diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
index 9523b928ed4..a1cf7665655 100644
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -1428,6 +1428,15 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
advanceStop(vm, cleanUpEvenIfUnableToStop);
}
+ /**
+ * Send StopCommand to stop vm.
+ * Not releasing network resources until expunge command is sent
+ * @param vm virtual machine
+ * @param cleanUpEvenIfUnableToStop if true -> cleanup even if vm cannot be stopped. if false -> not cleaning up if vm cannot be stopped.
+ * @throws AgentUnavailableException
+ * @throws OperationTimedoutException
+ * @throws ConcurrentOperationException
+ */
private void advanceStop(final VMInstanceVO vm, final boolean cleanUpEvenIfUnableToStop) throws AgentUnavailableException, OperationTimedoutException,
ConcurrentOperationException {
final State state = vm.getState();
@@ -1576,13 +1585,6 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
s_logger.debug(vm + " is stopped on the host. Proceeding to release resource held.");
}
- try {
- _networkMgr.release(profile, cleanUpEvenIfUnableToStop);
- s_logger.debug("Successfully released network resources for the vm " + vm);
- } catch (final Exception e) {
- s_logger.warn("Unable to release some network resources.", e);
- }
-
try {
if (vm.getHypervisorType() != HypervisorType.BareMetal) {
volumeMgr.release(profile);
diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java
index 9eddf6dabd9..dd7e817aaea 100644
--- a/server/src/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@ -2046,6 +2046,9 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
return false;
}
try {
+
+ releaseNetworkResourcesOnExpunge(vm.getId());
+
List rootVol = _volsDao.findByInstanceAndType(vm.getId(), Volume.Type.ROOT);
// expunge the vm
_itMgr.advanceExpunge(vm.getUuid());
@@ -2086,6 +2089,23 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
}
}
+ /**
+ * Release network resources, it was done on vm stop previously.
+ * @param id vm id
+ * @throws ConcurrentOperationException
+ * @throws ResourceUnavailableException
+ */
+ private void releaseNetworkResourcesOnExpunge(long id) throws ConcurrentOperationException, ResourceUnavailableException {
+ final VMInstanceVO vmInstance = _vmDao.findById(id);
+ if (vmInstance != null){
+ final VirtualMachineProfile profile = new VirtualMachineProfileImpl(vmInstance);
+ _networkMgr.release(profile, false);
+ }
+ else {
+ s_logger.error("Couldn't find vm with id = " + id + ", unable to release network resources");
+ }
+ }
+
private boolean cleanupVmResources(long vmId) {
boolean success = true;
// Remove vm from security groups