Skip to content

Commit 41a2743

Browse files
Allow config drive deletion of migrated VM, on host maintenance (from it's last source location - host cache/primary/secondary storage)
1 parent 47f6019 commit 41a2743

File tree

3 files changed

+32
-8
lines changed

3 files changed

+32
-8
lines changed

api/src/main/java/com/cloud/vm/VmDetailConstants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ public interface VmDetailConstants {
7373
String ENCRYPTED_PASSWORD = "Encrypted.Password";
7474

7575
String CONFIG_DRIVE_LOCATION = "configDriveLocation";
76+
String LAST_CONFIG_DRIVE_LOCATION = "lastConfigDriveLocation";
7677

7778
String SKIP_DRS = "skipFromDRS";
7879

engine/orchestration/src/main/java/com/cloud/agent/manager/AgentAttache.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import com.cloud.agent.api.Command;
4747
import com.cloud.agent.api.CreateStoragePoolCommand;
4848
import com.cloud.agent.api.DeleteStoragePoolCommand;
49+
import com.cloud.agent.api.HandleConfigDriveIsoCommand;
4950
import com.cloud.agent.api.MaintainCommand;
5051
import com.cloud.agent.api.MigrateCommand;
5152
import com.cloud.agent.api.ModifySshKeysCommand;
@@ -119,11 +120,10 @@ public int compare(final Object o1, final Object o2) {
119120

120121
public final static String[] s_commandsAllowedInMaintenanceMode = new String[] { MaintainCommand.class.toString(), MigrateCommand.class.toString(),
121122
StopCommand.class.toString(), CheckVirtualMachineCommand.class.toString(), PingTestCommand.class.toString(), CheckHealthCommand.class.toString(),
122-
ReadyCommand.class.toString(), ShutdownCommand.class.toString(), SetupCommand.class.toString(),
123-
CleanupNetworkRulesCmd.class.toString(), CheckNetworkCommand.class.toString(), PvlanSetupCommand.class.toString(), CheckOnHostCommand.class.toString(),
124-
ModifyTargetsCommand.class.toString(), ModifySshKeysCommand.class.toString(),
125-
CreateStoragePoolCommand.class.toString(), DeleteStoragePoolCommand.class.toString(), ModifyStoragePoolCommand.class.toString(),
126-
SetupMSListCommand.class.toString(), RollingMaintenanceCommand.class.toString(), CleanupPersistentNetworkResourceCommand.class.toString()};
123+
ReadyCommand.class.toString(), ShutdownCommand.class.toString(), SetupCommand.class.toString(), CleanupNetworkRulesCmd.class.toString(),
124+
CheckNetworkCommand.class.toString(), PvlanSetupCommand.class.toString(), CheckOnHostCommand.class.toString(), ModifyTargetsCommand.class.toString(),
125+
ModifySshKeysCommand.class.toString(), CreateStoragePoolCommand.class.toString(), DeleteStoragePoolCommand.class.toString(), ModifyStoragePoolCommand.class.toString(),
126+
SetupMSListCommand.class.toString(), RollingMaintenanceCommand.class.toString(), CleanupPersistentNetworkResourceCommand.class.toString(), HandleConfigDriveIsoCommand.class.toString()};
127127
protected final static String[] s_commandsNotAllowedInConnectingMode = new String[] { StartCommand.class.toString(), CreateCommand.class.toString() };
128128
static {
129129
Arrays.sort(s_commandsAllowedInMaintenanceMode);

server/src/main/java/com/cloud/network/element/ConfigDriveNetworkElement.java

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,7 @@ public void rollbackMigration(NicProfile nic, Network network, VirtualMachinePro
373373
@Override
374374
public void commitMigration(NicProfile nic, Network network, VirtualMachineProfile vm, ReservationContext src, ReservationContext dst) {
375375
try {
376-
if (isConfigDriveIsoOnHostCache(vm.getId())) {
376+
if (isLastConfigDriveIsoOnHostCache(vm.getId())) {
377377
vm.setConfigDriveLocation(Location.HOST);
378378
// Delete the config drive on src host cache
379379
deleteConfigDriveIsoOnHostCache(vm.getVirtualMachine(), vm.getHostId());
@@ -530,6 +530,17 @@ private boolean isConfigDriveIsoOnHostCache(long vmId) {
530530
return false;
531531
}
532532

533+
private boolean isLastConfigDriveIsoOnHostCache(long vmId) {
534+
final UserVmDetailVO vmDetailLastConfigDriveLocation = _userVmDetailsDao.findDetail(vmId, VmDetailConstants.LAST_CONFIG_DRIVE_LOCATION);
535+
if (vmDetailLastConfigDriveLocation == null) {
536+
return isConfigDriveIsoOnHostCache(vmId);
537+
}
538+
if (Location.HOST.toString().equalsIgnoreCase(vmDetailLastConfigDriveLocation.getValue())) {
539+
return true;
540+
}
541+
return false;
542+
}
543+
533544
private boolean createConfigDriveIsoOnHostCache(VirtualMachineProfile profile, Long hostId) throws ResourceUnavailableException {
534545
if (hostId == null) {
535546
throw new ResourceUnavailableException("Config drive iso creation failed, dest host not available",
@@ -556,7 +567,7 @@ private boolean createConfigDriveIsoOnHostCache(VirtualMachineProfile profile, L
556567
}
557568

558569
profile.setConfigDriveLocation(answer.getConfigDriveLocation());
559-
_userVmDetailsDao.addDetail(profile.getId(), VmDetailConstants.CONFIG_DRIVE_LOCATION, answer.getConfigDriveLocation().toString(), false);
570+
updateConfigDriveLocationInVMDetails(profile.getId(), answer.getConfigDriveLocation());
560571
addConfigDriveDisk(profile, null);
561572
return true;
562573
}
@@ -618,11 +629,23 @@ private boolean createConfigDriveIso(VirtualMachineProfile profile, DeployDestin
618629
answer.getDetails()), ConfigDriveNetworkElement.class, 0L);
619630
}
620631
profile.setConfigDriveLocation(answer.getConfigDriveLocation());
621-
_userVmDetailsDao.addDetail(profile.getId(), VmDetailConstants.CONFIG_DRIVE_LOCATION, answer.getConfigDriveLocation().toString(), false);
632+
updateConfigDriveLocationInVMDetails(profile.getId(), answer.getConfigDriveLocation());
622633
addConfigDriveDisk(profile, dataStore);
623634
return true;
624635
}
625636

637+
private void updateConfigDriveLocationInVMDetails(long vmId, NetworkElement.Location configDriveLocation) {
638+
final UserVmDetailVO vmDetailConfigDriveLocation = _userVmDetailsDao.findDetail(vmId, VmDetailConstants.CONFIG_DRIVE_LOCATION);
639+
if (vmDetailConfigDriveLocation != null) {
640+
if (!configDriveLocation.toString().equalsIgnoreCase(vmDetailConfigDriveLocation.getValue())) {
641+
_userVmDetailsDao.addDetail(vmId, VmDetailConstants.LAST_CONFIG_DRIVE_LOCATION, vmDetailConfigDriveLocation.getValue(), false);
642+
} else {
643+
_userVmDetailsDao.removeDetail(vmId, VmDetailConstants.LAST_CONFIG_DRIVE_LOCATION);
644+
}
645+
}
646+
_userVmDetailsDao.addDetail(vmId, VmDetailConstants.CONFIG_DRIVE_LOCATION, configDriveLocation.toString(), false);
647+
}
648+
626649
private Map<String, String> getVMCustomUserdataParamMap(long vmId) {
627650
UserVmVO userVm = _userVmDao.findById(vmId);
628651
String userDataDetails = userVm.getUserDataDetails();

0 commit comments

Comments
 (0)