diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index 83006c00878..3623f7453b8 100644 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -19,6 +19,7 @@ package com.cloud.network; import java.util.List; +import com.cloud.agent.manager.Commands; import com.cloud.dc.Vlan.VlanType; import com.cloud.deploy.DeployDestination; import com.cloud.deploy.DeploymentPlan; @@ -115,4 +116,7 @@ public interface NetworkManager extends NetworkService { boolean applyRules(Ip ip, List rules, boolean continueOnError) throws ResourceUnavailableException; PublicIp fetchNewPublicIp(long dcId, VlanType vlanUse, Account owner, Long networkId, boolean sourceNat) throws InsufficientAddressCapacityException; + + Commands getAssociateIPCommands(DomainRouterVO router, + List ipAddrList, boolean add, long vmId, Commands cmds); } diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 25a3ba01d9e..f5b8057d011 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -324,6 +324,55 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } } + @Override + public Commands getAssociateIPCommands(final DomainRouterVO router, final List ipAddrList, final boolean add, long vmId, Commands cmds) { + boolean sourceNat = false; + Map> vlanIpMap = new HashMap>(); + for (final String ipAddress: ipAddrList) { + IPAddressVO ip = _ipAddressDao.findById(ipAddress); + + VlanVO vlan = _vlanDao.findById(ip.getVlanId()); + ArrayList ipList = vlanIpMap.get(vlan.getId()); + if (ipList == null) { + ipList = new ArrayList(); + } + ipList.add(ip); + vlanIpMap.put(vlan, ipList); + } + for (Map.Entry> vlanAndIp: vlanIpMap.entrySet()) { + boolean firstIP = true; + ArrayList ipList = vlanAndIp.getValue(); + Collections.sort(ipList, new Comparator() { + @Override + public int compare(IPAddressVO o1, IPAddressVO o2) { + return o1.getAddress().compareTo(o2.getAddress()); + } }); + + for (final IPAddressVO ip: ipList) { + sourceNat = ip.isSourceNat(); + VlanVO vlan = vlanAndIp.getKey(); + String vlanId = vlan.getVlanId(); + String vlanGateway = vlan.getVlanGateway(); + String vlanNetmask = vlan.getVlanNetmask(); + + String vifMacAddress = null; + if (firstIP && add) { + String[] macAddresses = _dcDao.getNextAvailableMacAddressPair(ip.getDataCenterId()); + vifMacAddress = macAddresses[1]; + } + String vmGuestAddress = null; + if(vmId!=0){ + vmGuestAddress = _vmDao.findById(vmId).getGuestIpAddress(); + } + + cmds.addCommand(new IPAssocCommand(router.getInstanceName(), router.getPrivateIpAddress(), ip.getAddress(), add, firstIP, sourceNat, vlanId, vlanGateway, vlanNetmask, vifMacAddress, vmGuestAddress)); + + firstIP = false; + } + } + return cmds; + } + @Override public boolean associateIP(final DomainRouterVO router, final List ipAddrList, final boolean add, long vmId) { Commands cmds = new Commands(OnError.Continue); diff --git a/server/src/com/cloud/network/router/DomainRouterManagerImpl.java b/server/src/com/cloud/network/router/DomainRouterManagerImpl.java index 5bfb6fd1534..c6809e5fde6 100644 --- a/server/src/com/cloud/network/router/DomainRouterManagerImpl.java +++ b/server/src/com/cloud/network/router/DomainRouterManagerImpl.java @@ -2244,19 +2244,8 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute NicProfile controlNic = (NicProfile)profile.getParameter("control.nic"); cmds.addCommand("checkSsh", new CheckSshCommand(profile.getInstanceName(), controlNic.getIp4Address(), 3922, 5, 20)); - - return true; - } - - @Override - public boolean finalizeStart(Commands cmds, VirtualMachineProfile profile, DeployDestination dest, ReservationContext context) { - CheckSshAnswer answer = (CheckSshAnswer)cmds.getAnswer("checkSsh"); - if (!answer.getResult()) { - s_logger.warn("Unable to ssh to the VM: " + answer.getDetails()); - return false; - } - DomainRouterVO router = profile.getVirtualMachine(); + List nics = _nicDao.listBy(router.getId()); for (NicVO nic : nics) { NetworkVO network = _networkDao.findById(nic.getNetworkId()); @@ -2273,6 +2262,28 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute router.setPrivateMacAddress(nic.getMacAddress()); } } + //source NAT address is stored in /proc/cmdline of the domR and gets + //reassigned upon powerup. Source NAT rule gets configured in StartRouter command + final List ipAddrs = _networkMgr.listPublicIpAddressesInVirtualNetwork(router.getAccountId(), router.getDataCenterId(), null); + final List ipAddrList = new ArrayList(); + for (final IPAddressVO ipVO : ipAddrs) { + ipAddrList.add(ipVO.getAddress()); + } + if (!ipAddrList.isEmpty()) { + _networkMgr.getAssociateIPCommands(router, ipAddrList, true, 0, cmds); + } + return true; + } + + @Override + public boolean finalizeStart(Commands cmds, VirtualMachineProfile profile, DeployDestination dest, ReservationContext context) { + CheckSshAnswer answer = (CheckSshAnswer)cmds.getAnswer("checkSsh"); + if (!answer.getResult()) { + s_logger.warn("Unable to ssh to the VM: " + answer.getDetails()); + return false; + } + + return true; }