refactor all private methods in the virtual router appliance and VPC appliance

Conflicts:
        
server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
        
server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
        server/src/com/cloud/network/rules/DhcpEntryRules.java
        server/src/com/cloud/network/rules/LoadBalancingRules.java
        server/src/com/cloud/network/rules/RuleApplier.java
        server/src/com/cloud/network/rules/VirtualNetworkApplianceFactory.java
        
server/src/org/apache/cloudstack/network/topology/AdvancedNetworkTopology.java
        
server/src/org/apache/cloudstack/network/topology/AdvancedNetworkVisitor.java
        
server/src/org/apache/cloudstack/network/topology/BasicNetworkVisitor.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/bc90ce08
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/bc90ce08
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/bc90ce08

Branch: refs/heads/vpc-refactor
Commit: bc90ce0871a0060a8c1e829895f1bc25fce1f456
Parents: 085bbb7
Author: Wilder Rodrigues <wrodrig...@schubergphilis.com>
Authored: Thu Aug 21 12:28:07 2014 +0200
Committer: Wilder Rodrigues <wrodrig...@schubergphilis.com>
Committed: Fri Oct 3 06:21:28 2014 +0200

----------------------------------------------------------------------
 .../spring-server-core-managers-context.xml     |   3 +
 .../network/router/CommandSetupHelper.java      | 998 +++++++++++++++++++
 .../VirtualNetworkApplianceManagerImpl.java     | 631 +-----------
 .../VpcVirtualNetworkApplianceManagerImpl.java  | 451 ++-------
 .../com/cloud/network/rules/DhcpEntryRules.java |  64 --
 .../cloud/network/rules/DhcpSubNetRules.java    |  51 -
 .../com/cloud/network/rules/FirewallRules.java  | 166 ---
 .../cloud/network/rules/IpAssociationRules.java | 106 --
 .../cloud/network/rules/LoadBalancingRules.java |  63 --
 .../cloud/network/rules/NetworkAclsRules.java   |  39 -
 .../network/rules/PasswordToRouterRules.java    |  26 +-
 .../network/rules/PrivateGatewayRules.java      |  55 -
 .../com/cloud/network/rules/RuleApplier.java    | 116 ---
 .../network/rules/SshKeyToRouterRules.java      |  23 -
 .../com/cloud/network/rules/StaticNatRules.java |  28 -
 .../cloud/network/rules/StaticRoutesRules.java  |  13 -
 .../cloud/network/rules/UserdataPwdRules.java   |  24 -
 .../rules/VirtualNetworkApplianceFactory.java   |  89 +-
 .../network/rules/VpcIpAssociationRules.java    |  77 --
 .../src/com/cloud/network/rules/VpnRules.java   |  26 -
 .../topology/AdvancedNetworkTopology.java       | 123 +--
 .../topology/AdvancedNetworkVisitor.java        |  20 +-
 .../network/topology/BasicNetworkTopology.java  |   7 +-
 .../network/topology/BasicNetworkVisitor.java   |  34 +-
 .../network/topology/NetworkTopology.java       |   5 +
 25 files changed, 1191 insertions(+), 2047 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/bc90ce08/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
----------------------------------------------------------------------
diff --git 
a/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
 
b/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
index 7a9044b..6d8f32e 100644
--- 
a/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
+++ 
b/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
@@ -197,6 +197,9 @@
     <bean id="basicNetworkVisitor" 
class="org.apache.cloudstack.network.topology.BasicNetworkVisitor" />
     <bean id="advancedNetworkVisitor" 
class="org.apache.cloudstack.network.topology.AdvancedNetworkVisitor" />
     
