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/06/16 00:38:03 UTC
[33/51] [abbrv] git commit: StartRouter: set only control nic during
the initial router start;
plug exising public and guest nics after the router is started with control
nic
StartRouter: set only control nic during the initial router start; plug exising public and guest nics after the router is started with control nic
Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/d70d2f82
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/d70d2f82
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/d70d2f82
Branch: refs/heads/vpc
Commit: d70d2f82d41637fadf088fce22d159617ec9f2e4
Parents: c75fe80
Author: Alena Prokharchyk <al...@citrix.com>
Authored: Wed Jun 6 16:49:16 2012 -0700
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Fri Jun 15 14:25:31 2012 -0700
----------------------------------------------------------------------
.../router/VirtualNetworkApplianceManagerImpl.java | 85 ++++++++++-----
.../com/cloud/vm/VirtualMachineManagerImpl.java | 46 +++++----
server/src/com/cloud/vm/dao/NicDao.java | 2 +
server/src/com/cloud/vm/dao/NicDaoImpl.java | 16 +++
wscript | 2 +-
5 files changed, 103 insertions(+), 48 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/d70d2f82/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
index b28e193..f79eabf 100755
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@ -201,6 +201,7 @@ import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.MacAddress;
import com.cloud.utils.net.NetUtils;
import com.cloud.vm.DomainRouterVO;
+import com.cloud.vm.Nic;
import com.cloud.vm.NicProfile;
import com.cloud.vm.NicVO;
import com.cloud.vm.ReservationContext;
@@ -1565,7 +1566,10 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
String defaultDns1 = null;
String defaultDns2 = null;
- for (NicProfile nic : profile.getNics()) {
+
+ Iterator<NicProfile> it = profile.getNics().iterator();
+ while (it.hasNext()) {
+ NicProfile nic = it.next();
int deviceId = nic.getDeviceId();
buf.append(" eth").append(deviceId).append("ip=").append(nic.getIp4Address());
buf.append(" eth").append(deviceId).append("mask=").append(nic.getNetmask());
@@ -1600,6 +1604,10 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
buf.append(" localgw=").append(dest.getPod().getGateway());
}
}
+ } else {
+ //Remove public and guest nics from the profile
+ s_logger.debug("Removing nic of type " + nic.getTrafficType() + " from virtual machine profile " + profile.getVirtualMachine());
+ it.remove();
}
}
@@ -1893,15 +1901,6 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
ReservationContext context) {
DomainRouterVO router = profile.getVirtualMachine();
- //Get guest nic info
- List<NicProfile> routerNics = profile.getNics();
- List<Network> guestNetworks = new ArrayList<Network>();
- for (NicProfile routerNic : routerNics) {
- if (routerNic.getTrafficType() == TrafficType.Guest) {
- guestNetworks.add(_networkMgr.getNetwork(routerNic.getNetworkId()));
- }
- }
-
boolean result = true;
Answer answer = cmds.getAnswer("checkSsh");
@@ -1917,6 +1916,23 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
if (result == false) {
return result;
}
+
+ //Get guest nic info
+ Map<Nic, Network> guestNics = new HashMap<Nic, Network>();
+ Map<Nic, Network> publicNics = new HashMap<Nic, Network>();
+ List<Network> guestNetworks = new ArrayList<Network>();
+
+ List<? extends Nic> routerNics = _nicDao.listByVmId(profile.getId());
+ for (Nic routerNic : routerNics) {
+ Network network = _networkMgr.getNetwork(routerNic.getNetworkId());
+ if (network.getTrafficType() == TrafficType.Guest) {
+ guestNics.put(routerNic, network);
+ guestNetworks.add(network);
+ } else if (network.getTrafficType() == TrafficType.Public) {
+ publicNics.put(routerNic, network);
+ }
+ }
+
answer = cmds.getAnswer("getDomRVersion");
if (answer != null && answer instanceof GetDomRVersionAnswer) {
GetDomRVersionAnswer versionAnswer = (GetDomRVersionAnswer)answer;
@@ -1931,6 +1947,30 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
} else {
result = false;
}
+
+ try {
+ //add router to public and guest networks
+ for (Nic publicNic : publicNics.keySet()) {
+ Network publicNtwk = publicNics.get(publicNic);
+ if (!addRouterToPublicNetwork(router, publicNtwk, _ipAddressDao.findByIpAndSourceNetworkId(publicNtwk.getId(),
+ publicNic.getIp4Address()))) {
+ s_logger.warn("Failed to plug nic " + publicNic + " to router " + router);
+ return false;
+ }
+ }
+
+ for (Nic guestNic : guestNics.keySet()) {
+ Network guestNtwk = guestNics.get(guestNic);
+ if (!addRouterToGuestNetwork(router, guestNtwk, false)) {
+ s_logger.warn("Failed to plug nic " + guestNic + " to router " + router);
+ return false;
+ }
+ }
+ } catch (Exception ex) {
+ s_logger.warn("Failed to plug nic for router " + router + " due to exception ", ex);
+ return false;
+ }
+
return result;
}
@@ -3051,7 +3091,7 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
}
NicVO nic = _nicDao.findByInstanceIdAndNetworkId(network.getId(), router.getId());
- NicProfile nicProfile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri(), null,
+ NicProfile nicProfile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri(), _networkMgr.getNetworkRate(network.getId(), router.getId()),
_networkMgr.isSecurityGroupSupportedInNetwork(network), _networkMgr.getNetworkTag(router.getHypervisorType(), network));
SetupGuestNetworkCommand setupCmd = new SetupGuestNetworkCommand(dhcpRange, networkDomain, isRedundant, priority,
@@ -3086,12 +3126,6 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
return false;
}
- //Check if router is already a part of the Guest network
- if (_networkMgr.isVmPartOfNetwork(router.getId(), network.getId())) {
- s_logger.debug("Router " + router + " is already part of the Guest network " + network);
- return true;
- }
-
//Add router to the Guest network
boolean result = true;
try {
@@ -3155,7 +3189,7 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
return result;
}
- protected boolean addRouterToPublicNetwork(VirtualRouter router, Network publicNetwork, IpAddress sourceNatIp)
+ protected boolean addRouterToPublicNetwork(VirtualRouter router, Network publicNetwork, IpAddress publicIpAddr)
throws ConcurrentOperationException,ResourceUnavailableException, InsufficientCapacityException {
if (publicNetwork.getTrafficType() != TrafficType.Public) {
@@ -3163,12 +3197,6 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
return false;
}
- //Check if router is already a part of the Public network
- if (_networkMgr.isVmPartOfNetwork(router.getId(), publicNetwork.getId())) {
- s_logger.debug("Router " + router + " is already part of the Public network " + publicNetwork);
- return true;
- }
-
//Add router to the Public network
boolean result = true;
try {
@@ -3176,8 +3204,8 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
NicProfile publicNic = _itMgr.addVmToNetwork(router, publicNetwork);
//setup public network
if (publicNic != null) {
- if (sourceNatIp != null) {
- IPAddressVO ipVO = _ipAddressDao.findById(sourceNatIp.getId());
+ if (publicIpAddr != null) {
+ IPAddressVO ipVO = _ipAddressDao.findById(publicIpAddr.getId());
PublicIp publicIp = new PublicIp(ipVO, _vlanDao.findById(ipVO.getVlanId()),
NetUtils.createSequenceBasedMacAddress(ipVO.getMacAddress()));
result = setupPublicNetwork(publicNetwork, router, false, publicIp);
@@ -3242,10 +3270,11 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
return result;
}
- protected boolean setupPublicNetwork(Network network, VirtualRouter router, boolean add, PublicIp sourceNatIp)
+ protected boolean setupPublicNetwork(Network network, VirtualRouter router, boolean add, PublicIp ipAddress)
throws ConcurrentOperationException, ResourceUnavailableException{
List<PublicIp> publicIps = new ArrayList<PublicIp>(1);
+ publicIps.add(ipAddress);
Commands cmds = new Commands(OnError.Stop);
createAssociateIPCommands(router, publicIps, cmds, 0);
sendCommandsToRouter(router, cmds);
@@ -3254,7 +3283,7 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
IpAssocAnswer ipAssocAnswer = cmds.getAnswer(IpAssocAnswer.class);
String setup = add ? "set" : "destroy";
if (!(ipAssocAnswer != null && ipAssocAnswer.getResult())) {
- s_logger.warn("Unable to " + setup + " guest network on router " + router);
+ s_logger.warn("Unable to " + setup + " public network on router " + router);
result = false;
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/d70d2f82/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
index 5dee3d1..11cb733 100755
--- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -2448,31 +2448,40 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Listene
Host host = _hostDao.findById(vm.getHostId());
DeployDestination dest = new DeployDestination(dc, null, null, host);
- s_logger.debug("Adding vm " + vm + " to network " + network);
-
- Transaction txn = Transaction.currentTxn();
- txn.start();
- //1) allocate nic
- NicProfile nic = _networkMgr.allocateNic(null, network, false,
- 100, vmProfile).first();
-
- s_logger.debug("Nic is allocated successfully for vm " + vm + " in network " + network);
-
- //2) Prepare nic
- nic = _networkMgr.prepareNic(vmProfile, dest, context, nic.getId(), networkVO);
-
- s_logger.debug("Nic is prepared successfully for vm " + vm + " in network " + network);
+ NicProfile nic = null;
+ NicVO nicVO = _nicsDao.findByInstanceIdAndNetworkId(network.getId(), vm.getId());
+ if (nicVO != null) {
+ nic = new NicProfile(nicVO, network, nicVO.getBroadcastUri(), nicVO.getIsolationUri(), _networkMgr.getNetworkRate(network.getId(), vm.getId()),
+ _networkMgr.isSecurityGroupSupportedInNetwork(network), _networkMgr.getNetworkTag(vm.getHypervisorType(), network));
+ }
- txn.commit();
+ if (nic == null) {
+ s_logger.debug("Allocating nic for the " + vm + " in network " + network);
+ Transaction txn = Transaction.currentTxn();
+ txn.start();
+ //1) allocate nic and prepare nic if needed
+ int deviceId = _nicsDao.countNics(vm.getId());
+
+ nic = _networkMgr.allocateNic(null, network, false,
+ deviceId, vmProfile).first();
+
+ s_logger.debug("Nic is allocated successfully for vm " + vm + " in network " + network);
+
+ nic = _networkMgr.prepareNic(vmProfile, dest, context, nic.getId(), networkVO);
+
+ s_logger.debug("Nic is prepared successfully for vm " + vm + " in network " + network);
+
+ txn.commit();
+ }
- //3) Convert vmProfile to vmTO
+ //2) Convert vmProfile to vmTO
HypervisorGuru hvGuru = _hvGuruMgr.getGuru(vmProfile.getVirtualMachine().getHypervisorType());
VirtualMachineTO vmTO = hvGuru.implement(vmProfile);
- //4) Convert nicProfile to NicTO
+ //3) Convert nicProfile to NicTO
NicTO nicTO = toNicTO(nic, vmProfile.getVirtualMachine().getHypervisorType());
- //5) plug the nic to the vm
+ //4) plug the nic to the vm
VirtualMachineGuru<VMInstanceVO> vmGuru = getVmGuru(vmVO);
if (vmGuru.plugNic(network, nicTO, vmTO, context, dest)) {
@@ -2482,7 +2491,6 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Listene
s_logger.warn("Failed to plug nic to the vm " + vm + " in network " + network);
return null;
}
-
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/d70d2f82/server/src/com/cloud/vm/dao/NicDao.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/dao/NicDao.java b/server/src/com/cloud/vm/dao/NicDao.java
index deb302f..9a62467 100644
--- a/server/src/com/cloud/vm/dao/NicDao.java
+++ b/server/src/com/cloud/vm/dao/NicDao.java
@@ -46,4 +46,6 @@ public interface NicDao extends GenericDao<NicVO, Long> {
NicVO findNonReleasedByInstanceIdAndNetworkId(long networkId, long instanceId);
String getIpAddress(long networkId, long instanceId);
+
+ int countNics(long instanceId);
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/d70d2f82/server/src/com/cloud/vm/dao/NicDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/dao/NicDaoImpl.java b/server/src/com/cloud/vm/dao/NicDaoImpl.java
index 09786ca..baa75cd 100644
--- a/server/src/com/cloud/vm/dao/NicDaoImpl.java
+++ b/server/src/com/cloud/vm/dao/NicDaoImpl.java
@@ -32,6 +32,8 @@ public class NicDaoImpl extends GenericDaoBase<NicVO, Long> implements NicDao {
private final SearchBuilder<NicVO> AllFieldsSearch;
private final GenericSearchBuilder<NicVO, String> IpSearch;
private final SearchBuilder<NicVO> NonReleasedSearch;
+ final GenericSearchBuilder<NicVO, Integer> CountBy;
+
protected NicDaoImpl() {
super();
@@ -55,6 +57,12 @@ public class NicDaoImpl extends GenericDaoBase<NicVO, Long> implements NicDao {
NonReleasedSearch.and("network", NonReleasedSearch.entity().getNetworkId(), Op.EQ);
NonReleasedSearch.and("state", NonReleasedSearch.entity().getState(), Op.NOTIN);
NonReleasedSearch.done();
+
+ CountBy = createSearchBuilder(Integer.class);
+ CountBy.select(null, Func.COUNT, CountBy.entity().getId());
+ CountBy.and("vmId", CountBy.entity().getInstanceId(), Op.EQ);
+ CountBy.and("removed", CountBy.entity().getRemoved(), Op.NULL);
+ CountBy.done();
}
@Override
@@ -150,4 +158,12 @@ public class NicDaoImpl extends GenericDaoBase<NicVO, Long> implements NicDao {
return findOneBy(sc).getIp4Address();
}
+ @Override
+ public int countNics(long instanceId) {
+ SearchCriteria<Integer> sc = CountBy.create();
+ sc.setParameters("vmId", instanceId);
+ List<Integer> results = customSearch(sc, null);
+ return results.get(0);
+ }
+
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/d70d2f82/wscript
----------------------------------------------------------------------
diff --git a/wscript b/wscript
index d562838..4ef4e36 100644
--- a/wscript
+++ b/wscript
@@ -4,7 +4,7 @@
# the following two variables are used by the target "waf dist"
# if you change 'em here, you need to change it also in cloud.spec, add a %changelog entry there, and add an entry in debian/changelog
-VERSION = '3.0.3.2012-06-06T23:35:14Z'
+VERSION = '3.0.3.2012-06-06T23:43:59Z'
APPNAME = 'cloud'
import shutil,os