From 96f4986aca9f55ff9e2fa77e42b8e6fbdcba3882 Mon Sep 17 00:00:00 2001 From: Matthias Bolte Date: Thu, 27 Jan 2011 22:01:43 +0100 Subject: [PATCH] esx: Don't try to change max-memory of an active domain Report an VIR_ERR_OPERATION_INVALID error in that case instead of letting the SOAP call fail with an VIR_ERR_INTERNAL_ERROR error. --- src/esx/esx_driver.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c index 26f029ca5d..27994873fd 100644 --- a/src/esx/esx_driver.c +++ b/src/esx/esx_driver.c @@ -2027,7 +2027,9 @@ esxDomainSetMaxMemory(virDomainPtr domain, unsigned long memory) { int result = -1; esxPrivate *priv = domain->conn->privateData; + esxVI_String *propertyNameList = NULL; esxVI_ObjectContent *virtualMachine = NULL; + esxVI_VirtualMachinePowerState powerState; esxVI_VirtualMachineConfigSpec *spec = NULL; esxVI_ManagedObjectReference *task = NULL; esxVI_TaskInfoState taskInfoState; @@ -2037,10 +2039,22 @@ esxDomainSetMaxMemory(virDomainPtr domain, unsigned long memory) return -1; } - if (esxVI_LookupVirtualMachineByUuidAndPrepareForTask - (priv->primary, domain->uuid, NULL, &virtualMachine, + if (esxVI_String_AppendValueToList(&propertyNameList, + "runtime.powerState") < 0 || + esxVI_LookupVirtualMachineByUuidAndPrepareForTask + (priv->primary, domain->uuid, propertyNameList, &virtualMachine, priv->autoAnswer) < 0 || - esxVI_VirtualMachineConfigSpec_Alloc(&spec) < 0 || + esxVI_GetVirtualMachinePowerState(virtualMachine, &powerState) < 0) { + goto cleanup; + } + + if (powerState != esxVI_VirtualMachinePowerState_PoweredOff) { + ESX_ERROR(VIR_ERR_OPERATION_INVALID, "%s", + _("Domain is not powered off")); + goto cleanup; + } + + if (esxVI_VirtualMachineConfigSpec_Alloc(&spec) < 0 || esxVI_Long_Alloc(&spec->memoryMB) < 0) { goto cleanup; } @@ -2067,6 +2081,7 @@ esxDomainSetMaxMemory(virDomainPtr domain, unsigned long memory) result = 0; cleanup: + esxVI_String_Free(&propertyNameList); esxVI_ObjectContent_Free(&virtualMachine); esxVI_VirtualMachineConfigSpec_Free(&spec); esxVI_ManagedObjectReference_Free(&task);