diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index 4ab8e8f75b0..ef1ece36d84 100755 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -411,9 +411,10 @@ public interface NetworkManager extends NetworkService { /** * @param vm * @param networkId + * @param broadcastUri TODO * @return */ - NicProfile getNicProfile(VirtualMachine vm, long networkId); + NicProfile getNicProfile(VirtualMachine vm, long networkId, String broadcastUri); /** diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index c5e1e4d0e79..a525137a931 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -2351,8 +2351,13 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } @Override - public NicProfile getNicProfile(VirtualMachine vm, long networkId) { - NicVO nic = _nicDao.findByInstanceIdAndNetworkId(networkId, vm.getId()); + public NicProfile getNicProfile(VirtualMachine vm, long networkId, String broadcastUri) { + NicVO nic = null; + if (broadcastUri != null) { + nic = _nicDao.findByNetworkIdInstanceIdAndBroadcastUri(networkId, vm.getId(), broadcastUri); + } else { + nic = _nicDao.findByInstanceIdAndNetworkId(networkId, vm.getId()); + } NetworkVO network = _networksDao.findById(networkId); Integer networkRate = getNetworkRate(network.getId(), vm.getId()); @@ -7426,16 +7431,16 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag if (requested != null && requested.getBroadCastUri() != null) { String broadcastUri = requested.getBroadCastUri().toString(); String ipAddress = requested.getIp4Address(); - NicVO nicVO = _nicDao.findByInstanceIdNetworkIdAndBroadcastUri(network.getId(), vm.getId(), broadcastUri); + NicVO nicVO = _nicDao.findByNetworkIdInstanceIdAndBroadcastUri(network.getId(), vm.getId(), broadcastUri); if (nicVO != null) { if (ipAddress == null || nicVO.getIp4Address().equals(ipAddress)) { - nic = getNicProfile(vm, network.getId()); + nic = getNicProfile(vm, network.getId(), broadcastUri); } } } else { NicVO nicVO = _nicDao.findByInstanceIdAndNetworkId(network.getId(), vm.getId()); if (nicVO != null) { - nic = getNicProfile(vm, network.getId()); + nic = getNicProfile(vm, network.getId(), null); } } return nic; diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index 4840cc65b44..93baf7cae66 100755 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -1868,7 +1868,7 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian List routerGuestNtwkIds = _routerDao.getRouterNetworks(router.getId()); for (Long guestNetworkId : routerGuestNtwkIds) { if (reprogramGuestNtwks) { - finalizeIpAssocForNetwork(cmds, router, provider, guestNetworkId); + finalizeIpAssocForNetwork(cmds, router, provider, guestNetworkId, null); finalizeNetworkRulesForNetwork(cmds, router, provider, guestNetworkId); } @@ -2024,7 +2024,7 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian } protected void finalizeIpAssocForNetwork(Commands cmds, VirtualRouter router, Provider provider, - Long guestNetworkId) { + Long guestNetworkId, Map vlanMacAddress) { ArrayList publicIps = getPublicIpsToApply(router, provider, guestNetworkId); diff --git a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java index 24f724c2ef1..42a7a2df8b0 100644 --- a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java @@ -286,7 +286,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian return true; } - boolean result = setupVpcGuestNetwork(network, router, false, _networkMgr.getNicProfile(router, network.getId())); + boolean result = setupVpcGuestNetwork(network, router, false, _networkMgr.getNicProfile(router, network.getId(), null)); if (!result) { s_logger.warn("Failed to destroy guest network config " + network + " on router " + router); return false; @@ -439,7 +439,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian String networkDomain = network.getNetworkDomain(); String dhcpRange = getGuestDhcpRange(guestNic, network, _configMgr.getZone(network.getDataCenterId())); - NicProfile nicProfile = _networkMgr.getNicProfile(router, nic.getNetworkId()); + NicProfile nicProfile = _networkMgr.getNicProfile(router, nic.getNetworkId(), null); SetupGuestNetworkCommand setupCmd = new SetupGuestNetworkCommand(dhcpRange, networkDomain, false, null, defaultDns1, defaultDns2, add, _itMgr.toNicTO(nicProfile, router.getHypervisorType())); @@ -456,7 +456,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian } private void createVpcAssociatePublicIPCommands(final VirtualRouter router, final List ips, - Commands cmds) { + Commands cmds, Map vlanMacAddress) { Pair sourceNatIpAdd = null; Boolean addSourceNat = null; @@ -488,9 +488,11 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian for (final PublicIpAddress ipAddr : ipAddrList) { boolean add = (ipAddr.getState() == IpAddress.State.Releasing ? false : true); - + + String macAddress = vlanMacAddress.get(ipAddr.getVlanTag()); + IpAddressTO ip = new IpAddressTO(ipAddr.getAccountId(), ipAddr.getAddress().addr(), add, false, - ipAddr.isSourceNat(), ipAddr.getVlanTag(), ipAddr.getGateway(), ipAddr.getNetmask(), ipAddr.getMacAddress(), + ipAddr.isSourceNat(), ipAddr.getVlanTag(), ipAddr.getGateway(), ipAddr.getNetmask(), macAddress, null, networkRate, ipAddr.isOneToOneNat()); ip.setTrafficType(network.getTrafficType()); @@ -523,8 +525,8 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian } } - protected NicTO getNicTO(final VirtualRouter router, Long guestNetworkId) { - NicProfile nicProfile = _networkMgr.getNicProfile(router, guestNetworkId); + protected NicTO getNicTO(final VirtualRouter router, Long networkId, String broadcastUri) { + NicProfile nicProfile = _networkMgr.getNicProfile(router, networkId, broadcastUri); return _itMgr.toNicTO(nicProfile, router.getHypervisorType()); } @@ -599,12 +601,32 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian } } - //3) apply the ips + //3) apply the rules boolean result = applyRules(network, routers, "vpc ip association", false, null, false, new RuleApplier() { @Override public boolean execute(Network network, VirtualRouter router) throws ResourceUnavailableException { Commands cmds = new Commands(OnError.Continue); - createVpcAssociatePublicIPCommands(router, ipAddress, cmds); + Map vlanMacAddress = new HashMap(); + for (PublicIpAddress ipAddr : ipAddress) { + + String broadcastURI = BroadcastDomainType.Vlan.toUri(ipAddr.getVlanTag()).toString(); + Nic nic = _nicDao.findByNetworkIdInstanceIdAndBroadcastUri(ipAddr.getNetworkId(), + router.getId(), broadcastURI); + + String macAddress = null; + if (nic == null) { + if (ipAddr.getState() != IpAddress.State.Releasing) { + throw new CloudRuntimeException("Unable to find the nic in network " + ipAddr.getNetworkId() + + " to apply the ip address " + ipAddr + " for"); + } + macAddress = ipAddr.getMacAddress(); + } else { + macAddress = nic.getMacAddress(); + } + + vlanMacAddress.put(ipAddr.getVlanTag(), macAddress); + } + createVpcAssociatePublicIPCommands(router, ipAddress, cmds, vlanMacAddress); return sendCommandsToRouter(router, cmds); } }); @@ -691,8 +713,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian } } - - SetNetworkACLCommand cmd = new SetNetworkACLCommand(rulesTO, getNicTO(router, guestNetworkId)); + SetNetworkACLCommand cmd = new SetNetworkACLCommand(rulesTO, getNicTO(router, guestNetworkId, null)); cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId())); cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, getRouterIpInNetwork(guestNetworkId, router.getId())); cmd.setAccessDetail(NetworkElementCommand.GUEST_VLAN_TAG, guestVlan); @@ -731,16 +752,21 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian finalizeSshAndVersionOnStart(cmds, profile, router, controlNic); //2) FORM PLUG NIC COMMANDS - Map guestNics = new HashMap(); - Map publicNics = new HashMap(); + List> guestNics = new ArrayList>(); + List> publicNics = new ArrayList>(); + Map vlanMacAddress = new HashMap(); List routerNics = _nicDao.listByVmId(profile.getId()); for (Nic routerNic : routerNics) { Network network = _networkMgr.getNetwork(routerNic.getNetworkId()); if (network.getTrafficType() == TrafficType.Guest) { - guestNics.put(routerNic, network); + Pair guestNic = new Pair(routerNic, network); + guestNics.add(guestNic); } else if (network.getTrafficType() == TrafficType.Public) { - publicNics.put(routerNic, network); + Pair publicNic = new Pair(routerNic, network); + publicNics.add(publicNic); + String vlanTag = routerNic.getBroadcastUri().getHost(); + vlanMacAddress.put(vlanTag, routerNic.getMacAddress()); } } @@ -748,8 +774,9 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian try { //add VPC router to public networks List sourceNat = new ArrayList(1); - for (Nic publicNic : publicNics.keySet()) { - Network publicNtwk = publicNics.get(publicNic); + for (Pair nicNtwk : publicNics) { + Nic publicNic = nicNtwk.first(); + Network publicNtwk = nicNtwk.second(); IPAddressVO userIp = _ipAddressDao.findByIpAndSourceNetworkId(publicNtwk.getId(), publicNic.getIp4Address()); @@ -767,31 +794,32 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian } } - PlugNicCommand plugNicCmd = new PlugNicCommand(_itMgr.toVmTO(profile), getNicTO(router, publicNic.getNetworkId())); + PlugNicCommand plugNicCmd = new PlugNicCommand(_itMgr.toVmTO(profile), getNicTO(router, publicNic.getNetworkId(), publicNic.getBroadcastUri().toString())); cmds.addCommand(plugNicCmd); } // create ip assoc for source nat if (!sourceNat.isEmpty()) { - createVpcAssociatePublicIPCommands(router, sourceNat, cmds); + createVpcAssociatePublicIPCommands(router, sourceNat, cmds, vlanMacAddress); } //add VPC router to guest networks - for (Nic nic : guestNics.keySet()) { + for (Pair nicNtwk : guestNics) { + Nic guestNic = nicNtwk.first(); //plug guest nic - PlugNicCommand plugNicCmd = new PlugNicCommand(_itMgr.toVmTO(profile), getNicTO(router, nic.getNetworkId())); + PlugNicCommand plugNicCmd = new PlugNicCommand(_itMgr.toVmTO(profile), getNicTO(router, guestNic.getNetworkId(), null)); cmds.addCommand(plugNicCmd); - if (!_networkMgr.isPrivateGateway(nic)) { + if (!_networkMgr.isPrivateGateway(guestNic)) { //set guest network VirtualMachine vm = _vmDao.findById(router.getId()); - NicProfile nicProfile = _networkMgr.getNicProfile(vm, nic.getNetworkId()); + NicProfile nicProfile = _networkMgr.getNicProfile(vm, guestNic.getNetworkId(), null); SetupGuestNetworkCommand setupCmd = createSetupGuestNetworkCommand(router, true, nicProfile); cmds.addCommand(setupCmd); } else { //set private network - PrivateIpVO ipVO = _privateIpDao.findByIpAndSourceNetworkId(nic.getNetworkId(), nic.getIp4Address()); - Network network = _networkDao.findById(nic.getNetworkId()); + PrivateIpVO ipVO = _privateIpDao.findByIpAndSourceNetworkId(guestNic.getNetworkId(), guestNic.getIp4Address()); + Network network = _networkDao.findById(guestNic.getNetworkId()); String vlanTag = network.getBroadcastUri().getHost(); String netmask = NetUtils.getCidrNetmask(network.getCidr()); PrivateIpAddress ip = new PrivateIpAddress(ipVO, vlanTag, network.getGateway(), netmask, ipVO.getMacAddress()); @@ -844,13 +872,14 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian throw new CloudRuntimeException("Cannot find related provider of virtual router provider: " + vrProvider.getType().toString()); } - for (Nic nic : guestNics.keySet()) { + for (Pair nicNtwk : guestNics) { + Nic guestNic = nicNtwk.first(); if (reprogramGuestNtwks) { - finalizeIpAssocForNetwork(cmds, router, provider, nic.getNetworkId()); - finalizeNetworkRulesForNetwork(cmds, router, provider, nic.getNetworkId()); + finalizeIpAssocForNetwork(cmds, router, provider, guestNic.getNetworkId(), vlanMacAddress); + finalizeNetworkRulesForNetwork(cmds, router, provider, guestNic.getNetworkId()); } - finalizeUserDataAndDhcpOnStart(cmds, router, provider, nic.getNetworkId()); + finalizeUserDataAndDhcpOnStart(cmds, router, provider, guestNic.getNetworkId()); } return true; @@ -959,7 +988,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian Network privateNetwork = _networkMgr.getNetwork(gateway.getNetworkId()); s_logger.debug("Releasing private ip for gateway " + gateway + " from " + router); - boolean result = setupVpcPrivateNetwork(router, false, _networkMgr.getNicProfile(router, privateNetwork.getId())); + boolean result = setupVpcPrivateNetwork(router, false, _networkMgr.getNicProfile(router, privateNetwork.getId(), null)); if (!result) { s_logger.warn("Failed to release private ip for gateway " + gateway + " on router " + router); return false; @@ -974,10 +1003,10 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian @Override protected void finalizeIpAssocForNetwork(Commands cmds, VirtualRouter router, Provider provider, - Long guestNetworkId) { + Long guestNetworkId, Map vlanMacAddress) { if (router.getVpcId() == null) { - super.finalizeIpAssocForNetwork(cmds, router, provider, guestNetworkId); + super.finalizeIpAssocForNetwork(cmds, router, provider, guestNetworkId, vlanMacAddress); return; } @@ -986,7 +1015,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian if (publicIps != null && !publicIps.isEmpty()) { s_logger.debug("Found " + publicIps.size() + " ip(s) to apply as a part of domR " + router + " start."); // Re-apply public ip addresses - should come before PF/LB/VPN - createVpcAssociatePublicIPCommands(router, publicIps, cmds); + createVpcAssociatePublicIPCommands(router, publicIps, cmds, vlanMacAddress); } } @@ -1272,7 +1301,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian if (ip.getState() == IpAddress.State.Allocated || ip.getState() == IpAddress.State.Allocating) { //nic has to be plugged only when there are no nics for this vlan tag exist on VR - Nic nic = _nicDao.findByInstanceIdNetworkIdAndBroadcastUri(publicNtwkId, router.getId(), + Nic nic = _nicDao.findByNetworkIdInstanceIdAndBroadcastUri(publicNtwkId, router.getId(), broadcastUri.toString()); if ((nic == null && nicsToPlug.get(ip.getVlanTag()) == null) || nicsToUnplug.get(ip.getVlanTag()) != null) { diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java index edf45bcfeb8..c421c1386ab 100755 --- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -2527,7 +2527,7 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Listene Nic nic = null; if (broadcastUri != null) { - nic = _nicsDao.findByInstanceIdNetworkIdAndBroadcastUri(network.getId(), vm.getId(), broadcastUri.toString()); + nic = _nicsDao.findByNetworkIdInstanceIdAndBroadcastUri(network.getId(), vm.getId(), broadcastUri.toString()); } else { nic = _networkMgr.getNicInNetwork(vm.getId(), network.getId()); } diff --git a/server/src/com/cloud/vm/dao/NicDao.java b/server/src/com/cloud/vm/dao/NicDao.java index 367ad9153f8..6b8ea3069ac 100644 --- a/server/src/com/cloud/vm/dao/NicDao.java +++ b/server/src/com/cloud/vm/dao/NicDao.java @@ -49,7 +49,7 @@ public interface NicDao extends GenericDao { int countNics(long instanceId); - NicVO findByInstanceIdNetworkIdAndBroadcastUri(long networkId, long instanceId, String broadcastUri); + NicVO findByNetworkIdInstanceIdAndBroadcastUri(long networkId, long instanceId, String broadcastUri); NicVO findByIp4AddressAndNetworkIdAndInstanceId(long networkId, long instanceId, String ip4Address); } diff --git a/server/src/com/cloud/vm/dao/NicDaoImpl.java b/server/src/com/cloud/vm/dao/NicDaoImpl.java index 0adab2c3e56..dd568e555f2 100644 --- a/server/src/com/cloud/vm/dao/NicDaoImpl.java +++ b/server/src/com/cloud/vm/dao/NicDaoImpl.java @@ -169,7 +169,7 @@ public class NicDaoImpl extends GenericDaoBase implements NicDao { @Override - public NicVO findByInstanceIdNetworkIdAndBroadcastUri(long networkId, long instanceId, String broadcastUri) { + public NicVO findByNetworkIdInstanceIdAndBroadcastUri(long networkId, long instanceId, String broadcastUri) { SearchCriteria sc = AllFieldsSearch.create(); sc.setParameters("network", networkId); sc.setParameters("instance", instanceId); diff --git a/server/test/com/cloud/network/MockNetworkManagerImpl.java b/server/test/com/cloud/network/MockNetworkManagerImpl.java index 3e84cba2c7e..991e3fbd868 100755 --- a/server/test/com/cloud/network/MockNetworkManagerImpl.java +++ b/server/test/com/cloud/network/MockNetworkManagerImpl.java @@ -959,7 +959,7 @@ public class MockNetworkManagerImpl implements NetworkManager, Manager, NetworkS * @see com.cloud.network.NetworkManager#getNicProfile(com.cloud.vm.VirtualMachine, long) */ @Override - public NicProfile getNicProfile(VirtualMachine vm, long networkId) { + public NicProfile getNicProfile(VirtualMachine vm, long networkId, String broadcastUri) { // TODO Auto-generated method stub return null; }