You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by al...@apache.org on 2012/07/21 02:09:34 UTC

[2/5] git commit: VPC: when VPC router gets destroyed and recreated, plug public nic for each Vlan where VPC public ips belong to

VPC: when VPC router gets destroyed and recreated, plug public nic for each Vlan where VPC public ips belong to

Conflicts:

	server/src/com/cloud/network/NetworkManagerImpl.java


Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/966c1b0a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/966c1b0a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/966c1b0a

Branch: refs/heads/vpc
Commit: 966c1b0ad858a818b35487d948cad6f0920dbb37
Parents: cf895d3
Author: Alena Prokharchyk <al...@citrix.com>
Authored: Fri Jul 20 16:27:54 2012 -0700
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Fri Jul 20 17:12:34 2012 -0700

----------------------------------------------------------------------
 server/src/com/cloud/network/NetworkManager.java   |    3 +-
 .../src/com/cloud/network/NetworkManagerImpl.java  |   14 +-
 .../network/lb/LoadBalancingRulesManagerImpl.java  |    3 +-
 .../VpcVirtualNetworkApplianceManagerImpl.java     |  109 +++++++++++++--
 .../com/cloud/network/rules/RulesManagerImpl.java  |    4 +-
 .../com/cloud/network/MockNetworkManagerImpl.java  |    2 +-
 6 files changed, 110 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/966c1b0a/server/src/com/cloud/network/NetworkManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java
