From 510b9b3e28138637847df1eab32f79788bb8d641 Mon Sep 17 00:00:00 2001 From: Bryan Lima Date: Mon, 23 May 2022 18:24:48 -0300 Subject: [PATCH 1/2] Validate host tags on VM live scale --- .../src/main/java/com/cloud/host/HostVO.java | 3 +- .../com/cloud/service/ServiceOfferingVO.java | 3 +- .../main/java/com/cloud/vm/VMInstanceVO.java | 3 +- .../cloud/resource/ResourceManagerImpl.java | 3 ++ .../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 5757e073e740..e5c0c3daf411 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.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 boolean equals(Object obj) { @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 6e3093769248..2deca0b1459d 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 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 String getUuid() { @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 421dcf4a822a..f3560d68f495 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.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 void setRemoved(Date removed) { @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 25689c9ce592..b31f7eceadd4 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 Host updateHost(final UpdateHostCmd cmd) throws NoTransitionException { } final List hostTags = cmd.getHostTags(); if (hostTags != null) { + List 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 9e3622886e94..e4bc6be12dcc 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -1845,20 +1845,31 @@ public HashMap> getVmDiskStatistics(long hostId, St public boolean upgradeVirtualMachine(Long vmId, Long newServiceOfferingId, Map 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 customParameters) throws ResourceUnavailableException, From 4bb3d448443276f9de82f5209643f34b1ccda7bf Mon Sep 17 00:00:00 2001 From: Bryan Lima Date: Mon, 23 May 2022 18:26:19 -0300 Subject: [PATCH 2/2] Remove extra spaces --- engine/schema/src/main/java/com/cloud/host/HostVO.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 e5c0c3daf411..d6e7ea1fd870 100644 --- a/engine/schema/src/main/java/com/cloud/host/HostVO.java +++ b/engine/schema/src/main/java/com/cloud/host/HostVO.java @@ -681,7 +681,7 @@ public boolean equals(Object obj) { @Override public String toString() { - return String.format("Host %s", ReflectionToStringBuilderUtils.reflectOnlySelectedFields(this, "id", "name", "uuid", "type")); + return String.format("Host %s", ReflectionToStringBuilderUtils.reflectOnlySelectedFields(this, "id", "name", "uuid", "type")); } public void setHypervisorType(HypervisorType hypervisorType) {