From 029a07fad49f822801f54653ffa74ba5d7d5c8b1 Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Fri, 10 Aug 2012 16:04:18 -0700 Subject: [PATCH] VPC: CS-15950 - throw networkConflictException when try to create network rule for the ip address that is already in use for another service --- server/src/com/cloud/network/NetworkManagerImpl.java | 11 ++++++++--- .../src/com/cloud/network/rules/RulesManagerImpl.java | 2 -- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index b82752bac68..4381162781f 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -843,7 +843,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag return true; } - public boolean canIpUsedForService(PublicIp publicIp, Service service) { + public boolean canIpUsedForService(PublicIp publicIp, Service service, Long networkId) { List ipList = new ArrayList(); ipList.add(publicIp); Map> ipToServices = getIpToServices(ipList, false, true); @@ -851,8 +851,13 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag if (services == null || services.isEmpty()) { return true; } + + if (networkId == null) { + networkId = publicIp.getAssociatedWithNetworkId(); + } + // We only support one provider for one service now - Map> serviceToProviders = getServiceProvidersMap(publicIp.getAssociatedWithNetworkId()); + Map> serviceToProviders = getServiceProvidersMap(networkId); Set oldProviders = serviceToProviders.get(services.toArray()[0]); Provider oldProvider = (Provider) oldProviders.toArray()[0]; // Since IP already has service to bind with, the oldProvider can't be null @@ -6906,7 +6911,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag return true; } PublicIp publicIp = new PublicIp(userIp, _vlanDao.findById(userIp.getVlanId()), NetUtils.createSequenceBasedMacAddress(userIp.getMacAddress())); - if (!canIpUsedForService(publicIp, service)) { + if (!canIpUsedForService(publicIp, service, networkId)) { return false; } if (!offering.isConserveMode()) { diff --git a/server/src/com/cloud/network/rules/RulesManagerImpl.java b/server/src/com/cloud/network/rules/RulesManagerImpl.java index 4d73592ebfb..348f3d34722 100755 --- a/server/src/com/cloud/network/rules/RulesManagerImpl.java +++ b/server/src/com/cloud/network/rules/RulesManagerImpl.java @@ -196,8 +196,6 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { boolean assignToVpcNtwk = network.getVpcId() != null && ipAddress.getVpcId() != null && ipAddress.getVpcId().longValue() == network.getVpcId(); if (assignToVpcNtwk) { - //set networkId just for verification purposes - ipAddress.setAssociatedWithNetworkId(networkId); _networkMgr.checkIpForService(ipAddress, Service.PortForwarding, networkId); s_logger.debug("The ip is not associated with the VPC network id="+ networkId + ", so assigning");