adding setupPrivateGateway to new style; removing methods from Vpc appliance; changing the way VpcElement calls the command;
there is still work tob e done with the destroyPrivateGateway rule. Conflicts: server/src/com/cloud/network/rules/VirtualNetworkApplianceFactory.java server/src/org/apache/cloudstack/network/topology/BasicNetworkTopology.java server/src/org/apache/cloudstack/network/topology/NetworkTopology.java Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/07be4945 Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/07be4945 Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/07be4945 Branch: refs/heads/vpc-refactor Commit: 07be4945df7edd4d4a7487fa626bc6c691ee18e9 Parents: 5489130 Author: wrodrigues <wrodrig...@schubergphilis.com> Authored: Wed Aug 20 18:13:33 2014 +0200 Committer: Wilder Rodrigues <wrodrig...@schubergphilis.com> Committed: Fri Oct 3 06:21:27 2014 +0200 ---------------------------------------------------------------------- .../element/VpcVirtualRouterElement.java | 5 +- .../VpcVirtualNetworkApplianceManager.java | 9 -- .../VpcVirtualNetworkApplianceManagerImpl.java | 36 ----- .../network/rules/PrivateGatewayRules.java | 156 ++++++++++++++++++- .../com/cloud/network/rules/RuleApplier.java | 9 ++ .../rules/VirtualNetworkApplianceFactory.java | 47 +++++- .../topology/AdvancedNetworkTopology.java | 12 ++ .../topology/AdvancedNetworkVisitor.java | 47 +++++- .../network/topology/BasicNetworkTopology.java | 15 +- .../network/topology/NetworkTopology.java | 17 +- .../MockVpcVirtualNetworkApplianceManager.java | 9 -- 11 files changed, 286 insertions(+), 76 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/07be4945/server/src/com/cloud/network/element/VpcVirtualRouterElement.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/network/element/VpcVirtualRouterElement.java b/server/src/com/cloud/network/element/VpcVirtualRouterElement.java index 5504df3..0f11c73 100644 --- a/server/src/com/cloud/network/element/VpcVirtualRouterElement.java +++ b/server/src/com/cloud/network/element/VpcVirtualRouterElement.java @@ -384,8 +384,11 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc } VirtualRouter router = routers.get(0); + + DataCenterVO dcVO = _dcDao.findById(gateway.getZoneId()); + NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); - if (_vpcRouterMgr.setupPrivateGateway(gateway, router)) { + if (networkTopology.setupPrivateGateway(gateway, router)) { try { List<NetworkACLItemVO> rules = _networkACLItemDao.listByACL(gateway.getNetworkACLId()); if (!applyACLItemsToPrivateGw(gateway, rules)) { http://git-wip-us.apache.org/repos/asf/cloudstack/blob/07be4945/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManager.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManager.java b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManager.java index 7aecba5..5785263 100644 --- a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManager.java +++ b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManager.java @@ -32,15 +32,6 @@ public interface VpcVirtualNetworkApplianceManager extends VirtualNetworkApplian /** * @param gateway - * @param router TODO - * @return - * @throws ResourceUnavailableException - * @throws ConcurrentOperationException - */ - boolean setupPrivateGateway(PrivateGateway gateway, VirtualRouter router) throws ConcurrentOperationException, ResourceUnavailableException; - - /** - * @param gateway * @param router * @return * @throws ResourceUnavailableException http://git-wip-us.apache.org/repos/asf/cloudstack/blob/07be4945/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java index 1edea75..99ed723 100644 --- a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java @@ -649,42 +649,6 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian return _nwHelper.sendCommandsToRouter(router, cmds); } - @Override - public boolean setupPrivateGateway(final PrivateGateway gateway, final VirtualRouter router) throws ConcurrentOperationException, ResourceUnavailableException { - boolean result = true; - try { - Network network = _networkModel.getNetwork(gateway.getNetworkId()); - NicProfile requested = vpcHelper.createPrivateNicProfileForGateway(gateway); - - if (!_nwHelper.checkRouterVersion(router)) { - s_logger.warn("Router requires upgrade. Unable to send command to router: " + router.getId()); - return false; - } - NicProfile guestNic = _itMgr.addVmToNetwork(router, network, requested); - - //setup source nat - if (guestNic != null) { - result = setupVpcPrivateNetwork(router, true, guestNic); - } else { - s_logger.warn("Failed to setup gateway " + gateway + " on router " + router + " with the source nat"); - result = false; - } - } catch (Exception ex) { - s_logger.warn("Failed to create private gateway " + gateway + " on router " + router + " due to ", ex); - result = false; - } finally { - if (!result) { - s_logger.debug("Removing gateway " + gateway + " from router " + router + " as a part of cleanup"); - if (destroyPrivateGateway(gateway, router)) { - s_logger.debug("Removed the gateway " + gateway + " from router " + router + " as a part of cleanup"); - } else { - s_logger.warn("Failed to remove the gateway " + gateway + " from router " + router + " as a part of cleanup"); - } - } - } - return result; - } - /** * @param router * @param add http://git-wip-us.apache.org/repos/asf/cloudstack/blob/07be4945/server/src/com/cloud/network/rules/PrivateGatewayRules.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/network/rules/PrivateGatewayRules.java b/server/src/com/cloud/network/rules/PrivateGatewayRules.java index 364aded..f7a88ea 100644 --- a/server/src/com/cloud/network/rules/PrivateGatewayRules.java +++ b/server/src/com/cloud/network/rules/PrivateGatewayRules.java @@ -17,32 +17,172 @@ package com.cloud.network.rules; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.apache.cloudstack.network.topology.NetworkTopologyVisitor; +import org.apache.log4j.Logger; +import com.cloud.agent.api.routing.IpAssocVpcCommand; +import com.cloud.agent.api.routing.NetworkElementCommand; +import com.cloud.agent.api.to.IpAddressTO; +import com.cloud.agent.manager.Commands; +import com.cloud.dc.DataCenterVO; +import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.Network; import com.cloud.network.router.VirtualRouter; -import com.cloud.network.vpc.NetworkACLItem; +import com.cloud.network.vpc.PrivateGateway; +import com.cloud.network.vpc.PrivateIpAddress; +import com.cloud.network.vpc.PrivateIpVO; +import com.cloud.user.Account; +import com.cloud.vm.NicProfile; public class PrivateGatewayRules extends RuleApplier { - private final List<? extends NetworkACLItem> rules; + private static final Logger s_logger = Logger.getLogger(PrivateGatewayRules.class); + + private final PrivateGateway _privateGateway; + + private boolean _isAddOperation; + private NicProfile _nicProfile; - public PrivateGatewayRules(final Network network, final List<? extends NetworkACLItem> rules) { - super(network); - this.rules = rules; + public PrivateGatewayRules(final PrivateGateway privateGateway) { + super(null); + this._privateGateway = privateGateway; } @Override public boolean accept(final NetworkTopologyVisitor visitor, final VirtualRouter router) throws ResourceUnavailableException { this._router = router; - return visitor.visit(this); + boolean result = false; + try { + _network = _networkModel.getNetwork(_privateGateway.getNetworkId()); + NicProfile requested = _vpcNetworkHelper.createPrivateNicProfileForGateway(_privateGateway); + + if (!_networkHelper.checkRouterVersion(router)) { + s_logger.warn("Router requires upgrade. Unable to send command to router: " + router.getId()); + return false; + } + _nicProfile = _itMgr.addVmToNetwork(router, _network, requested); + + //setup source nat + if (_nicProfile != null) { + _isAddOperation = true; + //result = setupVpcPrivateNetwork(router, true, guestNic); + result = visitor.visit(this); + } + } catch (Exception ex) { + s_logger.warn("Failed to create private gateway " + _privateGateway + " on router " + router + " due to ", ex); + } finally { + if (!result) { + s_logger.debug("Failed to setup gateway " + _privateGateway + " on router " + router + " with the source nat. Will now remove the gateway."); + _isAddOperation = false; + boolean isRemoved = destroyPrivateGateway(visitor); + + if (isRemoved) { + s_logger.debug("Removed the gateway " + _privateGateway + " from router " + router + " as a part of cleanup"); + } else { + s_logger.warn("Failed to remove the gateway " + _privateGateway + " from router " + router + " as a part of cleanup"); + } + } + } + return result; + } + + public boolean isAddOperation() { + return _isAddOperation; + } + + public NicProfile getNicProfile() { + return _nicProfile; + } + + public PrivateIpVO retrivePrivateIP() { + PrivateIpVO ipVO = _privateIpDao.findByIpAndSourceNetworkId(_nicProfile.getNetworkId(), _nicProfile.getIp4Address()); + return ipVO; + } + + public Network retrievePrivateNetwork() { + // This network might be the same we have already as an instance in the RuleApplier super class. + // Just doing this here, but will double check is remove if it's not needed. + Network network = _networkDao.findById(_nicProfile.getNetworkId()); + return network; } - public List<? extends NetworkACLItem> getRules() { - return rules; + protected boolean destroyPrivateGateway(final NetworkTopologyVisitor visitor) throws ConcurrentOperationException, ResourceUnavailableException { + + if (!_networkModel.isVmPartOfNetwork(_router.getId(), _privateGateway.getNetworkId())) { + s_logger.debug("Router doesn't have nic for gateway " + _privateGateway + " so no need to removed it"); + return true; + } + + Network privateNetwork = _networkModel.getNetwork(_privateGateway.getNetworkId()); + + s_logger.debug("Releasing private ip for gateway " + _privateGateway + " from " + _router); + + _nicProfile = _networkModel.getNicProfile(_router, privateNetwork.getId(), null); + boolean result = visitor.visit(this); + if (!result) { + s_logger.warn("Failed to release private ip for gateway " + _privateGateway + " on router " + _router); + return false; + } + + //revoke network acl on the private gateway. + if (!_networkACLMgr.revokeACLItemsForPrivateGw(_privateGateway)) { + s_logger.debug("Failed to delete network acl items on " + _privateGateway + " from router " + _router); + return false; + } + + s_logger.debug("Removing router " + _router + " from private network " + privateNetwork + " as a part of delete private gateway"); + result = result && _itMgr.removeVmFromNetwork(_router, privateNetwork, null); + s_logger.debug("Private gateawy " + _privateGateway + " is removed from router " + _router); + return result; + } + + public void createVpcAssociatePrivateIPCommands(final VirtualRouter router, final List<PrivateIpAddress> ips, final Commands cmds, final boolean add) { + + // Ensure that in multiple vlans case we first send all ip addresses of vlan1, then all ip addresses of vlan2, etc.. + Map<String, ArrayList<PrivateIpAddress>> vlanIpMap = new HashMap<String, ArrayList<PrivateIpAddress>>(); + for (final PrivateIpAddress ipAddress : ips) { + String vlanTag = ipAddress.getBroadcastUri(); + ArrayList<PrivateIpAddress> ipList = vlanIpMap.get(vlanTag); + if (ipList == null) { + ipList = new ArrayList<PrivateIpAddress>(); + } + + ipList.add(ipAddress); + vlanIpMap.put(vlanTag, ipList); + } + + for (Map.Entry<String, ArrayList<PrivateIpAddress>> vlanAndIp : vlanIpMap.entrySet()) { + List<PrivateIpAddress> ipAddrList = vlanAndIp.getValue(); + IpAddressTO[] ipsToSend = new IpAddressTO[ipAddrList.size()]; + int i = 0; + + for (final PrivateIpAddress ipAddr : ipAddrList) { + Network network = _networkModel.getNetwork(ipAddr.getNetworkId()); + IpAddressTO ip = + new IpAddressTO(Account.ACCOUNT_ID_SYSTEM, ipAddr.getIpAddress(), add, false, ipAddr.getSourceNat(), ipAddr.getBroadcastUri(), ipAddr.getGateway(), + ipAddr.getNetmask(), ipAddr.getMacAddress(), null, false); + + ip.setTrafficType(network.getTrafficType()); + ip.setNetworkName(_networkModel.getNetworkTag(router.getHypervisorType(), network)); + ipsToSend[i++] = ip; + + } + + IpAssocVpcCommand cmd = new IpAssocVpcCommand(ipsToSend); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId())); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, _routerControlHelper.getRouterIpInNetwork(ipAddrList.get(0).getNetworkId(), router.getId())); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); + DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId()); + cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); + + cmds.addCommand("IPAssocVpcCommand", cmd); + } } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/cloudstack/blob/07be4945/server/src/com/cloud/network/rules/RuleApplier.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/network/rules/RuleApplier.java b/server/src/com/cloud/network/rules/RuleApplier.java index 84ad5230..6abeb01 100644 --- a/server/src/com/cloud/network/rules/RuleApplier.java +++ b/server/src/com/cloud/network/rules/RuleApplier.java @@ -40,7 +40,10 @@ import com.cloud.network.lb.LoadBalancingRulesManager; import com.cloud.network.router.NetworkHelper; import com.cloud.network.router.RouterControlHelper; import com.cloud.network.router.VirtualRouter; +import com.cloud.network.router.VpcNetworkHelper; +import com.cloud.network.vpc.NetworkACLManager; import com.cloud.network.vpc.VpcManager; +import com.cloud.network.vpc.dao.PrivateIpDao; import com.cloud.network.vpc.dao.VpcDao; import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.service.dao.ServiceOfferingDao; @@ -95,12 +98,16 @@ public abstract class RuleApplier { protected IPAddressDao _ipAddressDao; + protected PrivateIpDao _privateIpDao; + protected VpcManager _vpcMgr; protected VirtualMachineManager _itMgr; protected IpAddressManager _ipAddrMgr; + protected NetworkACLManager _networkACLMgr; + protected Network _network; protected VirtualRouter _router; @@ -109,6 +116,8 @@ public abstract class RuleApplier { protected NetworkHelper _networkHelper; + protected VpcNetworkHelper _vpcNetworkHelper; + public RuleApplier(final Network network) { _network = network; } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/07be4945/server/src/com/cloud/network/rules/VirtualNetworkApplianceFactory.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/network/rules/VirtualNetworkApplianceFactory.java b/server/src/com/cloud/network/rules/VirtualNetworkApplianceFactory.java index 2ea092d..207560b 100644 --- a/server/src/com/cloud/network/rules/VirtualNetworkApplianceFactory.java +++ b/server/src/com/cloud/network/rules/VirtualNetworkApplianceFactory.java @@ -30,6 +30,7 @@ import com.cloud.network.IpAddressManager; import com.cloud.network.Network; import com.cloud.network.NetworkModel; import com.cloud.network.PublicIpAddress; +import com.cloud.network.RemoteAccessVpn; import com.cloud.network.VpnUser; import com.cloud.network.dao.FirewallRulesDao; import com.cloud.network.dao.IPAddressDao; @@ -41,8 +42,11 @@ import com.cloud.network.router.NetworkHelper; import com.cloud.network.router.RouterControlHelper; import com.cloud.network.router.VirtualNetworkApplianceManager; import com.cloud.network.vpc.NetworkACLItem; +import com.cloud.network.vpc.NetworkACLManager; +import com.cloud.network.vpc.PrivateGateway; import com.cloud.network.vpc.StaticRouteProfile; import com.cloud.network.vpc.VpcManager; +import com.cloud.network.vpc.dao.PrivateIpDao; import com.cloud.network.vpc.dao.VpcDao; import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.service.dao.ServiceOfferingDao; @@ -122,6 +126,9 @@ public class VirtualNetworkApplianceFactory { protected IPAddressDao _ipAddressDao; @Inject + protected PrivateIpDao _privateIpDao; + + @Inject protected RouterControlHelper _routerControlHelper; @Inject @@ -131,8 +138,14 @@ public class VirtualNetworkApplianceFactory { protected IpAddressManager _ipAddrMgr; @Inject + protected NetworkACLManager _networkACLMgr; + + @Inject protected NetworkHelper _networkHelper; + @Inject + protected VpcNetworkHelper _vpcNetworkHelper; + public LoadBalancingRules createLoadBalancingRules(final Network network, final List<LoadBalancingRule> rules) { LoadBalancingRules lbRules = new LoadBalancingRules(network, rules); @@ -305,11 +318,31 @@ public class VirtualNetworkApplianceFactory { return pvlanRules; } - public StaticRoutesRules createStaticRoutesRules(List<StaticRouteProfile> staticRoutes) { - StaticRoutesRules routesRules = new StaticRoutesRules(staticRoutes); - - initBeans(routesRules); - - return routesRules; - } + public StaticRoutesRules createStaticRoutesRules(final List<StaticRouteProfile> staticRoutes) { + StaticRoutesRules routesRules = new StaticRoutesRules(staticRoutes); + + initBeans(routesRules); + + return routesRules; + } + + public AdvancedVpnRules createAdvancedVpnRules(final RemoteAccessVpn remoteAccessVpn, final List<? extends VpnUser> users) { + AdvancedVpnRules vpnRules = new AdvancedVpnRules(remoteAccessVpn, users); + + initBeans(vpnRules); + + return vpnRules; + } + + public PrivateGatewayRules createPrivateGatewayRules(final PrivateGateway gateway) { + PrivateGatewayRules gwRules = new PrivateGatewayRules(gateway); + + initBeans(gwRules); + + gwRules._privateIpDao = _privateIpDao; + gwRules._networkACLMgr = _networkACLMgr; + gwRules._vpcNetworkHelper = _vpcNetworkHelper; + + return gwRules; + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/cloudstack/blob/07be4945/server/src/org/apache/cloudstack/network/topology/AdvancedNetworkTopology.java ---------------------------------------------------------------------- diff --git a/server/src/org/apache/cloudstack/network/topology/AdvancedNetworkTopology.java b/server/src/org/apache/cloudstack/network/topology/AdvancedNetworkTopology.java index 8cc47d2..13d1cb7 100644 --- a/server/src/org/apache/cloudstack/network/topology/AdvancedNetworkTopology.java +++ b/server/src/org/apache/cloudstack/network/topology/AdvancedNetworkTopology.java @@ -30,6 +30,7 @@ import com.cloud.dc.DataCenter.NetworkType; import com.cloud.dc.Pod; import com.cloud.deploy.DeployDestination; import com.cloud.exception.AgentUnavailableException; +import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.host.Status; import com.cloud.network.Network; @@ -39,12 +40,14 @@ import com.cloud.network.rules.DhcpEntryRules; import com.cloud.network.rules.DhcpSubNetRules; import com.cloud.network.rules.NetworkAclsRules; import com.cloud.network.rules.NicPlugInOutRules; +import com.cloud.network.rules.PrivateGatewayRules; import com.cloud.network.rules.RuleApplier; import com.cloud.network.rules.RuleApplierWrapper; import com.cloud.network.rules.StaticRoutesRules; import com.cloud.network.rules.UserdataPwdRules; import com.cloud.network.rules.VpcIpAssociationRules; import com.cloud.network.vpc.NetworkACLItem; +import com.cloud.network.vpc.PrivateGateway; import com.cloud.network.vpc.StaticRouteProfile; import com.cloud.vm.DomainRouterVO; import com.cloud.vm.NicProfile; @@ -117,6 +120,15 @@ public class AdvancedNetworkTopology extends BasicNetworkTopology { return subNetRules.accept(_advancedVisitor, router); } + + @Override + public boolean setupPrivateGateway(PrivateGateway gateway, VirtualRouter router) throws ConcurrentOperationException, ResourceUnavailableException { + s_logger.debug("SETUP PRIVATE GATEWAY RULES"); + + PrivateGatewayRules routesRules = _virtualNetworkApplianceFactory.createPrivateGatewayRules(gateway); + + return routesRules.accept(_advancedVisitor, router); + } @Override public boolean applyUserData(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final DeployDestination dest, final List<DomainRouterVO> routers) http://git-wip-us.apache.org/repos/asf/cloudstack/blob/07be4945/server/src/org/apache/cloudstack/network/topology/AdvancedNetworkVisitor.java ---------------------------------------------------------------------- diff --git a/server/src/org/apache/cloudstack/network/topology/AdvancedNetworkVisitor.java b/server/src/org/apache/cloudstack/network/topology/AdvancedNetworkVisitor.java index 464dd1f..1f94370 100644 --- a/server/src/org/apache/cloudstack/network/topology/AdvancedNetworkVisitor.java +++ b/server/src/org/apache/cloudstack/network/topology/AdvancedNetworkVisitor.java @@ -28,6 +28,7 @@ import com.cloud.agent.api.Command; import com.cloud.agent.api.PvlanSetupCommand; import com.cloud.agent.api.routing.IpAliasTO; import com.cloud.agent.manager.Commands; +import com.cloud.dc.DataCenter; import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.Network; import com.cloud.network.PublicIpAddress; @@ -41,9 +42,14 @@ import com.cloud.network.rules.StaticRoutesRules; import com.cloud.network.rules.UserdataPwdRules; import com.cloud.network.rules.VpcIpAssociationRules; import com.cloud.network.vpc.NetworkACLItem; +import com.cloud.network.vpc.PrivateIpAddress; +import com.cloud.network.vpc.PrivateIpVO; import com.cloud.network.vpc.StaticRouteProfile; +import com.cloud.utils.net.NetUtils; +import com.cloud.vm.NicProfile; import com.cloud.vm.NicVO; import com.cloud.vm.UserVmVO; +import com.cloud.vm.VirtualMachine.State; import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.dao.NicIpAliasVO; @@ -123,7 +129,46 @@ public class AdvancedNetworkVisitor extends BasicNetworkVisitor { @Override public boolean visit(final PrivateGatewayRules privateGW) throws ResourceUnavailableException { - return false; + final VirtualRouter router = privateGW.getRouter(); + final NicProfile nicProfile = privateGW.getNicProfile(); + + final boolean isAddOperation = privateGW.isAddOperation(); + + if (router.getState() == State.Running) { + + PrivateIpVO ipVO = privateGW.retrivePrivateIP(); + Network network = privateGW.retrievePrivateNetwork(); + + String netmask = NetUtils.getCidrNetmask(network.getCidr()); + PrivateIpAddress ip = new PrivateIpAddress(ipVO, network.getBroadcastUri().toString(), network.getGateway(), netmask, nicProfile.getMacAddress()); + + List<PrivateIpAddress> privateIps = new ArrayList<PrivateIpAddress>(1); + privateIps.add(ip); + + Commands cmds = new Commands(Command.OnError.Stop); + privateGW.createVpcAssociatePrivateIPCommands(router, privateIps, cmds, isAddOperation); + + try{ + if (_networkGeneralHelper.sendCommandsToRouter(router, cmds)) { + s_logger.debug("Successfully applied ip association for ip " + ip + " in vpc network " + network); + return true; + } else { + s_logger.warn("Failed to associate ip address " + ip + " in vpc network " + network); + return false; + } + }catch (Exception ex) { + s_logger.warn("Failed to send " + (isAddOperation ?"add ":"delete ") + " private network " + network + " commands to rotuer "); + return false; + } + } else if (router.getState() == State.Stopped || router.getState() == State.Stopping) { + s_logger.debug("Router " + router.getInstanceName() + " is in " + router.getState() + ", so not sending setup private network command to the backend"); + } else { + s_logger.warn("Unable to setup private gateway, virtual router " + router + " is not in the right state " + router.getState()); + + throw new ResourceUnavailableException("Unable to setup Private gateway on the backend," + " virtual router " + router + " is not in the right state", + DataCenter.class, router.getDataCenterId()); + } + return true; } @Override http://git-wip-us.apache.org/repos/asf/cloudstack/blob/07be4945/server/src/org/apache/cloudstack/network/topology/BasicNetworkTopology.java ---------------------------------------------------------------------- diff --git a/server/src/org/apache/cloudstack/network/topology/BasicNetworkTopology.java b/server/src/org/apache/cloudstack/network/topology/BasicNetworkTopology.java index dd0cd15..6d05b56 100644 --- a/server/src/org/apache/cloudstack/network/topology/BasicNetworkTopology.java +++ b/server/src/org/apache/cloudstack/network/topology/BasicNetworkTopology.java @@ -33,12 +33,14 @@ import com.cloud.dc.Pod; import com.cloud.dc.dao.DataCenterDao; import com.cloud.deploy.DeployDestination; import com.cloud.exception.AgentUnavailableException; +import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.host.Status; import com.cloud.host.dao.HostDao; import com.cloud.network.Network; import com.cloud.network.Networks.TrafficType; import com.cloud.network.PublicIpAddress; +import com.cloud.network.RemoteAccessVpn; import com.cloud.network.VpnUser; import com.cloud.network.lb.LoadBalancingRule; import com.cloud.network.router.NetworkHelper; @@ -59,6 +61,7 @@ import com.cloud.network.rules.UserdataToRouterRules; import com.cloud.network.rules.VirtualNetworkApplianceFactory; import com.cloud.network.rules.VpnRules; import com.cloud.network.vpc.NetworkACLItem; +import com.cloud.network.vpc.PrivateGateway; import com.cloud.network.vpc.StaticRouteProfile; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.DomainRouterVO; @@ -104,8 +107,13 @@ public class BasicNetworkTopology implements NetworkTopology { } @Override - public NicProfile retrieveControlNic(final VirtualMachineProfile profile) { - return null; + public boolean setupPrivateGateway(final PrivateGateway gateway, final VirtualRouter router) throws ConcurrentOperationException, ResourceUnavailableException { + throw new CloudRuntimeException("setupPrivateGateway not implemented in Basic Network Topology."); + } + + @Override + public String[] applyVpnUsers(final RemoteAccessVpn vpn, final List<? extends VpnUser> users, final VirtualRouter router) throws ResourceUnavailableException { + throw new CloudRuntimeException("applyVpnUsers not implemented in Basic Network Topology."); } @Override @@ -410,7 +418,8 @@ public class BasicNetworkTopology implements NetworkTopology { if (!connectedRouters.isEmpty()) { if (!isZoneBasic && !disconnectedRouters.isEmpty() && disconnectedRouters.get(0).getIsRedundantRouter()) { - // These disconnected redundant virtual routers are out of sync now, stop them for synchronization + // These disconnected redundant virtual routers are out of sync + // now, stop them for synchronization _nwHelper.handleSingleWorkingRedundantRouter(connectedRouters, disconnectedRouters, msg); } } else if (!disconnectedRouters.isEmpty()) { http://git-wip-us.apache.org/repos/asf/cloudstack/blob/07be4945/server/src/org/apache/cloudstack/network/topology/NetworkTopology.java ---------------------------------------------------------------------- diff --git a/server/src/org/apache/cloudstack/network/topology/NetworkTopology.java b/server/src/org/apache/cloudstack/network/topology/NetworkTopology.java index 3975878..4e9175e 100644 --- a/server/src/org/apache/cloudstack/network/topology/NetworkTopology.java +++ b/server/src/org/apache/cloudstack/network/topology/NetworkTopology.java @@ -21,6 +21,7 @@ import java.util.List; import com.cloud.dc.DataCenter; import com.cloud.deploy.DeployDestination; +import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.Network; import com.cloud.network.PublicIpAddress; @@ -32,6 +33,7 @@ import com.cloud.network.rules.RuleApplier; import com.cloud.network.rules.RuleApplierWrapper; import com.cloud.network.rules.StaticNat; import com.cloud.network.vpc.NetworkACLItem; +import com.cloud.network.vpc.PrivateGateway; import com.cloud.network.vpc.StaticRouteProfile; import com.cloud.vm.DomainRouterVO; import com.cloud.vm.NicProfile; @@ -39,6 +41,7 @@ import com.cloud.vm.VirtualMachineProfile; public interface NetworkTopology { +<<<<<<< HEAD StringBuilder createGuestBootLoadArgs(final NicProfile guestNic, final String defaultDns1, final String defaultDns2, DomainRouterVO router); String retrieveGuestDhcpRange(final NicProfile guestNic, final Network guestNetwork, final DataCenter dc); @@ -47,6 +50,9 @@ public interface NetworkTopology { // ====== USER FOR VPC ONLY ====== // +======= + // ====== USED FOR VPC ONLY ====== // +>>>>>>> 0b8b22f... adding setupPrivateGateway to new style; boolean setupDhcpForPvlan(final boolean add, final DomainRouterVO router, final Long hostId, final NicProfile nic) throws ResourceUnavailableException; @@ -57,8 +63,15 @@ public interface NetworkTopology { throws ResourceUnavailableException; boolean applyStaticRoutes(final List<StaticRouteProfile> staticRoutes, final List<DomainRouterVO> routers) throws ResourceUnavailableException; - - // ====== USER FOR GUEST NETWORK AND VCP ====== // +<<<<<<< HEAD +======= + + boolean setupPrivateGateway(final PrivateGateway gateway, final VirtualRouter router) throws ConcurrentOperationException, ResourceUnavailableException; + + String[] applyVpnUsers(final RemoteAccessVpn vpn, final List<? extends VpnUser> users, final VirtualRouter router) throws ResourceUnavailableException; +>>>>>>> 0b8b22f... adding setupPrivateGateway to new style; + + // ====== USED FOR GUEST NETWORK AND VCP ====== // boolean applyDhcpEntry(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final DeployDestination dest, final List<DomainRouterVO> routers) throws ResourceUnavailableException; http://git-wip-us.apache.org/repos/asf/cloudstack/blob/07be4945/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java ---------------------------------------------------------------------- diff --git a/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java b/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java index 7153ed7..fa780c0 100644 --- a/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java +++ b/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java @@ -209,15 +209,6 @@ public class MockVpcVirtualNetworkApplianceManager extends ManagerBase implement } /* (non-Javadoc) - * @see com.cloud.network.router.VpcVirtualNetworkApplianceManager#setupPrivateGateway(com.cloud.network.vpc.PrivateGateway, com.cloud.network.router.VirtualRouter) - */ - @Override - public boolean setupPrivateGateway(final PrivateGateway gateway, final VirtualRouter router) throws ConcurrentOperationException, ResourceUnavailableException { - // TODO Auto-generated method stub - return false; - } - - /* (non-Javadoc) * @see com.cloud.network.router.VpcVirtualNetworkApplianceManager#destroyPrivateGateway(com.cloud.network.vpc.PrivateGateway, com.cloud.network.router.VirtualRouter) */ @Override