+    <bean id="commandSetupHelper"
+        class="com.cloud.network.router.CommandSetupHelper" />
+    
     <bean id="routerControlHelper"
         class="com.cloud.network.router.RouterControlHelper" />
         

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/bc90ce08/server/src/com/cloud/network/router/CommandSetupHelper.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/router/CommandSetupHelper.java 
b/server/src/com/cloud/network/router/CommandSetupHelper.java
new file mode 100644
index 0000000..acc343a
--- /dev/null
+++ b/server/src/com/cloud/network/router/CommandSetupHelper.java
@@ -0,0 +1,998 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.network.router;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.SetupGuestNetworkCommand;
+import com.cloud.agent.api.routing.CreateIpAliasCommand;
+import com.cloud.agent.api.routing.DeleteIpAliasCommand;
+import com.cloud.agent.api.routing.DhcpEntryCommand;
+import com.cloud.agent.api.routing.DnsMasqConfigCommand;
+import com.cloud.agent.api.routing.IpAliasTO;
+import com.cloud.agent.api.routing.IpAssocCommand;
+import com.cloud.agent.api.routing.IpAssocVpcCommand;
+import com.cloud.agent.api.routing.LoadBalancerConfigCommand;
+import com.cloud.agent.api.routing.NetworkElementCommand;
+import com.cloud.agent.api.routing.RemoteAccessVpnCfgCommand;
+import com.cloud.agent.api.routing.SavePasswordCommand;
+import com.cloud.agent.api.routing.SetFirewallRulesCommand;
+import com.cloud.agent.api.routing.SetNetworkACLCommand;
+import com.cloud.agent.api.routing.SetPortForwardingRulesCommand;
+import com.cloud.agent.api.routing.SetPortForwardingRulesVpcCommand;
+import com.cloud.agent.api.routing.SetSourceNatCommand;
+import com.cloud.agent.api.routing.SetStaticNatRulesCommand;
+import com.cloud.agent.api.routing.SetStaticRouteCommand;
+import com.cloud.agent.api.routing.Site2SiteVpnCfgCommand;
+import com.cloud.agent.api.routing.VmDataCommand;
+import com.cloud.agent.api.routing.VpnUsersCfgCommand;
+import com.cloud.agent.api.to.DhcpTO;
+import com.cloud.agent.api.to.FirewallRuleTO;
+import com.cloud.agent.api.to.IpAddressTO;
+import com.cloud.agent.api.to.LoadBalancerTO;
+import com.cloud.agent.api.to.NetworkACLTO;
+import com.cloud.agent.api.to.PortForwardingRuleTO;
+import com.cloud.agent.api.to.StaticNatRuleTO;
+import com.cloud.agent.manager.Commands;
+import com.cloud.configuration.Config;
+import com.cloud.dc.DataCenter;
+import com.cloud.dc.DataCenter.NetworkType;
+import com.cloud.dc.DataCenterVO;
+import com.cloud.dc.dao.DataCenterDao;
+import com.cloud.dc.dao.VlanDao;
+import com.cloud.network.IpAddress;
+import com.cloud.network.Network;
+import com.cloud.network.Network.Provider;
+import com.cloud.network.Network.Service;
+import com.cloud.network.NetworkModel;
+import com.cloud.network.Networks.BroadcastDomainType;
+import com.cloud.network.Networks.TrafficType;
+import com.cloud.network.PublicIpAddress;
+import com.cloud.network.RemoteAccessVpn;
+import com.cloud.network.Site2SiteVpnConnection;
+import com.cloud.network.VpnUser;
+import com.cloud.network.VpnUserVO;
+import com.cloud.network.dao.FirewallRulesDao;
+import com.cloud.network.dao.IPAddressDao;
+import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.dao.NetworkVO;
+import com.cloud.network.dao.Site2SiteCustomerGatewayDao;
+import com.cloud.network.dao.Site2SiteCustomerGatewayVO;
+import com.cloud.network.dao.Site2SiteVpnGatewayDao;
+import com.cloud.network.dao.Site2SiteVpnGatewayVO;
+import com.cloud.network.dao.VpnUserDao;
+import com.cloud.network.lb.LoadBalancingRule;
+import com.cloud.network.lb.LoadBalancingRule.LbDestination;
+import com.cloud.network.lb.LoadBalancingRule.LbStickinessPolicy;
+import com.cloud.network.rules.FirewallRule;
+import com.cloud.network.rules.FirewallRule.Purpose;
+import com.cloud.network.rules.FirewallRuleVO;
+import com.cloud.network.rules.PortForwardingRule;
+import com.cloud.network.rules.StaticNat;
+import com.cloud.network.rules.StaticNatRule;
+import com.cloud.network.vpc.NetworkACLItem;
+import com.cloud.network.vpc.PrivateIpAddress;
+import com.cloud.network.vpc.StaticRouteProfile;
+import com.cloud.network.vpc.Vpc;
+import com.cloud.network.vpc.VpcGateway;
+import com.cloud.network.vpc.dao.VpcDao;
+import com.cloud.offering.NetworkOffering;
+import com.cloud.offerings.NetworkOfferingVO;
+import com.cloud.offerings.dao.NetworkOfferingDao;
+import com.cloud.service.dao.ServiceOfferingDao;
+import com.cloud.user.Account;
+import com.cloud.uservm.UserVm;
+import com.cloud.utils.Pair;
+import com.cloud.utils.PasswordGenerator;
+import com.cloud.utils.StringUtils;
+import com.cloud.utils.db.EntityManager;
+import com.cloud.utils.net.NetUtils;
+import com.cloud.vm.DomainRouterVO;
+import com.cloud.vm.Nic;
+import com.cloud.vm.NicIpAlias;
+import com.cloud.vm.NicProfile;
+import com.cloud.vm.NicVO;
+import com.cloud.vm.UserVmVO;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.VirtualMachine.State;
+import com.cloud.vm.VirtualMachineManager;
+import com.cloud.vm.VirtualMachineProfile;
+import com.cloud.vm.dao.DomainRouterDao;
+import com.cloud.vm.dao.NicDao;
+import com.cloud.vm.dao.NicIpAliasDao;
+import com.cloud.vm.dao.NicIpAliasVO;
+import com.cloud.vm.dao.UserVmDao;
+
+public class CommandSetupHelper {
+
+    private static final Logger s_logger = 
Logger.getLogger(CommandSetupHelper.class);
+
+    @Inject
+    private EntityManager _entityMgr;
+
+    @Inject
+    private NicDao _nicDao;
+    @Inject
+    private NetworkDao _networkDao;
+    @Inject
+    private DomainRouterDao _routerDao;
+    @Inject
+    private NetworkModel _networkModel;
+    @Inject
+    private VirtualMachineManager _itMgr;
+    @Inject
+    private DataCenterDao _dcDao;
+    @Inject
+    private NicIpAliasDao _nicIpAliasDao;
+    @Inject
+    private FirewallRulesDao _rulesDao;
+    @Inject
+    private NetworkOfferingDao _networkOfferingDao;
+    @Inject
+    private ConfigurationDao _configDao;
+    @Inject
+    private ServiceOfferingDao _serviceOfferingDao;
+    @Inject
+    private UserVmDao _userVmDao;
+    @Inject
+    private VpnUserDao _vpnUsersDao;
+    @Inject
+    private Site2SiteCustomerGatewayDao _s2sCustomerGatewayDao;
+    @Inject
+    private Site2SiteVpnGatewayDao _s2sVpnGatewayDao;
+    @Inject
+    private VpcDao _vpcDao;
+    @Inject
+    private VlanDao _vlanDao;
+    @Inject
+    private IPAddressDao _ipAddressDao;
+
+    @Inject
+    private RouterControlHelper _routerControlHelper;
+    @Inject
+    private NetworkHelper _networkHelper;
+
+    private final String _dnsBasicZoneUpdates = "all";
+
+    public void createVmDataCommand(final VirtualRouter router, final UserVm 
vm, final NicVO nic, final String publicKey, final Commands cmds) {
+        final String serviceOffering = 
_serviceOfferingDao.findByIdIncludingRemoved(vm.getId(), 
vm.getServiceOfferingId()).getDisplayText();
+        final String zoneName = 
_dcDao.findById(router.getDataCenterId()).getName();
+        cmds.addCommand(
+                "vmdata",
+                generateVmDataCommand(router, nic.getIp4Address(), 
vm.getUserData(), serviceOffering, zoneName, nic.getIp4Address(), 
vm.getHostName(), vm.getInstanceName(),
+                        vm.getId(), vm.getUuid(), publicKey, 
nic.getNetworkId()));
+    }
+
+    public void createApplyVpnUsersCommand(final List<? extends VpnUser> 
users, final VirtualRouter router, final Commands cmds) {
+        final List<VpnUser> addUsers = new ArrayList<VpnUser>();
+        final List<VpnUser> removeUsers = new ArrayList<VpnUser>();
+        for (final VpnUser user : users) {
+            if (user.getState() == VpnUser.State.Add || user.getState() == 
VpnUser.State.Active) {
+                addUsers.add(user);
+            } else if (user.getState() == VpnUser.State.Revoke) {
+                removeUsers.add(user);
+            }
+        }
+
+        final VpnUsersCfgCommand cmd = new VpnUsersCfgCommand(addUsers, 
removeUsers);
+        cmd.setAccessDetail(NetworkElementCommand.ACCOUNT_ID, 
String.valueOf(router.getAccountId()));
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, 
_routerControlHelper.getRouterControlIp(router.getId()));
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, 
router.getInstanceName());
+        final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+        cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, 
dcVo.getNetworkType().toString());
+
+        cmds.addCommand("users", cmd);
+    }
+
+    public void createDhcpEntryCommand(final VirtualRouter router, final 
UserVm vm, final NicVO nic, final Commands cmds) {
+        final DhcpEntryCommand dhcpCommand =
+                new DhcpEntryCommand(nic.getMacAddress(), nic.getIp4Address(), 
vm.getHostName(), nic.getIp6Address(), 
_networkModel.getExecuteInSeqNtwkElmtCmd());
+        final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+        final Nic defaultNic = findGatewayIp(vm.getId());
+        String gatewayIp = defaultNic.getGateway();
+        if (gatewayIp != null && !gatewayIp.equals(nic.getGateway())) {
+            gatewayIp = "0.0.0.0";
+        }
+        dhcpCommand.setDefaultRouter(gatewayIp);
+        dhcpCommand.setIp6Gateway(nic.getIp6Gateway());
+        String ipaddress = null;
+        final NicVO domrDefaultNic = findDefaultDnsIp(vm.getId());
+        if (domrDefaultNic != null) {
+            ipaddress = domrDefaultNic.getIp4Address();
+        }
+        dhcpCommand.setDefaultDns(ipaddress);
+        dhcpCommand.setDuid(NetUtils.getDuidLL(nic.getMacAddress()));
+        dhcpCommand.setDefault(nic.isDefaultNic());
+
+        dhcpCommand.setAccessDetail(NetworkElementCommand.ROUTER_IP, 
_routerControlHelper.getRouterControlIp(router.getId()));
+        dhcpCommand.setAccessDetail(NetworkElementCommand.ROUTER_NAME, 
router.getInstanceName());
+        dhcpCommand.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, 
_routerControlHelper.getRouterIpInNetwork(nic.getNetworkId(), router.getId()));
+        dhcpCommand.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, 
dcVo.getNetworkType().toString());
+
+        cmds.addCommand("dhcp", dhcpCommand);
+    }
+
+    public void createIpAlias(final VirtualRouter router, final 
List<IpAliasTO> ipAliasTOs, final Long networkid, final Commands cmds) {
+
+        final String routerip = 
_routerControlHelper.getRouterIpInNetwork(networkid, router.getId());
+        final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+        final CreateIpAliasCommand ipaliasCmd = new 
CreateIpAliasCommand(routerip, ipAliasTOs);
+        ipaliasCmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, 
_routerControlHelper.getRouterControlIp(router.getId()));
+        ipaliasCmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, 
router.getInstanceName());
+        ipaliasCmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, 
routerip);
+        ipaliasCmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, 
dcVo.getNetworkType().toString());
+
+        cmds.addCommand("ipalias", ipaliasCmd);
+    }
+
+    public void configDnsMasq(final VirtualRouter router, final Network 
network, final Commands cmds) {
+        final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+        final List<NicIpAliasVO> ipAliasVOList = 
_nicIpAliasDao.listByNetworkIdAndState(network.getId(), 
NicIpAlias.state.active);
+        final List<DhcpTO> ipList = new ArrayList<DhcpTO>();
+
+        final NicVO router_guest_nic = 
_nicDao.findByNtwkIdAndInstanceId(network.getId(), router.getId());
+        final String cidr = 
NetUtils.getCidrFromGatewayAndNetmask(router_guest_nic.getGateway(), 
router_guest_nic.getNetmask());
+        final String[] cidrPair = cidr.split("\\/");
+        final String cidrAddress = cidrPair[0];
+        final long cidrSize = Long.parseLong(cidrPair[1]);
+        final String startIpOfSubnet = 
NetUtils.getIpRangeStartIpFromCidr(cidrAddress, cidrSize);
+
+        ipList.add(new DhcpTO(router_guest_nic.getIp4Address(), 
router_guest_nic.getGateway(), router_guest_nic.getNetmask(), startIpOfSubnet));
+        for (final NicIpAliasVO ipAliasVO : ipAliasVOList) {
+            final DhcpTO DhcpTO = new DhcpTO(ipAliasVO.getIp4Address(), 
ipAliasVO.getGateway(), ipAliasVO.getNetmask(), ipAliasVO.getStartIpOfSubnet());
+            if (s_logger.isTraceEnabled()) {
+                s_logger.trace("configDnsMasq : adding ip {" + 
DhcpTO.getGateway() + ", " + DhcpTO.getNetmask() + ", " + DhcpTO.getRouterIp() 
+ ", " +
+                        DhcpTO.getStartIpOfSubnet() + "}");
+            }
+            ipList.add(DhcpTO);
+            ipAliasVO.setVmId(router.getId());
+        }
+        _dcDao.findById(router.getDataCenterId());
+        final DnsMasqConfigCommand dnsMasqConfigCmd = new 
DnsMasqConfigCommand(ipList);
+        dnsMasqConfigCmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, 
_routerControlHelper.getRouterControlIp(router.getId()));
+        dnsMasqConfigCmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, 
router.getInstanceName());
+        
dnsMasqConfigCmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, 
_routerControlHelper.getRouterIpInNetwork(network.getId(), router.getId()));
+        
dnsMasqConfigCmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, 
dcVo.getNetworkType().toString());
+        cmds.addCommand("dnsMasqConfig", dnsMasqConfigCmd);
+    }
+
+    public void createApplyLoadBalancingRulesCommands(final 
List<LoadBalancingRule> rules, final VirtualRouter router, final Commands cmds, 
final long guestNetworkId) {
+        final LoadBalancerTO[] lbs = new LoadBalancerTO[rules.size()];
+        int i = 0;
+        // We don't support VR to be inline currently
+        final boolean inline = false;
+        for (final LoadBalancingRule rule : rules) {
+            final boolean revoked = 
(rule.getState().equals(FirewallRule.State.Revoke));
+            final String protocol = rule.getProtocol();
+            final String algorithm = rule.getAlgorithm();
+            final String uuid = rule.getUuid();
+
+            final String srcIp = rule.getSourceIp().addr();
+            final int srcPort = rule.getSourcePortStart();
+            final List<LbDestination> destinations = rule.getDestinations();
+            final List<LbStickinessPolicy> stickinessPolicies = 
rule.getStickinessPolicies();
+            final LoadBalancerTO lb = new LoadBalancerTO(uuid, srcIp, srcPort, 
protocol, algorithm, revoked, false, inline, destinations, stickinessPolicies);
+            lbs[i++] = lb;
+        }
+        String routerPublicIp = null;
+
+        if (router instanceof DomainRouterVO) {
+            final DomainRouterVO domr = _routerDao.findById(router.getId());
+            routerPublicIp = domr.getPublicIpAddress();
+        }
+
+        final Network guestNetwork = _networkModel.getNetwork(guestNetworkId);
+        final Nic nic = 
_nicDao.findByNtwkIdAndInstanceId(guestNetwork.getId(), router.getId());
+        final NicProfile nicProfile =
+                new NicProfile(nic, guestNetwork, nic.getBroadcastUri(), 
nic.getIsolationUri(), _networkModel.getNetworkRate(guestNetwork.getId(), 
router.getId()),
+                        
_networkModel.isSecurityGroupSupportedInNetwork(guestNetwork), 
_networkModel.getNetworkTag(router.getHypervisorType(), guestNetwork));
+        final NetworkOffering offering = 
_networkOfferingDao.findById(guestNetwork.getNetworkOfferingId());
+        String maxconn = null;
+        if (offering.getConcurrentConnections() == null) {
+            maxconn = 
_configDao.getValue(Config.NetworkLBHaproxyMaxConn.key());
+        } else {
+            maxconn = offering.getConcurrentConnections().toString();
+        }
+
+        final LoadBalancerConfigCommand cmd =
+                new LoadBalancerConfigCommand(lbs, routerPublicIp, 
_routerControlHelper.getRouterIpInNetwork(guestNetworkId, router.getId()), 
router.getPrivateIpAddress(), _itMgr.toNicTO(
+                        nicProfile, router.getHypervisorType()), 
router.getVpcId(), maxconn, offering.isKeepAliveEnabled());
+
+        cmd.lbStatsVisibility = 
_configDao.getValue(Config.NetworkLBHaproxyStatsVisbility.key());
+        cmd.lbStatsUri = 
_configDao.getValue(Config.NetworkLBHaproxyStatsUri.key());
+        cmd.lbStatsAuth = 
_configDao.getValue(Config.NetworkLBHaproxyStatsAuth.key());
+        cmd.lbStatsPort = 
_configDao.getValue(Config.NetworkLBHaproxyStatsPort.key());
+
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, 
_routerControlHelper.getRouterControlIp(router.getId()));
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, 
_routerControlHelper.getRouterIpInNetwork(guestNetworkId, router.getId()));
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, 
router.getInstanceName());
+        final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+        cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, 
dcVo.getNetworkType().toString());
+        cmds.addCommand(cmd);
+    }
+
+    public void createApplyPortForwardingRulesCommands(final List<? extends 
PortForwardingRule> rules, final VirtualRouter router, final Commands cmds, 
final long guestNetworkId) {
+        List<PortForwardingRuleTO> rulesTO = new 
ArrayList<PortForwardingRuleTO>();
+        if (rules != null) {
+            for (final PortForwardingRule rule : rules) {
+                final IpAddress sourceIp = 
_networkModel.getIp(rule.getSourceIpAddressId());
+                final PortForwardingRuleTO ruleTO = new 
PortForwardingRuleTO(rule, null, sourceIp.getAddress().addr());
+                rulesTO.add(ruleTO);
+            }
+        }
+
+        SetPortForwardingRulesCommand cmd = null;
+
+        if (router.getVpcId() != null) {
+            cmd = new SetPortForwardingRulesVpcCommand(rulesTO);
+        } else {
+            cmd = new SetPortForwardingRulesCommand(rulesTO);
+        }
+
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, 
_routerControlHelper.getRouterControlIp(router.getId()));
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, 
_routerControlHelper.getRouterIpInNetwork(guestNetworkId, router.getId()));
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, 
router.getInstanceName());
+        final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+        cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, 
dcVo.getNetworkType().toString());
+
+        cmds.addCommand(cmd);
+    }
+
+    public void createApplyStaticNatRulesCommands(final List<? extends 
StaticNatRule> rules, final VirtualRouter router, final Commands cmds, final 
long guestNetworkId) {
+        List<StaticNatRuleTO> rulesTO = new ArrayList<StaticNatRuleTO>();
+        if (rules != null) {
+            for (final StaticNatRule rule : rules) {
+                final IpAddress sourceIp = 
_networkModel.getIp(rule.getSourceIpAddressId());
+                final StaticNatRuleTO ruleTO = new StaticNatRuleTO(rule, null, 
sourceIp.getAddress().addr(), rule.getDestIpAddress());
+                rulesTO.add(ruleTO);
+            }
+        }
+
+        final SetStaticNatRulesCommand cmd = new 
SetStaticNatRulesCommand(rulesTO, router.getVpcId());
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, 
_routerControlHelper.getRouterControlIp(router.getId()));
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, 
_routerControlHelper.getRouterIpInNetwork(guestNetworkId, router.getId()));
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, 
router.getInstanceName());
+        final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+        cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, 
dcVo.getNetworkType().toString());
+        cmds.addCommand(cmd);
+    }
+
+    public void createApplyFirewallRulesCommands(final List<? extends 
FirewallRule> rules, final VirtualRouter router, final Commands cmds, final 
long guestNetworkId) {
+        List<FirewallRuleTO> rulesTO = new ArrayList<FirewallRuleTO>();
+        String systemRule = null;
+        Boolean defaultEgressPolicy = false;
+        if (rules != null) {
+            if (rules.size() > 0) {
+                if (rules.get(0).getTrafficType() == 
FirewallRule.TrafficType.Egress && rules.get(0).getType() == 
FirewallRule.FirewallRuleType.System) {
+                    systemRule = 
String.valueOf(FirewallRule.FirewallRuleType.System);
+                }
+            }
+            for (final FirewallRule rule : rules) {
+                _rulesDao.loadSourceCidrs((FirewallRuleVO)rule);
+                final FirewallRule.TrafficType traffictype = 
rule.getTrafficType();
+                if (traffictype == FirewallRule.TrafficType.Ingress) {
+                    final IpAddress sourceIp = 
_networkModel.getIp(rule.getSourceIpAddressId());
+                    final FirewallRuleTO ruleTO = new FirewallRuleTO(rule, 
null, sourceIp.getAddress().addr(), Purpose.Firewall, traffictype);
+                    rulesTO.add(ruleTO);
+                } else if (rule.getTrafficType() == 
FirewallRule.TrafficType.Egress) {
+                    final NetworkVO network = 
_networkDao.findById(guestNetworkId);
+                    final NetworkOfferingVO offering = 
_networkOfferingDao.findById(network.getNetworkOfferingId());
+                    defaultEgressPolicy = offering.getEgressDefaultPolicy();
+                    assert (rule.getSourceIpAddressId() == null) : 
"ipAddressId should be null for egress firewall rule. ";
+                    final FirewallRuleTO ruleTO = new FirewallRuleTO(rule, 
null, "", Purpose.Firewall, traffictype, defaultEgressPolicy);
+                    rulesTO.add(ruleTO);
+                }
+            }
+        }
+
+        final SetFirewallRulesCommand cmd = new 
SetFirewallRulesCommand(rulesTO);
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, 
_routerControlHelper.getRouterControlIp(router.getId()));
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, 
_routerControlHelper.getRouterIpInNetwork(guestNetworkId, router.getId()));
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, 
router.getInstanceName());
+        final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+        cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, 
dcVo.getNetworkType().toString());
+        if (systemRule != null) {
+            cmd.setAccessDetail(NetworkElementCommand.FIREWALL_EGRESS_DEFAULT, 
systemRule);
+        } else {
+            cmd.setAccessDetail(NetworkElementCommand.FIREWALL_EGRESS_DEFAULT, 
String.valueOf(defaultEgressPolicy));
+        }
+
+        cmds.addCommand(cmd);
+    }
+
+    public void createFirewallRulesCommands(final List<? extends FirewallRule> 
rules, final VirtualRouter router, final Commands cmds, final long 
guestNetworkId) {
+        List<FirewallRuleTO> rulesTO = new ArrayList<FirewallRuleTO>();
+        String systemRule = null;
+        Boolean defaultEgressPolicy = false;
+        if (rules != null) {
+            if (rules.size() > 0) {
+                if (rules.get(0).getTrafficType() == 
FirewallRule.TrafficType.Egress && rules.get(0).getType() == 
FirewallRule.FirewallRuleType.System) {
+                    systemRule = 
String.valueOf(FirewallRule.FirewallRuleType.System);
+                }
+            }
+            for (final FirewallRule rule : rules) {
+                _rulesDao.loadSourceCidrs((FirewallRuleVO)rule);
+                final FirewallRule.TrafficType traffictype = 
rule.getTrafficType();
+                if (traffictype == FirewallRule.TrafficType.Ingress) {
+                    final IpAddress sourceIp = 
_networkModel.getIp(rule.getSourceIpAddressId());
+                    final FirewallRuleTO ruleTO = new FirewallRuleTO(rule, 
null, sourceIp.getAddress().addr(), Purpose.Firewall, traffictype);
+                    rulesTO.add(ruleTO);
+                } else if (rule.getTrafficType() == 
FirewallRule.TrafficType.Egress) {
+                    final NetworkVO network = 
_networkDao.findById(guestNetworkId);
+                    final NetworkOfferingVO offering = 
_networkOfferingDao.findById(network.getNetworkOfferingId());
+                    defaultEgressPolicy = offering.getEgressDefaultPolicy();
+                    assert (rule.getSourceIpAddressId() == null) : 
"ipAddressId should be null for egress firewall rule. ";
+                    final FirewallRuleTO ruleTO = new FirewallRuleTO(rule, 
null, "", Purpose.Firewall, traffictype, defaultEgressPolicy);
+                    rulesTO.add(ruleTO);
+                }
+            }
+        }
+
+        final SetFirewallRulesCommand cmd = new 
SetFirewallRulesCommand(rulesTO);
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, 
_routerControlHelper.getRouterControlIp(router.getId()));
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, 
_routerControlHelper.getRouterIpInNetwork(guestNetworkId, router.getId()));
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, 
router.getInstanceName());
+        final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+        cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, 
dcVo.getNetworkType().toString());
+        if (systemRule != null) {
+            cmd.setAccessDetail(NetworkElementCommand.FIREWALL_EGRESS_DEFAULT, 
systemRule);
+        } else {
+            cmd.setAccessDetail(NetworkElementCommand.FIREWALL_EGRESS_DEFAULT, 
String.valueOf(defaultEgressPolicy));
+        }
+
+        cmds.addCommand(cmd);
+    }
+
+    public void createAssociateIPCommands(final VirtualRouter router, final 
List<? extends PublicIpAddress> ips, final Commands cmds, final long vmId) {
+
+        // Ensure that in multiple vlans case we first send all ip addresses 
of vlan1, then all ip addresses of vlan2, etc..
+        final Map<String, ArrayList<PublicIpAddress>> vlanIpMap = new 
HashMap<String, ArrayList<PublicIpAddress>>();
+        for (final PublicIpAddress ipAddress : ips) {
+            final String vlanTag = ipAddress.getVlanTag();
+            ArrayList<PublicIpAddress> ipList = vlanIpMap.get(vlanTag);
+            if (ipList == null) {
+                ipList = new ArrayList<PublicIpAddress>();
+            }
+            //domR doesn't support release for sourceNat IP address; so reset 
the state
+            if (ipAddress.isSourceNat() && ipAddress.getState() == 
IpAddress.State.Releasing) {
+                ipAddress.setState(IpAddress.State.Allocated);
+            }
+            ipList.add(ipAddress);
+            vlanIpMap.put(vlanTag, ipList);
+        }
+
+        final List<NicVO> nics = _nicDao.listByVmId(router.getId());
+        String baseMac = null;
+        for (final NicVO nic : nics) {
+            final NetworkVO nw = _networkDao.findById(nic.getNetworkId());
+            if (nw.getTrafficType() == TrafficType.Public) {
+                baseMac = nic.getMacAddress();
+                break;
+            }
+        }
+
+        for (final Map.Entry<String, ArrayList<PublicIpAddress>> vlanAndIp : 
vlanIpMap.entrySet()) {
+            final List<PublicIpAddress> ipAddrList = vlanAndIp.getValue();
+            // Source nat ip address should always be sent first
+            Collections.sort(ipAddrList, new Comparator<PublicIpAddress>() {
+                @Override
+                public int compare(final PublicIpAddress o1, final 
PublicIpAddress o2) {
+                    final boolean s1 = o1.isSourceNat();
+                    final boolean s2 = o2.isSourceNat();
+                    return (s1 ^ s2) ? ((s1 ^ true) ? 1 : -1) : 0;
+                }
+            });
+
+            // Get network rate - required for IpAssoc
+            final Integer networkRate = 
_networkModel.getNetworkRate(ipAddrList.get(0).getNetworkId(), router.getId());
+            final Network network = 
_networkModel.getNetwork(ipAddrList.get(0).getNetworkId());
+
+            final IpAddressTO[] ipsToSend = new IpAddressTO[ipAddrList.size()];
+            int i = 0;
+            boolean firstIP = true;
+
+            for (final PublicIpAddress ipAddr : ipAddrList) {
+
+                final boolean add = (ipAddr.getState() == 
IpAddress.State.Releasing ? false : true);
+                boolean sourceNat = ipAddr.isSourceNat();
+                /* enable sourceNAT for the first ip of the public interface */
+                if (firstIP) {
+                    sourceNat = true;
+                }
+                final String vlanId = ipAddr.getVlanTag();
+                final String vlanGateway = ipAddr.getGateway();
+                final String vlanNetmask = ipAddr.getNetmask();
+                String vifMacAddress = null;
+                // For non-source nat IP, set the mac to be something based on 
first public nic's MAC
+                // We cannot depends on first ip because we need to deal with 
first ip of other nics
+                if (!ipAddr.isSourceNat() && ipAddr.getVlanId() != 0) {
+                    vifMacAddress = NetUtils.generateMacOnIncrease(baseMac, 
ipAddr.getVlanId());
+                } else {
+                    vifMacAddress = ipAddr.getMacAddress();
+                }
+
+                final IpAddressTO ip =
+                        new IpAddressTO(ipAddr.getAccountId(), 
ipAddr.getAddress().addr(), add, firstIP, sourceNat, vlanId, vlanGateway, 
vlanNetmask, vifMacAddress,
+                                networkRate, ipAddr.isOneToOneNat());
+
+                ip.setTrafficType(network.getTrafficType());
+                
ip.setNetworkName(_networkModel.getNetworkTag(router.getHypervisorType(), 
network));
+                ipsToSend[i++] = ip;
+                /* send the firstIP = true for the first Add, this is to 
create primary on interface*/
+                if (!firstIP || add) {
+                    firstIP = false;
+                }
+            }
+            final IpAssocCommand cmd = new IpAssocCommand(ipsToSend);
+            cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, 
_routerControlHelper.getRouterControlIp(router.getId()));
+            cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, 
_routerControlHelper.getRouterIpInNetwork(ipAddrList.get(0).getAssociatedWithNetworkId(),
 router.getId()));
