[VMware] Disconnect/Detach config drive ISO (if exists) on stop VM (#9468)

This commit is contained in:
Suresh Kumar Anaparti 2024-08-27 14:41:01 +05:30 committed by GitHub
parent 11497c601f
commit 6c0492366c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 37 additions and 1 deletions

View File

@ -55,6 +55,7 @@ import com.vmware.vim25.FileQueryFlags;
import com.vmware.vim25.FolderFileInfo;
import com.vmware.vim25.HostDatastoreBrowserSearchResults;
import com.vmware.vim25.HostDatastoreBrowserSearchSpec;
import com.vmware.vim25.VirtualCdromIsoBackingInfo;
import com.vmware.vim25.VirtualMachineConfigSummary;
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.backup.PrepareForBackupRestorationCommand;
@ -2738,8 +2739,9 @@ public class VmwareResource extends ServerResourceBase implements StoragePoolRes
private DiskTO[] getDisks(DiskTO[] sortedDisks) {
return Arrays.stream(sortedDisks).filter(vol -> ((vol.getPath() != null &&
vol.getPath().contains("configdrive"))) || (vol.getType() != Volume.Type.ISO)).toArray(DiskTO[]::new);
vol.getPath().contains(ConfigDrive.CONFIGDRIVEDIR))) || (vol.getType() != Volume.Type.ISO)).toArray(DiskTO[]::new);
}
private void configureIso(VmwareHypervisorHost hyperHost, VirtualMachineMO vmMo, DiskTO vol,
VirtualDeviceConfigSpec[] deviceConfigSpecArray, int ideUnitNumber, int i) throws Exception {
TemplateObjectTO iso = (TemplateObjectTO) vol.getData();
@ -4448,6 +4450,8 @@ public class VmwareResource extends ServerResourceBase implements StoragePoolRes
msg = "Have problem in powering off VM " + cmd.getVmName() + ", let the process continue";
s_logger.warn(msg);
}
disconnectConfigDriveIsoIfExists(vmMo);
return new StopAnswer(cmd, msg, true);
}
@ -4466,6 +4470,30 @@ public class VmwareResource extends ServerResourceBase implements StoragePoolRes
}
}
private void disconnectConfigDriveIsoIfExists(VirtualMachineMO vmMo) {
try {
List<VirtualDevice> isoDevices = vmMo.getIsoDevices();
if (CollectionUtils.isEmpty(isoDevices)) {
return;
}
for (VirtualDevice isoDevice : isoDevices) {
if (!(isoDevice.getBacking() instanceof VirtualCdromIsoBackingInfo)) {
continue;
}
String isoFilePath = ((VirtualCdromIsoBackingInfo)isoDevice.getBacking()).getFileName();
if (!isoFilePath.contains(ConfigDrive.CONFIGDRIVEDIR)) {
continue;
}
s_logger.info(String.format("Disconnecting config drive at location: %s", isoFilePath));
vmMo.detachIso(isoFilePath, true);
return;
}
} catch (Exception e) {
s_logger.warn(String.format("Couldn't check/disconnect config drive, error: %s", e.getMessage()), e);
}
}
protected Answer execute(RebootRouterCommand cmd) {
RebootAnswer answer = (RebootAnswer) execute((RebootCommand) cmd);

View File

@ -3203,6 +3203,14 @@ public class VirtualMachineMO extends BaseMO {
return null;
}
public List<VirtualDevice> getIsoDevices() throws Exception {
List<VirtualDevice> devices = _context.getVimClient().getDynamicProperty(_mor, "config.hardware.device");
if (CollectionUtils.isEmpty(devices)) {
return new ArrayList<>();
}
return devices.stream().filter(device -> device instanceof VirtualCdrom).collect(Collectors.toList());
}
public VirtualDevice getIsoDevice(int key) throws Exception {
List<VirtualDevice> devices = _context.getVimClient().getDynamicProperty(_mor, "config.hardware.device");
if (devices != null && devices.size() > 0) {