VPC: more changes to ipAssoc

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

Branch: refs/heads/vpc
Commit: 3e5f391c859cb03e080de0b76b11761e3ee0e740
Parents: 10a578d
Author: Alena Prokharchyk <[email protected]>
Authored: Tue Jun 12 13:35:03 2012 -0700
Committer: Alena Prokharchyk <[email protected]>
Committed: Fri Jun 15 14:32:39 2012 -0700

----------------------------------------------------------------------
 .../network/element/VpcVirtualRouterElement.java   |   28 +++-
 .../router/VirtualNetworkApplianceManagerImpl.java |    7 +-
 .../VpcVirtualNetworkApplianceManagerImpl.java     |  129 ++++++++++-----
 wscript                                            |    2 +-
 4 files changed, 118 insertions(+), 48 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/3e5f391c/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 ff0ca36..ca5f920 100644
--- a/server/src/com/cloud/network/element/VpcVirtualRouterElement.java
+++ b/server/src/com/cloud/network/element/VpcVirtualRouterElement.java
@@ -16,6 +16,7 @@ package com.cloud.network.element;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import javax.ejb.Local;
 
@@ -31,6 +32,7 @@ import com.cloud.network.Network.Capability;
 import com.cloud.network.Network.Provider;
 import com.cloud.network.Network.Service;
 import com.cloud.network.NetworkService;
+import com.cloud.network.PublicIpAddress;
 import com.cloud.network.router.VirtualRouter;
 import com.cloud.network.router.VpcVirtualNetworkApplianceManager;
 import com.cloud.network.vpc.Vpc;
@@ -269,12 +271,32 @@ public class VpcVirtualRouterElement extends 
VirtualRouterElement implements Vpc
         return true;
     }
     
-    
-    
     @Override
     protected List<DomainRouterVO> getRouters(Network network, 
DeployDestination dest) {
         return  _vpcMgr.getVpcRouters(network.getVpcId());
     }
 
