From 3f16740d825d789adff9ee50252f765143d68810 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Wed, 16 Sep 2015 14:44:49 +0200 Subject: [PATCH] CLOUDSTACK-7985: keep the default nic on shared network when assignVM --- .../src/com/cloud/vm/UserVmManagerImpl.java | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 6f0d4984502..8a696b8a3e9 100644 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -5246,12 +5246,27 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir if (securityGroupIdList != null && !securityGroupIdList.isEmpty()) { throw new InvalidParameterValueException("Can't move vm with security groups; security group feature is not enabled in this zone"); } + Set applicableNetworks = new HashSet(); + // if networkIdList is null and the first network of vm is shared network, then keep it if possible + if (networkIdList == null || networkIdList.isEmpty()) { + NicVO defaultNicOld = _nicDao.findDefaultNicForVM(vm.getId()); + if (defaultNicOld != null) { + NetworkVO defaultNetworkOld = _networkDao.findById(defaultNicOld.getNetworkId()); + if (defaultNetworkOld != null && defaultNetworkOld.getGuestType() == Network.GuestType.Shared && defaultNetworkOld.getAclType() == ACLType.Domain) { + try { + _networkModel.checkNetworkPermissions(newAccount, defaultNetworkOld); + applicableNetworks.add(defaultNetworkOld); + } catch (PermissionDeniedException e) { + s_logger.debug("AssignVM: the shared network on old default nic can not be applied to new account"); + } + } + } + } + // cleanup the network for the oldOwner _networkMgr.cleanupNics(vmOldProfile); _networkMgr.expungeNics(vmOldProfile); - Set applicableNetworks = new HashSet(); - if (networkIdList != null && !networkIdList.isEmpty()) { // add any additional networks for (Long networkId : networkIdList) { @@ -5273,7 +5288,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir } applicableNetworks.add(network); } - } else { + } else if (applicableNetworks.isEmpty()) { NetworkVO defaultNetwork = null; List requiredOfferings = _networkOfferingDao.listByAvailability(Availability.Required, false); if (requiredOfferings.size() < 1) {