@@ -569,7 +569,7 @@ public void allocate(final String vmInstanceName, final VirtualMachineTemplate t
569569 allocate (vmInstanceName , template , serviceOffering , new DiskOfferingInfo (diskOffering ), new ArrayList <>(), networks , plan , hyperType , null , null );
570570 }
571571
572- private VirtualMachineGuru getVmGuru (final VirtualMachine vm ) {
572+ VirtualMachineGuru getVmGuru (final VirtualMachine vm ) {
573573 if (vm != null ) {
574574 return _vmGurus .get (vm .getType ());
575575 }
@@ -1443,6 +1443,7 @@ public void orchestrateStart(final String vmUuid, final Map<VirtualMachineProfil
14431443 }
14441444 if (canRetry ) {
14451445 try {
1446+ conditionallySetPodToDeployIn (vm );
14461447 changeState (vm , Event .OperationFailed , null , work , Step .Done );
14471448 } catch (final NoTransitionException e ) {
14481449 throw new ConcurrentOperationException (e .getMessage ());
@@ -1460,6 +1461,24 @@ public void orchestrateStart(final String vmUuid, final Map<VirtualMachineProfil
14601461 }
14611462 }
14621463
1464+ /**
1465+ * Setting pod id to null can result in migration of Volumes across pods. This is not desirable for VMs which
1466+ * have a volume in Ready state (happens when a VM is shutdown and started again).
1467+ * So, we set it to null only when
1468+ * migration of VM across cluster is enabled
1469+ * Or, volumes are still in allocated state for that VM (happens when VM is Starting/deployed for the first time)
1470+ */
1471+ private void conditionallySetPodToDeployIn (VMInstanceVO vm ) {
1472+ if (MIGRATE_VM_ACROSS_CLUSTERS .valueIn (vm .getDataCenterId ()) || areAllVolumesAllocated (vm .getId ())) {
1473+ vm .setPodIdToDeployIn (null );
1474+ }
1475+ }
1476+
1477+ boolean areAllVolumesAllocated (long vmId ) {
1478+ final List <VolumeVO > vols = _volsDao .findByInstance (vmId );
1479+ return CollectionUtils .isEmpty (vols ) || vols .stream ().allMatch (v -> Volume .State .Allocated .equals (v .getState ()));
1480+ }
1481+
14631482 private void logBootModeParameters (Map <VirtualMachineProfile .Param , Object > params ) {
14641483 if (params == null ) {
14651484 return ;
0 commit comments