-    
+    @Override
+    public boolean applyIps(Network network, List<? extends PublicIpAddress> 
ipAddress, Set<Service> services) 
+            throws ResourceUnavailableException {
+        boolean canHandle = true;
+        for (Service service : services) {
+            if (!canHandle(network, service)) {
+                canHandle = false;
+                break;
+            }
+        }
+        if (canHandle) {
+            List<DomainRouterVO> routers = getRouters(network, null);
+            if (routers == null || routers.isEmpty()) {
+                s_logger.debug(this.getName() + " element doesn't need to 
associate ip addresses on the backend; VPC virtual " +
+                        "router doesn't exist in the network " + 
network.getId());
+                return true;
+            }
+
+            return _vpcRouterMgr.associateIP(network, ipAddress, routers);
+        } else {
+            return false;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/3e5f391c/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
----------------------------------------------------------------------
diff --git 
a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java 
b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
index 048e6a5..ad99885 100755
--- 
a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++ 
b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@ -2640,7 +2640,8 @@ public class VirtualNetworkApplianceManagerImpl 
implements VirtualNetworkApplian
     }
 
     @Override
-    public boolean associateIP(Network network, final List<? extends 
PublicIpAddress> ipAddress, List<? extends VirtualRouter> routers) throws 
ResourceUnavailableException {
+    public boolean associateIP(Network network, final List<? extends 
PublicIpAddress> ipAddress, List<? extends VirtualRouter> routers)
+            throws ResourceUnavailableException {
         if (ipAddress == null || ipAddress.isEmpty()) {
             s_logger.debug("No ip association rules to be applied for network 
" + network.getId());
             return true;
@@ -2749,11 +2750,11 @@ public class VirtualNetworkApplianceManagerImpl 
implements VirtualNetworkApplian
         return _dnsBasicZoneUpdates;
     }
     
-    private interface RuleApplier {
+    protected interface RuleApplier {
         boolean execute(Network network, VirtualRouter router) throws 
ResourceUnavailableException;
     }
     
-    private boolean applyRules(Network network, List<? extends VirtualRouter> 
routers, String typeString, 
+    protected boolean applyRules(Network network, List<? extends 
VirtualRouter> routers, String typeString, 
             boolean isPodLevelException, Long podId, boolean 
failWhenDisconnect, RuleApplier applier) throws ResourceUnavailableException {
         if (routers == null || routers.isEmpty()) {
             s_logger.warn("Unable to apply " + typeString + ", virtual router 
doesn't exist in the network " + network.getId());

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/3e5f391c/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 39499aa..c351485 100644
--- 
a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
+++ 
b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
@@ -156,7 +156,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends 
VirtualNetworkApplian
             
             PublicIp sourceNatIp = 
_networkMgr.assignSourceNatIpAddressToVpc(owner, vpc);
             
-            DomainRouterVO router = deployRouter(owner, dest, plan, params, 
false, vpcVrProvider, offeringId,
+            DomainRouterVO router = deployVpcRouter(owner, dest, plan, params, 
false, vpcVrProvider, offeringId,
                     vpc.getId(), sourceNatIp);
             routers.add(router);
             
@@ -344,40 +344,13 @@ public class VpcVirtualNetworkApplianceManagerImpl 
extends VirtualNetworkApplian
     protected boolean associtePublicIpInVpc(Network network, VirtualRouter 
router, boolean add, PublicIp ipAddress) 
             throws ConcurrentOperationException, ResourceUnavailableException{
         
-        //1) Associate ip addresses
         List<PublicIp> publicIps = new ArrayList<PublicIp>(1);
         publicIps.add(ipAddress);
         Commands cmds = new Commands(OnError.Stop);
         createVpcAssociateIPCommands(router, publicIps, cmds, 0);
-        String assoc = add ? "Associating " : "Disassociating";
-        StringBuilder debugMsg = new StringBuilder(assoc + " ip address " + 
ipAddress); 
-        
-        //2) If sourceNat, setup the source nat
-        if (ipAddress.isSourceNat()) {
-            Integer networkRate = 
_networkMgr.getNetworkRate(ipAddress.getNetworkId(), router.getId());
-            String vmGuestAddress = null;
-
-            IpAddressTO ip = new IpAddressTO(ipAddress.getAccountId(), 
ipAddress.getAddress().addr(), add, false, 
-                    true, ipAddress.getVlanTag(), ipAddress.getGateway(), 
ipAddress.getNetmask(), ipAddress.getMacAddress(),
-                    vmGuestAddress, networkRate, ipAddress.isOneToOneNat());
-            
-            
-
-            ip.setTrafficType(network.getTrafficType());
-            
ip.setNetworkName(_networkMgr.getNetworkTag(router.getHypervisorType(), 
network));
-        
-            SetSourceNatCommand cmd = new SetSourceNatCommand(ip, true);
-            cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, 
getRouterControlIp(router.getId()));
-            cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, 
getRouterIpInNetwork(ipAddress.getNetworkId(), router.getId()));
-            cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, 
router.getInstanceName());
-            DataCenterVO dcVo = 
_dcDao.findById(router.getDataCenterIdToDeployIn());
-            cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, 
dcVo.getNetworkType().toString());
-            String enable = add ? "enabling" : "disabling";
-            debugMsg.append(" and " + enable + " source nat for it");
-        }
         
         if (sendCommandsToRouter(router, cmds)) {
-            s_logger.debug("Successfully applied ip associatino for ip " + 
ipAddress + " in vpc network " + network);
+            s_logger.debug("Successfully applied ip association for ip " + 
ipAddress + " in vpc network " + network);
             return true;
         } else {
             s_logger.warn("Failed to associate ip address " + ipAddress + " in 
vpc network " + network);
@@ -443,7 +416,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends 
VirtualNetworkApplian
         return true;
     }
     
-    protected DomainRouterVO deployRouter(Account owner, DeployDestination 
dest, DeploymentPlan plan, Map<Param, Object> params,
+    protected DomainRouterVO deployVpcRouter(Account owner, DeployDestination 
dest, DeploymentPlan plan, Map<Param, Object> params,
             boolean isRedundant, VirtualRouterProvider vrProvider, long 
svcOffId,
             Long vpcId, PublicIp sourceNatIp) throws 
ConcurrentOperationException, 
             InsufficientAddressCapacityException, 
InsufficientServerCapacityException, InsufficientCapacityException, 
@@ -580,8 +553,11 @@ public class VpcVirtualNetworkApplianceManagerImpl extends 
VirtualNetworkApplian
         return result;
     }
     
-    private void createVpcAssociateIPCommands(final VirtualRouter router, 
final List<? extends PublicIpAddress> ips, Commands cmds, long vmId) {
-
+    private void createVpcAssociateIPCommands(final VirtualRouter router, 
final List<? extends PublicIpAddress> ips,
+            Commands cmds, long vmId) {
+        
+        Pair<IpAddressTO, Long> sourceNatIpAdd = null;
+        Boolean addSourceNat = null;
         // Ensure that in multiple vlans case we first send all ip addresses 
of vlan1, then all ip addresses of vlan2, etc..
         Map<String, ArrayList<PublicIpAddress>> vlanIpMap = new 
HashMap<String, ArrayList<PublicIpAddress>>();
         for (final PublicIpAddress ipAddress : ips) {
@@ -610,20 +586,18 @@ public class VpcVirtualNetworkApplianceManagerImpl 
extends VirtualNetworkApplian
 
             for (final PublicIpAddress ipAddr : ipAddrList) {
                 boolean add = (ipAddr.getState() == IpAddress.State.Releasing 
? false : true);
-                boolean sourceNat = ipAddr.isSourceNat();
-                String vlanId = ipAddr.getVlanTag();
-                String vlanGateway = ipAddr.getGateway();
-                String vlanNetmask = ipAddr.getNetmask();
-                String vifMacAddress = ipAddr.getMacAddress();
-
-                String vmGuestAddress = null;
 
                 IpAddressTO ip = new IpAddressTO(ipAddr.getAccountId(), 
ipAddr.getAddress().addr(), add, false, 
-                        sourceNat, vlanId, vlanGateway, vlanNetmask, 
vifMacAddress, vmGuestAddress, networkRate, ipAddr.isOneToOneNat());
+                        ipAddr.isSourceNat(), ipAddr.getVlanTag(), 
ipAddr.getGateway(), ipAddr.getNetmask(), ipAddr.getMacAddress(),
+                        null, networkRate, ipAddr.isOneToOneNat());
 
                 ip.setTrafficType(network.getTrafficType());
                 
ip.setNetworkName(_networkMgr.getNetworkTag(router.getHypervisorType(), 
network));
                 ipsToSend[i++] = ip;
+                if (ipAddr.isSourceNat()) {
+                    sourceNatIpAdd = new Pair<IpAddressTO, Long>(ip, 
ipAddr.getNetworkId());
+                    addSourceNat = add;
+                }
             }
             IpAssocVpcCommand cmd = new IpAssocVpcCommand(ipsToSend);
             cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, 
getRouterControlIp(router.getId()));
@@ -634,6 +608,79 @@ public class VpcVirtualNetworkApplianceManagerImpl extends 
VirtualNetworkApplian
 
             cmds.addCommand("IPAssocVpcCommand", cmd);
         }
+        
+        //set source nat ip
+        if (sourceNatIpAdd != null) {
+            IpAddressTO sourceNatIp = sourceNatIpAdd.first();
+            Long networkId = sourceNatIpAdd.second();
+            SetSourceNatCommand cmd = new SetSourceNatCommand(sourceNatIp, 
addSourceNat);
+            cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, 
getRouterControlIp(router.getId()));
+            cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, 
getRouterIpInNetwork(networkId, router.getId()));
+            cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, 
router.getInstanceName());
+            DataCenterVO dcVo = 
_dcDao.findById(router.getDataCenterIdToDeployIn());
+            cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, 
dcVo.getNetworkType().toString());
+            cmds.addCommand("SetSourceNatCommand", cmd);
+        }
+    }
+    
+    @Override
+    public boolean associateIP(Network network, final List<? extends 
PublicIpAddress> ipAddress, List<? extends VirtualRouter> routers)
+            throws ResourceUnavailableException {
+        if (ipAddress == null || ipAddress.isEmpty()) {
+            s_logger.debug("No ip association rules to be applied for network 
" + network.getId());
+            return true;
+        }
+        
+        //1) check which nics need to be plugged and plug them
+        for (PublicIpAddress ip : ipAddress) {
+            for (VirtualRouter router : routers) {
+                URI broadcastUri = 
BroadcastDomainType.Vlan.toUri(ip.getVlanTag());
+                Nic nic = 
_nicDao.findByInstanceIdNetworkIdAndBroadcastUri(network.getId(), 
router.getId(), 
+                        broadcastUri.toString());
+                if (nic != null) {
+                    //have to plug the nic(s)
+                    NicProfile defaultNic = new NicProfile();
+                    if (ip.isSourceNat()) {
+                        defaultNic.setDefaultNic(true);
+                    }
+                    defaultNic.setIp4Address(ip.getAddress().addr());
+                    defaultNic.setGateway(ip.getGateway());
+                    defaultNic.setNetmask(ip.getNetmask());
+                    defaultNic.setMacAddress(ip.getMacAddress());
+                    defaultNic.setBroadcastType(BroadcastDomainType.Vlan);
+                    
defaultNic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(ip.getVlanTag()));
+                    
defaultNic.setIsolationUri(IsolationType.Vlan.toUri(ip.getVlanTag()));
+                    
+                    NicProfile publicNic = null;
+                    Network publicNtwk = null;
+                    try {
+                        publicNtwk = _networkMgr.getNetwork(ip.getNetworkId());
+                        publicNic = _itMgr.addVmToNetwork(router, publicNtwk, 
defaultNic);
+                    } catch (ConcurrentOperationException e) {
+                        s_logger.warn("Failed to add router " + router + " to 
vlan " + ip.getVlanTag() + 
+                                " in public network " + publicNtwk + " due to 
", e);
+                    } catch (InsufficientCapacityException e) {
+                        s_logger.warn("Failed to add router " + router + " to 
vlan " + ip.getVlanTag() + 
+                                " in public network " + publicNtwk + " due to 
", e);
+                    } finally {
+                        if (publicNic == null) {
+                            s_logger.warn("Failed to add router " + router + " 
to vlan " + ip.getVlanTag() + 
+                                    " in public network " + publicNtwk);
+                            return false;
+                        }
+                    }
+                }
+            }
+        }
+        
+        //2) apply the ips
+        return applyRules(network, routers, "vpc ip association", false, null, 
false, new RuleApplier() {
+            @Override
+            public boolean execute(Network network, VirtualRouter router) 
throws ResourceUnavailableException {
+                Commands cmds = new Commands(OnError.Continue);
+                createVpcAssociateIPCommands(router, ipAddress, cmds, 0);
+                return sendCommandsToRouter(router, cmds);
+            }
+        });
     }
-
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/3e5f391c/wscript
----------------------------------------------------------------------
diff --git a/wscript b/wscript
index 96c75d0..f8b7aea 100644
--- a/wscript
+++ b/wscript
@@ -5,7 +5,7 @@
 # if you change 'em here, you need to change it also in cloud.spec, add a 
%changelog entry there, and add an entry in debian/changelog
 
 
-VERSION = '3.0.3.2012-06-12T00:24:56Z'
+VERSION = '3.0.3.2012-06-12T20:28:54Z'
 APPNAME = 'cloud'
 
 import shutil,os

Reply via email to