From 46cd99f01e57bc299e96827c1b7289ee6418cd9b Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Mon, 23 Jul 2012 16:18:04 -0700 Subject: [PATCH] VPC: CS-15668 - IpAssoc: unplug the nics before pluggning new ones --- api/src/com/cloud/vm/NicProfile.java | 3 +- .../com/cloud/network/NetworkManagerImpl.java | 8 ++- ...VpcVirtualNetworkApplianceManagerImpl.java | 67 ++++--------------- .../cloud/vm/VirtualMachineManagerImpl.java | 2 +- 4 files changed, 20 insertions(+), 60 deletions(-) diff --git a/api/src/com/cloud/vm/NicProfile.java b/api/src/com/cloud/vm/NicProfile.java index 2eda387a91a..c5ffbeaa502 100644 --- a/api/src/com/cloud/vm/NicProfile.java +++ b/api/src/com/cloud/vm/NicProfile.java @@ -296,7 +296,8 @@ public class NicProfile { @Override public String toString() { - return new StringBuilder("NicProfile[").append(id).append("-").append(vmId).append("-").append(reservationId).toString(); + return new StringBuilder("NicProfile[").append(id).append("-").append(vmId).append("-"). + append(reservationId).append("-").append(ip4Address).append("-").append(broadcastUri).toString(); } } diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index b8536da31e5..ff2f968e8e9 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -1871,7 +1871,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag InsufficientAddressCapacityException, ConcurrentOperationException{ NetworkVO ntwkVO = _networksDao.findById(network.getId()); - s_logger.debug("Allocating nic for vm " + vm.getVirtualMachine() + " in network " + network); + s_logger.debug("Allocating nic for vm " + vm.getVirtualMachine() + " in network " + network + " with requested profile " + requested); NetworkGuru guru = _networkGurus.get(ntwkVO.getGuruName()); if (requested != null && requested.getMode() == null) { @@ -7427,7 +7427,6 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag //1) allocate nic (if needed) if (nic == null) { - s_logger.debug("Allocating nic for the " + vm + " in network " + network); int deviceId = _nicDao.countNics(vm.getId()); nic = allocateNic(requested, network, false, @@ -7453,9 +7452,12 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag NicProfile nic = null; if (requested != null && requested.getBroadCastUri() != null) { String broadcastUri = requested.getBroadCastUri().toString(); + String ipAddress = requested.getIp4Address(); NicVO nicVO = _nicDao.findByInstanceIdNetworkIdAndBroadcastUri(network.getId(), vm.getId(), broadcastUri); if (nicVO != null) { - nic = getNicProfile(vm, network.getId()); + if (ipAddress == null || nicVO.getIp4Address().equals(ipAddress)) { + nic = getNicProfile(vm, network.getId()); + } } } else { NicVO nicVO = _nicDao.findByInstanceIdAndNetworkId(network.getId(), vm.getId()); diff --git a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java index 7aeb06f52ff..7b920ac7f5b 100644 --- a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java @@ -538,46 +538,17 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian Map nicsToPlug = nicsToChange.first(); Map nicsToUnplug = nicsToChange.second(); - - //find out nics to unplug - for (PublicIpAddress ip : ipAddress) { - long publicNtwkId = ip.getNetworkId(); - - //if ip is not associated to any network, and there are no firewall rules, release it on the backend - if (!_networkMgr.ipUsedInVpc(ip)) { - ip.setState(IpAddress.State.Releasing); - } - - if (ip.getState() == IpAddress.State.Releasing) { - Nic nic = _nicDao.findByIp4AddressAndNetworkIdAndInstanceId(publicNtwkId, router.getId(), ip.getAddress().addr()); - if (nic != null) { - nicsToUnplug.put(ip.getVlanTag(), ip); - s_logger.debug("Need to unplug the nic for ip=" + ip + "; vlan=" + ip.getVlanTag() + - " in public network id =" + publicNtwkId); - } - } - } - - //find out nics to plug - for (PublicIpAddress ip : ipAddress) { - URI broadcastUri = BroadcastDomainType.Vlan.toUri(ip.getVlanTag()); - long publicNtwkId = ip.getNetworkId(); - - //if ip is not associated to any network, and there are no firewall rules, release it on the backend - if (!_networkMgr.ipUsedInVpc(ip)) { - ip.setState(IpAddress.State.Releasing); - } - - 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(), - broadcastUri.toString()); - - if ((nic == null && nicsToPlug.get(ip.getVlanTag()) == null) || nicsToUnplug.get(ip.getVlanTag()) != null) { - nicsToPlug.put(ip.getVlanTag(), ip); - s_logger.debug("Need to plug the nic for ip=" + ip + "; vlan=" + ip.getVlanTag() + - " in public network id =" + publicNtwkId); - } + //1) Unplug the nics + for (String vlanTag : nicsToUnplug.keySet()) { + Network publicNtwk = null; + try { + publicNtwk = _networkMgr.getNetwork(nicsToUnplug.get(vlanTag).getNetworkId()); + URI broadcastUri = BroadcastDomainType.Vlan.toUri(vlanTag); + _itMgr.removeVmFromNetwork(router, publicNtwk, broadcastUri); + } catch (ConcurrentOperationException e) { + s_logger.warn("Failed to remove router " + router + " from vlan " + vlanTag + + " in public network " + publicNtwk + " due to ", e); + return false; } } @@ -627,20 +598,6 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian } }); - //4) Unplug the nics - for (String vlanTag : nicsToUnplug.keySet()) { - Network publicNtwk = null; - try { - publicNtwk = _networkMgr.getNetwork(nicsToUnplug.get(vlanTag).getNetworkId()); - URI broadcastUri = BroadcastDomainType.Vlan.toUri(vlanTag); - _itMgr.removeVmFromNetwork(router, publicNtwk, broadcastUri); - } catch (ConcurrentOperationException e) { - s_logger.warn("Failed to remove router " + router + " from vlan " + vlanTag + - " in public network " + publicNtwk + " due to ", e); - return false; - } - } - return result; } @@ -662,7 +619,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian defaultDns1 = nic.getDns1(); defaultDns2 = nic.getDns2(); } - s_logger.debug("Removing nic of type " + nic.getTrafficType() + " from the nics passed on vm start. " + + 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(); } diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java index 82a3f5704e7..29fd5ce8be4 100755 --- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -2453,7 +2453,7 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Listene public NicProfile addVmToNetwork(VirtualMachine vm, Network network, NicProfile requested) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { - s_logger.debug("Adding vm " + vm + " to network " + network); + s_logger.debug("Adding vm " + vm + " to network " + network + "; requested nic profile " + requested); VMInstanceVO vmVO = _vmDao.findById(vm.getId()); ReservationContext context = new ReservationContextImpl(null, null, _accountMgr.getActiveUser(User.UID_SYSTEM), _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM));