This is an automated email from the ASF dual-hosted git repository.

dahn pushed a commit to branch 4.19
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.19 by this push:
     new b4ad04badfb Allow config drive deletion of migrated VM, on host 
maintenance (#10045)
b4ad04badfb is described below

commit b4ad04badfbc35cd11f761866b59eb475fbd479f
Author: Suresh Kumar Anaparti <[email protected]>
AuthorDate: Wed Dec 18 13:42:28 2024 +0530

    Allow config drive deletion of migrated VM, on host maintenance (#10045)
---
 .../main/java/com/cloud/vm/VmDetailConstants.java  |  1 +
 .../java/com/cloud/agent/manager/AgentAttache.java | 10 +++---
 .../kvm/resource/LibvirtComputingResource.java     | 35 +++++++++++--------
 .../kvm/storage/KVMStoragePoolManager.java         |  3 +-
 .../network/element/ConfigDriveNetworkElement.java | 39 +++++++++++++++++-----
 5 files changed, 60 insertions(+), 28 deletions(-)

diff --git a/api/src/main/java/com/cloud/vm/VmDetailConstants.java 
b/api/src/main/java/com/cloud/vm/VmDetailConstants.java
index 9338cc11cd4..f7d87ab18f1 100644
--- a/api/src/main/java/com/cloud/vm/VmDetailConstants.java
+++ b/api/src/main/java/com/cloud/vm/VmDetailConstants.java
@@ -73,6 +73,7 @@ public interface VmDetailConstants {
     String ENCRYPTED_PASSWORD = "Encrypted.Password";
 
     String CONFIG_DRIVE_LOCATION = "configDriveLocation";
+    String LAST_CONFIG_DRIVE_LOCATION = "lastConfigDriveLocation";
 
     String SKIP_DRS = "skipFromDRS";
 
diff --git 
a/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentAttache.java 
b/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentAttache.java
index 2d8d6f1c48e..4d9ee0a9ab4 100644
--- 
a/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentAttache.java
+++ 
b/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentAttache.java
@@ -46,6 +46,7 @@ import com.cloud.agent.api.CleanupNetworkRulesCmd;
 import com.cloud.agent.api.Command;
 import com.cloud.agent.api.CreateStoragePoolCommand;
 import com.cloud.agent.api.DeleteStoragePoolCommand;
+import com.cloud.agent.api.HandleConfigDriveIsoCommand;
 import com.cloud.agent.api.MaintainCommand;
 import com.cloud.agent.api.MigrateCommand;
 import com.cloud.agent.api.ModifySshKeysCommand;
@@ -119,11 +120,10 @@ public abstract class AgentAttache {
 
     public final static String[] s_commandsAllowedInMaintenanceMode = new 
String[] { MaintainCommand.class.toString(), MigrateCommand.class.toString(),
         StopCommand.class.toString(), 
CheckVirtualMachineCommand.class.toString(), PingTestCommand.class.toString(), 
CheckHealthCommand.class.toString(),
-        ReadyCommand.class.toString(), ShutdownCommand.class.toString(), 
SetupCommand.class.toString(),
-        CleanupNetworkRulesCmd.class.toString(), 
CheckNetworkCommand.class.toString(), PvlanSetupCommand.class.toString(), 
CheckOnHostCommand.class.toString(),
-        ModifyTargetsCommand.class.toString(), 
ModifySshKeysCommand.class.toString(),
-        CreateStoragePoolCommand.class.toString(), 
DeleteStoragePoolCommand.class.toString(), 
ModifyStoragePoolCommand.class.toString(),
-        SetupMSListCommand.class.toString(), 
RollingMaintenanceCommand.class.toString(), 
CleanupPersistentNetworkResourceCommand.class.toString()};
+        ReadyCommand.class.toString(), ShutdownCommand.class.toString(), 
SetupCommand.class.toString(), CleanupNetworkRulesCmd.class.toString(),
+        CheckNetworkCommand.class.toString(), 
PvlanSetupCommand.class.toString(), CheckOnHostCommand.class.toString(), 
ModifyTargetsCommand.class.toString(),
+        ModifySshKeysCommand.class.toString(), 
CreateStoragePoolCommand.class.toString(), 
DeleteStoragePoolCommand.class.toString(), 
ModifyStoragePoolCommand.class.toString(),
+        SetupMSListCommand.class.toString(), 
RollingMaintenanceCommand.class.toString(), 
CleanupPersistentNetworkResourceCommand.class.toString(), 
HandleConfigDriveIsoCommand.class.toString()};
     protected final static String[] s_commandsNotAllowedInConnectingMode = new 
String[] { StartCommand.class.toString(), CreateCommand.class.toString() };
     static {
         Arrays.sort(s_commandsAllowedInMaintenanceMode);
diff --git 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
index a4d7bd524ad..f9d56f8301d 100644
--- 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
+++ 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
@@ -2985,9 +2985,10 @@ public class LibvirtComputingResource extends 
ServerResourceBase implements Serv
 
     public static boolean useBLOCKDiskType(KVMPhysicalDisk physicalDisk) {
         return physicalDisk != null &&
-                physicalDisk.getPool().getType() == StoragePoolType.Linstor &&
+                physicalDisk.getPool() != null &&
+                
StoragePoolType.Linstor.equals(physicalDisk.getPool().getType()) &&
                 physicalDisk.getFormat() != null &&
-                physicalDisk.getFormat()== PhysicalDiskFormat.RAW;
+                PhysicalDiskFormat.RAW.equals(physicalDisk.getFormat());
     }
 
     public static DiskDef.DiskType getDiskType(KVMPhysicalDisk physicalDisk) {
@@ -3402,13 +3403,15 @@ public class LibvirtComputingResource extends 
ServerResourceBase implements Serv
         }
         if (configdrive != null) {
             try {
+                s_logger.debug(String.format("Detaching ConfigDrive ISO of the 
VM %s, at path %s", vmName, configdrive.getDiskPath()));
                 String result = attachOrDetachISO(conn, vmName, 
configdrive.getDiskPath(), false, CONFIG_DRIVE_ISO_DEVICE_ID);
                 if (result != null) {
-                    s_logger.warn("Detach ConfigDrive ISO with result: " + 
result);
+                    s_logger.warn(String.format("Detach ConfigDrive ISO of the 
VM %s, at path %s with %s: ", vmName, configdrive.getDiskPath(), result));
                 }
+                s_logger.debug(String.format("Attaching ConfigDrive ISO of the 
VM %s, at path %s", vmName, configdrive.getDiskPath()));
                 result = attachOrDetachISO(conn, vmName, 
configdrive.getDiskPath(), true, CONFIG_DRIVE_ISO_DEVICE_ID);
                 if (result != null) {
-                    s_logger.warn("Attach ConfigDrive ISO with result: " + 
result);
+                    s_logger.warn(String.format("Attach ConfigDrive ISO of the 
VM %s, at path %s with %s: ", vmName, configdrive.getDiskPath(), result));
                 }
             } catch (final LibvirtException | InternalErrorException | 
URISyntaxException e) {
                 final String msg = "Detach and attach ConfigDrive ISO failed 
due to " + e.toString();
@@ -3420,16 +3423,20 @@ public class LibvirtComputingResource extends 
ServerResourceBase implements Serv
     public synchronized String attachOrDetachISO(final Connect conn, final 
String vmName, String isoPath, final boolean isAttach, final Integer diskSeq) 
throws LibvirtException, URISyntaxException,
             InternalErrorException {
         final DiskDef iso = new DiskDef();
-        if (isoPath != null && isAttach) {
-            final int index = isoPath.lastIndexOf("/");
-            final String path = isoPath.substring(0, index);
-            final String name = isoPath.substring(index + 1);
-            final KVMStoragePool secondaryPool = 
storagePoolManager.getStoragePoolByURI(path);
-            final KVMPhysicalDisk isoVol = secondaryPool.getPhysicalDisk(name);
-            final DiskDef.DiskType diskType = getDiskType(isoVol);
-            isoPath = isoVol.getPath();
-
-            iso.defISODisk(isoPath, diskSeq, diskType);
+        if (isAttach && StringUtils.isNotBlank(isoPath) && 
isoPath.lastIndexOf("/") > 0) {
+            if (isoPath.startsWith(getConfigPath() + "/" + 
ConfigDrive.CONFIGDRIVEDIR) && isoPath.contains(vmName)) {
+                iso.defISODisk(isoPath, diskSeq, DiskDef.DiskType.FILE);
+            } else {
+                final int index = isoPath.lastIndexOf("/");
+                final String path = isoPath.substring(0, index);
+                final String name = isoPath.substring(index + 1);
+                final KVMStoragePool storagePool = 
storagePoolManager.getStoragePoolByURI(path);
+                final KVMPhysicalDisk isoVol = 
storagePool.getPhysicalDisk(name);
+                final DiskDef.DiskType diskType = getDiskType(isoVol);
+                isoPath = isoVol.getPath();
+
+                iso.defISODisk(isoPath, diskSeq, diskType);
+            }
         } else {
             iso.defISODisk(null, diskSeq, DiskDef.DiskType.FILE);
         }
diff --git 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java
 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java
index ee23e489951..da6a192f129 100644
--- 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java
+++ 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java
@@ -287,6 +287,7 @@ public class KVMStoragePoolManager {
         URI storageUri = null;
 
         try {
+            s_logger.debug("Get storage pool by uri: " + uri);
             storageUri = new URI(uri);
         } catch (URISyntaxException e) {
             throw new CloudRuntimeException(e.toString());
@@ -296,7 +297,7 @@ public class KVMStoragePoolManager {
         String uuid = null;
         String sourceHost = "";
         StoragePoolType protocol = null;
-        final String scheme = storageUri.getScheme().toLowerCase();
+        final String scheme = (storageUri.getScheme() != null) ? 
storageUri.getScheme().toLowerCase() : "";
         List<String> acceptedSchemes = List.of("nfs", "networkfilesystem", 
"filesystem");
         if (acceptedSchemes.contains(scheme)) {
             sourcePath = storageUri.getPath();
diff --git 
a/server/src/main/java/com/cloud/network/element/ConfigDriveNetworkElement.java 
b/server/src/main/java/com/cloud/network/element/ConfigDriveNetworkElement.java
index 83900ff2d43..38d71b9c507 100644
--- 
a/server/src/main/java/com/cloud/network/element/ConfigDriveNetworkElement.java
+++ 
b/server/src/main/java/com/cloud/network/element/ConfigDriveNetworkElement.java
@@ -341,10 +341,10 @@ public class ConfigDriveNetworkElement extends 
AdapterBase implements NetworkEle
             try {
                 if (isConfigDriveIsoOnHostCache(vm.getId())) {
                     vm.setConfigDriveLocation(Location.HOST);
-                    configureConfigDriveData(vm, nic, dest);
-
-                    // Create the config drive on dest host cache
-                    createConfigDriveIsoOnHostCache(vm, 
dest.getHost().getId());
+                    if (configureConfigDriveData(vm, nic, dest)) {
+                        // Create the config drive on dest host cache
+                        createConfigDriveIsoOnHostCache(vm, 
dest.getHost().getId());
+                    }
                 } else {
                     
vm.setConfigDriveLocation(getConfigDriveLocation(vm.getId()));
                     addPasswordAndUserdata(network, nic, vm, dest, context);
@@ -373,7 +373,7 @@ public class ConfigDriveNetworkElement extends AdapterBase 
implements NetworkEle
     @Override
     public void commitMigration(NicProfile nic, Network network, 
VirtualMachineProfile vm, ReservationContext src, ReservationContext dst) {
         try {
-            if (isConfigDriveIsoOnHostCache(vm.getId())) {
+            if (isLastConfigDriveIsoOnHostCache(vm.getId())) {
                 vm.setConfigDriveLocation(Location.HOST);
                 // Delete the config drive on src host cache
                 deleteConfigDriveIsoOnHostCache(vm.getVirtualMachine(), 
vm.getHostId());
@@ -530,6 +530,17 @@ public class ConfigDriveNetworkElement extends AdapterBase 
implements NetworkEle
         return false;
     }
 
+    private boolean isLastConfigDriveIsoOnHostCache(long vmId) {
+        final UserVmDetailVO vmDetailLastConfigDriveLocation = 
_userVmDetailsDao.findDetail(vmId, 
VmDetailConstants.LAST_CONFIG_DRIVE_LOCATION);
+        if (vmDetailLastConfigDriveLocation == null) {
+            return isConfigDriveIsoOnHostCache(vmId);
+        }
+        if 
(Location.HOST.toString().equalsIgnoreCase(vmDetailLastConfigDriveLocation.getValue()))
 {
+            return true;
+        }
+        return false;
+    }
+
     private boolean createConfigDriveIsoOnHostCache(VirtualMachineProfile 
profile, Long hostId) throws ResourceUnavailableException {
         if (hostId == null) {
             throw new ResourceUnavailableException("Config drive iso creation 
failed, dest host not available",
@@ -556,7 +567,7 @@ public class ConfigDriveNetworkElement extends AdapterBase 
implements NetworkEle
         }
 
         profile.setConfigDriveLocation(answer.getConfigDriveLocation());
-        _userVmDetailsDao.addDetail(profile.getId(), 
VmDetailConstants.CONFIG_DRIVE_LOCATION, 
answer.getConfigDriveLocation().toString(), false);
+        updateConfigDriveLocationInVMDetails(profile.getId(), 
answer.getConfigDriveLocation());
         addConfigDriveDisk(profile, null);
         return true;
     }
@@ -618,11 +629,23 @@ public class ConfigDriveNetworkElement extends 
AdapterBase implements NetworkEle
                     answer.getDetails()), ConfigDriveNetworkElement.class, 0L);
         }
         profile.setConfigDriveLocation(answer.getConfigDriveLocation());
-        _userVmDetailsDao.addDetail(profile.getId(), 
VmDetailConstants.CONFIG_DRIVE_LOCATION, 
answer.getConfigDriveLocation().toString(), false);
+        updateConfigDriveLocationInVMDetails(profile.getId(), 
answer.getConfigDriveLocation());
         addConfigDriveDisk(profile, dataStore);
         return true;
     }
 
+    private void updateConfigDriveLocationInVMDetails(long vmId, 
NetworkElement.Location configDriveLocation) {
+        final UserVmDetailVO vmDetailConfigDriveLocation = 
_userVmDetailsDao.findDetail(vmId, VmDetailConstants.CONFIG_DRIVE_LOCATION);
+        if (vmDetailConfigDriveLocation != null) {
+            if 
(!configDriveLocation.toString().equalsIgnoreCase(vmDetailConfigDriveLocation.getValue()))
 {
+                _userVmDetailsDao.addDetail(vmId, 
VmDetailConstants.LAST_CONFIG_DRIVE_LOCATION, 
vmDetailConfigDriveLocation.getValue(), false);
+            } else {
+                _userVmDetailsDao.removeDetail(vmId, 
VmDetailConstants.LAST_CONFIG_DRIVE_LOCATION);
+            }
+        }
+        _userVmDetailsDao.addDetail(vmId, 
VmDetailConstants.CONFIG_DRIVE_LOCATION, configDriveLocation.toString(), false);
+    }
+
     private Map<String, String> getVMCustomUserdataParamMap(long vmId) {
         UserVmVO userVm = _userVmDao.findById(vmId);
         String userDataDetails = userVm.getUserDataDetails();
@@ -737,7 +760,7 @@ public class ConfigDriveNetworkElement extends AdapterBase 
implements NetworkEle
 
     private boolean configureConfigDriveData(final VirtualMachineProfile 
profile, final NicProfile nic, final DeployDestination dest) {
         final UserVmVO vm = _userVmDao.findById(profile.getId());
-        if (vm.getType() != VirtualMachine.Type.User) {
+        if (vm == null || vm.getType() != VirtualMachine.Type.User) {
             return false;
         }
         final Nic defaultNic = _networkModel.getDefaultNic(vm.getId());

Reply via email to