Skip to content

Commit 0cb63a1

Browse files
Issue-513: Allow config drive deletion of migrated VM, on host maintenance (from it's last source location) (apache#515)
* Allow config drive deletion of migrate VM, on host maintenance (from it's last source location - host cache/primary/secondary storage) * system vms doesn't require config drive data configuration
1 parent 90c320e commit 0cb63a1

3 files changed

Lines changed: 37 additions & 12 deletions

File tree

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

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

7171
String CONFIG_DRIVE_LOCATION = "configDriveLocation";
72+
String LAST_CONFIG_DRIVE_LOCATION = "lastConfigDriveLocation";
7273

7374
// VM import with nic, disk and custom params for custom compute offering
7475
String NIC = "nic";

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import com.cloud.agent.api.CheckVirtualMachineCommand;
4545
import com.cloud.agent.api.CleanupNetworkRulesCmd;
4646
import com.cloud.agent.api.Command;
47+
import com.cloud.agent.api.HandleConfigDriveIsoCommand;
4748
import com.cloud.agent.api.MaintainCommand;
4849
import com.cloud.agent.api.MigrateCommand;
4950
import com.cloud.agent.api.ModifySshKeysCommand;
@@ -117,10 +118,10 @@ public int compare(final Object o1, final Object o2) {
117118

118119
public final static String[] s_commandsAllowedInMaintenanceMode = new String[] { MaintainCommand.class.toString(), MigrateCommand.class.toString(),
119120
StopCommand.class.toString(), CheckVirtualMachineCommand.class.toString(), PingTestCommand.class.toString(), CheckHealthCommand.class.toString(),
120-
ReadyCommand.class.toString(), ShutdownCommand.class.toString(), SetupCommand.class.toString(),
121-
CleanupNetworkRulesCmd.class.toString(), CheckNetworkCommand.class.toString(), PvlanSetupCommand.class.toString(), CheckOnHostCommand.class.toString(),
122-
ModifyTargetsCommand.class.toString(), ModifySshKeysCommand.class.toString(), ModifyStoragePoolCommand.class.toString(), SetupMSListCommand.class.toString(), RollingMaintenanceCommand.class.toString(),
123-
CleanupPersistentNetworkResourceCommand.class.toString()};
121+
ReadyCommand.class.toString(), ShutdownCommand.class.toString(), SetupCommand.class.toString(), CleanupNetworkRulesCmd.class.toString(),
122+
CheckNetworkCommand.class.toString(), PvlanSetupCommand.class.toString(), CheckOnHostCommand.class.toString(), ModifyTargetsCommand.class.toString(),
123+
ModifySshKeysCommand.class.toString(), ModifyStoragePoolCommand.class.toString(), SetupMSListCommand.class.toString(), RollingMaintenanceCommand.class.toString(),
124+
CleanupPersistentNetworkResourceCommand.class.toString(), HandleConfigDriveIsoCommand.class.toString()};
124125
protected final static String[] s_commandsNotAllowedInConnectingMode = new String[] { StartCommand.class.toString(), CreateCommand.class.toString() };
125126
static {
126127
Arrays.sort(s_commandsAllowedInMaintenanceMode);

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

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -341,10 +341,10 @@ public boolean prepareMigration(NicProfile nic, Network network, VirtualMachineP
341341
try {
342342
if (isConfigDriveIsoOnHostCache(vm.getId())) {
343343
vm.setConfigDriveLocation(Location.HOST);
344-
configureConfigDriveData(vm, nic, dest);
345-
346-
// Create the config drive on dest host cache
347-
createConfigDriveIsoOnHostCache(vm, dest.getHost().getId());
344+
if (configureConfigDriveData(vm, nic, dest)) {
345+
// Create the config drive on dest host cache
346+
createConfigDriveIsoOnHostCache(vm, dest.getHost().getId());
347+
}
348348
} else {
349349
vm.setConfigDriveLocation(getConfigDriveLocation(vm.getId()));
350350
addPasswordAndUserdata(network, nic, vm, dest, context);
@@ -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();
@@ -737,7 +760,7 @@ private void addConfigDriveDisk(final VirtualMachineProfile profile, final DataS
737760

738761
private boolean configureConfigDriveData(final VirtualMachineProfile profile, final NicProfile nic, final DeployDestination dest) {
739762
final UserVmVO vm = _userVmDao.findById(profile.getId());
740-
if (vm.getType() != VirtualMachine.Type.User) {
763+
if (vm == null || vm.getType() != VirtualMachine.Type.User) {
741764
return false;
742765
}
743766
final Nic defaultNic = _networkModel.getDefaultNic(vm.getId());

0 commit comments

Comments
 (0)