From 460204fa9fec0f8bef7e5e7f89f40079a143626e Mon Sep 17 00:00:00 2001 From: wilderrodrigues Date: Mon, 12 Jan 2015 16:04:04 +0100 Subject: [PATCH] Fixing CsDhcp.py Fixing assign IPv4 on GuestNetworkGuru.java Fixing getRouters() on VpcVirtualRouterElement.java Fixing Fixing paths on keepalived.conf.templ Refactor on the other files --- .../src/com/cloud/vm/dao/NicDaoImpl.java | 6 +- .../network/element/VirtualRouterElement.java | 280 +++++++++--------- .../element/VpcVirtualRouterElement.java | 116 ++++++-- .../cloud/network/guru/GuestNetworkGuru.java | 89 +++--- .../cloud/network/router/NetworkHelper.java | 10 +- .../network/router/NetworkHelperImpl.java | 133 +++++---- .../VirtualNetworkApplianceManagerImpl.java | 7 +- .../network/router/VpcNetworkHelperImpl.java | 40 +-- .../RouterDeploymentDefinitionBuilder.java | 2 +- .../VpcRouterDeploymentDefinition.java | 7 +- .../debian/config/opt/cloud/bin/cs/CsDhcp.py | 2 +- .../opt/cloud/templates/keepalived.conf.templ | 6 +- 12 files changed, 396 insertions(+), 302 deletions(-) diff --git a/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java index 2a9a6025071..1e78262710b 100644 --- a/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java +++ b/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java @@ -214,7 +214,11 @@ public class NicDaoImpl extends GenericDaoBase implements NicDao { SearchCriteria sc = AllFieldsSearch.create(); sc.setParameters("network", networkId); sc.setParameters("instance", instanceId); - return findOneBy(sc).getIp4Address(); + NicVO nicVo = findOneBy(sc); + if (nicVo != null) { + return nicVo.getIp4Address(); + } + return null; } @Override diff --git a/server/src/com/cloud/network/element/VirtualRouterElement.java b/server/src/com/cloud/network/element/VirtualRouterElement.java index 2c28f8749de..1a340fab407 100644 --- a/server/src/com/cloud/network/element/VirtualRouterElement.java +++ b/server/src/com/cloud/network/element/VirtualRouterElement.java @@ -112,8 +112,8 @@ import com.google.gson.Gson; @Local(value = { NetworkElement.class, FirewallServiceProvider.class, DhcpServiceProvider.class, UserDataServiceProvider.class, StaticNatServiceProvider.class, LoadBalancingServiceProvider.class, PortForwardingServiceProvider.class, IpDeployer.class, RemoteAccessVPNServiceProvider.class, NetworkMigrationResponder.class }) public class VirtualRouterElement extends AdapterBase implements VirtualRouterElementService, DhcpServiceProvider, UserDataServiceProvider, SourceNatServiceProvider, - StaticNatServiceProvider, FirewallServiceProvider, LoadBalancingServiceProvider, PortForwardingServiceProvider, RemoteAccessVPNServiceProvider, IpDeployer, - NetworkMigrationResponder, AggregatedCommandExecutor { +StaticNatServiceProvider, FirewallServiceProvider, LoadBalancingServiceProvider, PortForwardingServiceProvider, RemoteAccessVPNServiceProvider, IpDeployer, +NetworkMigrationResponder, AggregatedCommandExecutor { private static final Logger s_logger = Logger.getLogger(VirtualRouterElement.class); public static final AutoScaleCounterType AutoScaleCounterCpu = new AutoScaleCounterType("cpu"); public static final AutoScaleCounterType AutoScaleCounterMemory = new AutoScaleCounterType("memory"); @@ -165,7 +165,7 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl protected RouterDeploymentDefinitionBuilder routerDeploymentDefinitionBuilder; protected boolean canHandle(final Network network, final Service service) { - Long physicalNetworkId = _networkMdl.getPhysicalNetworkId(network); + final Long physicalNetworkId = _networkMdl.getPhysicalNetworkId(network); if (physicalNetworkId == null) { return false; } @@ -201,10 +201,10 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl return false; } - Map params = new HashMap(1); + final Map params = new HashMap(1); params.put(VirtualMachineProfile.Param.ReProgramGuestNetworks, true); - RouterDeploymentDefinition routerDeploymentDefinition = + final RouterDeploymentDefinition routerDeploymentDefinition = routerDeploymentDefinitionBuilder.create() .setGuestNetwork(network) .setDeployDestination(dest) @@ -212,7 +212,7 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl .setParams(params) .build(); - List routers = routerDeploymentDefinition.deployVirtualRouter(); + final List routers = routerDeploymentDefinition.deployVirtualRouter(); int routerCounts = 1; if (offering.getRedundantRouter()) { @@ -236,7 +236,7 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl return false; } - NetworkOfferingVO offering = _networkOfferingDao.findById(network.getNetworkOfferingId()); + final NetworkOfferingVO offering = _networkOfferingDao.findById(network.getNetworkOfferingId()); if (offering.isSystemOnly()) { return false; } @@ -244,7 +244,7 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl return false; } - RouterDeploymentDefinition routerDeploymentDefinition = + final RouterDeploymentDefinition routerDeploymentDefinition = routerDeploymentDefinitionBuilder.create() .setGuestNetwork(network) .setDeployDestination(dest) @@ -252,7 +252,7 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl .setParams(vm.getParameters()) .build(); - List routers = routerDeploymentDefinition.deployVirtualRouter(); + final List routers = routerDeploymentDefinition.deployVirtualRouter(); if (routers == null || routers.size() == 0) { throw new ResourceUnavailableException("Can't find at least one running router!", DataCenter.class, network.getDataCenterId()); @@ -263,7 +263,7 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl @Override public boolean applyFWRules(final Network network, final List rules) throws ResourceUnavailableException { if (canHandle(network, Service.Firewall)) { - List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER); + final List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER); if (routers == null || routers.isEmpty()) { s_logger.debug("Virtual router elemnt doesn't need to apply firewall rules on the backend; virtual " + "router doesn't exist in the network " + network.getId()); return true; @@ -278,8 +278,8 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl } } - DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); - NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); + final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); + final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); if (!networkTopology.applyFirewallRules(network, rules, routers)) { throw new CloudRuntimeException("Failed to apply firewall rules in network " + network.getId()); @@ -308,8 +308,8 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl return false; // at least one numeric and one char. example: } // 3h - char strEnd = str.toCharArray()[str.length() - 1]; - for (char c : endChar.toCharArray()) { + final char strEnd = str.toCharArray()[str.length() - 1]; + for (final char c : endChar.toCharArray()) { if (strEnd == c) { number = str.substring(0, str.length() - 1); matchedEndChar = true; @@ -322,22 +322,22 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl } try { Integer.parseInt(number); - } catch (NumberFormatException e) { + } catch (final NumberFormatException e) { return false; } return true; } public static boolean validateHAProxyLBRule(final LoadBalancingRule rule) { - String timeEndChar = "dhms"; + final String timeEndChar = "dhms"; if (rule.getSourcePortStart() == NetUtils.HAPROXY_STATS_PORT) { s_logger.debug("Can't create LB on port 8081, haproxy is listening for LB stats on this port"); return false; } - for (LbStickinessPolicy stickinessPolicy : rule.getStickinessPolicies()) { - List> paramsList = stickinessPolicy.getParams(); + for (final LbStickinessPolicy stickinessPolicy : rule.getStickinessPolicies()) { + final List> paramsList = stickinessPolicy.getParams(); if (StickinessMethodType.LBCookieBased.getName().equalsIgnoreCase(stickinessPolicy.getMethodName())) { @@ -346,9 +346,9 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl String expire = "30m"; // optional /* overwrite default values with the stick parameters */ - for (Pair paramKV : paramsList) { - String key = paramKV.first(); - String value = paramKV.second(); + for (final Pair paramKV : paramsList) { + final String key = paramKV.first(); + final String value = paramKV.second(); if ("tablesize".equalsIgnoreCase(key)) { tablesize = value; } @@ -367,9 +367,9 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl String length = null; // optional String holdTime = null; // optional - for (Pair paramKV : paramsList) { - String key = paramKV.first(); - String value = paramKV.second(); + for (final Pair paramKV : paramsList) { + final String key = paramKV.first(); + final String value = paramKV.second(); if ("length".equalsIgnoreCase(key)) { length = value; } @@ -391,10 +391,10 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl @Override public boolean validateLBRule(final Network network, final LoadBalancingRule rule) { - List rules = new ArrayList(); + final List rules = new ArrayList(); rules.add(rule); if (canHandle(network, Service.Lb) && canHandleLbRules(rules)) { - List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER); + final List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER); if (routers == null || routers.isEmpty()) { return true; } @@ -410,14 +410,14 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl return false; } - List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER); + final List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER); if (routers == null || routers.isEmpty()) { s_logger.debug("Virtual router elemnt doesn't need to apply lb rules on the backend; virtual " + "router doesn't exist in the network " + network.getId()); return true; } - DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); - NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); + final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); + final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); if (!networkTopology.applyLoadBalancingRules(network, rules, routers)) { throw new CloudRuntimeException("Failed to apply load balancing rules in network " + network.getId()); @@ -435,16 +435,16 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl return null; } - Network network = _networksDao.findById(vpn.getNetworkId()); + final Network network = _networksDao.findById(vpn.getNetworkId()); if (canHandle(network, Service.Vpn)) { - List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER); + final List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER); if (routers == null || routers.isEmpty()) { s_logger.debug("Virtual router elemnt doesn't need to apply vpn users on the backend; virtual router" + " doesn't exist in the network " + network.getId()); return null; } - DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); - NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); + final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); + final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); return networkTopology.applyVpnUsers(network, users, routers); } else { @@ -459,9 +459,9 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl return false; } - Network network = _networksDao.findById(vpn.getNetworkId()); + final Network network = _networksDao.findById(vpn.getNetworkId()); if (canHandle(network, Service.Vpn)) { - List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER); + final List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER); if (routers == null || routers.isEmpty()) { s_logger.debug("Virtual router elemnt doesn't need stop vpn on the backend; virtual router doesn't" + " exist in the network " + network.getId()); return true; @@ -479,9 +479,9 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl return false; } - Network network = _networksDao.findById(vpn.getNetworkId()); + final Network network = _networksDao.findById(vpn.getNetworkId()); if (canHandle(network, Service.Vpn)) { - List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER); + final List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER); if (routers == null || routers.isEmpty()) { s_logger.debug("Virtual router elemnt doesn't need stop vpn on the backend; virtual router doesn't " + "exist in the network " + network.getId()); return true; @@ -496,21 +496,21 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl @Override public boolean applyIps(final Network network, final List ipAddress, final Set services) throws ResourceUnavailableException { boolean canHandle = true; - for (Service service : services) { + for (final Service service : services) { if (!canHandle(network, service)) { canHandle = false; break; } } if (canHandle) { - List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER); + final List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER); if (routers == null || routers.isEmpty()) { s_logger.debug("Virtual router elemnt doesn't need to associate ip addresses on the backend; virtual " + "router doesn't exist in the network " + network.getId()); return true; } - DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); - NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); + final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); + final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); return networkTopology.associatePublicIP(network, ipAddress, routers); } else { @@ -530,7 +530,7 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl public static String getHAProxyStickinessCapability() { LbStickinessMethod method; - List methodList = new ArrayList(1); + final List methodList = new ArrayList(1); method = new LbStickinessMethod(StickinessMethodType.LBCookieBased, "This is loadbalancer cookie based stickiness method."); method.addParam("cookie-name", false, "Cookie name passed in http header by the LB to the client.", false); @@ -577,7 +577,7 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl false, "When this option is specified, haproxy will match on the cookie prefix (or URL parameter prefix). " + "The appsession value is the data following this prefix. Example : appsession ASPSESSIONID len 64 timeout 3h prefix This will match the cookie ASPSESSIONIDXXXX=XXXXX, the appsession value will be XXXX=XXXXX.", - true); + true); method.addParam("mode", false, "This option allows to change the URL parser mode. 2 modes are currently supported : - path-parameters " + ": The parser looks for the appsession in the path parameters part (each parameter is separated by a semi-colon), " + "which is convenient for JSESSIONID for example.This is the default mode if the option is not set. - query-string :" @@ -590,16 +590,16 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl + " example: expire=30m 20s 50h 4d. Default value:3h", false); methodList.add(method); - Gson gson = new Gson(); - String capability = gson.toJson(methodList); + final Gson gson = new Gson(); + final String capability = gson.toJson(methodList); return capability; } private static Map> setCapabilities() { - Map> capabilities = new HashMap>(); + final Map> capabilities = new HashMap>(); // Set capabilities for LB service - Map lbCapabilities = new HashMap(); + final Map lbCapabilities = new HashMap(); lbCapabilities.put(Capability.SupportedLBAlgorithms, "roundrobin,leastconn,source"); lbCapabilities.put(Capability.SupportedLBIsolation, "dedicated"); lbCapabilities.put(Capability.SupportedProtocols, "tcp, udp"); @@ -609,18 +609,18 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl // specifies that LB rules can support autoscaling and the list of // counters it supports AutoScaleCounter counter; - List counterList = new ArrayList(); + final List counterList = new ArrayList(); counter = new AutoScaleCounter(AutoScaleCounterCpu); counterList.add(counter); counter = new AutoScaleCounter(AutoScaleCounterMemory); counterList.add(counter); - Gson gson = new Gson(); - String autoScaleCounterList = gson.toJson(counterList); + final Gson gson = new Gson(); + final String autoScaleCounterList = gson.toJson(counterList); lbCapabilities.put(Capability.AutoScaleCounters, autoScaleCounterList); capabilities.put(Service.Lb, lbCapabilities); // Set capabilities for Firewall service - Map firewallCapabilities = new HashMap(); + final Map firewallCapabilities = new HashMap(); firewallCapabilities.put(Capability.TrafficStatistics, "per public ip"); firewallCapabilities.put(Capability.SupportedProtocols, "tcp,udp,icmp"); firewallCapabilities.put(Capability.SupportedEgressProtocols, "tcp,udp,icmp, all"); @@ -629,24 +629,24 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl capabilities.put(Service.Firewall, firewallCapabilities); // Set capabilities for vpn - Map vpnCapabilities = new HashMap(); + final Map vpnCapabilities = new HashMap(); vpnCapabilities.put(Capability.SupportedVpnProtocols, "pptp,l2tp,ipsec"); vpnCapabilities.put(Capability.VpnTypes, "removeaccessvpn"); capabilities.put(Service.Vpn, vpnCapabilities); - Map dnsCapabilities = new HashMap(); + final Map dnsCapabilities = new HashMap(); dnsCapabilities.put(Capability.AllowDnsSuffixModification, "true"); capabilities.put(Service.Dns, dnsCapabilities); capabilities.put(Service.UserData, null); - Map dhcpCapabilities = new HashMap(); + final Map dhcpCapabilities = new HashMap(); dhcpCapabilities.put(Capability.DhcpAccrossMultipleSubnets, "true"); capabilities.put(Service.Dhcp, dhcpCapabilities); capabilities.put(Service.Gateway, null); - Map sourceNatCapabilities = new HashMap(); + final Map sourceNatCapabilities = new HashMap(); sourceNatCapabilities.put(Capability.SupportedSourceNatTypes, "peraccount"); sourceNatCapabilities.put(Capability.RedundantRouter, "true"); capabilities.put(Service.SourceNat, sourceNatCapabilities); @@ -660,14 +660,14 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl @Override public boolean applyStaticNats(final Network network, final List rules) throws ResourceUnavailableException { if (canHandle(network, Service.StaticNat)) { - List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER); + final List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER); if (routers == null || routers.isEmpty()) { s_logger.debug("Virtual router elemnt doesn't need to apply static nat on the backend; virtual " + "router doesn't exist in the network " + network.getId()); return true; } - DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); - NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); + final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); + final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); return networkTopology.applyStaticNats(network, rules, routers); } else { @@ -677,12 +677,12 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl @Override public boolean shutdown(final Network network, final ReservationContext context, final boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException { - List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER); + final List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER); if (routers == null || routers.isEmpty()) { return true; } boolean result = true; - for (DomainRouterVO router : routers) { + for (final DomainRouterVO router : routers) { result = result && _routerMgr.stop(router, false, context.getCaller(), context.getAccount()) != null; if (cleanup) { if (!result) { @@ -699,7 +699,7 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl @Override public boolean destroy(final Network config, final ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException { - List routers = _routerDao.listByNetworkAndRole(config.getId(), Role.VIRTUAL_ROUTER); + final List routers = _routerDao.listByNetworkAndRole(config.getId(), Role.VIRTUAL_ROUTER); if (routers == null || routers.isEmpty()) { return true; } @@ -708,8 +708,8 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl // it will fail permission check there. Context passed in from // deleteNetwork is the network account, // not caller account - Account callerAccount = _accountMgr.getAccount(context.getCaller().getAccountId()); - for (DomainRouterVO router : routers) { + final Account callerAccount = _accountMgr.getAccount(context.getCaller().getAccountId()); + for (final DomainRouterVO router : routers) { result = result && _routerMgr.destroyRouter(router.getId(), callerAccount, context.getCaller().getId()) != null; } return result; @@ -720,27 +720,27 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl if (!canHandle(network, null)) { return false; } - List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER); + final List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER); if (routers == null || routers.isEmpty()) { s_logger.debug("Can't find virtual router element in network " + network.getId()); return true; } - VirtualMachineProfile uservm = vm; + final VirtualMachineProfile uservm = vm; - DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); - NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); + final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); + final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); // If any router is running then send save password command otherwise // save the password in DB - for (VirtualRouter router : routers) { + for (final VirtualRouter router : routers) { if (router.getState() == State.Running) { return networkTopology.savePasswordToRouter(network, nic, uservm, routers); } } - String password = (String) uservm.getParameter(VirtualMachineProfile.Param.VmPassword); - String password_encrypted = DBEncryptionUtil.encrypt(password); - UserVmVO userVmVO = _userVmDao.findById(vm.getId()); + final String password = (String) uservm.getParameter(VirtualMachineProfile.Param.VmPassword); + final String password_encrypted = DBEncryptionUtil.encrypt(password); + final UserVmVO userVmVO = _userVmDao.findById(vm.getId()); _userVmDao.loadDetails(userVmVO); userVmVO.setDetail("password", password_encrypted); @@ -757,16 +757,16 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl if (!canHandle(network, null)) { return false; } - List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER); + final List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER); if (routers == null || routers.isEmpty()) { s_logger.debug("Can't find virtual router element in network " + network.getId()); return true; } - VirtualMachineProfile uservm = vm; + final VirtualMachineProfile uservm = vm; - DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); - NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); + final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); + final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); return networkTopology.saveSSHPublicKeyToRouter(network, nic, uservm, routers, sshPublicKey); } @@ -776,23 +776,23 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl if (!canHandle(network, null)) { return false; } - List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER); + final List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER); if (routers == null || routers.isEmpty()) { s_logger.debug("Can't find virtual router element in network " + network.getId()); return true; } - VirtualMachineProfile uservm = vm; + final VirtualMachineProfile uservm = vm; - DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); - NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); + final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); + final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); return networkTopology.saveUserDataToRouter(network, nic, uservm, routers); } @Override public List> getCommands() { - List> cmdList = new ArrayList>(); + final List> cmdList = new ArrayList>(); cmdList.add(CreateVirtualRouterElementCmd.class); cmdList.add(ConfigureVirtualRouterElementCmd.class); cmdList.add(ListVirtualRouterElementsCmd.class); @@ -801,7 +801,7 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl @Override public VirtualRouterProvider configure(final ConfigureVirtualRouterElementCmd cmd) { - VirtualRouterProviderVO element = _vrProviderDao.findById(cmd.getId()); + final VirtualRouterProviderVO element = _vrProviderDao.findById(cmd.getId()); if (element == null || !(element.getType() == Type.VirtualRouter || element.getType() == Type.VPCVirtualRouter)) { s_logger.debug("Can't find Virtual Router element with network service provider id " + cmd.getId()); return null; @@ -815,7 +815,7 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl @Override public OvsProvider configure(final ConfigureOvsElementCmd cmd) { - OvsProviderVO element = _ovsProviderDao.findById(cmd.getId()); + final OvsProviderVO element = _ovsProviderDao.findById(cmd.getId()); if (element == null) { s_logger.debug("Can't find Ovs element with network service provider id " + cmd.getId()); return null; @@ -845,14 +845,14 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl @Override public boolean applyPFRules(final Network network, final List rules) throws ResourceUnavailableException { if (canHandle(network, Service.PortForwarding)) { - List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER); + final List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER); if (routers == null || routers.isEmpty()) { s_logger.debug("Virtual router elemnt doesn't need to apply firewall rules on the backend; virtual " + "router doesn't exist in the network " + network.getId()); return true; } - DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); - NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); + final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); + final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); if (!networkTopology.applyFirewallRules(network, rules, routers)) { throw new CloudRuntimeException("Failed to apply firewall rules in network " + network.getId()); @@ -866,7 +866,7 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl @Override public boolean isReady(final PhysicalNetworkServiceProvider provider) { - VirtualRouterProviderVO element = _vrProviderDao.findByNspIdAndType(provider.getId(), getVirtualRouterProvider()); + final VirtualRouterProviderVO element = _vrProviderDao.findByNspIdAndType(provider.getId(), getVirtualRouterProvider()); if (element == null) { return false; } @@ -875,16 +875,16 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl @Override public boolean shutdownProviderInstances(final PhysicalNetworkServiceProvider provider, final ReservationContext context) throws ConcurrentOperationException, - ResourceUnavailableException { - VirtualRouterProviderVO element = _vrProviderDao.findByNspIdAndType(provider.getId(), getVirtualRouterProvider()); + ResourceUnavailableException { + final VirtualRouterProviderVO element = _vrProviderDao.findByNspIdAndType(provider.getId(), getVirtualRouterProvider()); if (element == null) { return true; } // Find domain routers - long elementId = element.getId(); - List routers = _routerDao.listByElementId(elementId); + final long elementId = element.getId(); + final List routers = _routerDao.listByElementId(elementId); boolean result = true; - for (DomainRouterVO router : routers) { + for (final DomainRouterVO router : routers) { result = result && _routerMgr.destroyRouter(router.getId(), context.getAccount(), context.getCaller().getId()) != null; } _vrProviderDao.remove(elementId); @@ -898,13 +898,13 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl } public Long getIdByNspId(final Long nspId) { - VirtualRouterProviderVO vr = _vrProviderDao.findByNspIdAndType(nspId, Type.VirtualRouter); + final VirtualRouterProviderVO vr = _vrProviderDao.findByNspIdAndType(nspId, Type.VirtualRouter); return vr.getId(); } @Override public VirtualRouterProvider getCreatedElement(final long id) { - VirtualRouterProvider provider = _vrProviderDao.findById(id); + final VirtualRouterProvider provider = _vrProviderDao.findById(id); if (!(provider.getType() == Type.VirtualRouter || provider.getType() == Type.VPCVirtualRouter)) { throw new InvalidParameterValueException("Unable to find provider by id"); } @@ -913,7 +913,7 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl @Override public boolean release(final Network network, final NicProfile nic, final VirtualMachineProfile vm, final ReservationContext context) throws ConcurrentOperationException, - ResourceUnavailableException { + ResourceUnavailableException { return true; } @@ -925,16 +925,16 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl return false; } - VirtualMachineProfile uservm = vm; + final VirtualMachineProfile uservm = vm; - List routers = getRouters(network, dest); + final List routers = getRouters(network, dest); if (routers == null || routers.size() == 0) { throw new ResourceUnavailableException("Can't find at least one router!", DataCenter.class, network.getDataCenterId()); } - DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); - NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); + final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); + final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); return networkTopology.configDhcpForSubnet(network, nic, uservm, dest, routers); } @@ -944,13 +944,13 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl @Override public boolean removeDhcpSupportForSubnet(final Network network) throws ResourceUnavailableException { if (canHandle(network, Service.Dhcp)) { - List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER); + final List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER); if (routers == null || routers.size() == 0) { throw new ResourceUnavailableException("Can't find at least one router!", DataCenter.class, network.getDataCenterId()); } try { return _routerMgr.removeDhcpSupportForSubnet(network, routers); - } catch (ResourceUnavailableException e) { + } catch (final ResourceUnavailableException e) { s_logger.debug("Router resource unavailable "); } } @@ -965,16 +965,16 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl return false; } - VirtualMachineProfile uservm = vm; + final VirtualMachineProfile uservm = vm; - List routers = getRouters(network, dest); + final List routers = getRouters(network, dest); if (routers == null || routers.size() == 0) { throw new ResourceUnavailableException("Can't find at least one router!", DataCenter.class, network.getDataCenterId()); } - DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); - NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); + final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); + final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); return networkTopology.applyDhcpEntry(network, nic, uservm, dest, routers); } @@ -994,16 +994,16 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl return true; } - VirtualMachineProfile uservm = vm; + final VirtualMachineProfile uservm = vm; - List routers = getRouters(network, dest); + final List routers = getRouters(network, dest); if (routers == null || routers.size() == 0) { throw new ResourceUnavailableException("Can't find at least one router!", DataCenter.class, network.getDataCenterId()); } - DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); - NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); + final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); + final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); return networkTopology.applyUserData(network, nic, uservm, dest, routers); } @@ -1015,7 +1015,7 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl if (_networkMdl.isProviderSupportServiceInNetwork(network.getId(), Service.SourceNat, getProvider())) { publicNetwork = true; } - boolean isPodBased = (dest.getDataCenter().getNetworkType() == NetworkType.Basic || _networkMdl.isSecurityGroupSupportedInNetwork(network)) + final boolean isPodBased = (dest.getDataCenter().getNetworkType() == NetworkType.Basic || _networkMdl.isSecurityGroupSupportedInNetwork(network)) && network.getTrafficType() == TrafficType.Guest; List routers; @@ -1024,7 +1024,7 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER); } else { if (isPodBased && dest.getPod() != null) { - Long podId = dest.getPod().getId(); + final Long podId = dest.getPod().getId(); routers = _routerDao.listByNetworkAndPodAndRole(network.getId(), podId, Role.VIRTUAL_ROUTER); } else { // With pod == null, it's network restart case, we would add all @@ -1040,8 +1040,8 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl // With pod == null, it's network restart case, we already add all // routers to it if (isPodBased && dest.getPod() != null && _routerMgr.getDnsBasicZoneUpdate().equalsIgnoreCase("all")) { - Long podId = dest.getPod().getId(); - List allRunningRoutersOutsideThePod = _routerDao.findByNetworkOutsideThePod(network.getId(), podId, State.Running, Role.VIRTUAL_ROUTER); + final Long podId = dest.getPod().getId(); + final List allRunningRoutersOutsideThePod = _routerDao.findByNetworkOutsideThePod(network.getId(), podId, State.Running, Role.VIRTUAL_ROUTER); routers.addAll(allRunningRoutersOutsideThePod); } return routers; @@ -1049,11 +1049,11 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl @Override public List searchForVirtualRouterElement(final ListVirtualRouterElementsCmd cmd) { - Long id = cmd.getId(); - Long nspId = cmd.getNspId(); - Boolean enabled = cmd.getEnabled(); + final Long id = cmd.getId(); + final Long nspId = cmd.getNspId(); + final Boolean enabled = cmd.getEnabled(); - QueryBuilder sc = QueryBuilder.create(VirtualRouterProviderVO.class); + final QueryBuilder sc = QueryBuilder.create(VirtualRouterProviderVO.class); if (id != null) { sc.and(sc.entity().getId(), Op.EQ, id); } @@ -1072,10 +1072,10 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl @Override public List searchForOvsElement(final ListOvsElementsCmd cmd) { - Long id = cmd.getId(); - Long nspId = cmd.getNspId(); - Boolean enabled = cmd.getEnabled(); - QueryBuilder sc = QueryBuilder.create(OvsProviderVO.class); + final Long id = cmd.getId(); + final Long nspId = cmd.getNspId(); + final Boolean enabled = cmd.getEnabled(); + final QueryBuilder sc = QueryBuilder.create(OvsProviderVO.class); if (id != null) { sc.and(sc.entity().getId(), Op.EQ, id); @@ -1111,11 +1111,11 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl } private boolean canHandleLbRules(final List rules) { - Map lbCaps = getCapabilities().get(Service.Lb); + final Map lbCaps = getCapabilities().get(Service.Lb); if (!lbCaps.isEmpty()) { - String schemeCaps = lbCaps.get(Capability.LbSchemes); + final String schemeCaps = lbCaps.get(Capability.LbSchemes); if (schemeCaps != null) { - for (LoadBalancingRule rule : rules) { + for (final LoadBalancingRule rule : rules) { if (!schemeCaps.contains(rule.getScheme().toString())) { s_logger.debug("Scheme " + rules.get(0).getScheme() + " is not supported by the provider " + getName()); return false; @@ -1133,19 +1133,19 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl } if (vm.getType() == VirtualMachine.Type.DomainRouter) { assert vm instanceof DomainRouterVO; - DomainRouterVO router = (DomainRouterVO) vm.getVirtualMachine(); + final DomainRouterVO router = (DomainRouterVO) vm.getVirtualMachine(); - DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); - NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); + final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); + final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); try { networkTopology.setupDhcpForPvlan(false, router, router.getHostId(), nic); - } catch (ResourceUnavailableException e) { + } catch (final ResourceUnavailableException e) { s_logger.warn("Timed Out", e); } } else if (vm.getType() == VirtualMachine.Type.User) { assert vm instanceof UserVmVO; - UserVmVO userVm = (UserVmVO) vm.getVirtualMachine(); + final UserVmVO userVm = (UserVmVO) vm.getVirtualMachine(); _userVmMgr.setupVmForPvlan(false, userVm.getHostId(), nic); } return true; @@ -1158,19 +1158,19 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl } if (vm.getType() == VirtualMachine.Type.DomainRouter) { assert vm instanceof DomainRouterVO; - DomainRouterVO router = (DomainRouterVO) vm.getVirtualMachine(); + final DomainRouterVO router = (DomainRouterVO) vm.getVirtualMachine(); - DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); - NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); + final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); + final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); try { networkTopology.setupDhcpForPvlan(true, router, router.getHostId(), nic); - } catch (ResourceUnavailableException e) { + } catch (final ResourceUnavailableException e) { s_logger.warn("Timed Out", e); } } else if (vm.getType() == VirtualMachine.Type.User) { assert vm instanceof UserVmVO; - UserVmVO userVm = (UserVmVO) vm.getVirtualMachine(); + final UserVmVO userVm = (UserVmVO) vm.getVirtualMachine(); _userVmMgr.setupVmForPvlan(true, userVm.getHostId(), nic); } } @@ -1182,26 +1182,26 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl } if (vm.getType() == VirtualMachine.Type.DomainRouter) { assert vm instanceof DomainRouterVO; - DomainRouterVO router = (DomainRouterVO) vm.getVirtualMachine(); + final DomainRouterVO router = (DomainRouterVO) vm.getVirtualMachine(); - DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); - NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); + final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); + final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); try { networkTopology.setupDhcpForPvlan(true, router, router.getHostId(), nic); - } catch (ResourceUnavailableException e) { + } catch (final ResourceUnavailableException e) { s_logger.warn("Timed Out", e); } } else if (vm.getType() == VirtualMachine.Type.User) { assert vm instanceof UserVmVO; - UserVmVO userVm = (UserVmVO) vm.getVirtualMachine(); + final UserVmVO userVm = (UserVmVO) vm.getVirtualMachine(); _userVmMgr.setupVmForPvlan(true, userVm.getHostId(), nic); } } @Override public boolean prepareAggregatedExecution(final Network network, final DeployDestination dest) throws ResourceUnavailableException { - List routers = getRouters(network, dest); + final List routers = getRouters(network, dest); if (routers == null || routers.size() == 0) { throw new ResourceUnavailableException("Can't find at least one router!", DataCenter.class, network.getDataCenterId()); @@ -1212,7 +1212,7 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl @Override public boolean completeAggregatedExecution(final Network network, final DeployDestination dest) throws ResourceUnavailableException { - List routers = getRouters(network, dest); + final List routers = getRouters(network, dest); if (routers == null || routers.size() == 0) { throw new ResourceUnavailableException("Can't find at least one router!", DataCenter.class, network.getDataCenterId()); diff --git a/server/src/com/cloud/network/element/VpcVirtualRouterElement.java b/server/src/com/cloud/network/element/VpcVirtualRouterElement.java index f44d7aa15d7..f0c0fba8407 100644 --- a/server/src/com/cloud/network/element/VpcVirtualRouterElement.java +++ b/server/src/com/cloud/network/element/VpcVirtualRouterElement.java @@ -16,6 +16,7 @@ // under the License. package com.cloud.network.element; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -28,6 +29,8 @@ import org.apache.cloudstack.network.topology.NetworkTopology; import org.apache.log4j.Logger; import org.cloud.network.router.deployment.RouterDeploymentDefinition; import org.cloud.network.router.deployment.RouterDeploymentDefinitionBuilder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenterVO; @@ -36,6 +39,7 @@ import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.IpAddress; +import com.cloud.network.IpAddressManager; import com.cloud.network.Network; import com.cloud.network.Network.Capability; import com.cloud.network.Network.Provider; @@ -53,6 +57,7 @@ import com.cloud.network.dao.NetworkDao; import com.cloud.network.dao.Site2SiteVpnGatewayDao; import com.cloud.network.router.VirtualRouter; import com.cloud.network.router.VirtualRouter.Role; +import com.cloud.network.router.VpcNetworkHelperImpl; import com.cloud.network.router.VpcVirtualNetworkApplianceManager; import com.cloud.network.vpc.NetworkACLItem; import com.cloud.network.vpc.NetworkACLItemDao; @@ -62,6 +67,7 @@ import com.cloud.network.vpc.StaticRouteProfile; import com.cloud.network.vpc.Vpc; import com.cloud.network.vpc.VpcGateway; import com.cloud.network.vpc.VpcManager; +import com.cloud.network.vpc.dao.VpcDao; import com.cloud.network.vpc.dao.VpcGatewayDao; import com.cloud.offering.NetworkOffering; import com.cloud.utils.db.EntityManager; @@ -70,13 +76,18 @@ import com.cloud.vm.DomainRouterVO; import com.cloud.vm.NicProfile; import com.cloud.vm.ReservationContext; import com.cloud.vm.VirtualMachine; +import com.cloud.vm.VirtualMachineManager; import com.cloud.vm.VirtualMachineProfile; @Local(value = { NetworkElement.class, FirewallServiceProvider.class, DhcpServiceProvider.class, UserDataServiceProvider.class, StaticNatServiceProvider.class, LoadBalancingServiceProvider.class, PortForwardingServiceProvider.class, IpDeployer.class, VpcProvider.class, Site2SiteVpnServiceProvider.class, NetworkACLServiceProvider.class }) public class VpcVirtualRouterElement extends VirtualRouterElement implements VpcProvider, Site2SiteVpnServiceProvider, NetworkACLServiceProvider { + private static final Logger s_logger = Logger.getLogger(VpcVirtualRouterElement.class); + + private static final Map> capabilities = setCapabilities(); + @Inject VpcManager _vpcMgr; @Inject @@ -95,12 +106,20 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc NetworkACLItemDao _networkACLItemDao; @Inject EntityManager _entityMgr; + @Inject + VirtualMachineManager _itMgr; + @Inject + IpAddressManager _ipAddrMgr; + @Inject + VpcDao _vpcDao; + + @Autowired + @Qualifier("vpcNetworkHelper") + private VpcNetworkHelperImpl _vpcNetWprkHelper; @Inject private RouterDeploymentDefinitionBuilder routerDeploymentDefinitionBuilder; - private static final Map> capabilities = setCapabilities(); - @Override protected boolean canHandle(final Network network, final Service service) { final Long physicalNetworkId = _networkMdl.getPhysicalNetworkId(network); @@ -179,8 +198,13 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc final Map params = new HashMap(1); params.put(VirtualMachineProfile.Param.ReProgramGuestNetworks, true); - final RouterDeploymentDefinition routerDeploymentDefinition = routerDeploymentDefinitionBuilder.create().setVpc(vpc).setDeployDestination(dest) - .setAccountOwner(_accountMgr.getAccount(vpc.getAccountId())).setParams(params).build(); + final RouterDeploymentDefinition routerDeploymentDefinition = routerDeploymentDefinitionBuilder.create() + .setGuestNetwork(network) + .setVpc(vpc) + .setDeployDestination(dest) + .setAccountOwner(_accountMgr.getAccount(vpc.getAccountId())) + .setParams(params) + .build(); final List routers = routerDeploymentDefinition.deployVirtualRouter(); @@ -188,23 +212,29 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc throw new ResourceUnavailableException("Can't find at least one running router!", DataCenter.class, network.getDataCenterId()); } + configureGuestNetwork(network, routers); + + return true; + } + + protected void configureGuestNetwork(final Network network, final List routers ) + throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException { + s_logger.info("Adding VPC routers to Guest Network: " + routers.size() + " to be added!"); - for (final DomainRouterVO domainRouterVO : routers) { - if (!_networkMdl.isVmPartOfNetwork(domainRouterVO.getId(), network.getId())) { + for (final DomainRouterVO router : routers) { + if (!_networkMdl.isVmPartOfNetwork(router.getId(), network.getId())) { final Map paramsForRouter = new HashMap(1); if (network.getState() == State.Setup) { paramsForRouter.put(VirtualMachineProfile.Param.ReProgramGuestNetworks, true); } - if (!_vpcRouterMgr.addVpcRouterToGuestNetwork(domainRouterVO, network, paramsForRouter)) { - s_logger.error("Failed to add VPC router " + domainRouterVO + " to guest network " + network); + if (!_vpcRouterMgr.addVpcRouterToGuestNetwork(router, network, paramsForRouter)) { + s_logger.error("Failed to add VPC router " + router + " to guest network " + network); } else { - s_logger.debug("Successfully added VPC router " + domainRouterVO + " to guest network " + network); + s_logger.debug("Successfully added VPC router " + router + " to guest network " + network); } } } - - return true; } @Override @@ -227,31 +257,21 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc final Map params = new HashMap(1); params.put(VirtualMachineProfile.Param.ReProgramGuestNetworks, true); - final RouterDeploymentDefinition routerDeploymentDefinition = routerDeploymentDefinitionBuilder.create().setVpc(vpc).setDeployDestination(dest) - .setAccountOwner(_accountMgr.getAccount(vpc.getAccountId())).setParams(params).build(); + final RouterDeploymentDefinition routerDeploymentDefinition = routerDeploymentDefinitionBuilder.create() + .setGuestNetwork(network) + .setVpc(vpc) + .setDeployDestination(dest) + .setAccountOwner(_accountMgr.getAccount(vpc.getAccountId())) + .setParams(params) + .build(); + final List routers = routerDeploymentDefinition.deployVirtualRouter(); if (routers == null || routers.size() == 0) { throw new ResourceUnavailableException("Can't find at least one running router!", DataCenter.class, network.getDataCenterId()); } - s_logger.info("Adding VPC routers to Guest Network: " + routers.size() + " to be added!"); - - for (final DomainRouterVO domainRouterVO : routers) { - // Add router to guest network if needed - if (!_networkMdl.isVmPartOfNetwork(domainRouterVO.getId(), network.getId())) { - final Map paramsForRouter = new HashMap(1); - // need to reprogram guest network if it comes in a setup state - if (network.getState() == State.Setup) { - paramsForRouter.put(VirtualMachineProfile.Param.ReProgramGuestNetworks, true); - } - if (!_vpcRouterMgr.addVpcRouterToGuestNetwork(domainRouterVO, network, paramsForRouter)) { - s_logger.error("Failed to add VPC router " + domainRouterVO + " to guest network " + network); - } else { - s_logger.debug("Successfully added VPC router " + domainRouterVO + " to guest network " + network); - } - } - } + configureGuestNetwork(network, routers); } return true; @@ -318,6 +338,42 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc return Provider.VPCVirtualRouter; } + @Override + protected List getRouters(final Network network, final DeployDestination dest) { + List routers = new ArrayList(); + + final Long vpcId = network.getVpcId(); + if (vpcId == null) { + s_logger.error("Network " + network + " is not associated with any VPC"); + return routers; + } + + final Vpc vpc = _vpcMgr.getActiveVpc(vpcId); + if (vpc == null) { + s_logger.warn("Unable to find Enabled VPC by id " + vpcId); + return routers; + } + + final RouterDeploymentDefinition routerDeploymentDefinition = routerDeploymentDefinitionBuilder.create() + .setGuestNetwork(network) + .setVpc(vpc) + .setDeployDestination(dest) + .setAccountOwner(_accountMgr.getAccount(vpc.getAccountId())) + .build(); + + try { + routers = routerDeploymentDefinition.deployVirtualRouter(); + } catch (final ConcurrentOperationException e) { + s_logger.error("Error occurred when loading routers from routerDeploymentDefinition.deployVirtualRouter()!", e); + } catch (final InsufficientCapacityException e) { + s_logger.error("Error occurred when loading routers from routerDeploymentDefinition.deployVirtualRouter()!", e); + } catch (final ResourceUnavailableException e) { + s_logger.error("Error occurred when loading routers from routerDeploymentDefinition.deployVirtualRouter()!", e); + } + + return routers; + } + private static Map> setCapabilities() { final Map> capabilities = new HashMap>(); capabilities.putAll(VirtualRouterElement.capabilities); diff --git a/server/src/com/cloud/network/guru/GuestNetworkGuru.java b/server/src/com/cloud/network/guru/GuestNetworkGuru.java index 17b313c029a..25b1f54798e 100644 --- a/server/src/com/cloud/network/guru/GuestNetworkGuru.java +++ b/server/src/com/cloud/network/guru/GuestNetworkGuru.java @@ -62,6 +62,8 @@ import com.cloud.network.dao.NetworkDao; import com.cloud.network.dao.NetworkVO; import com.cloud.network.dao.PhysicalNetworkDao; import com.cloud.network.dao.PhysicalNetworkVO; +import com.cloud.network.vpc.Vpc; +import com.cloud.network.vpc.dao.VpcDao; import com.cloud.offering.NetworkOffering; import com.cloud.server.ConfigurationServer; import com.cloud.user.Account; @@ -83,6 +85,9 @@ import com.cloud.vm.dao.NicDao; @Local(value = NetworkGuru.class) public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGuru, Configurable { private static final Logger s_logger = Logger.getLogger(GuestNetworkGuru.class); + + @Inject + protected VpcDao _vpcDao; @Inject protected NetworkOrchestrationService _networkMgr; @Inject @@ -130,8 +135,8 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur } @Override - public boolean isMyTrafficType(TrafficType type) { - for (TrafficType t : TrafficTypes) { + public boolean isMyTrafficType(final TrafficType type) { + for (final TrafficType t : TrafficTypes) { if (t == type) { return true; } @@ -144,14 +149,14 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur return TrafficTypes; } - public boolean isMyIsolationMethod(PhysicalNetwork physicalNetwork) { + public boolean isMyIsolationMethod(final PhysicalNetwork physicalNetwork) { if (physicalNetwork == null) { // Can't tell if there is no physical network return false; } List methods = new ArrayList(); - for (String method : physicalNetwork.getIsolationMethods()) { + for (final String method : physicalNetwork.getIsolationMethods()) { methods.add(method.toLowerCase()); } if (methods.isEmpty()) { @@ -161,7 +166,7 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur methods.add("VLAN".toLowerCase()); } - for (IsolationMethod m : _isolationMethods) { + for (final IsolationMethod m : _isolationMethods) { if (methods.contains(m.toString().toLowerCase())) { return true; } @@ -177,19 +182,19 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur protected abstract boolean canHandle(NetworkOffering offering, final NetworkType networkType, PhysicalNetwork physicalNetwork); @Override - public Network design(NetworkOffering offering, DeploymentPlan plan, Network userSpecified, Account owner) { - DataCenter dc = _dcDao.findById(plan.getDataCenterId()); - PhysicalNetworkVO physnet = _physicalNetworkDao.findById(plan.getPhysicalNetworkId()); + public Network design(final NetworkOffering offering, final DeploymentPlan plan, final Network userSpecified, final Account owner) { + final DataCenter dc = _dcDao.findById(plan.getDataCenterId()); + final PhysicalNetworkVO physnet = _physicalNetworkDao.findById(plan.getPhysicalNetworkId()); if (!canHandle(offering, dc.getNetworkType(), physnet)) { return null; } - NetworkVO network = + final NetworkVO network = new NetworkVO(offering.getTrafficType(), Mode.Dhcp, BroadcastDomainType.Vlan, offering.getId(), State.Allocated, plan.getDataCenterId(), plan.getPhysicalNetworkId(), offering.getRedundantRouter()); if (userSpecified != null) { - if ((userSpecified.getCidr() == null && userSpecified.getGateway() != null) || (userSpecified.getCidr() != null && userSpecified.getGateway() == null)) { + if (userSpecified.getCidr() == null && userSpecified.getGateway() != null || userSpecified.getCidr() != null && userSpecified.getGateway() == null) { throw new InvalidParameterValueException("cidr and gateway must be specified together."); } @@ -197,9 +202,9 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur network.setCidr(userSpecified.getCidr()); network.setGateway(userSpecified.getGateway()); } else { - String guestNetworkCidr = dc.getGuestNetworkCidr(); + final String guestNetworkCidr = dc.getGuestNetworkCidr(); if (guestNetworkCidr != null) { - String[] cidrTuple = guestNetworkCidr.split("\\/"); + final String[] cidrTuple = guestNetworkCidr.split("\\/"); network.setGateway(NetUtils.getIpRangeStartIpFromCidr(cidrTuple[0], Long.parseLong(cidrTuple[1]))); network.setCidr(guestNetworkCidr); } else if (dc.getNetworkType() == NetworkType.Advanced) { @@ -212,11 +217,11 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur network.setState(State.Setup); } } else { - String guestNetworkCidr = dc.getGuestNetworkCidr(); + final String guestNetworkCidr = dc.getGuestNetworkCidr(); if (guestNetworkCidr == null && dc.getNetworkType() == NetworkType.Advanced) { throw new CloudRuntimeException("Can't design network " + network + "; guest CIDR is not configured per zone " + dc); } - String[] cidrTuple = guestNetworkCidr.split("\\/"); + final String[] cidrTuple = guestNetworkCidr.split("\\/"); network.setGateway(NetUtils.getIpRangeStartIpFromCidr(cidrTuple[0], Long.parseLong(cidrTuple[1]))); network.setCidr(guestNetworkCidr); } @@ -226,7 +231,7 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur @Override @DB - public void deallocate(Network network, NicProfile nic, VirtualMachineProfile vm) { + public void deallocate(final Network network, final NicProfile nic, final VirtualMachineProfile vm) { if (network.getSpecifyIpRanges()) { if (s_logger.isDebugEnabled()) { s_logger.debug("Deallocate network: networkId: " + nic.getNetworkId() + ", ip: " + nic.getIp4Address()); @@ -236,7 +241,7 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur if (ip != null) { Transaction.execute(new TransactionCallbackNoReturn() { @Override - public void doInTransactionWithoutResult(TransactionStatus status) { + public void doInTransactionWithoutResult(final TransactionStatus status) { _ipAddrMgr.markIpAsUnavailable(ip.getId()); _ipAddressDao.unassignIpAddress(ip.getId()); } @@ -246,8 +251,8 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur } } - public int getVlanOffset(long physicalNetworkId, int vlanTag) { - PhysicalNetworkVO pNetwork = _physicalNetworkDao.findById(physicalNetworkId); + public int getVlanOffset(final long physicalNetworkId, final int vlanTag) { + final PhysicalNetworkVO pNetwork = _physicalNetworkDao.findById(physicalNetworkId); if (pNetwork == null) { throw new CloudRuntimeException("Could not find the physical Network " + physicalNetworkId + "."); } @@ -256,9 +261,9 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur throw new CloudRuntimeException("Could not find vlan range for physical Network " + physicalNetworkId + "."); } Integer lowestVlanTag = null; - List> vnetList = pNetwork.getVnet(); + final List> vnetList = pNetwork.getVnet(); //finding the vlanrange in which the vlanTag lies. - for (Pair vnet : vnetList) { + for (final Pair vnet : vnetList) { if (vlanTag >= vnet.first() && vlanTag <= vnet.second()) { lowestVlanTag = vnet.first(); } @@ -271,17 +276,17 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur public int getGloballyConfiguredCidrSize() { try { - String globalVlanBits = _configDao.getValue(Config.GuestVlanBits.key()); + final String globalVlanBits = _configDao.getValue(Config.GuestVlanBits.key()); return 8 + Integer.parseInt(globalVlanBits); - } catch (Exception e) { + } catch (final Exception e) { throw new CloudRuntimeException("Failed to read the globally configured VLAN bits size."); } } - protected void allocateVnet(Network network, NetworkVO implemented, long dcId, long physicalNetworkId, String reservationId) + protected void allocateVnet(final Network network, final NetworkVO implemented, final long dcId, final long physicalNetworkId, final String reservationId) throws InsufficientVirtualNetworkCapacityException { if (network.getBroadcastUri() == null) { - String vnet = _dcDao.allocateVnet(dcId, physicalNetworkId, network.getAccountId(), reservationId, UseSystemGuestVlans.valueIn(network.getAccountId())); + final String vnet = _dcDao.allocateVnet(dcId, physicalNetworkId, network.getAccountId(), reservationId, UseSystemGuestVlans.valueIn(network.getAccountId())); if (vnet == null) { throw new InsufficientVirtualNetworkCapacityException("Unable to allocate vnet as a " + "part of network " + network + " implement ", DataCenter.class, dcId); @@ -295,11 +300,11 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur } @Override - public Network implement(Network network, NetworkOffering offering, DeployDestination dest, ReservationContext context) + public Network implement(final Network network, final NetworkOffering offering, final DeployDestination dest, final ReservationContext context) throws InsufficientVirtualNetworkCapacityException { - assert (network.getState() == State.Implementing) : "Why are we implementing " + network; + assert network.getState() == State.Implementing : "Why are we implementing " + network; - long dcId = dest.getDataCenter().getId(); + final long dcId = dest.getDataCenter().getId(); //get physical network id Long physicalNetworkId = network.getPhysicalNetworkId(); @@ -309,7 +314,7 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur physicalNetworkId = _networkModel.findPhysicalNetworkId(dcId, offering.getTags(), offering.getTrafficType()); } - NetworkVO implemented = + final NetworkVO implemented = new NetworkVO(network.getTrafficType(), network.getMode(), network.getBroadcastDomainType(), network.getNetworkOfferingId(), State.Allocated, network.getDataCenterId(), physicalNetworkId, offering.getRedundantRouter()); @@ -326,16 +331,16 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur } @Override - public NicProfile allocate(Network network, NicProfile nic, VirtualMachineProfile vm) throws InsufficientVirtualNetworkCapacityException, + public NicProfile allocate(final Network network, NicProfile nic, final VirtualMachineProfile vm) throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException { - assert (network.getTrafficType() == TrafficType.Guest) : "Look at my name! Why are you calling" + " me when the traffic type is : " + network.getTrafficType(); + assert network.getTrafficType() == TrafficType.Guest : "Look at my name! Why are you calling" + " me when the traffic type is : " + network.getTrafficType(); if (nic == null) { nic = new NicProfile(ReservationStrategy.Start, null, null, null, null); } - DataCenter dc = _dcDao.findById(network.getDataCenterId()); + final DataCenter dc = _dcDao.findById(network.getDataCenterId()); if (nic.getIp4Address() == null) { nic.setBroadcastUri(network.getBroadcastUri()); @@ -350,7 +355,9 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur boolean isGateway = false; if (vm.getVirtualMachine().getType() == VirtualMachine.Type.DomainRouter) { if (network.getVpcId() != null) { - if (_networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.SourceNat, Provider.VPCVirtualRouter)) { + final Vpc vpc = _vpcDao.findById(network.getVpcId()); + // Redundant Networks need a guest IP that is not the same as the gateway IP. + if (_networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.SourceNat, Provider.VPCVirtualRouter) && !vpc.isRedundant()) { isGateway = true; } } else { @@ -392,8 +399,8 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur } @Override - public void updateNicProfile(NicProfile profile, Network network) { - DataCenter dc = _dcDao.findById(network.getDataCenterId()); + public void updateNicProfile(final NicProfile profile, final Network network) { + final DataCenter dc = _dcDao.findById(network.getDataCenterId()); if (profile != null) { profile.setDns1(dc.getDns1()); profile.setDns2(dc.getDns2()); @@ -401,23 +408,23 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur } @Override - public void reserve(NicProfile nic, Network network, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) + public void reserve(final NicProfile nic, final Network network, final VirtualMachineProfile vm, final DeployDestination dest, final ReservationContext context) throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException { - assert (nic.getReservationStrategy() == ReservationStrategy.Start) : "What can I do for nics that are not allocated at start? "; + assert nic.getReservationStrategy() == ReservationStrategy.Start : "What can I do for nics that are not allocated at start? "; nic.setBroadcastUri(network.getBroadcastUri()); nic.setIsolationUri(network.getBroadcastUri()); } @Override - public boolean release(NicProfile nic, VirtualMachineProfile vm, String reservationId) { + public boolean release(final NicProfile nic, final VirtualMachineProfile vm, final String reservationId) { nic.setBroadcastUri(null); nic.setIsolationUri(null); return true; } @Override - public void shutdown(NetworkProfile profile, NetworkOffering offering) { + public void shutdown(final NetworkProfile profile, final NetworkOffering offering) { if (profile.getBroadcastUri() == null) { return; // Nothing to do here if the uri is null already } @@ -434,13 +441,13 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur } @Override - public boolean trash(Network network, NetworkOffering offering) { + public boolean trash(final Network network, final NetworkOffering offering) { return true; } @Override - public void updateNetworkProfile(NetworkProfile networkProfile) { - DataCenter dc = _dcDao.findById(networkProfile.getDataCenterId()); + public void updateNetworkProfile(final NetworkProfile networkProfile) { + final DataCenter dc = _dcDao.findById(networkProfile.getDataCenterId()); networkProfile.setDns1(dc.getDns1()); networkProfile.setDns2(dc.getDns2()); } diff --git a/server/src/com/cloud/network/router/NetworkHelper.java b/server/src/com/cloud/network/router/NetworkHelper.java index 4ee5b853cd9..073f32f3d84 100644 --- a/server/src/com/cloud/network/router/NetworkHelper.java +++ b/server/src/com/cloud/network/router/NetworkHelper.java @@ -31,7 +31,9 @@ import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.InsufficientServerCapacityException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.exception.StorageUnavailableException; +import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.network.Network; +import com.cloud.storage.VMTemplateVO; import com.cloud.user.Account; import com.cloud.user.User; import com.cloud.vm.DomainRouterVO; @@ -81,6 +83,12 @@ public interface NetworkHelper { InsufficientServerCapacityException, InsufficientCapacityException, StorageUnavailableException, ResourceUnavailableException; - public abstract LinkedHashMap> createRouterNetworks(RouterDeploymentDefinition routerDeploymentDefinition) + public abstract void reallocateRouterNetworks(RouterDeploymentDefinition routerDeploymentDefinition, VirtualRouter router, VMTemplateVO template, HypervisorType hType) + throws ConcurrentOperationException, InsufficientAddressCapacityException, InsufficientCapacityException; + + public abstract LinkedHashMap> configureDefaultNics(RouterDeploymentDefinition routerDeploymentDefinition) + throws ConcurrentOperationException, InsufficientAddressCapacityException; + + public abstract LinkedHashMap> configureGuestNic(RouterDeploymentDefinition routerDeploymentDefinition) throws ConcurrentOperationException, InsufficientAddressCapacityException; } \ No newline at end of file diff --git a/server/src/com/cloud/network/router/NetworkHelperImpl.java b/server/src/com/cloud/network/router/NetworkHelperImpl.java index d99898e526c..265d4cc7d3c 100644 --- a/server/src/com/cloud/network/router/NetworkHelperImpl.java +++ b/server/src/com/cloud/network/router/NetworkHelperImpl.java @@ -28,7 +28,6 @@ import javax.annotation.PostConstruct; import javax.ejb.Local; import javax.inject.Inject; -import com.cloud.user.dao.UserDao; import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; import org.apache.cloudstack.framework.config.ConfigKey; @@ -87,6 +86,7 @@ import com.cloud.storage.dao.VolumeDao; import com.cloud.user.Account; import com.cloud.user.AccountManager; import com.cloud.user.User; +import com.cloud.user.dao.UserDao; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.net.NetUtils; import com.cloud.vm.DomainRouterVO; @@ -121,8 +121,6 @@ public class NetworkHelperImpl implements NetworkHelper { @Inject protected NetworkModel _networkModel; @Inject - private VirtualMachineManager _itMgr; - @Inject private AccountManager _accountMgr; @Inject private Site2SiteVpnManager _s2sVpnMgr; @@ -131,8 +129,6 @@ public class NetworkHelperImpl implements NetworkHelper { @Inject private VolumeDao _volumeDao; @Inject - private ServiceOfferingDao _serviceOfferingDao; - @Inject private VMTemplateDao _templateDao; @Inject private ResourceManager _resourceMgr; @@ -141,8 +137,6 @@ public class NetworkHelperImpl implements NetworkHelper { @Inject protected IPAddressDao _ipAddressDao; @Inject - private IpAddressManager _ipAddrMgr; - @Inject private UserIpv6AddressDao _ipv6Dao; @Inject private RouterControlHelper _routerControlHelper; @@ -150,6 +144,11 @@ public class NetworkHelperImpl implements NetworkHelper { protected NetworkOrchestrationService _networkMgr; @Inject private UserDao _userDao; + protected ServiceOfferingDao _serviceOfferingDao; + @Inject + protected VirtualMachineManager _itMgr; + @Inject + protected IpAddressManager _ipAddrMgr; protected final Map> hypervisorsMap = new HashMap<>(); @@ -288,7 +287,7 @@ public class NetworkHelperImpl implements NetworkHelper { if (router.getTemplateVersion() == null) { return false; } - long dcid = router.getDataCenterId(); + final long dcid = router.getDataCenterId(); final String trimmedVersion = Version.trimRouterVersion(router.getTemplateVersion()); return Version.compare(trimmedVersion, NetworkOrchestrationService.MinVRVersion.valueIn(dcid)) >= 0; } @@ -531,9 +530,7 @@ public class NetworkHelperImpl implements NetworkHelper { router.setRole(Role.VIRTUAL_ROUTER); router = _routerDao.persist(router); - final LinkedHashMap> networks = createRouterNetworks(routerDeploymentDefinition); - - _itMgr.allocate(router.getInstanceName(), template, routerOffering, networks, routerDeploymentDefinition.getPlan(), null); + reallocateRouterNetworks(routerDeploymentDefinition, router, template, null); router = _routerDao.findById(router.getId()); } catch (final InsufficientCapacityException ex) { if (allocateRetry < 2 && iter.hasNext()) { @@ -645,13 +642,66 @@ public class NetworkHelperImpl implements NetworkHelper { } @Override - public LinkedHashMap> createRouterNetworks(final RouterDeploymentDefinition routerDeploymentDefinition) + public LinkedHashMap> configureDefaultNics(final RouterDeploymentDefinition routerDeploymentDefinition) throws ConcurrentOperationException, InsufficientAddressCapacityException { + + final LinkedHashMap> networks = configureGuestNic(routerDeploymentDefinition); + + // 2) Control network + s_logger.debug("Adding nic for Virtual Router in Control network "); + final List offerings = _networkModel.getSystemAccountNetworkOfferings(NetworkOffering.SystemControlNetwork); + final NetworkOffering controlOffering = offerings.get(0); + final Network controlConfig = _networkMgr.setupNetwork(s_systemAccount, controlOffering, routerDeploymentDefinition.getPlan(), null, null, false).get(0); + networks.put(controlConfig, new ArrayList()); + // 3) Public network + if (routerDeploymentDefinition.isPublicNetwork()) { + s_logger.debug("Adding nic for Virtual Router in Public network "); + // if source nat service is supported by the network, get the source + // nat ip address + final NicProfile defaultNic = new NicProfile(); + defaultNic.setDefaultNic(true); + final PublicIp sourceNatIp = routerDeploymentDefinition.getSourceNatIP(); + defaultNic.setIp4Address(sourceNatIp.getAddress().addr()); + defaultNic.setGateway(sourceNatIp.getGateway()); + defaultNic.setNetmask(sourceNatIp.getNetmask()); + defaultNic.setMacAddress(sourceNatIp.getMacAddress()); + // get broadcast from public network + final Network pubNet = _networkDao.findById(sourceNatIp.getNetworkId()); + if (pubNet.getBroadcastDomainType() == BroadcastDomainType.Vxlan) { + defaultNic.setBroadcastType(BroadcastDomainType.Vxlan); + defaultNic.setBroadcastUri(BroadcastDomainType.Vxlan.toUri(sourceNatIp.getVlanTag())); + defaultNic.setIsolationUri(BroadcastDomainType.Vxlan.toUri(sourceNatIp.getVlanTag())); + } else { + defaultNic.setBroadcastType(BroadcastDomainType.Vlan); + defaultNic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(sourceNatIp.getVlanTag())); + defaultNic.setIsolationUri(IsolationType.Vlan.toUri(sourceNatIp.getVlanTag())); + } + //If guest nic has already been addedd we will have 2 devices in the list. + if (networks.size() > 1) { + defaultNic.setDeviceId(2); + } + final NetworkOffering publicOffering = _networkModel.getSystemAccountNetworkOfferings(NetworkOffering.SystemPublicNetwork).get(0); + final List publicNetworks = _networkMgr.setupNetwork(s_systemAccount, publicOffering, routerDeploymentDefinition.getPlan(), null, null, false); + final String publicIp = defaultNic.getIp4Address(); + // We want to use the identical MAC address for RvR on public + // interface if possible + final NicVO peerNic = _nicDao.findByIp4AddressAndNetworkId(publicIp, publicNetworks.get(0).getId()); + if (peerNic != null) { + s_logger.info("Use same MAC as previous RvR, the MAC is " + peerNic.getMacAddress()); + defaultNic.setMacAddress(peerNic.getMacAddress()); + } + networks.put(publicNetworks.get(0), new ArrayList(Arrays.asList(defaultNic))); + } + + return networks; + } + + @Override + public LinkedHashMap> configureGuestNic(final RouterDeploymentDefinition routerDeploymentDefinition) throws ConcurrentOperationException, InsufficientAddressCapacityException { // Form networks final LinkedHashMap> networks = new LinkedHashMap>(3); // 1) Guest network - boolean hasGuestNetwork = false; final Network guestNetwork = routerDeploymentDefinition.getGuestNetwork(); if (guestNetwork != null) { @@ -711,57 +761,20 @@ public class NetworkHelperImpl implements NetworkHelper { } networks.put(guestNetwork, new ArrayList(Arrays.asList(gatewayNic))); - hasGuestNetwork = true; } - - // 2) Control network - s_logger.debug("Adding nic for Virtual Router in Control network "); - final List offerings = _networkModel.getSystemAccountNetworkOfferings(NetworkOffering.SystemControlNetwork); - final NetworkOffering controlOffering = offerings.get(0); - final Network controlConfig = _networkMgr.setupNetwork(s_systemAccount, controlOffering, routerDeploymentDefinition.getPlan(), null, null, false).get(0); - networks.put(controlConfig, new ArrayList()); - // 3) Public network - if (routerDeploymentDefinition.isPublicNetwork()) { - s_logger.debug("Adding nic for Virtual Router in Public network "); - // if source nat service is supported by the network, get the source - // nat ip address - final NicProfile defaultNic = new NicProfile(); - defaultNic.setDefaultNic(true); - final PublicIp sourceNatIp = routerDeploymentDefinition.getSourceNatIP(); - defaultNic.setIp4Address(sourceNatIp.getAddress().addr()); - defaultNic.setGateway(sourceNatIp.getGateway()); - defaultNic.setNetmask(sourceNatIp.getNetmask()); - defaultNic.setMacAddress(sourceNatIp.getMacAddress()); - // get broadcast from public network - final Network pubNet = _networkDao.findById(sourceNatIp.getNetworkId()); - if (pubNet.getBroadcastDomainType() == BroadcastDomainType.Vxlan) { - defaultNic.setBroadcastType(BroadcastDomainType.Vxlan); - defaultNic.setBroadcastUri(BroadcastDomainType.Vxlan.toUri(sourceNatIp.getVlanTag())); - defaultNic.setIsolationUri(BroadcastDomainType.Vxlan.toUri(sourceNatIp.getVlanTag())); - } else { - defaultNic.setBroadcastType(BroadcastDomainType.Vlan); - defaultNic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(sourceNatIp.getVlanTag())); - defaultNic.setIsolationUri(IsolationType.Vlan.toUri(sourceNatIp.getVlanTag())); - } - if (hasGuestNetwork) { - defaultNic.setDeviceId(2); - } - final NetworkOffering publicOffering = _networkModel.getSystemAccountNetworkOfferings(NetworkOffering.SystemPublicNetwork).get(0); - final List publicNetworks = _networkMgr.setupNetwork(s_systemAccount, publicOffering, routerDeploymentDefinition.getPlan(), null, null, false); - final String publicIp = defaultNic.getIp4Address(); - // We want to use the identical MAC address for RvR on public - // interface if possible - final NicVO peerNic = _nicDao.findByIp4AddressAndNetworkId(publicIp, publicNetworks.get(0).getId()); - if (peerNic != null) { - s_logger.info("Use same MAC as previous RvR, the MAC is " + peerNic.getMacAddress()); - defaultNic.setMacAddress(peerNic.getMacAddress()); - } - networks.put(publicNetworks.get(0), new ArrayList(Arrays.asList(defaultNic))); - } - return networks; } + @Override + public void reallocateRouterNetworks(final RouterDeploymentDefinition routerDeploymentDefinition, final VirtualRouter router, final VMTemplateVO template, final HypervisorType hType) + throws ConcurrentOperationException, InsufficientCapacityException { + final ServiceOfferingVO routerOffering = _serviceOfferingDao.findById(routerDeploymentDefinition.getServiceOfferingId()); + + final LinkedHashMap> networks = configureDefaultNics(routerDeploymentDefinition); + + _itMgr.allocate(router.getInstanceName(), template, routerOffering, networks, routerDeploymentDefinition.getPlan(), hType); + } + public static void setSystemAccount(final Account systemAccount) { s_systemAccount = systemAccount; } diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index 462e1ae9142..278164b43b1 100644 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -2632,8 +2632,11 @@ Configurable, StateListener { protected boolean aggregationExecution(final AggregationControlCommand.Action action, final Network network, final List routers) throws AgentUnavailableException, ResourceUnavailableException { for (final DomainRouterVO router : routers) { - final AggregationControlCommand cmd = new AggregationControlCommand(action, router.getInstanceName(), _routerControlHelper.getRouterControlIp(router.getId()), _routerControlHelper.getRouterIpInNetwork( - network.getId(), router.getId())); + + final String routerControlIp = _routerControlHelper.getRouterControlIp(router.getId()); + final String routerIpInNetwork = _routerControlHelper.getRouterIpInNetwork(network.getId(), router.getId()); + + final AggregationControlCommand cmd = new AggregationControlCommand(action, router.getInstanceName(), routerControlIp, routerIpInNetwork); final Commands cmds = new Commands(cmd); if (!_nwHelper.sendCommandsToRouter(router, cmds)) { return false; diff --git a/server/src/com/cloud/network/router/VpcNetworkHelperImpl.java b/server/src/com/cloud/network/router/VpcNetworkHelperImpl.java index 58537d112be..069937d4027 100644 --- a/server/src/com/cloud/network/router/VpcNetworkHelperImpl.java +++ b/server/src/com/cloud/network/router/VpcNetworkHelperImpl.java @@ -32,7 +32,7 @@ import org.cloud.network.router.deployment.RouterDeploymentDefinition; import com.cloud.dc.dao.VlanDao; import com.cloud.exception.ConcurrentOperationException; -import com.cloud.exception.InsufficientAddressCapacityException; +import com.cloud.exception.InsufficientCapacityException; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.network.IpAddress; import com.cloud.network.Network; @@ -43,6 +43,8 @@ import com.cloud.network.dao.IPAddressVO; import com.cloud.network.vpc.PrivateGateway; import com.cloud.network.vpc.VpcManager; import com.cloud.offering.NetworkOffering; +import com.cloud.service.ServiceOfferingVO; +import com.cloud.storage.VMTemplateVO; import com.cloud.vm.NicProfile; @@ -76,37 +78,34 @@ public class VpcNetworkHelperImpl extends NetworkHelperImpl { } @Override - public LinkedHashMap> createRouterNetworks( - final RouterDeploymentDefinition vpcRouterDeploymentDefinition) - throws ConcurrentOperationException, InsufficientAddressCapacityException { + public void reallocateRouterNetworks(final RouterDeploymentDefinition vpcRouterDeploymentDefinition, final VirtualRouter router, final VMTemplateVO template, final HypervisorType hType) + throws ConcurrentOperationException, InsufficientCapacityException { final TreeSet publicVlans = new TreeSet(); publicVlans.add(vpcRouterDeploymentDefinition.getSourceNatIP().getVlanTag()); //1) allocate nic for control and source nat public ip - final LinkedHashMap> networks = - super.createRouterNetworks(vpcRouterDeploymentDefinition); - + final LinkedHashMap> networks = configureDefaultNics(vpcRouterDeploymentDefinition); final Long vpcId = vpcRouterDeploymentDefinition.getVpc().getId(); //2) allocate nic for private gateways if needed final List privateGateways = vpcMgr.getVpcPrivateGateways(vpcId); if (privateGateways != null && !privateGateways.isEmpty()) { - for (PrivateGateway privateGateway : privateGateways) { - NicProfile privateNic = nicProfileHelper.createPrivateNicProfileForGateway(privateGateway); - Network privateNetwork = _networkModel.getNetwork(privateGateway.getNetworkId()); + for (final PrivateGateway privateGateway : privateGateways) { + final NicProfile privateNic = nicProfileHelper.createPrivateNicProfileForGateway(privateGateway); + final Network privateNetwork = _networkModel.getNetwork(privateGateway.getNetworkId()); networks.put(privateNetwork, new ArrayList(Arrays.asList(privateNic))); } } //3) allocate nic for guest gateway if needed - List guestNetworks = vpcMgr.getVpcNetworks(vpcId); - for (Network guestNetwork : guestNetworks) { + final List guestNetworks = vpcMgr.getVpcNetworks(vpcId); + for (final Network guestNetwork : guestNetworks) { if (_networkModel.isPrivateGateway(guestNetwork.getId())) { continue; } if (guestNetwork.getState() == Network.State.Implemented || guestNetwork.getState() == Network.State.Setup) { - NicProfile guestNic = nicProfileHelper.createGuestNicProfileForVpcRouter(guestNetwork); + final NicProfile guestNic = nicProfileHelper.createGuestNicProfileForVpcRouter(guestNetwork); networks.put(guestNetwork, new ArrayList(Arrays.asList(guestNic))); } } @@ -115,12 +114,12 @@ public class VpcNetworkHelperImpl extends NetworkHelperImpl { final List ips = _ipAddressDao.listByAssociatedVpc(vpcId, false); final List publicNics = new ArrayList(); Network publicNetwork = null; - for (IPAddressVO ip : ips) { - PublicIp publicIp = PublicIp.createFromAddrAndVlan(ip, _vlanDao.findById(ip.getVlanId())); + for (final IPAddressVO ip : ips) { + final PublicIp publicIp = PublicIp.createFromAddrAndVlan(ip, _vlanDao.findById(ip.getVlanId())); if ((ip.getState() == IpAddress.State.Allocated || ip.getState() == IpAddress.State.Allocating) && vpcMgr.isIpAllocatedToVpc(ip) && !publicVlans.contains(publicIp.getVlanTag())) { s_logger.debug("Allocating nic for router in vlan " + publicIp.getVlanTag()); - NicProfile publicNic = new NicProfile(); + final NicProfile publicNic = new NicProfile(); publicNic.setDefaultNic(false); publicNic.setIp4Address(publicIp.getAddress().addr()); publicNic.setGateway(publicIp.getGateway()); @@ -129,9 +128,9 @@ public class VpcNetworkHelperImpl extends NetworkHelperImpl { publicNic.setBroadcastType(BroadcastDomainType.Vlan); publicNic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(publicIp.getVlanTag())); publicNic.setIsolationUri(IsolationType.Vlan.toUri(publicIp.getVlanTag())); - NetworkOffering publicOffering = _networkModel.getSystemAccountNetworkOfferings(NetworkOffering.SystemPublicNetwork).get(0); + final NetworkOffering publicOffering = _networkModel.getSystemAccountNetworkOfferings(NetworkOffering.SystemPublicNetwork).get(0); if (publicNetwork == null) { - List publicNetworks = _networkMgr.setupNetwork(s_systemAccount, publicOffering, vpcRouterDeploymentDefinition.getPlan(), null, null, false); + final List publicNetworks = _networkMgr.setupNetwork(s_systemAccount, publicOffering, vpcRouterDeploymentDefinition.getPlan(), null, null, false); publicNetwork = publicNetworks.get(0); } publicNics.add(publicNic); @@ -141,6 +140,7 @@ public class VpcNetworkHelperImpl extends NetworkHelperImpl { if (publicNetwork != null) { if (networks.get(publicNetwork) != null) { @SuppressWarnings("unchecked") + final List publicNicProfiles = (List)networks.get(publicNetwork); publicNicProfiles.addAll(publicNics); networks.put(publicNetwork, publicNicProfiles); @@ -149,6 +149,8 @@ public class VpcNetworkHelperImpl extends NetworkHelperImpl { } } - return networks; + final ServiceOfferingVO routerOffering = _serviceOfferingDao.findById(vpcRouterDeploymentDefinition.getServiceOfferingId()); + + _itMgr.allocate(router.getInstanceName(), template, routerOffering, networks, vpcRouterDeploymentDefinition.getPlan(), hType); } } \ No newline at end of file diff --git a/server/src/org/cloud/network/router/deployment/RouterDeploymentDefinitionBuilder.java b/server/src/org/cloud/network/router/deployment/RouterDeploymentDefinitionBuilder.java index 2ad9483145f..33ed9d093a1 100644 --- a/server/src/org/cloud/network/router/deployment/RouterDeploymentDefinitionBuilder.java +++ b/server/src/org/cloud/network/router/deployment/RouterDeploymentDefinitionBuilder.java @@ -194,7 +194,7 @@ public class RouterDeploymentDefinitionBuilder { public RouterDeploymentDefinition build() { RouterDeploymentDefinition routerDeploymentDefinition = null; if (vpc != null) { - routerDeploymentDefinition = new VpcRouterDeploymentDefinition(vpc, dest, owner, params); + routerDeploymentDefinition = new VpcRouterDeploymentDefinition(guestNetwork, vpc, dest, owner, params); } else { routerDeploymentDefinition = new RouterDeploymentDefinition(guestNetwork, dest, owner, params); } diff --git a/server/src/org/cloud/network/router/deployment/VpcRouterDeploymentDefinition.java b/server/src/org/cloud/network/router/deployment/VpcRouterDeploymentDefinition.java index 8452d7f76de..514c37c43b1 100644 --- a/server/src/org/cloud/network/router/deployment/VpcRouterDeploymentDefinition.java +++ b/server/src/org/cloud/network/router/deployment/VpcRouterDeploymentDefinition.java @@ -29,6 +29,7 @@ import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.Network; import com.cloud.network.PhysicalNetwork; import com.cloud.network.PhysicalNetworkServiceProvider; import com.cloud.network.VirtualRouterProvider.Type; @@ -53,10 +54,10 @@ public class VpcRouterDeploymentDefinition extends RouterDeploymentDefinition { protected Vpc vpc; - protected VpcRouterDeploymentDefinition(final Vpc vpc, final DeployDestination dest, final Account owner, + protected VpcRouterDeploymentDefinition(final Network guestNetwork, final Vpc vpc, final DeployDestination dest, final Account owner, final Map params) { - super(null, dest, owner, params); + super(guestNetwork, dest, owner, params); this.vpc = vpc; } @@ -197,7 +198,7 @@ public class VpcRouterDeploymentDefinition extends RouterDeploymentDefinition { } @Override - protected void generateDeploymentPlan() { + public void generateDeploymentPlan() { plan = new DataCenterDeployment(dest.getDataCenter().getId()); } diff --git a/systemvm/patches/debian/config/opt/cloud/bin/cs/CsDhcp.py b/systemvm/patches/debian/config/opt/cloud/bin/cs/CsDhcp.py index 33452e00d46..173be470d2d 100644 --- a/systemvm/patches/debian/config/opt/cloud/bin/cs/CsDhcp.py +++ b/systemvm/patches/debian/config/opt/cloud/bin/cs/CsDhcp.py @@ -111,7 +111,7 @@ class CsDhcp(CsDataBag): for o in leases: if o['del']: - cmd = "dhcp_release eth%s %s %s" % (o.device, o.ip, o.mac) + cmd = "dhcp_release eth%s %s %s" % (o['device'], o['ip'], o['mac']) logging.info(cmd) CsHelper.execute(cmd) except IOError: diff --git a/systemvm/patches/debian/config/opt/cloud/templates/keepalived.conf.templ b/systemvm/patches/debian/config/opt/cloud/templates/keepalived.conf.templ index 34d233c5e84..a79f207586b 100644 --- a/systemvm/patches/debian/config/opt/cloud/templates/keepalived.conf.templ +++ b/systemvm/patches/debian/config/opt/cloud/templates/keepalived.conf.templ @@ -52,7 +52,7 @@ vrrp_instance inside_network { } !That's the correct path of the master.py file. - notify_master "/root/cloud_scripts/opt/cloud/bin/master.py --master" - notify_backup "/root/cloud_scripts/opt/cloud/bin/master.py --backup" - notify_fault "/root/cloud_scripts/opt/cloud/bin/master.py --fault" + !notify_master "/opt/cloud/bin/master.py --master" + !notify_backup "/opt/cloud/bin/master.py --backup" + !notify_fault "/opt/cloud/bin/master.py --fault" }