diff --git a/api/src/com/cloud/agent/api/routing/NetworkElementCommand.java b/api/src/com/cloud/agent/api/routing/NetworkElementCommand.java index 9f40e657411..e7e27957202 100644 --- a/api/src/com/cloud/agent/api/routing/NetworkElementCommand.java +++ b/api/src/com/cloud/agent/api/routing/NetworkElementCommand.java @@ -26,6 +26,7 @@ public abstract class NetworkElementCommand extends Command { public static final String ACCOUNT_ID = "account.id"; public static final String GUEST_NETWORK_CIDR = "guest.network.cidr"; + public static final String GUEST_VLAN_TAG = "guest.vlan.tag"; public static final String ROUTER_NAME = "router.name"; public static final String ROUTER_IP = "router.ip"; public static final String ROUTER_GUEST_IP = "router.guest.ip"; diff --git a/api/src/com/cloud/api/ApiConstants.java b/api/src/com/cloud/api/ApiConstants.java index 2106f2c68c2..7372dedf4a7 100755 --- a/api/src/com/cloud/api/ApiConstants.java +++ b/api/src/com/cloud/api/ApiConstants.java @@ -75,6 +75,7 @@ public class ApiConstants { public static final String HA_ENABLE = "haenable"; public static final String HOST_ID = "hostid"; public static final String HYPERVISOR = "hypervisor"; + public static final String INLINE = "inline"; public static final String INSTANCE = "instance"; public static final String ICMP_CODE = "icmpcode"; public static final String ICMP_TYPE = "icmptype"; diff --git a/server/src/com/cloud/configuration/DefaultComponentLibrary.java b/server/src/com/cloud/configuration/DefaultComponentLibrary.java index c380c920914..5da5b21c2ca 100755 --- a/server/src/com/cloud/configuration/DefaultComponentLibrary.java +++ b/server/src/com/cloud/configuration/DefaultComponentLibrary.java @@ -74,6 +74,7 @@ import com.cloud.network.NetworkManagerImpl; import com.cloud.network.dao.FirewallRulesCidrsDaoImpl; import com.cloud.network.dao.FirewallRulesDaoImpl; import com.cloud.network.dao.IPAddressDaoImpl; +import com.cloud.network.dao.InlineLoadBalancerNicMapDaoImpl; import com.cloud.network.dao.LoadBalancerDaoImpl; import com.cloud.network.dao.LoadBalancerVMMapDaoImpl; import com.cloud.network.dao.NetworkDaoImpl; @@ -268,6 +269,7 @@ public class DefaultComponentLibrary extends ComponentLibraryBase implements Com addDao("SwiftDao", SwiftDaoImpl.class); addDao("AgentTransferMapDao", HostTransferMapDaoImpl.class); addDao("ProjectDao", ProjectDaoImpl.class); + addDao("InlineLoadBalancerNicMapDao", InlineLoadBalancerNicMapDaoImpl.class); } @Override diff --git a/server/src/com/cloud/network/InlineLoadBalancerNicMapVO.java b/server/src/com/cloud/network/InlineLoadBalancerNicMapVO.java new file mode 100644 index 00000000000..7dc2d6a768d --- /dev/null +++ b/server/src/com/cloud/network/InlineLoadBalancerNicMapVO.java @@ -0,0 +1,68 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package com.cloud.network; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name=("inline_load_balancer_nic_map")) +public class InlineLoadBalancerNicMapVO { + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + @Column(name="id") + private long id; + + @Column(name="load_balancer_id") + private long loadBalancerId; + + @Column(name="public_ip_address") + private String publicIpAddress; + + @Column(name="nic_id") + private long nicId; + + public InlineLoadBalancerNicMapVO() { } + + public InlineLoadBalancerNicMapVO(long loadBalancerId, String publicIpAddress, long nicId) { + this.loadBalancerId = loadBalancerId; + this.publicIpAddress = publicIpAddress; + this.nicId = nicId; + } + + public long getId() { + return id; + } + + public long getLoadBalancerId() { + return loadBalancerId; + } + + public String getPublicIpAddress() { + return publicIpAddress; + } + + public long getNicId() { + return nicId; + } +} diff --git a/server/src/com/cloud/network/dao/InlineLoadBalancerNicMapDao.java b/server/src/com/cloud/network/dao/InlineLoadBalancerNicMapDao.java new file mode 100644 index 00000000000..ac2ad59e859 --- /dev/null +++ b/server/src/com/cloud/network/dao/InlineLoadBalancerNicMapDao.java @@ -0,0 +1,27 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package com.cloud.network.dao; + +import com.cloud.network.InlineLoadBalancerNicMapVO; +import com.cloud.utils.db.GenericDao; + +public interface InlineLoadBalancerNicMapDao extends GenericDao { + InlineLoadBalancerNicMapVO findByPublicIpAddress(String publicIpAddress); + InlineLoadBalancerNicMapVO findByNicId(long nicId); +} diff --git a/server/src/com/cloud/network/dao/InlineLoadBalancerNicMapDaoImpl.java b/server/src/com/cloud/network/dao/InlineLoadBalancerNicMapDaoImpl.java new file mode 100644 index 00000000000..f30ba19a27e --- /dev/null +++ b/server/src/com/cloud/network/dao/InlineLoadBalancerNicMapDaoImpl.java @@ -0,0 +1,46 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package com.cloud.network.dao; + +import javax.ejb.Local; + +import com.cloud.network.InlineLoadBalancerNicMapVO; +import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.SearchCriteria; + +@Local(value={InlineLoadBalancerNicMapDao.class}) +public class InlineLoadBalancerNicMapDaoImpl extends GenericDaoBase implements InlineLoadBalancerNicMapDao { + + @Override + public InlineLoadBalancerNicMapVO findByPublicIpAddress(String publicIpAddress) { + SearchCriteria sc = createSearchCriteria(); + sc.addAnd("publicIpAddress", SearchCriteria.Op.EQ, publicIpAddress); + + return findOneBy(sc); + } + + @Override + public InlineLoadBalancerNicMapVO findByNicId(long nicId) { + SearchCriteria sc = createSearchCriteria(); + sc.addAnd("nicId", SearchCriteria.Op.EQ, nicId); + + return findOneBy(sc); + } + +} diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java index 73b3fb265bb..17a8f1348e6 100755 --- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java +++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java @@ -450,10 +450,8 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager, for (LoadBalancerVO lb : lbs) { List dstList = getExistingDestinations(lb.getId()); - if (dstList != null && !dstList.isEmpty()) { - LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList); - rules.add(loadBalancing); - } + LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList); + rules.add(loadBalancing); } if (!_networkMgr.applyRules(rules, false)) { diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index 63f40b88ce6..010f0592c5d 100755 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -2048,13 +2048,18 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian List lbs = _loadBalancerDao.listByNetworkId(network.getId()); List lbRules = new ArrayList(); for (LoadBalancerVO lb : lbs) { - List dstList = _lbMgr.getExistingDestinations(lb.getId()); - // load the cidrs, - lb.setSourceCidrList(_firewallCidrsDao.getSourceCidrs(lb.getId())); - LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList); - lbRules.add(loadBalancing); + List dstList = _lbMgr.getExistingDestinations(lb.getId()); + if (dstList != null && !dstList.isEmpty()) { + // load the cidrs, + lb.setSourceCidrList(_firewallCidrsDao.getSourceCidrs(lb.getId())); + LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList); + lbRules.add(loadBalancing); + } + } + + if (!lbRules.isEmpty()) { + result = result && applyLBRules(router, lbRules); } - result = result && applyLBRules(router, lbRules); } else if (rules.get(0).getPurpose() == Purpose.PortForwarding) { result = result && applyPortForwardingRules(router, (List) rules); } else if (rules.get(0).getPurpose() == Purpose.StaticNat) { diff --git a/server/src/com/cloud/vm/dao/NicDao.java b/server/src/com/cloud/vm/dao/NicDao.java index e2408d08bfb..35f3e6f1f98 100644 --- a/server/src/com/cloud/vm/dao/NicDao.java +++ b/server/src/com/cloud/vm/dao/NicDao.java @@ -42,4 +42,6 @@ public interface NicDao extends GenericDao { void removeNicsForInstance(long instanceId); NicVO findByNetworkIdAndType(long networkId, VirtualMachine.Type vmType); + + NicVO findByIp4Address(String ip4Address); } diff --git a/server/src/com/cloud/vm/dao/NicDaoImpl.java b/server/src/com/cloud/vm/dao/NicDaoImpl.java index a8c89b5cadf..d030d02ffdd 100644 --- a/server/src/com/cloud/vm/dao/NicDaoImpl.java +++ b/server/src/com/cloud/vm/dao/NicDaoImpl.java @@ -46,6 +46,7 @@ public class NicDaoImpl extends GenericDaoBase implements NicDao { AllFieldsSearch.and("instance", AllFieldsSearch.entity().getInstanceId(), Op.EQ); AllFieldsSearch.and("network", AllFieldsSearch.entity().getNetworkId(), Op.EQ); AllFieldsSearch.and("vmType", AllFieldsSearch.entity().getVmType(), Op.EQ); + AllFieldsSearch.and("address", AllFieldsSearch.entity().getIp4Address(), Op.EQ); AllFieldsSearch.done(); IpSearch = createSearchBuilder(String.class); @@ -114,4 +115,11 @@ public class NicDaoImpl extends GenericDaoBase implements NicDao { sc.setParameters("vmType", vmType); return findOneBy(sc); } + + @Override + public NicVO findByIp4Address(String ip4Address) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("address", ip4Address); + return findOneBy(sc); + } } diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index 8fc40ed89dc..61b9142e957 100755 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -61,6 +61,7 @@ DROP TABLE IF EXISTS `cloud`.`sync_queue`; DROP TABLE IF EXISTS `cloud`.`sync_queue_item`; DROP TABLE IF EXISTS `cloud`.`security_group_vm_map`; DROP TABLE IF EXISTS `cloud`.`load_balancer_vm_map`; +DROP TABLE IF EXISTS `cloud`.`load_balancer_inline_ip_map`; DROP TABLE IF EXISTS `cloud`.`storage_pool`; DROP TABLE IF EXISTS `cloud`.`storage_pool_host_ref`; DROP TABLE IF EXISTS `cloud`.`template_spool_ref`; @@ -626,6 +627,17 @@ CREATE TABLE `cloud`.`load_balancer_vm_map` ( CONSTRAINT `fk_load_balancer_vm_map__instance_id` FOREIGN KEY(`instance_id`) REFERENCES `vm_instance`(`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `cloud`.`inline_load_balancer_nic_map` ( + `id` bigint unsigned NOT NULL auto_increment, + `load_balancer_id` bigint unsigned NOT NULL, + `public_ip_address` char(40) NOT NULL, + `nic_id` bigint unsigned NULL COMMENT 'nic id', + PRIMARY KEY (`id`), + UNIQUE KEY (`nic_id`), + CONSTRAINT `fk_inline_load_balancer_nic_map__load_balancer_id` FOREIGN KEY(`load_balancer_id`) REFERENCES `load_balancing_rules`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_inline_load_balancer_nic_map__nic_id` FOREIGN KEY(`nic_id`) REFERENCES `nics`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + CREATE TABLE `cloud`.`port_forwarding_rules` ( `id` bigint unsigned NOT NULL COMMENT 'id', `instance_id` bigint unsigned NOT NULL COMMENT 'vm instance id',