Fixing guest network interfaces on redundant routers

- The interfaces were messed up because part of the code was still taking inot 
account a non-redundant path.


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

Branch: refs/heads/feature/systemvm-persistent-config
Commit: 3aaab4cc92026138993a24892dd50250d42bbfb9
Parents: ee868a0
Author: wilderrodrigues <[email protected]>
Authored: Tue Jan 20 11:04:39 2015 +0100
Committer: wilderrodrigues <[email protected]>
Committed: Wed Feb 4 18:47:07 2015 +0100

----------------------------------------------------------------------
 .../cloud/network/router/NetworkHelperImpl.java |   5 +-
 .../VpcVirtualNetworkApplianceManagerImpl.java  | 403 +++++++++----------
 .../topology/AdvancedNetworkTopology.java       |  35 +-
 3 files changed, 212 insertions(+), 231 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3aaab4cc/server/src/com/cloud/network/router/NetworkHelperImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/router/NetworkHelperImpl.java 
b/server/src/com/cloud/network/router/NetworkHelperImpl.java
index cfbaf52..8ca7615 100644
--- a/server/src/com/cloud/network/router/NetworkHelperImpl.java
+++ b/server/src/com/cloud/network/router/NetworkHelperImpl.java
@@ -392,10 +392,7 @@ public class NetworkHelperImpl implements NetworkHelper {
         DomainRouterVO result = null;
         assert router.getIsRedundantRouter();
         final List<Long> networkIds = 
_routerDao.getRouterNetworks(router.getId());
-        // Not support VPC now
-        if (networkIds.size() > 1) {
-            throw new ResourceUnavailableException("Unable to support more 
than one guest network for redundant router now!", DataCenter.class, 
router.getDataCenterId());
-        }
+
         DomainRouterVO routerToBeAvoid = null;
         if (networkIds.size() != 0) {
             final List<DomainRouterVO> routerList = 
_routerDao.findByNetwork(networkIds.get(0));

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3aaab4cc/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 e74f022..f06b1ba 100644
--- 
a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
+++ 
b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
@@ -234,39 +234,35 @@ public class VpcVirtualNetworkApplianceManagerImpl 
extends VirtualNetworkApplian
 
     @Override
     public boolean finalizeVirtualMachineProfile(final VirtualMachineProfile 
profile, final DeployDestination dest, final ReservationContext context) {
-        final DomainRouterVO vr = _routerDao.findById(profile.getId());
-
-        if (vr.getVpcId() != null) {
-            final List<DomainRouterVO> routers = getVpcRouters(vr.getVpcId());
-            for (final DomainRouterVO domainRouterVO : routers) {
-
-                if (domainRouterVO.getState() == State.Starting || 
domainRouterVO.getState() == State.Running) {
-                    String defaultDns1 = null;
-                    String defaultDns2 = null;
-                    // remove public and guest nics as we will plug them later
-                    final Iterator<NicProfile> it = 
profile.getNics().iterator();
-                    while (it.hasNext()) {
-                        final NicProfile nic = it.next();
-                        if (nic.getTrafficType() == TrafficType.Public || 
nic.getTrafficType() == TrafficType.Guest) {
-                            // save dns information
-                            if (nic.getTrafficType() == TrafficType.Public) {
-                                defaultDns1 = nic.getDns1();
-                                defaultDns2 = nic.getDns2();
-                            }
-                            s_logger.debug("Removing nic " + nic + " of type " 
+ nic.getTrafficType() + " from the nics passed on vm start. " + "The nic will 
be plugged later");
-                            it.remove();
+        final DomainRouterVO domainRouterVO = 
_routerDao.findById(profile.getId());
+
+        if (domainRouterVO.getVpcId() != null) {
+            if (domainRouterVO.getState() == State.Starting || 
domainRouterVO.getState() == State.Running) {
+                String defaultDns1 = null;
+                String defaultDns2 = null;
+                // remove public and guest nics as we will plug them later
+                final Iterator<NicProfile> it = profile.getNics().iterator();
+                while (it.hasNext()) {
+                    final NicProfile nic = it.next();
+                    if (nic.getTrafficType() == TrafficType.Public || 
nic.getTrafficType() == TrafficType.Guest) {
+                        // save dns information
+                        if (nic.getTrafficType() == TrafficType.Public) {
+                            defaultDns1 = nic.getDns1();
+                            defaultDns2 = nic.getDns2();
                         }
+                        s_logger.debug("Removing nic " + nic + " of type " + 
nic.getTrafficType() + " from the nics passed on vm start. " + "The nic will be 
plugged later");
+                        it.remove();
                     }
+                }
 
-                    // add vpc cidr/dns/networkdomain to the boot load args
-                    final StringBuilder buf = profile.getBootArgsBuilder();
-                    final Vpc vpc = _entityMgr.findById(Vpc.class, 
domainRouterVO.getVpcId());
-                    buf.append(" vpccidr=" + vpc.getCidr() + " domain=" + 
vpc.getNetworkDomain());
+                // add vpc cidr/dns/networkdomain to the boot load args
+                final StringBuilder buf = profile.getBootArgsBuilder();
+                final Vpc vpc = _entityMgr.findById(Vpc.class, 
domainRouterVO.getVpcId());
+                buf.append(" vpccidr=" + vpc.getCidr() + " domain=" + 
vpc.getNetworkDomain());
 
-                    buf.append(" dns1=").append(defaultDns1);
-                    if (defaultDns2 != null) {
-                        buf.append(" dns2=").append(defaultDns2);
-                    }
+                buf.append(" dns1=").append(defaultDns1);
+                if (defaultDns2 != null) {
+                    buf.append(" dns2=").append(defaultDns2);
                 }
             }
         }
@@ -276,208 +272,201 @@ public class VpcVirtualNetworkApplianceManagerImpl 
extends VirtualNetworkApplian
 
     @Override
     public boolean finalizeCommandsOnStart(final Commands cmds, final 
VirtualMachineProfile profile) {
-        final DomainRouterVO router = _routerDao.findById(profile.getId());
+        final DomainRouterVO domainRouterVO = 
_routerDao.findById(profile.getId());
 
-        final boolean isVpc = router.getVpcId() != null;
+        final boolean isVpc = domainRouterVO.getVpcId() != null;
         if (!isVpc) {
             return super.finalizeCommandsOnStart(cmds, profile);
         }
 
-        final List<DomainRouterVO> routers = getVpcRouters(router.getVpcId());
-        for (final DomainRouterVO domainRouterVO : routers) {
+        if (domainRouterVO.getState() == State.Starting || 
domainRouterVO.getState() == State.Running) {
+            // 1) FORM SSH CHECK COMMAND
+            final NicProfile controlNic = getControlNic(profile);
+            if (controlNic == null) {
+                s_logger.error("Control network doesn't exist for the router " 
+ domainRouterVO);
+                return false;
+            }
 
-            if (domainRouterVO.getState() == State.Starting || 
domainRouterVO.getState() == State.Running) {
-                // 1) FORM SSH CHECK COMMAND
-                final NicProfile controlNic = getControlNic(profile);
-                if (controlNic == null) {
-                    s_logger.error("Control network doesn't exist for the 
router " + domainRouterVO);
-                    return false;
+            finalizeSshAndVersionAndNetworkUsageOnStart(cmds, profile, 
domainRouterVO, controlNic);
+
+            // 2) FORM PLUG NIC COMMANDS
+            final List<Pair<Nic, Network>> guestNics = new ArrayList<Pair<Nic, 
Network>>();
+            final List<Pair<Nic, Network>> publicNics = new 
ArrayList<Pair<Nic, Network>>();
+            final Map<String, String> vlanMacAddress = new HashMap<String, 
String>();
+
+            final List<? extends Nic> routerNics = 
_nicDao.listByVmId(profile.getId());
+            for (final Nic routerNic : routerNics) {
+                final Network network = 
_networkModel.getNetwork(routerNic.getNetworkId());
+                if (network.getTrafficType() == TrafficType.Guest) {
+                    final Pair<Nic, Network> guestNic = new Pair<Nic, 
Network>(routerNic, network);
+                    guestNics.add(guestNic);
+                } else if (network.getTrafficType() == TrafficType.Public) {
+                    final Pair<Nic, Network> publicNic = new Pair<Nic, 
Network>(routerNic, network);
+                    publicNics.add(publicNic);
+                    final String vlanTag = 
BroadcastDomainType.getValue(routerNic.getBroadcastUri());
+                    vlanMacAddress.put(vlanTag, routerNic.getMacAddress());
                 }
+            }
 
-                finalizeSshAndVersionAndNetworkUsageOnStart(cmds, profile, 
domainRouterVO, controlNic);
-
-                // 2) FORM PLUG NIC COMMANDS
-                final List<Pair<Nic, Network>> guestNics = new 
ArrayList<Pair<Nic, Network>>();
-                final List<Pair<Nic, Network>> publicNics = new 
ArrayList<Pair<Nic, Network>>();
-                final Map<String, String> vlanMacAddress = new HashMap<String, 
String>();
-
-                final List<? extends Nic> routerNics = 
_nicDao.listByVmId(profile.getId());
-                for (final Nic routerNic : routerNics) {
-                    final Network network = 
_networkModel.getNetwork(routerNic.getNetworkId());
-                    if (network.getTrafficType() == TrafficType.Guest) {
-                        final Pair<Nic, Network> guestNic = new Pair<Nic, 
Network>(routerNic, network);
-                        guestNics.add(guestNic);
-                    } else if (network.getTrafficType() == TrafficType.Public) 
{
-                        final Pair<Nic, Network> publicNic = new Pair<Nic, 
Network>(routerNic, network);
-                        publicNics.add(publicNic);
-                        final String vlanTag = 
BroadcastDomainType.getValue(routerNic.getBroadcastUri());
-                        vlanMacAddress.put(vlanTag, routerNic.getMacAddress());
-                    }
-                }
+            final List<Command> usageCmds = new ArrayList<Command>();
 
-                final List<Command> usageCmds = new ArrayList<Command>();
-
-                // 3) PREPARE PLUG NIC COMMANDS
-                try {
-                    // add VPC router to public networks
-                    final List<PublicIp> sourceNat = new 
ArrayList<PublicIp>(1);
-                    for (final Pair<Nic, Network> nicNtwk : publicNics) {
-                        final Nic publicNic = nicNtwk.first();
-                        final Network publicNtwk = nicNtwk.second();
-                        final IPAddressVO userIp = 
_ipAddressDao.findByIpAndSourceNetworkId(publicNtwk.getId(), 
publicNic.getIp4Address());
-
-                        if (userIp.isSourceNat()) {
-                            final PublicIp publicIp = 
PublicIp.createFromAddrAndVlan(userIp, _vlanDao.findById(userIp.getVlanId()));
-                            sourceNat.add(publicIp);
-
-                            if (domainRouterVO.getPublicIpAddress() == null) {
-                                final DomainRouterVO routerVO = 
_routerDao.findById(domainRouterVO.getId());
-                                
routerVO.setPublicIpAddress(publicNic.getIp4Address());
-                                
routerVO.setPublicNetmask(publicNic.getNetmask());
-                                
routerVO.setPublicMacAddress(publicNic.getMacAddress());
-                                _routerDao.update(routerVO.getId(), routerVO);
-                            }
-                        }
-                        final PlugNicCommand plugNicCmd = new 
PlugNicCommand(_nwHelper.getNicTO(domainRouterVO, publicNic.getNetworkId(), 
publicNic.getBroadcastUri().toString()),
-                                domainRouterVO.getInstanceName(), 
domainRouterVO.getType());
-                        cmds.addCommand(plugNicCmd);
-                        final VpcVO vpc = 
_vpcDao.findById(domainRouterVO.getVpcId());
-                        final NetworkUsageCommand netUsageCmd = new 
NetworkUsageCommand(domainRouterVO.getPrivateIpAddress(), 
domainRouterVO.getInstanceName(), true, publicNic.getIp4Address(), 
vpc.getCidr());
-                        usageCmds.add(netUsageCmd);
-                        UserStatisticsVO stats = 
_userStatsDao.findBy(domainRouterVO.getAccountId(), 
domainRouterVO.getDataCenterId(), publicNtwk.getId(), 
publicNic.getIp4Address(), domainRouterVO.getId(),
-                                domainRouterVO.getType().toString());
-                        if (stats == null) {
-                            stats = new 
UserStatisticsVO(domainRouterVO.getAccountId(), 
domainRouterVO.getDataCenterId(), publicNic.getIp4Address(), 
domainRouterVO.getId(), domainRouterVO.getType().toString(),
-                                    publicNtwk.getId());
-                            _userStatsDao.persist(stats);
+            // 3) PREPARE PLUG NIC COMMANDS
+            try {
+                // add VPC router to public networks
+                final List<PublicIp> sourceNat = new ArrayList<PublicIp>(1);
+                for (final Pair<Nic, Network> nicNtwk : publicNics) {
+                    final Nic publicNic = nicNtwk.first();
+                    final Network publicNtwk = nicNtwk.second();
+                    final IPAddressVO userIp = 
_ipAddressDao.findByIpAndSourceNetworkId(publicNtwk.getId(), 
publicNic.getIp4Address());
+
+                    if (userIp.isSourceNat()) {
+                        final PublicIp publicIp = 
PublicIp.createFromAddrAndVlan(userIp, _vlanDao.findById(userIp.getVlanId()));
+                        sourceNat.add(publicIp);
+
+                        if (domainRouterVO.getPublicIpAddress() == null) {
+                            final DomainRouterVO routerVO = 
_routerDao.findById(domainRouterVO.getId());
+                            
routerVO.setPublicIpAddress(publicNic.getIp4Address());
+                            routerVO.setPublicNetmask(publicNic.getNetmask());
+                            
routerVO.setPublicMacAddress(publicNic.getMacAddress());
+                            _routerDao.update(routerVO.getId(), routerVO);
                         }
                     }
-
-                    // create ip assoc for source nat
-                    if (!sourceNat.isEmpty()) {
-                        
_commandSetupHelper.createVpcAssociatePublicIPCommands(domainRouterVO, 
sourceNat, cmds, vlanMacAddress);
+                    final PlugNicCommand plugNicCmd = new 
PlugNicCommand(_nwHelper.getNicTO(domainRouterVO, publicNic.getNetworkId(), 
publicNic.getBroadcastUri().toString()),
+                            domainRouterVO.getInstanceName(), 
domainRouterVO.getType());
+                    cmds.addCommand(plugNicCmd);
+                    final VpcVO vpc = 
_vpcDao.findById(domainRouterVO.getVpcId());
+                    final NetworkUsageCommand netUsageCmd = new 
NetworkUsageCommand(domainRouterVO.getPrivateIpAddress(), 
domainRouterVO.getInstanceName(), true, publicNic.getIp4Address(), 
vpc.getCidr());
+                    usageCmds.add(netUsageCmd);
+                    UserStatisticsVO stats = 
_userStatsDao.findBy(domainRouterVO.getAccountId(), 
domainRouterVO.getDataCenterId(), publicNtwk.getId(), 
publicNic.getIp4Address(), domainRouterVO.getId(),
+                            domainRouterVO.getType().toString());
+                    if (stats == null) {
+                        stats = new 
UserStatisticsVO(domainRouterVO.getAccountId(), 
domainRouterVO.getDataCenterId(), publicNic.getIp4Address(), 
domainRouterVO.getId(), domainRouterVO.getType().toString(),
+                                publicNtwk.getId());
+                        _userStatsDao.persist(stats);
                     }
+                }
 
-                    // add VPC router to guest networks
-                    for (final Pair<Nic, Network> nicNtwk : guestNics) {
-                        final Nic guestNic = nicNtwk.first();
-                        // plug guest nic
-                        final PlugNicCommand plugNicCmd = new 
PlugNicCommand(_nwHelper.getNicTO(domainRouterVO, guestNic.getNetworkId(), 
null), domainRouterVO.getInstanceName(), domainRouterVO.getType());
-                        cmds.addCommand(plugNicCmd);
-                        if 
(!_networkModel.isPrivateGateway(guestNic.getNetworkId())) {
-                            // set guest network
-                            final VirtualMachine vm = 
_vmDao.findById(domainRouterVO.getId());
-                            final NicProfile nicProfile = 
_networkModel.getNicProfile(vm, guestNic.getNetworkId(), null);
-                            final SetupGuestNetworkCommand setupCmd = 
_commandSetupHelper.createSetupGuestNetworkCommand(domainRouterVO, true, 
nicProfile);
-                            cmds.addCommand(setupCmd);
-                        } else {
-
-                            // set private network
-                            final PrivateIpVO ipVO = 
_privateIpDao.findByIpAndSourceNetworkId(guestNic.getNetworkId(), 
guestNic.getIp4Address());
-                            final Network network = 
_networkDao.findById(guestNic.getNetworkId());
-                            
BroadcastDomainType.getValue(network.getBroadcastUri());
-                            final String netmask = 
NetUtils.getCidrNetmask(network.getCidr());
-                            final PrivateIpAddress ip = new 
PrivateIpAddress(ipVO, network.getBroadcastUri().toString(), 
network.getGateway(), netmask, guestNic.getMacAddress());
-
-                            final List<PrivateIpAddress> privateIps = new 
ArrayList<PrivateIpAddress>(1);
-                            privateIps.add(ip);
-                            
_commandSetupHelper.createVpcAssociatePrivateIPCommands(domainRouterVO, 
privateIps, cmds, true);
-
-                            final Long privateGwAclId = 
_vpcGatewayDao.getNetworkAclIdForPrivateIp(ipVO.getVpcId(), 
ipVO.getNetworkId(), ipVO.getIpAddress());
-
-                            if (privateGwAclId != null) {
-                                // set network acl on private gateway
-                                final List<NetworkACLItemVO> networkACLs = 
_networkACLItemDao.listByACL(privateGwAclId);
-                                s_logger.debug("Found " + networkACLs.size() + 
" network ACLs to apply as a part of VPC VR " + domainRouterVO + " start for 
private gateway ip = "
-                                        + ipVO.getIpAddress());
-
-                                
_commandSetupHelper.createNetworkACLsCommands(networkACLs, domainRouterVO, 
cmds, ipVO.getNetworkId(), true);
-                            }
-                        }
-                    }
-                } catch (final Exception ex) {
-                    s_logger.warn("Failed to add router " + domainRouterVO + " 
to network due to exception ", ex);
-                    return false;
+                // create ip assoc for source nat
+                if (!sourceNat.isEmpty()) {
+                    
_commandSetupHelper.createVpcAssociatePublicIPCommands(domainRouterVO, 
sourceNat, cmds, vlanMacAddress);
                 }
 
-                // 4) RE-APPLY ALL STATIC ROUTE RULES
-                final List<? extends StaticRoute> routes = 
_staticRouteDao.listByVpcId(domainRouterVO.getVpcId());
-                final List<StaticRouteProfile> staticRouteProfiles = new 
ArrayList<StaticRouteProfile>(routes.size());
-                final Map<Long, VpcGateway> gatewayMap = new HashMap<Long, 
VpcGateway>();
-                for (final StaticRoute route : routes) {
-                    VpcGateway gateway = 
gatewayMap.get(route.getVpcGatewayId());
-                    if (gateway == null) {
-                        gateway = _entityMgr.findById(VpcGateway.class, 
route.getVpcGatewayId());
-                        gatewayMap.put(gateway.getId(), gateway);
+                // add VPC router to guest networks
+                for (final Pair<Nic, Network> nicNtwk : guestNics) {
+                    final Nic guestNic = nicNtwk.first();
+                    // plug guest nic
+                    final PlugNicCommand plugNicCmd = new 
PlugNicCommand(_nwHelper.getNicTO(domainRouterVO, guestNic.getNetworkId(), 
null), domainRouterVO.getInstanceName(), domainRouterVO.getType());
+                    cmds.addCommand(plugNicCmd);
+                    if 
(!_networkModel.isPrivateGateway(guestNic.getNetworkId())) {
+                        // set guest network
+                        final VirtualMachine vm = 
_vmDao.findById(domainRouterVO.getId());
+                        final NicProfile nicProfile = 
_networkModel.getNicProfile(vm, guestNic.getNetworkId(), null);
+                        final SetupGuestNetworkCommand setupCmd = 
_commandSetupHelper.createSetupGuestNetworkCommand(domainRouterVO, true, 
nicProfile);
+                        cmds.addCommand(setupCmd);
+                    } else {
+
+                        // set private network
+                        final PrivateIpVO ipVO = 
_privateIpDao.findByIpAndSourceNetworkId(guestNic.getNetworkId(), 
guestNic.getIp4Address());
+                        final Network network = 
_networkDao.findById(guestNic.getNetworkId());
+                        
BroadcastDomainType.getValue(network.getBroadcastUri());
+                        final String netmask = 
NetUtils.getCidrNetmask(network.getCidr());
+                        final PrivateIpAddress ip = new PrivateIpAddress(ipVO, 
network.getBroadcastUri().toString(), network.getGateway(), netmask, 
guestNic.getMacAddress());
+
+                        final List<PrivateIpAddress> privateIps = new 
ArrayList<PrivateIpAddress>(1);
+                        privateIps.add(ip);
+                        
_commandSetupHelper.createVpcAssociatePrivateIPCommands(domainRouterVO, 
privateIps, cmds, true);
+
+                        final Long privateGwAclId = 
_vpcGatewayDao.getNetworkAclIdForPrivateIp(ipVO.getVpcId(), 
ipVO.getNetworkId(), ipVO.getIpAddress());
+
+                        if (privateGwAclId != null) {
+                            // set network acl on private gateway
+                            final List<NetworkACLItemVO> networkACLs = 
_networkACLItemDao.listByACL(privateGwAclId);
+                            s_logger.debug("Found " + networkACLs.size() + " 
network ACLs to apply as a part of VPC VR " + domainRouterVO + " start for 
private gateway ip = "
+                                    + ipVO.getIpAddress());
+
+                            
_commandSetupHelper.createNetworkACLsCommands(networkACLs, domainRouterVO, 
cmds, ipVO.getNetworkId(), true);
+                        }
                     }
-                    staticRouteProfiles.add(new StaticRouteProfile(route, 
gateway));
                 }
+            } catch (final Exception ex) {
+                s_logger.warn("Failed to add router " + domainRouterVO + " to 
network due to exception ", ex);
+                return false;
+            }
 
-                s_logger.debug("Found " + staticRouteProfiles.size() + " 
static routes to apply as a part of vpc route " + domainRouterVO + " start");
-                if (!staticRouteProfiles.isEmpty()) {
-                    
_commandSetupHelper.createStaticRouteCommands(staticRouteProfiles, 
domainRouterVO, cmds);
+            // 4) RE-APPLY ALL STATIC ROUTE RULES
+            final List<? extends StaticRoute> routes = 
_staticRouteDao.listByVpcId(domainRouterVO.getVpcId());
+            final List<StaticRouteProfile> staticRouteProfiles = new 
ArrayList<StaticRouteProfile>(routes.size());
+            final Map<Long, VpcGateway> gatewayMap = new HashMap<Long, 
VpcGateway>();
+            for (final StaticRoute route : routes) {
+                VpcGateway gateway = gatewayMap.get(route.getVpcGatewayId());
+                if (gateway == null) {
+                    gateway = _entityMgr.findById(VpcGateway.class, 
route.getVpcGatewayId());
+                    gatewayMap.put(gateway.getId(), gateway);
                 }
+                staticRouteProfiles.add(new StaticRouteProfile(route, 
gateway));
+            }
 
-                // 5) RE-APPLY ALL REMOTE ACCESS VPNs
-                final RemoteAccessVpnVO vpn = 
_vpnDao.findByAccountAndVpc(domainRouterVO.getAccountId(), 
domainRouterVO.getVpcId());
-                if (vpn != null) {
-                    _commandSetupHelper.createApplyVpnCommands(true, vpn, 
domainRouterVO, cmds);
-                }
+            s_logger.debug("Found " + staticRouteProfiles.size() + " static 
routes to apply as a part of vpc route " + domainRouterVO + " start");
+            if (!staticRouteProfiles.isEmpty()) {
+                
_commandSetupHelper.createStaticRouteCommands(staticRouteProfiles, 
domainRouterVO, cmds);
+            }
 
-                // 6) REPROGRAM GUEST NETWORK
-                boolean reprogramGuestNtwks = true;
-                if (profile.getParameter(Param.ReProgramGuestNetworks) != null 
&& (Boolean) profile.getParameter(Param.ReProgramGuestNetworks) == false) {
-                    reprogramGuestNtwks = false;
-                }
+            // 5) RE-APPLY ALL REMOTE ACCESS VPNs
+            final RemoteAccessVpnVO vpn = 
_vpnDao.findByAccountAndVpc(domainRouterVO.getAccountId(), 
domainRouterVO.getVpcId());
+            if (vpn != null) {
+                _commandSetupHelper.createApplyVpnCommands(true, vpn, 
domainRouterVO, cmds);
+            }
 
-                final VirtualRouterProvider vrProvider = 
_vrProviderDao.findById(domainRouterVO.getElementId());
-                if (vrProvider == null) {
-                    throw new CloudRuntimeException("Cannot find related 
virtual router provider of router: " + domainRouterVO.getHostName());
-                }
-                final Provider provider = 
Network.Provider.getProvider(vrProvider.getType().toString());
-                if (provider == null) {
-                    throw new CloudRuntimeException("Cannot find related 
provider of virtual router provider: " + vrProvider.getType().toString());
-                }
+            // 6) REPROGRAM GUEST NETWORK
+            boolean reprogramGuestNtwks = true;
+            if (profile.getParameter(Param.ReProgramGuestNetworks) != null && 
(Boolean) profile.getParameter(Param.ReProgramGuestNetworks) == false) {
+                reprogramGuestNtwks = false;
+            }
 
-                for (final Pair<Nic, Network> nicNtwk : guestNics) {
-                    final Nic guestNic = nicNtwk.first();
-                    final AggregationControlCommand startCmd = new 
AggregationControlCommand(Action.Start, domainRouterVO.getInstanceName(), 
controlNic.getIp4Address(), _routerControlHelper.getRouterIpInNetwork(
-                            guestNic.getNetworkId(), domainRouterVO.getId()));
-                    cmds.addCommand(startCmd);
-                    if (reprogramGuestNtwks) {
-                        finalizeIpAssocForNetwork(cmds, domainRouterVO, 
provider, guestNic.getNetworkId(), vlanMacAddress);
-                        finalizeNetworkRulesForNetwork(cmds, domainRouterVO, 
provider, guestNic.getNetworkId());
-                    }
+            final VirtualRouterProvider vrProvider = 
_vrProviderDao.findById(domainRouterVO.getElementId());
+            if (vrProvider == null) {
+                throw new CloudRuntimeException("Cannot find related virtual 
router provider of router: " + domainRouterVO.getHostName());
+            }
+            final Provider provider = 
Network.Provider.getProvider(vrProvider.getType().toString());
+            if (provider == null) {
+                throw new CloudRuntimeException("Cannot find related provider 
of virtual router provider: " + vrProvider.getType().toString());
+            }
 
-                    finalizeUserDataAndDhcpOnStart(cmds, domainRouterVO, 
provider, guestNic.getNetworkId());
-                    final AggregationControlCommand finishCmd = new 
AggregationControlCommand(Action.Finish, domainRouterVO.getInstanceName(), 
controlNic.getIp4Address(), _routerControlHelper.getRouterIpInNetwork(
-                            guestNic.getNetworkId(), domainRouterVO.getId()));
-                    cmds.addCommand(finishCmd);
+            for (final Pair<Nic, Network> nicNtwk : guestNics) {
+                final Nic guestNic = nicNtwk.first();
+                final AggregationControlCommand startCmd = new 
AggregationControlCommand(Action.Start, domainRouterVO.getInstanceName(), 
controlNic.getIp4Address(), _routerControlHelper.getRouterIpInNetwork(
+                        guestNic.getNetworkId(), domainRouterVO.getId()));
+                cmds.addCommand(startCmd);
+                if (reprogramGuestNtwks) {
+                    finalizeIpAssocForNetwork(cmds, domainRouterVO, provider, 
guestNic.getNetworkId(), vlanMacAddress);
+                    finalizeNetworkRulesForNetwork(cmds, domainRouterVO, 
provider, guestNic.getNetworkId());
                 }
 
-                // Add network usage commands
-                cmds.addCommands(usageCmds);
+                finalizeUserDataAndDhcpOnStart(cmds, domainRouterVO, provider, 
guestNic.getNetworkId());
+                final AggregationControlCommand finishCmd = new 
AggregationControlCommand(Action.Finish, domainRouterVO.getInstanceName(), 
controlNic.getIp4Address(), _routerControlHelper.getRouterIpInNetwork(
+                        guestNic.getNetworkId(), domainRouterVO.getId()));
+                cmds.addCommand(finishCmd);
             }
+
+            // Add network usage commands
+            cmds.addCommands(usageCmds);
         }
         return true;
     }
 
     @Override
-    protected void finalizeNetworkRulesForNetwork(final Commands cmds, final 
DomainRouterVO router, final Provider provider, final Long guestNetworkId) {
+    protected void finalizeNetworkRulesForNetwork(final Commands cmds, final 
DomainRouterVO domainRouterVO, final Provider provider, final Long 
guestNetworkId) {
 
-        super.finalizeNetworkRulesForNetwork(cmds, router, provider, 
guestNetworkId);
+        super.finalizeNetworkRulesForNetwork(cmds, domainRouterVO, provider, 
guestNetworkId);
 
-        if (router.getVpcId() != null) {
-            final List<DomainRouterVO> routers = 
getVpcRouters(router.getVpcId());
-            for (final DomainRouterVO domainRouterVO : routers) {
+        if (domainRouterVO.getVpcId() != null) {
 
-                if (domainRouterVO.getState() == State.Starting || 
domainRouterVO.getState() == State.Running) {
-                    if 
(_networkModel.isProviderSupportServiceInNetwork(guestNetworkId, 
Service.NetworkACL, Provider.VPCVirtualRouter)) {
-                        final List<NetworkACLItemVO> networkACLs = 
_networkACLMgr.listNetworkACLItems(guestNetworkId);
-                        if (networkACLs != null && !networkACLs.isEmpty()) {
-                            s_logger.debug("Found " + networkACLs.size() + " 
network ACLs to apply as a part of VPC VR " + domainRouterVO + " start for 
guest network id=" + guestNetworkId);
-                            
_commandSetupHelper.createNetworkACLsCommands(networkACLs, domainRouterVO, 
cmds, guestNetworkId, false);
-                        }
+            if (domainRouterVO.getState() == State.Starting || 
domainRouterVO.getState() == State.Running) {
+                if 
(_networkModel.isProviderSupportServiceInNetwork(guestNetworkId, 
Service.NetworkACL, Provider.VPCVirtualRouter)) {
+                    final List<NetworkACLItemVO> networkACLs = 
_networkACLMgr.listNetworkACLItems(guestNetworkId);
+                    if (networkACLs != null && !networkACLs.isEmpty()) {
+                        s_logger.debug("Found " + networkACLs.size() + " 
network ACLs to apply as a part of VPC VR " + domainRouterVO + " start for 
guest network id=" + guestNetworkId);
+                        
_commandSetupHelper.createNetworkACLsCommands(networkACLs, domainRouterVO, 
cmds, guestNetworkId, false);
                     }
                 }
             }
@@ -574,25 +563,21 @@ public class VpcVirtualNetworkApplianceManagerImpl 
extends VirtualNetworkApplian
     }
 
     @Override
-    protected void finalizeIpAssocForNetwork(final Commands cmds, final 
VirtualRouter router, final Provider provider, final Long guestNetworkId,
+    protected void finalizeIpAssocForNetwork(final Commands cmds, final 
VirtualRouter domainRouterVO, final Provider provider, final Long 
guestNetworkId,
             final Map<String, String> vlanMacAddress) {
 
-        if (router.getVpcId() == null) {
-            super.finalizeIpAssocForNetwork(cmds, router, provider, 
guestNetworkId, vlanMacAddress);
+        if (domainRouterVO.getVpcId() == null) {
+            super.finalizeIpAssocForNetwork(cmds, domainRouterVO, provider, 
guestNetworkId, vlanMacAddress);
             return;
         }
 
-        final List<DomainRouterVO> routers = getVpcRouters(router.getVpcId());
-        for (final DomainRouterVO domainRouterVO : routers) {
+        if (domainRouterVO.getState() == State.Starting || 
domainRouterVO.getState() == State.Running) {
+            final ArrayList<? extends PublicIpAddress> publicIps = 
getPublicIpsToApply(domainRouterVO, provider, guestNetworkId, 
IpAddress.State.Releasing);
 
-            if (domainRouterVO.getState() == State.Starting || 
domainRouterVO.getState() == State.Running) {
-                final ArrayList<? extends PublicIpAddress> publicIps = 
getPublicIpsToApply(domainRouterVO, provider, guestNetworkId, 
IpAddress.State.Releasing);
-
-                if (publicIps != null && !publicIps.isEmpty()) {
-                    s_logger.debug("Found " + publicIps.size() + " ip(s) to 
apply as a part of domR " + domainRouterVO + " start.");
-                    // Re-apply public ip addresses - should come before 
PF/LB/VPN
-                    
_commandSetupHelper.createVpcAssociatePublicIPCommands(domainRouterVO, 
publicIps, cmds, vlanMacAddress);
-                }
+            if (publicIps != null && !publicIps.isEmpty()) {
+                s_logger.debug("Found " + publicIps.size() + " ip(s) to apply 
as a part of domR " + domainRouterVO + " start.");
+                // Re-apply public ip addresses - should come before PF/LB/VPN
+                
_commandSetupHelper.createVpcAssociatePublicIPCommands(domainRouterVO, 
publicIps, cmds, vlanMacAddress);
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3aaab4cc/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 f35af42..fffac04 100644
--- 
a/server/src/org/apache/cloudstack/network/topology/AdvancedNetworkTopology.java
+++ 
b/server/src/org/apache/cloudstack/network/topology/AdvancedNetworkTopology.java
@@ -71,11 +71,11 @@ public class AdvancedNetworkTopology extends 
BasicNetworkTopology {
 
         s_logger.debug("APPLYING ADVANCED VPN USERS RULES");
 
-        AdvancedVpnRules routesRules = new AdvancedVpnRules(remoteAccessVpn, 
users);
+        final AdvancedVpnRules routesRules = new 
AdvancedVpnRules(remoteAccessVpn, users);
 
-        boolean agentResult = routesRules.accept(_advancedVisitor, router);
+        final boolean agentResult = routesRules.accept(_advancedVisitor, 
router);
 
-        String[] result = new String[users.size()];
+        final String[] result = new String[users.size()];
         for (int i = 0; i < result.length; i++) {
             if (agentResult) {
                 result[i] = null;
@@ -97,10 +97,10 @@ public class AdvancedNetworkTopology extends 
BasicNetworkTopology {
             return true;
         }
 
-        StaticRoutesRules routesRules = new StaticRoutesRules(staticRoutes);
+        final StaticRoutesRules routesRules = new 
StaticRoutesRules(staticRoutes);
 
         boolean result = true;
-        for (VirtualRouter router : routers) {
+        for (final VirtualRouter router : routers) {
             if (router.getState() == State.Running) {
 
                 result = result && routesRules.accept(_advancedVisitor, 
router);
@@ -126,7 +126,7 @@ public class AdvancedNetworkTopology extends 
BasicNetworkTopology {
             return false;
         }
 
-        DhcpPvlanRules pvlanRules = new DhcpPvlanRules(isAddPvlan, nic);
+        final DhcpPvlanRules pvlanRules = new DhcpPvlanRules(isAddPvlan, nic);
 
         return pvlanRules.accept(_advancedVisitor, router);
     }
@@ -135,7 +135,7 @@ public class AdvancedNetworkTopology extends 
BasicNetworkTopology {
     public boolean setupPrivateGateway(final PrivateGateway gateway, final 
VirtualRouter router) throws ConcurrentOperationException, 
ResourceUnavailableException {
         s_logger.debug("SETUP PRIVATE GATEWAY RULES");
 
-        PrivateGatewayRules routesRules = new PrivateGatewayRules(gateway);
+        final PrivateGatewayRules routesRules = new 
PrivateGatewayRules(gateway);
 
         return routesRules.accept(_advancedVisitor, router);
     }
@@ -151,7 +151,7 @@ public class AdvancedNetworkTopology extends 
BasicNetworkTopology {
         final boolean failWhenDisconnect = false;
         final Long podId = null;
 
-        UserdataPwdRules pwdRules = new UserdataPwdRules(network, nic, 
profile, dest);
+        final UserdataPwdRules pwdRules = new UserdataPwdRules(network, nic, 
profile, dest);
 
         return applyRules(network, routers, typeString, isPodLevelException, 
podId, failWhenDisconnect, new RuleApplierWrapper<RuleApplier>(pwdRules));
     }
@@ -167,7 +167,7 @@ public class AdvancedNetworkTopology extends 
BasicNetworkTopology {
         final boolean isPodLevelException = false;
         final boolean failWhenDisconnect = false;
 
-        DhcpEntryRules dhcpRules = new DhcpEntryRules(network, nic, profile, 
dest);
+        final DhcpEntryRules dhcpRules = new DhcpEntryRules(network, nic, 
profile, dest);
 
         return applyRules(network, routers, typeString, isPodLevelException, 
podId, failWhenDisconnect, new RuleApplierWrapper<RuleApplier>(dhcpRules));
     }
@@ -181,10 +181,7 @@ public class AdvancedNetworkTopology extends 
BasicNetworkTopology {
             return true;
         }
 
-        // only one router is supported in VPC for now
-        VirtualRouter router = routers.get(0);
-
-        if (router.getVpcId() == null) {
+        if (network.getVpcId() == null) {
             return super.associatePublicIP(network, ipAddresses, routers);
         }
 
@@ -195,11 +192,13 @@ public class AdvancedNetworkTopology extends 
BasicNetworkTopology {
         final boolean failWhenDisconnect = false;
         final Long podId = null;
 
-        NicPlugInOutRules nicPlugInOutRules = new NicPlugInOutRules(network, 
ipAddresses);
-        nicPlugInOutRules.accept(_advancedVisitor, router);
+        final NicPlugInOutRules nicPlugInOutRules = new 
NicPlugInOutRules(network, ipAddresses);
+        for (final VirtualRouter router : routers) {
+            nicPlugInOutRules.accept(_advancedVisitor, router);
+        }
 
-        VpcIpAssociationRules ipAssociationRules = new 
VpcIpAssociationRules(network, ipAddresses);
-        boolean result = applyRules(network, routers, typeString, 
isPodLevelException, podId, failWhenDisconnect, new 
RuleApplierWrapper<RuleApplier>(ipAssociationRules));
+        final VpcIpAssociationRules ipAssociationRules = new 
VpcIpAssociationRules(network, ipAddresses);
+        final boolean result = applyRules(network, routers, typeString, 
isPodLevelException, podId, failWhenDisconnect, new 
RuleApplierWrapper<RuleApplier>(ipAssociationRules));
 
         if (result) {
             _advancedVisitor.visit(nicPlugInOutRules);
@@ -224,7 +223,7 @@ public class AdvancedNetworkTopology extends 
BasicNetworkTopology {
         final boolean failWhenDisconnect = false;
         final Long podId = null;
 
-        NetworkAclsRules aclsRules = new NetworkAclsRules(network, rules, 
isPrivateGateway);
+        final NetworkAclsRules aclsRules = new NetworkAclsRules(network, 
rules, isPrivateGateway);
 
         return applyRules(network, routers, typeString, isPodLevelException, 
podId, failWhenDisconnect, new RuleApplierWrapper<RuleApplier>(aclsRules));
     }

Reply via email to