index 4274295..6dba220 100755
--- a/server/src/com/cloud/network/NetworkManager.java
+++ b/server/src/com/cloud/network/NetworkManager.java
@@ -403,8 +403,9 @@ public interface NetworkManager extends NetworkService {
     /**
      * @param ipAddrId
      * @param networkId
+     * @param releaseOnFailure TODO
      */
-    IPAddressVO associateIPToGuestNetwork(long ipAddrId, long networkId) throws ResourceAllocationException, ResourceUnavailableException, 
+    IPAddressVO associateIPToGuestNetwork(long ipAddrId, long networkId, boolean releaseOnFailure) throws ResourceAllocationException, ResourceUnavailableException, 
         InsufficientAddressCapacityException, ConcurrentOperationException;
 
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/966c1b0a/server/src/com/cloud/network/NetworkManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java
index 8b7b056..2788d44 100755
--- a/server/src/com/cloud/network/NetworkManagerImpl.java
+++ b/server/src/com/cloud/network/NetworkManagerImpl.java
@@ -1138,8 +1138,9 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
 
     @DB
     @Override
-    public IPAddressVO associateIPToGuestNetwork(long ipId, long networkId) throws ResourceAllocationException, ResourceUnavailableException, 
-        InsufficientAddressCapacityException, ConcurrentOperationException {
+    public IPAddressVO associateIPToGuestNetwork(long ipId, long networkId, boolean releaseOnFailure) 
+            throws ResourceAllocationException, ResourceUnavailableException, 
+    InsufficientAddressCapacityException, ConcurrentOperationException {
         Account caller = UserContext.current().getCaller();
         Account owner = null;
 
@@ -1216,14 +1217,11 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
                 s_logger.warn("Failed to associate ip address " + ip.getAddress().addr() + " to network " + network);
             }
             return ip;
-        } catch (ResourceUnavailableException e) {
-            s_logger.error("Unable to associate ip address due to resource unavailable exception", e);
-            return null;
         } finally {
-            if (!success) {
+            if (!success && releaseOnFailure) {
                 if (ip != null) {
                     try {
-                        s_logger.warn("Failed to associate ip address " + ip);
+                        s_logger.warn("Failed to associate ip address, so releasing ip from the database " + ip);
                         _ipAddressDao.markAsUnavailable(ip.getId());
                         if (!applyIpAssociations(network, true)) {
                             // if fail to apply ip assciations again, unassign ip address without updating resource
@@ -7244,7 +7242,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
                 throw new InvalidParameterValueException("Can't assign ip to the network directly when network belongs" +
                 		" to VPC.Specify vpcId to associate ip address to VPC");
             }
-            return associateIPToGuestNetwork(ipId, networkId);
+            return associateIPToGuestNetwork(ipId, networkId, true);
         }
         
         return null;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/966c1b0a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
index d42f273..e7ece27 100755
--- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
+++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
@@ -749,11 +749,10 @@ public class LoadBalancingRulesManagerImpl<Type> implements LoadBalancingRulesMa
                             && ipVO.getVpcId() != null && ipVO.getVpcId().longValue() == network.getVpcId();
                     if (assignToVpcNtwk) {
                         //set networkId just for verification purposes
-                        ipVO.setAssociatedWithNetworkId(lb.getNetworkId());
                         _networkMgr.checkIpForService(ipVO, Service.Lb, lb.getNetworkId());
 
                         s_logger.debug("The ip is not associated with the VPC network id="+ lb.getNetworkId() + " so assigning");
-                        ipVO = _networkMgr.associateIPToGuestNetwork(ipAddrId, lb.getNetworkId());
+                        ipVO = _networkMgr.associateIPToGuestNetwork(ipAddrId, lb.getNetworkId(), false);
                         performedIpAssoc = true;
                     }
                 } else {

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/966c1b0a/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 4b3d5a1..81b2a79 100644
--- a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
@@ -22,6 +22,7 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.TreeSet;
 
 import javax.ejb.Local;
 
@@ -97,6 +98,7 @@ import com.cloud.network.vpc.Dao.PrivateIpDao;
 import com.cloud.network.vpc.Dao.StaticRouteDao;
 import com.cloud.network.vpc.Dao.VpcDao;
 import com.cloud.network.vpc.Dao.VpcOfferingDao;
+import com.cloud.offerings.NetworkOfferingVO;
 import com.cloud.user.Account;
 import com.cloud.utils.Pair;
 import com.cloud.utils.component.Inject;
@@ -529,9 +531,10 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
         //only one router is supported in VPC now
         VirtualRouter router = routers.get(0);
         
-        //1) check which nics need to be plugged/unplugged and plug/unplug them
-        Map<String, PublicIpAddress> nicsToPlug = new HashMap<String, PublicIpAddress>();
-        Map<String, PublicIpAddress> nicsToUnPlug = new HashMap<String, PublicIpAddress>();
+        Pair<Map<String, PublicIpAddress>, Map<String, PublicIpAddress>> nicsToChange = getNicsToChangeOnRouter(ipAddress, router);
+        Map<String, PublicIpAddress> nicsToPlug = nicsToChange.first();
+        Map<String, PublicIpAddress> nicsToUnplug = nicsToChange.second();
+        
         
         //find out nics to unplug
         for (PublicIpAddress ip : ipAddress) {
@@ -545,7 +548,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
             if (ip.getState() == IpAddress.State.Releasing) {
                 Nic nic = _nicDao.findByIp4AddressAndNetworkIdAndInstanceId(publicNtwkId, router.getId(), ip.getAddress().addr());
                 if (nic != null) {
-                    nicsToUnPlug.put(ip.getVlanTag(), ip);
+                    nicsToUnplug.put(ip.getVlanTag(), ip);
                     s_logger.debug("Need to unplug the nic for ip=" + ip + "; vlan=" + ip.getVlanTag() + 
                             " in public network id =" + publicNtwkId);
                 }
@@ -567,7 +570,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
                 Nic nic = _nicDao.findByInstanceIdNetworkIdAndBroadcastUri(publicNtwkId, router.getId(), 
                         broadcastUri.toString());
                 
-                if ((nic == null && nicsToPlug.get(ip.getVlanTag()) == null) || nicsToUnPlug.get(ip.getVlanTag()) != null) {
+                if ((nic == null && nicsToPlug.get(ip.getVlanTag()) == null) || nicsToUnplug.get(ip.getVlanTag()) != null) {
                     nicsToPlug.put(ip.getVlanTag(), ip);
                     s_logger.debug("Need to plug the nic for ip=" + ip + "; vlan=" + ip.getVlanTag() + 
                             " in public network id =" + publicNtwkId);
@@ -622,10 +625,10 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
         });
         
         //4) Unplug the nics
-        for (String vlanTag : nicsToUnPlug.keySet()) {
+        for (String vlanTag : nicsToUnplug.keySet()) {
             Network publicNtwk = null;
             try {
-                publicNtwk = _networkMgr.getNetwork(nicsToUnPlug.get(vlanTag).getNetworkId());
+                publicNtwk = _networkMgr.getNetwork(nicsToUnplug.get(vlanTag).getNetworkId());
                 URI broadcastUri = BroadcastDomainType.Vlan.toUri(vlanTag);
                 _itMgr.removeVmFromNetwork(router, publicNtwk, broadcastUri);
             } catch (ConcurrentOperationException e) {
@@ -1143,13 +1146,18 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
     
     
     protected List<Pair<NetworkVO, NicProfile>> createVpcRouterNetworks(Account owner, boolean isRedundant, 
-            DeploymentPlan plan, Pair<Boolean, PublicIp> publicNetwork, long vpcId) throws ConcurrentOperationException,
+            DeploymentPlan plan, Pair<Boolean, PublicIp> sourceNatIp, long vpcId) throws ConcurrentOperationException,
             InsufficientAddressCapacityException {
 
         List<Pair<NetworkVO, NicProfile>> networks = new ArrayList<Pair<NetworkVO, NicProfile>>(4);
-        networks = super.createRouterNetworks(owner, isRedundant, plan, null, publicNetwork);
         
-        //1) allocate nic for private gateway if needed
+        TreeSet<String> publicVlans = new TreeSet<String>();
+        publicVlans.add(sourceNatIp.second().getVlanTag());
+        
+        //1) allocate nic for control and source nat public ip
+        networks = super.createRouterNetworks(owner, isRedundant, plan, null, sourceNatIp);
+
+        //2) allocate nic for private gateway if needed
         VpcGateway privateGateway = _vpcMgr.getPrivateGatewayForVpc(vpcId);
         if (privateGateway != null) {
             NicProfile privateNic = createPrivateNicProfileForGateway(privateGateway);
@@ -1157,7 +1165,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
             networks.add(new Pair<NetworkVO, NicProfile>((NetworkVO) privateNetwork, privateNic));
         }
         
-        //2) allocate nic for guest gateway if needed
+        //3) allocate nic for guest gateway if needed
         List<? extends Network> guestNetworks = _vpcMgr.getVpcNetworks(vpcId);
         for (Network guestNetwork : guestNetworks) {
             if (guestNetwork.getState() == Network.State.Implemented) {
@@ -1166,6 +1174,30 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
             }
         }
         
+        //4) allocate nic for additional public network(s)
+        List<IPAddressVO> ips = _ipAddressDao.listByAssociatedVpc(vpcId, false);
+        for (IPAddressVO ip : ips) {
+            PublicIp publicIp = new PublicIp(ip, _vlanDao.findById(ip.getVlanId()), 
+                    NetUtils.createSequenceBasedMacAddress(ip.getMacAddress()));
+            if ((ip.getState() == IpAddress.State.Allocated || ip.getState() == IpAddress.State.Allocating) 
+                    && _networkMgr.ipUsedInVpc(ip)&& !publicVlans.contains(publicIp.getVlanTag())) {
+                s_logger.debug("Allocating nic for router in vlan " + publicIp.getVlanTag());
+                NicProfile publicNic = new NicProfile();
+                publicNic.setDefaultNic(false);
+                publicNic.setIp4Address(publicIp.getAddress().addr());
+                publicNic.setGateway(publicIp.getGateway());
+                publicNic.setNetmask(publicIp.getNetmask());
+                publicNic.setMacAddress(publicIp.getMacAddress());
+                publicNic.setBroadcastType(BroadcastDomainType.Vlan);
+                publicNic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(publicIp.getVlanTag()));
+                publicNic.setIsolationUri(IsolationType.Vlan.toUri(publicIp.getVlanTag()));
+                NetworkOfferingVO publicOffering = _networkMgr.getSystemAccountNetworkOfferings(NetworkOfferingVO.SystemPublicNetwork).get(0);
+                List<NetworkVO> publicNetworks = _networkMgr.setupNetwork(_systemAcct, publicOffering, plan, null, null, false);
+                networks.add(new Pair<NetworkVO, NicProfile>(publicNetworks.get(0), publicNic));
+                publicVlans.add(publicIp.getVlanTag());
+            }
+        }
+        
         return networks;
     }
 
@@ -1203,4 +1235,59 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
         
         return guestNic;
     }
+    
+    protected Pair<Map<String, PublicIpAddress>, Map<String, PublicIpAddress>> getNicsToChangeOnRouter 
+    (final List<? extends PublicIpAddress> publicIps, VirtualRouter router) {
+        //1) check which nics need to be plugged/unplugged and plug/unplug them
+        
+        Map<String, PublicIpAddress> nicsToPlug = new HashMap<String, PublicIpAddress>();
+        Map<String, PublicIpAddress> nicsToUnplug = new HashMap<String, PublicIpAddress>();
+
+        
+        //find out nics to unplug
+        for (PublicIpAddress ip : publicIps) {
+            long publicNtwkId = ip.getNetworkId();
+            
+            //if ip is not associated to any network, and there are no firewall rules, release it on the backend
+            if (!_networkMgr.ipUsedInVpc(ip)) {
+                ip.setState(IpAddress.State.Releasing);
+            }
+                         
+            if (ip.getState() == IpAddress.State.Releasing) {
+                Nic nic = _nicDao.findByIp4AddressAndNetworkIdAndInstanceId(publicNtwkId, router.getId(), ip.getAddress().addr());
+                if (nic != null) {
+                    nicsToUnplug.put(ip.getVlanTag(), ip);
+                    s_logger.debug("Need to unplug the nic for ip=" + ip + "; vlan=" + ip.getVlanTag() + 
+                            " in public network id =" + publicNtwkId);
+                }
+            }
+        }
+        
+        //find out nics to plug
+        for (PublicIpAddress ip : publicIps) {
+            URI broadcastUri = BroadcastDomainType.Vlan.toUri(ip.getVlanTag());
+            long publicNtwkId = ip.getNetworkId();
+            
+            //if ip is not associated to any network, and there are no firewall rules, release it on the backend
+            if (!_networkMgr.ipUsedInVpc(ip)) {
+                ip.setState(IpAddress.State.Releasing);
+            }
+                         
+            if (ip.getState() == IpAddress.State.Allocated || ip.getState() == IpAddress.State.Allocating) {
+                //nic has to be plugged only when there are no nics for this vlan tag exist on VR
+                Nic nic = _nicDao.findByInstanceIdNetworkIdAndBroadcastUri(publicNtwkId, router.getId(), 
+                        broadcastUri.toString());
+                
+                if ((nic == null && nicsToPlug.get(ip.getVlanTag()) == null) || nicsToUnplug.get(ip.getVlanTag()) != null) {
+                    nicsToPlug.put(ip.getVlanTag(), ip);
+                    s_logger.debug("Need to plug the nic for ip=" + ip + "; vlan=" + ip.getVlanTag() + 
+                            " in public network id =" + publicNtwkId);
+                }
+            }
+        }
+        
+        Pair<Map<String, PublicIpAddress>, Map<String, PublicIpAddress>> nicsToChange = 
+                new Pair<Map<String, PublicIpAddress>, Map<String, PublicIpAddress>>(nicsToPlug, nicsToUnplug);
+        return nicsToChange;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/966c1b0a/server/src/com/cloud/network/rules/RulesManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/rules/RulesManagerImpl.java b/server/src/com/cloud/network/rules/RulesManagerImpl.java
index 224b635..14588dd 100755
--- a/server/src/com/cloud/network/rules/RulesManagerImpl.java
+++ b/server/src/com/cloud/network/rules/RulesManagerImpl.java
@@ -194,7 +194,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager {
 
                 s_logger.debug("The ip is not associated with the VPC network id="+ networkId + ", so assigning");
                 try {
-                    ipAddress = _networkMgr.associateIPToGuestNetwork(ipAddrId, networkId);
+                    ipAddress = _networkMgr.associateIPToGuestNetwork(ipAddrId, networkId, false);
                     performedIpAssoc = true;
                 } catch (Exception ex) {
                     throw new CloudRuntimeException("Failed to associate ip to VPC network as " +
@@ -420,7 +420,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager {
                         
                         s_logger.debug("The ip is not associated with the VPC network id="+ networkId + ", so assigning");
                         try {
-                            ipAddress = _networkMgr.associateIPToGuestNetwork(ipId, networkId);
+                            ipAddress = _networkMgr.associateIPToGuestNetwork(ipId, networkId, false);
                         } catch (Exception ex) {
                             s_logger.warn("Failed to associate ip id=" + ipId + " to VPC network id=" + networkId + " as " +
                                     "a part of enable static nat");

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/966c1b0a/server/test/com/cloud/network/MockNetworkManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/network/MockNetworkManagerImpl.java b/server/test/com/cloud/network/MockNetworkManagerImpl.java
index 841d4a6..01c7fb8 100755
--- a/server/test/com/cloud/network/MockNetworkManagerImpl.java
+++ b/server/test/com/cloud/network/MockNetworkManagerImpl.java
@@ -80,7 +80,7 @@ public class MockNetworkManagerImpl implements NetworkManager, Manager, NetworkS
     }
 
     @Override
-    public IPAddressVO associateIPToGuestNetwork(long ipId, long networkId) throws ResourceAllocationException, InsufficientAddressCapacityException, ConcurrentOperationException, ResourceUnavailableException {
+    public IPAddressVO associateIPToGuestNetwork(long ipId, long networkId, boolean releaseOnFailure) throws ResourceAllocationException, InsufficientAddressCapacityException, ConcurrentOperationException, ResourceUnavailableException {
         // TODO Auto-generated method stub
         return null;
     }