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

DaanHoogland pushed a commit to branch ghi13406-vmMove-error
in repository https://gitbox.apache.org/repos/asf/cloudstack.git

commit 6cfbcc84a662ca7e052307abf70ff5c4f58ea9ae
Author: Daan Hoogland <[email protected]>
AuthorDate: Wed Jul 22 17:15:28 2026 +0200

    conditional error reporting for vm move failure
---
 api/src/main/java/com/cloud/vm/UserVmService.java                   | 6 ++++++
 .../org/apache/cloudstack/api/command/admin/vm/AssignVMCmd.java     | 4 ++++
 server/src/main/java/com/cloud/vm/UserVmManagerImpl.java            | 2 +-
 3 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/api/src/main/java/com/cloud/vm/UserVmService.java 
b/api/src/main/java/com/cloud/vm/UserVmService.java
index dc9e8c1f0d8..184fbd83c30 100644
--- a/api/src/main/java/com/cloud/vm/UserVmService.java
+++ b/api/src/main/java/com/cloud/vm/UserVmService.java
@@ -40,6 +40,7 @@ import 
org.apache.cloudstack.api.command.user.vm.UpdateVmNicIpCmd;
 import org.apache.cloudstack.api.command.user.vm.UpgradeVMCmd;
 import org.apache.cloudstack.api.command.user.vmgroup.CreateVMGroupCmd;
 import org.apache.cloudstack.api.command.user.vmgroup.DeleteVMGroupCmd;
+import org.apache.cloudstack.framework.config.ConfigKey;
 
 import com.cloud.dc.DataCenter;
 import com.cloud.deploy.DeploymentPlanner;
@@ -64,6 +65,11 @@ import com.cloud.utils.exception.ExecutionException;
 
 public interface UserVmService {
 
+    ConfigKey<Boolean> AllowExposingVmAssignFailureDetails = new 
ConfigKey<>("Advanced", Boolean.class,
+            "vm.assign.failure.detailed.message.enabled", "true",
+            "If true, the reason a VM ownership change (assignVirtualMachine) 
fails, e.g. remaining port forwarding rules or volume snapshots, is returned to 
the API caller. " +
+            "If false, only a generic error message referencing the Instance 
ID is returned, and the detailed reason is only available in the management 
server logs.",
+            true, ConfigKey.Scope.Global);
 
     /**
      * Destroys one virtual machine
diff --git 
a/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/AssignVMCmd.java 
b/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/AssignVMCmd.java
index e11d20d0646..dd726c339a8 100644
--- 
a/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/AssignVMCmd.java
+++ 
b/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/AssignVMCmd.java
@@ -36,6 +36,7 @@ import org.apache.cloudstack.api.response.UserVmResponse;
 import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.user.Account;
 import com.cloud.uservm.UserVm;
+import com.cloud.vm.UserVmService;
 import com.cloud.vm.VirtualMachine;
 
 @APICommand(name = "assignVirtualMachine",
@@ -128,6 +129,9 @@ public class AssignVMCmd extends BaseCmd  {
             ApiErrorCode errorCode = e instanceof 
InvalidParameterValueException ? ApiErrorCode.PARAM_ERROR : 
ApiErrorCode.INTERNAL_ERROR;
             String msg = String.format("Failed to move Instance due to [%s].", 
getVmId());
             logger.error(msg, e);
+            if (e instanceof InvalidParameterValueException && 
UserVmService.AllowExposingVmAssignFailureDetails.value()) {
+                msg = e.getMessage();
+            }
             throw new ServerApiException(errorCode, msg);
         }
     }
diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java 
b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
index 7e58cd01050..9238d9bfec0 100644
--- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
@@ -8891,7 +8891,7 @@ public class UserVmManagerImpl extends ManagerBase 
implements UserVmManager, Vir
         return new ConfigKey<?>[] {EnableDynamicallyScaleVm, 
AllowDiskOfferingChangeDuringScaleVm, AllowUserExpungeRecoverVm, 
VmIpFetchWaitInterval, VmIpFetchTrialMax,
                 VmIpFetchThreadPoolMax, VmIpFetchTaskWorkers, 
AllowDeployVmIfGivenHostFails, EnableAdditionalVmConfig, DisplayVMOVFProperties,
                 KvmAdditionalConfigAllowList, 
XenServerAdditionalConfigAllowList, VmwareAdditionalConfigAllowList, 
DestroyRootVolumeOnVmDestruction,
-                EnforceStrictResourceLimitHostTagCheck, StrictHostTags, 
AllowUserForceStopVm};
+                EnforceStrictResourceLimitHostTagCheck, StrictHostTags, 
AllowUserForceStopVm, AllowExposingVmAssignFailureDetails};
     }
 
     @Override

Reply via email to