You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by al...@apache.org on 2012/07/21 02:09:34 UTC
[2/5] git commit: VPC: when VPC router gets destroyed and recreated,
plug public nic for each Vlan where VPC public ips belong to
VPC: when VPC router gets destroyed and recreated, plug public nic for each Vlan where VPC public ips belong to
Conflicts:
server/src/com/cloud/network/NetworkManagerImpl.java
Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/966c1b0a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/966c1b0a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/966c1b0a
Branch: refs/heads/vpc
Commit: 966c1b0ad858a818b35487d948cad6f0920dbb37
Parents: cf895d3
Author: Alena Prokharchyk <al...@citrix.com>
Authored: Fri Jul 20 16:27:54 2012 -0700
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Fri Jul 20 17:12:34 2012 -0700
----------------------------------------------------------------------
server/src/com/cloud/network/NetworkManager.java | 3 +-
.../src/com/cloud/network/NetworkManagerImpl.java | 14 +-
.../network/lb/LoadBalancingRulesManagerImpl.java | 3 +-
.../VpcVirtualNetworkApplianceManagerImpl.java | 109 +++++++++++++--
.../com/cloud/network/rules/RulesManagerImpl.java | 4 +-
.../com/cloud/network/MockNetworkManagerImpl.java | 2 +-
6 files changed, 110 insertions(+), 25 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/966c1b0a/server/src/com/cloud/network/NetworkManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java
index 4274295..6dba220 100755
--- a/server/src/com/cloud/network/NetworkManager.java
+++ b/server/src/com/cloud/network/NetworkManager.java
@@ -403,8 +403,9 @@ public interface NetworkManager extends NetworkService {
/**
* @param ipAddrId
* @param networkId
+ * @param releaseOnFailure TODO
*/
- IPAddressVO associateIPToGuestNetwork(long ipAddrId, long networkId) throws ResourceAllocationException, ResourceUnavailableException,
+ IPAddressVO associateIPToGuestNetwork(long ipAddrId, long networkId, boolean releaseOnFailure) throws ResourceAllocationException, ResourceUnavailableException,
InsufficientAddressCapacityException, ConcurrentOperationException;
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/966c1b0a/server/src/com/cloud/network/NetworkManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java
index 8b7b056..2788d44 100755
--- a/server/src/com/cloud/network/NetworkManagerImpl.java
+++ b/server/src/com/cloud/network/NetworkManagerImpl.java
@@ -1138,8 +1138,9 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
@DB
@Override
- public IPAddressVO associateIPToGuestNetwork(long ipId, long networkId) throws ResourceAllocationException, ResourceUnavailableException,
- InsufficientAddressCapacityException, ConcurrentOperationException {
+ public IPAddressVO associateIPToGuestNetwork(long ipId, long networkId, boolean releaseOnFailure)
+ throws ResourceAllocationException, ResourceUnavailableException,
+ InsufficientAddressCapacityException, ConcurrentOperationException {
Account caller = UserContext.current().getCaller();
Account owner = null;
@@ -1216,14 +1217,11 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
s_logger.warn("Failed to associate ip address " + ip.getAddress().addr() + " to network " + network);
}
return ip;
- } catch (ResourceUnavailableException e) {
- s_logger.error("Unable to associate ip address due to resource unavailable exception", e);
- return null;
} finally {
- if (!success) {
+ if (!success && releaseOnFailure) {
if (ip != null) {
try {
- s_logger.warn("Failed to associate ip address " + ip);
+ s_logger.warn("Failed to associate ip address, so releasing ip from the database " + ip);
_ipAddressDao.markAsUnavailable(ip.getId());
if (!applyIpAssociations(network, true)) {
// if fail to apply ip assciations again, unassign ip address without updating resource
@@ -7244,7 +7242,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
throw new InvalidParameterValueException("Can't assign ip to the network directly when network belongs" +
" to VPC.Specify vpcId to associate ip address to VPC");
}
- return associateIPToGuestNetwork(ipId, networkId);
+ return associateIPToGuestNetwork(ipId, networkId, true);
}
return null;
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/966c1b0a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
index d42f273..e7ece27 100755
--- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
+++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
@@ -749,11 +749,10 @@ public class LoadBalancingRulesManagerImpl<Type> implements LoadBalancingRulesMa
&& ipVO.getVpcId() != null && ipVO.getVpcId().longValue() == network.getVpcId();
if (assignToVpcNtwk) {
//set networkId just for verification purposes
- ipVO.setAssociatedWithNetworkId(lb.getNetworkId());
_networkMgr.checkIpForService(ipVO, Service.Lb, lb.getNetworkId());
s_logger.debug("The ip is not associated with the VPC network id="+ lb.getNetworkId() + " so assigning");
- ipVO = _networkMgr.associateIPToGuestNetwork(ipAddrId, lb.getNetworkId());
+ ipVO = _networkMgr.associateIPToGuestNetwork(ipAddrId, lb.getNetworkId(), false);
performedIpAssoc = true;
}
} else {
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/966c1b0a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
index 4b3d5a1..81b2a79 100644
--- a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
@@ -22,6 +22,7 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.TreeSet;
import javax.ejb.Local;
@@ -97,6 +98,7 @@ import com.cloud.network.vpc.Dao.PrivateIpDao;
import com.cloud.network.vpc.Dao.StaticRouteDao;
import com.cloud.network.vpc.Dao.VpcDao;
import com.cloud.network.vpc.Dao.VpcOfferingDao;
+import com.cloud.offerings.NetworkOfferingVO;
import com.cloud.user.Account;
import com.cloud.utils.Pair;
import com.cloud.utils.component.Inject;
@@ -529,9 +531,10 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
//only one router is supported in VPC now
VirtualRouter router = routers.get(0);
- //1) check which nics need to be plugged/unplugged and plug/unplug them
- Map<String, PublicIpAddress> nicsToPlug = new HashMap<String, PublicIpAddress>();
- Map<String, PublicIpAddress> nicsToUnPlug = new HashMap<String, PublicIpAddress>();
+ Pair<Map<String, PublicIpAddress>, Map<String, PublicIpAddress>> nicsToChange = getNicsToChangeOnRouter(ipAddress, router);
+ Map<String, PublicIpAddress> nicsToPlug = nicsToChange.first();
+ Map<String, PublicIpAddress> nicsToUnplug = nicsToChange.second();
+
//find out nics to unplug
for (PublicIpAddress ip : ipAddress) {
@@ -545,7 +548,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
if (ip.getState() == IpAddress.State.Releasing) {
Nic nic = _nicDao.findByIp4AddressAndNetworkIdAndInstanceId(publicNtwkId, router.getId(), ip.getAddress().addr());
if (nic != null) {
- nicsToUnPlug.put(ip.getVlanTag(), ip);
+ nicsToUnplug.put(ip.getVlanTag(), ip);
s_logger.debug("Need to unplug the nic for ip=" + ip + "; vlan=" + ip.getVlanTag() +
" in public network id =" + publicNtwkId);
}
@@ -567,7 +570,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
Nic nic = _nicDao.findByInstanceIdNetworkIdAndBroadcastUri(publicNtwkId, router.getId(),
broadcastUri.toString());
- if ((nic == null && nicsToPlug.get(ip.getVlanTag()) == null) || nicsToUnPlug.get(ip.getVlanTag()) != null) {
+ 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);
@@ -622,10 +625,10 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
});
//4) Unplug the nics
- for (String vlanTag : nicsToUnPlug.keySet()) {
+ for (String vlanTag : nicsToUnplug.keySet()) {
Network publicNtwk = null;
try {
- publicNtwk = _networkMgr.getNetwork(nicsToUnPlug.get(vlanTag).getNetworkId());
+ publicNtwk = _networkMgr.getNetwork(nicsToUnplug.get(vlanTag).getNetworkId());
URI broadcastUri = BroadcastDomainType.Vlan.toUri(vlanTag);
_itMgr.removeVmFromNetwork(router, publicNtwk, broadcastUri);
} catch (ConcurrentOperationException e) {
@@ -1143,13 +1146,18 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
protected List<Pair<NetworkVO, NicProfile>> createVpcRouterNetworks(Account owner, boolean isRedundant,
- DeploymentPlan plan, Pair<Boolean, PublicIp> publicNetwork, long vpcId) throws ConcurrentOperationException,
+ DeploymentPlan plan, Pair<Boolean, PublicIp> sourceNatIp, long vpcId) throws ConcurrentOperationException,
InsufficientAddressCapacityException {
List<Pair<NetworkVO, NicProfile>> networks = new ArrayList<Pair<NetworkVO, NicProfile>>(4);
- networks = super.createRouterNetworks(owner, isRedundant, plan, null, publicNetwork);
- //1) allocate nic for private gateway if needed
+ TreeSet<String> publicVlans = new TreeSet<String>();
+ publicVlans.add(sourceNatIp.second().getVlanTag());
+
+ //1) allocate nic for control and source nat public ip
+ networks = super.createRouterNetworks(owner, isRedundant, plan, null, sourceNatIp);
+
+ //2) allocate nic for private gateway if needed
VpcGateway privateGateway = _vpcMgr.getPrivateGatewayForVpc(vpcId);
if (privateGateway != null) {
NicProfile privateNic = createPrivateNicProfileForGateway(privateGateway);
@@ -1157,7 +1165,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
networks.add(new Pair<NetworkVO, NicProfile>((NetworkVO) privateNetwork, privateNic));
}
- //2) allocate nic for guest gateway if needed
+ //3) allocate nic for guest gateway if needed
List<? extends Network> guestNetworks = _vpcMgr.getVpcNetworks(vpcId);
for (Network guestNetwork : guestNetworks) {
if (guestNetwork.getState() == Network.State.Implemented) {
@@ -1166,6 +1174,30 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
}
}
+ //4) allocate nic for additional public network(s)
+ List<IPAddressVO> ips = _ipAddressDao.listByAssociatedVpc(vpcId, false);
+ for (IPAddressVO ip : ips) {
+ PublicIp publicIp = new PublicIp(ip, _vlanDao.findById(ip.getVlanId()),
+ NetUtils.createSequenceBasedMacAddress(ip.getMacAddress()));
+ if ((ip.getState() == IpAddress.State.Allocated || ip.getState() == IpAddress.State.Allocating)
+ && _networkMgr.ipUsedInVpc(ip)&& !publicVlans.contains(publicIp.getVlanTag())) {
+ s_logger.debug("Allocating nic for router in vlan " + publicIp.getVlanTag());
+ NicProfile publicNic = new NicProfile();
+ publicNic.setDefaultNic(false);
+ publicNic.setIp4Address(publicIp.getAddress().addr());
+ publicNic.setGateway(publicIp.getGateway());
+ publicNic.setNetmask(publicIp.getNetmask());
+ publicNic.setMacAddress(publicIp.getMacAddress());
+ publicNic.setBroadcastType(BroadcastDomainType.Vlan);
+ publicNic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(publicIp.getVlanTag()));
+ publicNic.setIsolationUri(IsolationType.Vlan.toUri(publicIp.getVlanTag()));
+ NetworkOfferingVO publicOffering = _networkMgr.getSystemAccountNetworkOfferings(NetworkOfferingVO.SystemPublicNetwork).get(0);
+ List<NetworkVO> publicNetworks = _networkMgr.setupNetwork(_systemAcct, publicOffering, plan, null, null, false);
+ networks.add(new Pair<NetworkVO, NicProfile>(publicNetworks.get(0), publicNic));
+ publicVlans.add(publicIp.getVlanTag());
+ }
+ }
+
return networks;
}
@@ -1203,4 +1235,59 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
return guestNic;
}
+
+ protected Pair<Map<String, PublicIpAddress>, Map<String, PublicIpAddress>> getNicsToChangeOnRouter
+ (final List<? extends PublicIpAddress> publicIps, VirtualRouter router) {
+ //1) check which nics need to be plugged/unplugged and plug/unplug them
+
+ Map<String, PublicIpAddress> nicsToPlug = new HashMap<String, PublicIpAddress>();
+ Map<String, PublicIpAddress> nicsToUnplug = new HashMap<String, PublicIpAddress>();
+
+
+ //find out nics to unplug
+ for (PublicIpAddress ip : publicIps) {
+ 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 : publicIps) {
+ 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);
+ }
+ }
+ }
+
+ Pair<Map<String, PublicIpAddress>, Map<String, PublicIpAddress>> nicsToChange =
+ new Pair<Map<String, PublicIpAddress>, Map<String, PublicIpAddress>>(nicsToPlug, nicsToUnplug);
+ return nicsToChange;
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/966c1b0a/server/src/com/cloud/network/rules/RulesManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/rules/RulesManagerImpl.java b/server/src/com/cloud/network/rules/RulesManagerImpl.java
index 224b635..14588dd 100755
--- a/server/src/com/cloud/network/rules/RulesManagerImpl.java
+++ b/server/src/com/cloud/network/rules/RulesManagerImpl.java
@@ -194,7 +194,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager {
s_logger.debug("The ip is not associated with the VPC network id="+ networkId + ", so assigning");
try {
- ipAddress = _networkMgr.associateIPToGuestNetwork(ipAddrId, networkId);
+ ipAddress = _networkMgr.associateIPToGuestNetwork(ipAddrId, networkId, false);
performedIpAssoc = true;
} catch (Exception ex) {
throw new CloudRuntimeException("Failed to associate ip to VPC network as " +
@@ -420,7 +420,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager {
s_logger.debug("The ip is not associated with the VPC network id="+ networkId + ", so assigning");
try {
- ipAddress = _networkMgr.associateIPToGuestNetwork(ipId, networkId);
+ ipAddress = _networkMgr.associateIPToGuestNetwork(ipId, networkId, false);
} catch (Exception ex) {
s_logger.warn("Failed to associate ip id=" + ipId + " to VPC network id=" + networkId + " as " +
"a part of enable static nat");
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/966c1b0a/server/test/com/cloud/network/MockNetworkManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/network/MockNetworkManagerImpl.java b/server/test/com/cloud/network/MockNetworkManagerImpl.java
index 841d4a6..01c7fb8 100755
--- a/server/test/com/cloud/network/MockNetworkManagerImpl.java
+++ b/server/test/com/cloud/network/MockNetworkManagerImpl.java
@@ -80,7 +80,7 @@ public class MockNetworkManagerImpl implements NetworkManager, Manager, NetworkS
}
@Override
- public IPAddressVO associateIPToGuestNetwork(long ipId, long networkId) throws ResourceAllocationException, InsufficientAddressCapacityException, ConcurrentOperationException, ResourceUnavailableException {
+ public IPAddressVO associateIPToGuestNetwork(long ipId, long networkId, boolean releaseOnFailure) throws ResourceAllocationException, InsufficientAddressCapacityException, ConcurrentOperationException, ResourceUnavailableException {
// TODO Auto-generated method stub
return null;
}