+            cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, 
router.getInstanceName());
+            final DataCenterVO dcVo = 
_dcDao.findById(router.getDataCenterId());
+            cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, 
dcVo.getNetworkType().toString());
+
+            cmds.addCommand("IPAssocCommand", cmd);
+        }
+    }
+
+    public void createNetworkACLsCommands(final List<? extends NetworkACLItem> 
rules, final VirtualRouter router, final Commands cmds, final long 
guestNetworkId, final boolean privateGateway) {
+        List<NetworkACLTO> rulesTO = new ArrayList<NetworkACLTO>();
+        String guestVlan = null;
+        Network guestNtwk = _networkDao.findById(guestNetworkId);
+        URI uri = guestNtwk.getBroadcastUri();
+        if (uri != null) {
+            guestVlan = BroadcastDomainType.getValue(uri);
+        }
+
+        if (rules != null) {
+            for (NetworkACLItem rule : rules) {
+                NetworkACLTO ruleTO = new NetworkACLTO(rule, guestVlan, 
rule.getTrafficType());
+                rulesTO.add(ruleTO);
+            }
+        }
+
+        SetNetworkACLCommand cmd = new SetNetworkACLCommand(rulesTO, 
_networkHelper.getNicTO(router, guestNetworkId, null));
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, 
_routerControlHelper.getRouterControlIp(router.getId()));
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, 
_routerControlHelper.getRouterIpInNetwork(guestNetworkId, router.getId()));
+        cmd.setAccessDetail(NetworkElementCommand.GUEST_VLAN_TAG, guestVlan);
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, 
router.getInstanceName());
+        DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+        cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, 
dcVo.getNetworkType().toString());
+        if (privateGateway) {
+            cmd.setAccessDetail(NetworkElementCommand.VPC_PRIVATE_GATEWAY, 
String.valueOf(VpcGateway.Type.Private));
+        }
+
+        cmds.addCommand(cmd);
+    }
+
+    public void createPasswordCommand(final VirtualRouter router, final 
VirtualMachineProfile profile, final NicVO nic, final Commands cmds) {
+        final String password = 
(String)profile.getParameter(VirtualMachineProfile.Param.VmPassword);
+        final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+
+        // password should be set only on default network element
+        if (password != null && nic.isDefaultNic()) {
+            final String encodedPassword = PasswordGenerator.rot13(password);
+            final SavePasswordCommand cmd =
+                    new SavePasswordCommand(encodedPassword, 
nic.getIp4Address(), profile.getVirtualMachine().getHostName(), 
_networkModel.getExecuteInSeqNtwkElmtCmd());
+            cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, 
_routerControlHelper.getRouterControlIp(router.getId()));
+            cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, 
_routerControlHelper.getRouterIpInNetwork(nic.getNetworkId(), router.getId()));
+            cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, 
router.getInstanceName());
+            cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, 
dcVo.getNetworkType().toString());
+
+            cmds.addCommand("password", cmd);
+        }
+
+    }
+
+    public void createApplyStaticNatCommands(final List<? extends StaticNat> 
rules, final VirtualRouter router, final Commands cmds, final long 
guestNetworkId) {
+        List<StaticNatRuleTO> rulesTO = new ArrayList<StaticNatRuleTO>();
+        if (rules != null) {
+            for (final StaticNat rule : rules) {
+                final IpAddress sourceIp = 
_networkModel.getIp(rule.getSourceIpAddressId());
+                final StaticNatRuleTO ruleTO =
+                        new StaticNatRuleTO(0, sourceIp.getAddress().addr(), 
null, null, rule.getDestIpAddress(), null, null, null, rule.isForRevoke(), 
false);
+                rulesTO.add(ruleTO);
+            }
+        }
+
+        final SetStaticNatRulesCommand cmd = new 
SetStaticNatRulesCommand(rulesTO, router.getVpcId());
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, 
_routerControlHelper.getRouterControlIp(router.getId()));
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, 
_routerControlHelper.getRouterIpInNetwork(guestNetworkId, router.getId()));
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, 
router.getInstanceName());
+
+        final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+        cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, 
dcVo.getNetworkType().toString());
+        cmds.addCommand(cmd);
+    }
+
+    public void createStaticRouteCommands(final List<StaticRouteProfile> 
staticRoutes, final VirtualRouter router, final Commands cmds) {
+        SetStaticRouteCommand cmd = new SetStaticRouteCommand(staticRoutes);
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, 
_networkHelper.getRouterControlIp(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(cmd);
+    }
+
+    public void createApplyVpnCommands(final boolean isCreate, final 
RemoteAccessVpn vpn, final VirtualRouter router, final Commands cmds) {
+        final List<VpnUserVO> vpnUsers = 
_vpnUsersDao.listByAccount(vpn.getAccountId());
+
+        createApplyVpnUsersCommand(vpnUsers, router, cmds);
+
+        final IpAddress ip = _networkModel.getIp(vpn.getServerAddressId());
+
+        final Network network = _networkDao.findById(vpn.getNetworkId());
+        String cidr = network.getCidr();
+
+        final RemoteAccessVpnCfgCommand startVpnCmd =
+                new RemoteAccessVpnCfgCommand(isCreate, 
ip.getAddress().addr(), vpn.getLocalIp(), vpn.getIpRange(), 
vpn.getIpsecPresharedKey(), (vpn.getVpcId() != null));
+        startVpnCmd.setLocalCidr(cidr);
+        startVpnCmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, 
_routerControlHelper.getRouterControlIp(router.getId()));
+        startVpnCmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, 
router.getInstanceName());
+        final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+        startVpnCmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, 
dcVo.getNetworkType().toString());
+
+        cmds.addCommand("startVpn", startVpnCmd);
+    }
+
+    public void createVmDataCommandForVMs(final DomainRouterVO router, final 
Commands cmds, final long guestNetworkId) {
+        final List<UserVmVO> vms = 
_userVmDao.listByNetworkIdAndStates(guestNetworkId, State.Running, 
State.Migrating, State.Stopping);
+        final DataCenterVO dc = _dcDao.findById(router.getDataCenterId());
+        for (final UserVmVO vm : vms) {
+            boolean createVmData = true;
+            if (dc.getNetworkType() == NetworkType.Basic && 
router.getPodIdToDeployIn().longValue() != vm.getPodIdToDeployIn().longValue()) 
{
+                createVmData = false;
+            }
+
+            if (createVmData) {
+                final NicVO nic = 
_nicDao.findByNtwkIdAndInstanceId(guestNetworkId, vm.getId());
+                if (nic != null) {
+                    s_logger.debug("Creating user data entry for vm " + vm + " 
on domR " + router);
+                    createVmDataCommand(router, vm, nic, null, cmds);
+                }
+            }
+        }
+    }
+
+    public void createDhcpEntryCommandsForVMs(final DomainRouterVO router, 
final Commands cmds, final long guestNetworkId) {
+        final List<UserVmVO> vms = 
_userVmDao.listByNetworkIdAndStates(guestNetworkId, State.Running, 
State.Migrating, State.Stopping);
+        final DataCenterVO dc = _dcDao.findById(router.getDataCenterId());
+        for (final UserVmVO vm : vms) {
+            boolean createDhcp = true;
+            if (dc.getNetworkType() == NetworkType.Basic && 
router.getPodIdToDeployIn().longValue() != vm.getPodIdToDeployIn().longValue() 
&&
+                    _dnsBasicZoneUpdates.equalsIgnoreCase("pod")) {
+                createDhcp = false;
+            }
+            if (createDhcp) {
+                final NicVO nic = 
_nicDao.findByNtwkIdAndInstanceId(guestNetworkId, vm.getId());
+                if (nic != null) {
+                    s_logger.debug("Creating dhcp entry for vm " + vm + " on 
domR " + router + ".");
+                    createDhcpEntryCommand(router, vm, nic, cmds);
+                }
+            }
+        }
+    }
+
+    public void createDeleteIpAliasCommand(final DomainRouterVO router, final 
List<IpAliasTO> deleteIpAliasTOs, final List<IpAliasTO> createIpAliasTos, final 
long networkId,
+            final Commands cmds) {
+        final String routerip = 
_routerControlHelper.getRouterIpInNetwork(networkId, router.getId());
+        final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+        final DeleteIpAliasCommand deleteIpaliasCmd = new 
DeleteIpAliasCommand(routerip, deleteIpAliasTOs, createIpAliasTos);
+        deleteIpaliasCmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, 
_routerControlHelper.getRouterControlIp(router.getId()));
+        deleteIpaliasCmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, 
router.getInstanceName());
+        
deleteIpaliasCmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, 
routerip);
+        
deleteIpaliasCmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, 
dcVo.getNetworkType().toString());
+
+        cmds.addCommand("deleteIpalias", deleteIpaliasCmd);
+    }
+
+    public void createVpcAssociatePublicIPCommands(final VirtualRouter router, 
final List<? extends PublicIpAddress> ips, final Commands cmds,
+            final Map<String, String> vlanMacAddress) {
+
+        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) {
+            String vlanTag = ipAddress.getVlanTag();
+            ArrayList<PublicIpAddress> ipList = vlanIpMap.get(vlanTag);
+            if (ipList == null) {
+                ipList = new ArrayList<PublicIpAddress>();
+            }
+            //VR doesn't support release for sourceNat IP address; so reset 
the state
+            if (ipAddress.isSourceNat() && ipAddress.getState() == 
IpAddress.State.Releasing) {
+                ipAddress.setState(IpAddress.State.Allocated);
+            }
+            ipList.add(ipAddress);
+            vlanIpMap.put(vlanTag, ipList);
+        }
+
+        for (Map.Entry<String, ArrayList<PublicIpAddress>> vlanAndIp : 
vlanIpMap.entrySet()) {
+            List<PublicIpAddress> ipAddrList = vlanAndIp.getValue();
+
+            // Get network rate - required for IpAssoc
+            Integer networkRate = 
_networkModel.getNetworkRate(ipAddrList.get(0).getNetworkId(), router.getId());
+            Network network = 
_networkModel.getNetwork(ipAddrList.get(0).getNetworkId());
+
+            IpAddressTO[] ipsToSend = new IpAddressTO[ipAddrList.size()];
+            int i = 0;
+
+            for (final PublicIpAddress ipAddr : ipAddrList) {
+                boolean add = (ipAddr.getState() == IpAddress.State.Releasing 
? false : true);
+
+                String macAddress = 
vlanMacAddress.get(BroadcastDomainType.getValue(BroadcastDomainType.fromString(ipAddr.getVlanTag())));
+
+                IpAddressTO ip =
+                        new IpAddressTO(ipAddr.getAccountId(), 
ipAddr.getAddress().addr(), add, false, ipAddr.isSourceNat(), 
ipAddr.getVlanTag(), ipAddr.getGateway(),
+                                ipAddr.getNetmask(), macAddress, networkRate, 
ipAddr.isOneToOneNat());
+
+                ip.setTrafficType(network.getTrafficType());
+                
ip.setNetworkName(_networkModel.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, 
_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);
+        }
+
+        //set source nat ip
+        if (sourceNatIpAdd != null) {
+            IpAddressTO sourceNatIp = sourceNatIpAdd.first();
+            SetSourceNatCommand cmd = new SetSourceNatCommand(sourceNatIp, 
addSourceNat);
+            cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, 
_routerControlHelper.getRouterControlIp(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("SetSourceNatCommand", cmd);
+        }
+    }
+
+    public void createStaticRouteCommands(final List<StaticRouteProfile> 
staticRoutes, final DomainRouterVO router, final Commands cmds) {
+        SetStaticRouteCommand cmd = new SetStaticRouteCommand(staticRoutes);
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, 
_routerControlHelper.getRouterControlIp(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(cmd);
+    }
+
+    public void createSite2SiteVpnCfgCommands(final Site2SiteVpnConnection 
conn, final boolean isCreate, final VirtualRouter router, final Commands cmds) {
+        Site2SiteCustomerGatewayVO gw = 
_s2sCustomerGatewayDao.findById(conn.getCustomerGatewayId());
+        Site2SiteVpnGatewayVO vpnGw = 
_s2sVpnGatewayDao.findById(conn.getVpnGatewayId());
+        IpAddress ip = _ipAddressDao.findById(vpnGw.getAddrId());
+        Vpc vpc = _vpcDao.findById(ip.getVpcId());
+        String localPublicIp = ip.getAddress().toString();
+        String localGuestCidr = vpc.getCidr();
+        String localPublicGateway = 
_vlanDao.findById(ip.getVlanId()).getVlanGateway();
+        String peerGatewayIp = gw.getGatewayIp();
+        String peerGuestCidrList = gw.getGuestCidrList();
+        String ipsecPsk = gw.getIpsecPsk();
+        String ikePolicy = gw.getIkePolicy();
+        String espPolicy = gw.getEspPolicy();
+        Long ikeLifetime = gw.getIkeLifetime();
+        Long espLifetime = gw.getEspLifetime();
+        Boolean dpd = gw.getDpd();
+
+        Site2SiteVpnCfgCommand cmd =
+                new Site2SiteVpnCfgCommand(isCreate, localPublicIp, 
localPublicGateway, localGuestCidr, peerGatewayIp, peerGuestCidrList, 
ikePolicy, espPolicy, ipsecPsk,
+                        ikeLifetime, espLifetime, dpd, conn.isPassive());
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, 
_routerControlHelper.getRouterControlIp(router.getId()));
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, 
_routerControlHelper.getRouterControlIp(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("applyS2SVpn", cmd);
+    }
+
+    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);
+        }
+    }
+
+    public SetupGuestNetworkCommand createSetupGuestNetworkCommand(final 
VirtualRouter router, final boolean add, final NicProfile guestNic) {
+        Network network = _networkModel.getNetwork(guestNic.getNetworkId());
+
+        String defaultDns1 = null;
+        String defaultDns2 = null;
+
+        boolean dnsProvided = 
_networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.Dns, 
Provider.VPCVirtualRouter);
+        boolean dhcpProvided = 
_networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.Dhcp, 
Provider.VPCVirtualRouter);
+
+        boolean setupDns = dnsProvided || dhcpProvided;
+
+        if (setupDns) {
+            defaultDns1 = guestNic.getDns1();
+            defaultDns2 = guestNic.getDns2();
+        }
+
+        Nic nic = _nicDao.findByNtwkIdAndInstanceId(network.getId(), 
router.getId());
+        String networkDomain = network.getNetworkDomain();
+        String dhcpRange = getGuestDhcpRange(guestNic, network, 
_entityMgr.findById(DataCenter.class, network.getDataCenterId()));
+
+        NicProfile nicProfile = _networkModel.getNicProfile(router, 
nic.getNetworkId(), null);
+
+        SetupGuestNetworkCommand setupCmd =
+                new SetupGuestNetworkCommand(dhcpRange, networkDomain, false, 
null, defaultDns1, defaultDns2, add, _itMgr.toNicTO(nicProfile, 
router.getHypervisorType()));
+
+        String brd = 
NetUtils.long2Ip(NetUtils.ip2Long(guestNic.getIp4Address()) | 
~NetUtils.ip2Long(guestNic.getNetmask()));
+        setupCmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, 
_routerControlHelper.getRouterControlIp(router.getId()));
+        setupCmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, 
_routerControlHelper.getRouterIpInNetwork(network.getId(), router.getId()));
+
+        setupCmd.setAccessDetail(NetworkElementCommand.GUEST_NETWORK_GATEWAY, 
network.getGateway());
+        setupCmd.setAccessDetail(NetworkElementCommand.GUEST_BRIDGE, brd);
+        setupCmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, 
router.getInstanceName());
+
+        if (network.getBroadcastDomainType() == BroadcastDomainType.Vlan) {
+            long guestVlanTag = 
Long.parseLong(BroadcastDomainType.Vlan.getValueFrom(network.getBroadcastUri()));
+            setupCmd.setAccessDetail(NetworkElementCommand.GUEST_VLAN_TAG, 
String.valueOf(guestVlanTag));
+        }
+
+        return setupCmd;
+    }
+
+    private VmDataCommand generateVmDataCommand(final VirtualRouter router, 
final String vmPrivateIpAddress, final String userData, final String 
serviceOffering, final String zoneName,
+            final String guestIpAddress, final String vmName, final String 
vmInstanceName, final long vmId, final String vmUuid, final String publicKey, 
final long guestNetworkId) {
+        final VmDataCommand cmd = new VmDataCommand(vmPrivateIpAddress, 
vmName, _networkModel.getExecuteInSeqNtwkElmtCmd());
+
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, 
_routerControlHelper.getRouterControlIp(router.getId()));
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, 
_routerControlHelper.getRouterIpInNetwork(guestNetworkId, router.getId()));
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, 
router.getInstanceName());
+
+        final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+        cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, 
dcVo.getNetworkType().toString());
+
+        cmd.addVmData("userdata", "user-data", userData);
+        cmd.addVmData("metadata", "service-offering", 
StringUtils.unicodeEscape(serviceOffering));
+        cmd.addVmData("metadata", "availability-zone", 
StringUtils.unicodeEscape(zoneName));
+        cmd.addVmData("metadata", "local-ipv4", guestIpAddress);
+        cmd.addVmData("metadata", "local-hostname", 
StringUtils.unicodeEscape(vmName));
+        if (dcVo.getNetworkType() == NetworkType.Basic) {
+            cmd.addVmData("metadata", "public-ipv4", guestIpAddress);
+            cmd.addVmData("metadata", "public-hostname", 
StringUtils.unicodeEscape(vmName));
+        } else {
+            if (router.getPublicIpAddress() == null) {
+                cmd.addVmData("metadata", "public-ipv4", guestIpAddress);
+            } else {
+                cmd.addVmData("metadata", "public-ipv4", 
router.getPublicIpAddress());
+            }
+            cmd.addVmData("metadata", "public-hostname", 
router.getPublicIpAddress());
+        }
+        if (vmUuid == null) {
+            cmd.addVmData("metadata", "instance-id", vmInstanceName);
+            cmd.addVmData("metadata", "vm-id", String.valueOf(vmId));
+        } else {
+            cmd.addVmData("metadata", "instance-id", vmUuid);
+            cmd.addVmData("metadata", "vm-id", vmUuid);
+        }
+        cmd.addVmData("metadata", "public-keys", publicKey);
+
+        String cloudIdentifier = _configDao.getValue("cloud.identifier");
+        if (cloudIdentifier == null) {
+            cloudIdentifier = "";
+        } else {
+            cloudIdentifier = "CloudStack-{" + cloudIdentifier + "}";
+        }
+        cmd.addVmData("metadata", "cloud-identifier", cloudIdentifier);
+
+        return cmd;
+    }
+
+    private NicVO findGatewayIp(final long userVmId) {
+        final NicVO defaultNic = _nicDao.findDefaultNicForVM(userVmId);
+        return defaultNic;
+    }
+
+    private NicVO findDefaultDnsIp(final long userVmId) {
+        final NicVO defaultNic = _nicDao.findDefaultNicForVM(userVmId);
+
+        //check if DNS provider is the domR
+        if 
(!_networkModel.isProviderSupportServiceInNetwork(defaultNic.getNetworkId(), 
Service.Dns, Provider.VirtualRouter)) {
+            return null;
+        }
+
+        final NetworkOffering offering = 
_networkOfferingDao.findById(_networkDao.findById(defaultNic.getNetworkId()).getNetworkOfferingId());
+        if (offering.getRedundantRouter()) {
+            return findGatewayIp(userVmId);
+        }
+
+        final DataCenter dc = 
_dcDao.findById(_networkModel.getNetwork(defaultNic.getNetworkId()).getDataCenterId());
+        final boolean isZoneBasic = (dc.getNetworkType() == NetworkType.Basic);
+
+        //find domR's nic in the network
+        NicVO domrDefaultNic;
+        if (isZoneBasic) {
+            domrDefaultNic = 
_nicDao.findByNetworkIdTypeAndGateway(defaultNic.getNetworkId(), 
VirtualMachine.Type.DomainRouter, defaultNic.getGateway());
+        } else {
+            domrDefaultNic = 
_nicDao.findByNetworkIdAndType(defaultNic.getNetworkId(), 
VirtualMachine.Type.DomainRouter);
+        }
+        return domrDefaultNic;
+    }
+
+    protected String getGuestDhcpRange(final NicProfile guestNic, final 
Network guestNetwork, final DataCenter dc) {
+        String dhcpRange = null;
+        //setup dhcp range
+        if (dc.getNetworkType() == NetworkType.Basic) {
+            final long cidrSize = NetUtils.getCidrSize(guestNic.getNetmask());
+            final String cidr = NetUtils.getCidrSubNet(guestNic.getGateway(), 
cidrSize);
+            if (cidr != null) {
+                dhcpRange = NetUtils.getIpRangeStartIpFromCidr(cidr, cidrSize);
+            }
+        } else if (dc.getNetworkType() == NetworkType.Advanced) {
+            final String cidr = guestNetwork.getCidr();
+            if (cidr != null) {
+                dhcpRange = NetUtils.getDhcpRange(cidr);
+            }
+        }
+        return dhcpRange;
+    }
+}
\ No newline at end of file

Reply via email to