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

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


The following commit(s) were added to refs/heads/main by this push:
     new d4b8e2cbe8 Validate host tags on VM live scale (#6409)
d4b8e2cbe8 is described below

commit d4b8e2cbe87f5d62c998eb2e23bc3cf9251c30ce
Author: Bryan Lima <[email protected]>
AuthorDate: Wed Aug 31 04:24:00 2022 -0300

    Validate host tags on VM live scale (#6409)
    
    * Validate host tags on VM live scale
    
    * Remove extra spaces
---
 .../src/main/java/com/cloud/host/HostVO.java       |  3 ++-
 .../java/com/cloud/service/ServiceOfferingVO.java  |  3 ++-
 .../src/main/java/com/cloud/vm/VMInstanceVO.java   |  3 ++-
 .../com/cloud/resource/ResourceManagerImpl.java    |  3 +++
 .../main/java/com/cloud/vm/UserVmManagerImpl.java  | 29 +++++++++++++++-------
 5 files changed, 29 insertions(+), 12 deletions(-)

diff --git a/engine/schema/src/main/java/com/cloud/host/HostVO.java 
b/engine/schema/src/main/java/com/cloud/host/HostVO.java
index 5757e073e7..d6e7ea1fd8 100644
--- a/engine/schema/src/main/java/com/cloud/host/HostVO.java
+++ b/engine/schema/src/main/java/com/cloud/host/HostVO.java
@@ -46,6 +46,7 @@ import com.cloud.storage.Storage.StoragePoolType;
 import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.db.GenericDao;
 import java.util.Arrays;
+import 
org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils;
 import org.apache.commons.lang3.StringUtils;
 
 @Entity
@@ -680,7 +681,7 @@ public class HostVO implements Host {
 
     @Override
     public String toString() {
-        return String.format("Host {\"id\": \"%s\", \"name\": \"%s\", 
\"uuid\": \"%s\", \"type\"=\"%s\"}", id, name, uuid, type);
+        return String.format("Host %s", 
ReflectionToStringBuilderUtils.reflectOnlySelectedFields(this, "id", "name", 
"uuid", "type"));
     }
 
     public void setHypervisorType(HypervisorType hypervisorType) {
diff --git 
a/engine/schema/src/main/java/com/cloud/service/ServiceOfferingVO.java 
b/engine/schema/src/main/java/com/cloud/service/ServiceOfferingVO.java
index 6e30937692..2deca0b145 100644
--- a/engine/schema/src/main/java/com/cloud/service/ServiceOfferingVO.java
+++ b/engine/schema/src/main/java/com/cloud/service/ServiceOfferingVO.java
@@ -35,6 +35,7 @@ import javax.persistence.EnumType;
 import com.cloud.offering.ServiceOffering;
 import com.cloud.utils.db.GenericDao;
 import com.cloud.vm.VirtualMachine;
+import 
org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils;
 
 @Entity
 @Table(name = "service_offering")
@@ -424,7 +425,7 @@ public class ServiceOfferingVO implements ServiceOffering {
 
     @Override
     public String toString() {
-        return String.format("Service offering {\"id\": %s, \"name\": \"%s\", 
\"uuid\": \"%s\"}", getId(), getName(), getUuid());
+        return String.format("Service offering %s.", 
ReflectionToStringBuilderUtils.reflectOnlySelectedFields(this, "id", "name", 
"uuid"));
     }
 
     public boolean isDynamicScalingEnabled() {
diff --git a/engine/schema/src/main/java/com/cloud/vm/VMInstanceVO.java 
b/engine/schema/src/main/java/com/cloud/vm/VMInstanceVO.java
index 421dcf4a82..f3560d68f4 100644
--- a/engine/schema/src/main/java/com/cloud/vm/VMInstanceVO.java
+++ b/engine/schema/src/main/java/com/cloud/vm/VMInstanceVO.java
@@ -41,6 +41,7 @@ import javax.persistence.TemporalType;
 import javax.persistence.Transient;
 
 import org.apache.cloudstack.backup.Backup;
+import 
org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils;
 import org.apache.commons.codec.binary.Base64;
 import org.apache.log4j.Logger;
 
@@ -501,7 +502,7 @@ public class VMInstanceVO implements VirtualMachine, 
FiniteStateObject<State, Vi
 
     @Override
     public String toString() {
-        return String.format("VM instance {id: \"%s\", name: \"%s\", uuid: 
\"%s\", type=\"%s\"}", id, getInstanceName(), uuid, type);
+        return String.format("VM instance %s", 
ReflectionToStringBuilderUtils.reflectOnlySelectedFields(this, "id", 
"instanceName", "uuid", "type"));
     }
 
     @Override
diff --git a/server/src/main/java/com/cloud/resource/ResourceManagerImpl.java 
b/server/src/main/java/com/cloud/resource/ResourceManagerImpl.java
index 25689c9ce5..b31f7ecead 100755
--- a/server/src/main/java/com/cloud/resource/ResourceManagerImpl.java
+++ b/server/src/main/java/com/cloud/resource/ResourceManagerImpl.java
@@ -1829,6 +1829,9 @@ public class ResourceManagerImpl extends ManagerBase 
implements ResourceManager,
         }
         final List<String> hostTags = cmd.getHostTags();
         if (hostTags != null) {
+            List<VMInstanceVO> activeVMs =  _vmDao.listByHostId(hostId);
+            s_logger.warn(String.format("The following active VMs [%s] are 
using the host [%s]. Updating the host tags will not affect them.", activeVMs, 
host));
+
             if (s_logger.isDebugEnabled()) {
                 s_logger.debug("Updating Host Tags to :" + hostTags);
             }
diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java 
b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
index 9d56c339ee..47f85910da 100644
--- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
@@ -1847,20 +1847,31 @@ public class UserVmManagerImpl extends ManagerBase 
implements UserVmManager, Vir
     public boolean upgradeVirtualMachine(Long vmId, Long newServiceOfferingId, 
Map<String, String> customParameters) throws ResourceUnavailableException,
     ConcurrentOperationException, ManagementServerException, 
VirtualMachineMigrationException {
 
-        // Verify input parameters
         VMInstanceVO vmInstance = _vmInstanceDao.findById(vmId);
         Account caller = CallContext.current().getCallingAccount();
         _accountMgr.checkAccess(caller, null, true, vmInstance);
-        if (vmInstance != null) {
-            if (vmInstance.getState().equals(State.Stopped)) {
-                upgradeStoppedVirtualMachine(vmId, newServiceOfferingId, 
customParameters);
-                return true;
-            }
-            if (vmInstance.getState().equals(State.Running)) {
-                return upgradeRunningVirtualMachine(vmId, 
newServiceOfferingId, customParameters);
+        if (vmInstance == null) {
+            s_logger.error(String.format("VM instance with id [%s] is null, it 
is not possible to upgrade a null VM.", vmId));
+            return false;
+        }
+
+        if (State.Stopped.equals(vmInstance.getState())) {
+            upgradeStoppedVirtualMachine(vmId, newServiceOfferingId, 
customParameters);
+            return true;
+        }
+
+        if (State.Running.equals(vmInstance.getState())) {
+            ServiceOfferingVO newServiceOfferingVO = 
_serviceOfferingDao.findById(newServiceOfferingId);
+            HostVO instanceHost = _hostDao.findById(vmInstance.getHostId());
+            _hostDao.loadHostTags(instanceHost);
+
+            if 
(!instanceHost.checkHostServiceOfferingTags(newServiceOfferingVO)) {
+                s_logger.error(String.format("Cannot upgrade VM [%s] as the 
new service offering [%s] does not have the required host tags %s.", 
vmInstance, newServiceOfferingVO,
+                        instanceHost.getHostTags()));
+                return false;
             }
         }
-        return false;
+        return upgradeRunningVirtualMachine(vmId, newServiceOfferingId, 
customParameters);
     }
 
     private boolean upgradeRunningVirtualMachine(Long vmId, Long 
newServiceOfferingId, Map<String, String> customParameters) throws 
ResourceUnavailableException,

Reply via email to