From 1fd1f0626a020fa26d4f23b192ff339a003ef733 Mon Sep 17 00:00:00 2001 From: Nicolas Vazquez Date: Fri, 19 Aug 2022 09:57:11 -0300 Subject: [PATCH 1/4] Fix SQL query for uuid wrong format (#6654) Fixes: #6652 --- .../java/com/cloud/upgrade/dao/Upgrade41610to41700.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41610to41700.java b/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41610to41700.java index be1e42cb5d9..6b41ba42b22 100644 --- a/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41610to41700.java +++ b/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41610to41700.java @@ -61,7 +61,7 @@ public class Upgrade41610to41700 implements DbUpgrade, DbUpgradeSystemVmTemplate @Override public void performDataMigration(Connection conn) { - fixWrongPoolUuid(conn); + fixWrongDatastoreClusterPoolUuid(conn); } @Override @@ -90,10 +90,11 @@ public class Upgrade41610to41700 implements DbUpgrade, DbUpgradeSystemVmTemplate } } - public void fixWrongPoolUuid(Connection conn) { - LOG.debug("Replacement of faulty pool uuids"); + public void fixWrongDatastoreClusterPoolUuid(Connection conn) { + LOG.debug("Replacement of faulty pool uuids on datastorecluster"); try (PreparedStatement pstmt = conn.prepareStatement("SELECT id,uuid FROM storage_pool " - + "WHERE uuid NOT LIKE \"%-%-%-%\" AND removed IS NULL;"); ResultSet rs = pstmt.executeQuery()) { + + "WHERE uuid NOT LIKE \"%-%-%-%\" AND removed IS NULL " + + "AND pool_type = 'DatastoreCluster';"); ResultSet rs = pstmt.executeQuery()) { PreparedStatement updateStmt = conn.prepareStatement("update storage_pool set uuid = ? where id = ?"); while (rs.next()) { UUID poolUuid = new UUID( From 44e600e2fc84d088672964a5b969ba0792dd73a2 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Fri, 19 Aug 2022 18:28:51 +0530 Subject: [PATCH 2/4] server: remove resource tags for disassociated public ip (#6642) Fixes #6620 Remove resource tags when public IP is disassociated --- server/src/main/java/com/cloud/network/NetworkServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java index a3a3e4d9702..39752e64a6b 100644 --- a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java @@ -1101,6 +1101,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C boolean success = _ipAddrMgr.disassociatePublicIpAddress(ipAddressId, userId, caller); if (success) { + _resourceTagDao.removeByIdAndType(ipAddressId, ResourceObjectType.PublicIpAddress); if (guestNetwork != null) { NetworkOffering offering = _entityMgr.findById(NetworkOffering.class, guestNetwork.getNetworkOfferingId()); Long vmId = ipVO.getAssociatedWithVmId(); From 98479183601260495790a997419480d989f05aa6 Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Mon, 22 Aug 2022 13:27:07 +0530 Subject: [PATCH 3/4] api, vmware: allow VM setting/detail for disk controller (root/data) to override template details (#6276) This PR allows VM details wrt root & data disk controller passed via details parameter of deployVMCmd to take precedence over template settings, i.e., the order of precedence for determining VM disk controller is : VM details passed during deployment > template settings > global setting vmware.root.disk.controller. --- .../java/com/cloud/vm/UserVmManagerImpl.java | 78 +++++++++++-------- 1 file changed, 47 insertions(+), 31 deletions(-) diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index 0fcaf6a2b2e..9d56c339eed 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -4304,6 +4304,15 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir if (!isImport && isIso) { vm.setIsoId(template.getId()); } + + long guestOSId = template.getGuestOSId(); + GuestOSVO guestOS = _guestOSDao.findById(guestOSId); + long guestOSCategoryId = guestOS.getCategoryId(); + GuestOSCategoryVO guestOSCategory = _guestOSCategoryDao.findById(guestOSCategoryId); + if (hypervisorType.equals(HypervisorType.VMware)) { + updateVMDiskController(vm, customParameters, guestOS); + } + Long rootDiskSize = null; // custom root disk size, resizes base template to larger size if (customParameters.containsKey(VmDetailConstants.ROOT_DISK_SIZE)) { @@ -4324,36 +4333,6 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir vm.setDisplayVm(true); } - long guestOSId = template.getGuestOSId(); - GuestOSVO guestOS = _guestOSDao.findById(guestOSId); - long guestOSCategoryId = guestOS.getCategoryId(); - GuestOSCategoryVO guestOSCategory = _guestOSCategoryDao.findById(guestOSCategoryId); - - // If hypervisor is vSphere and OS is OS X, set special settings. - if (hypervisorType.equals(HypervisorType.VMware)) { - if (guestOS.getDisplayName().toLowerCase().contains("apple mac os")) { - vm.setDetail(VmDetailConstants.SMC_PRESENT, "TRUE"); - vm.setDetail(VmDetailConstants.ROOT_DISK_CONTROLLER, "scsi"); - vm.setDetail(VmDetailConstants.DATA_DISK_CONTROLLER, "scsi"); - vm.setDetail(VmDetailConstants.FIRMWARE, "efi"); - s_logger.info("guestOS is OSX : overwrite root disk controller to scsi, use smc and efi"); - } else { - String controllerSetting = StringUtils.defaultIfEmpty(_configDao.getValue(Config.VmwareRootDiskControllerType.key()), - Config.VmwareRootDiskControllerType.getDefaultValue()); - // Don't override if VM already has root/data disk controller detail - if (vm.getDetail(VmDetailConstants.ROOT_DISK_CONTROLLER) == null) { - vm.setDetail(VmDetailConstants.ROOT_DISK_CONTROLLER, controllerSetting); - } - if (vm.getDetail(VmDetailConstants.DATA_DISK_CONTROLLER) == null) { - if (controllerSetting.equalsIgnoreCase("scsi")) { - vm.setDetail(VmDetailConstants.DATA_DISK_CONTROLLER, "scsi"); - } else { - vm.setDetail(VmDetailConstants.DATA_DISK_CONTROLLER, "osdefault"); - } - } - } - } - if (isImport) { vm.setDataCenterId(zone.getId()); vm.setHostId(host.getId()); @@ -4443,6 +4422,42 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir }); } + private void updateVMDiskController(UserVmVO vm, Map customParameters, GuestOSVO guestOS) { + // If hypervisor is vSphere and OS is OS X, set special settings. + if (guestOS.getDisplayName().toLowerCase().contains("apple mac os")) { + vm.setDetail(VmDetailConstants.SMC_PRESENT, "TRUE"); + vm.setDetail(VmDetailConstants.ROOT_DISK_CONTROLLER, "scsi"); + vm.setDetail(VmDetailConstants.DATA_DISK_CONTROLLER, "scsi"); + vm.setDetail(VmDetailConstants.FIRMWARE, "efi"); + s_logger.info("guestOS is OSX : overwrite root disk controller to scsi, use smc and efi"); + } else { + String rootDiskControllerSetting = customParameters.get(VmDetailConstants.ROOT_DISK_CONTROLLER); + String dataDiskControllerSetting = customParameters.get(VmDetailConstants.DATA_DISK_CONTROLLER); + if (StringUtils.isNotEmpty(rootDiskControllerSetting)) { + vm.setDetail(VmDetailConstants.ROOT_DISK_CONTROLLER, rootDiskControllerSetting); + } + + if (StringUtils.isNotEmpty(dataDiskControllerSetting)) { + vm.setDetail(VmDetailConstants.DATA_DISK_CONTROLLER, dataDiskControllerSetting); + } + + String controllerSetting = StringUtils.defaultIfEmpty(_configDao.getValue(Config.VmwareRootDiskControllerType.key()), + Config.VmwareRootDiskControllerType.getDefaultValue()); + + // Don't override if VM already has root/data disk controller detail + if (vm.getDetail(VmDetailConstants.ROOT_DISK_CONTROLLER) == null) { + vm.setDetail(VmDetailConstants.ROOT_DISK_CONTROLLER, controllerSetting); + } + if (vm.getDetail(VmDetailConstants.DATA_DISK_CONTROLLER) == null) { + if (controllerSetting.equalsIgnoreCase("scsi")) { + vm.setDetail(VmDetailConstants.DATA_DISK_CONTROLLER, "scsi"); + } else { + vm.setDetail(VmDetailConstants.DATA_DISK_CONTROLLER, "osdefault"); + } + } + } + } + /** * take the properties and set them on the vm. * consider should we be complete, and make sure all default values are copied as well if known? @@ -4495,6 +4510,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir public void validateRootDiskResize(final HypervisorType hypervisorType, Long rootDiskSize, VMTemplateVO templateVO, UserVmVO vm, final Map customParameters) throws InvalidParameterValueException { // rootdisksize must be larger than template. + boolean isIso = ImageFormat.ISO == templateVO.getFormat(); if ((rootDiskSize << 30) < templateVO.getSize()) { String error = "Unsupported: rootdisksize override is smaller than template size " + toHumanReadableSize(templateVO.getSize()); s_logger.error(error); @@ -4502,7 +4518,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir } else if ((rootDiskSize << 30) > templateVO.getSize()) { if (hypervisorType == HypervisorType.VMware && (vm.getDetails() == null || vm.getDetails().get(VmDetailConstants.ROOT_DISK_CONTROLLER) == null)) { s_logger.warn("If Root disk controller parameter is not overridden, then Root disk resize may fail because current Root disk controller value is NULL."); - } else if (hypervisorType == HypervisorType.VMware && vm.getDetails().get(VmDetailConstants.ROOT_DISK_CONTROLLER).toLowerCase().contains("ide")) { + } else if (hypervisorType == HypervisorType.VMware && vm.getDetails().get(VmDetailConstants.ROOT_DISK_CONTROLLER).toLowerCase().contains("ide") && !isIso) { String error = String.format("Found unsupported root disk controller [%s].", vm.getDetails().get(VmDetailConstants.ROOT_DISK_CONTROLLER)); s_logger.error(error); throw new InvalidParameterValueException(error); From 814dbbaf860d204e2cb35b84a1414f6b6e111366 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Mon, 22 Aug 2022 14:39:36 +0530 Subject: [PATCH 4/4] cks: fix k8s cluster deployment with host tagged offering (#6658) Fixes #6657 Fixes k8s cluster node VM deployment when the underlying hypervisor host has multiple host tags and the service offering used for the cluster deployment does not contain all of those host tags. --- .../cluster/KubernetesClusterManagerImpl.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java index 113cee9bbbf..fa96e8b24b7 100644 --- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java +++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java @@ -469,26 +469,26 @@ public class KubernetesClusterManagerImpl extends ManagerBase implements Kuberne suitable_host_found = false; for (Map.Entry> hostEntry : hosts_with_resevered_capacity.entrySet()) { Pair hp = hostEntry.getValue(); - HostVO h = hp.first(); - hostDao.loadHostTags(h); - if (StringUtils.isNotEmpty(offering.getHostTag()) && !(h.getHostTags() != null && h.getHostTags().contains(offering.getHostTag()))) { + HostVO hostVO = hp.first(); + hostDao.loadHostTags(hostVO); + if (!hostVO.checkHostServiceOfferingTags(offering)) { continue; } int reserved = hp.second(); reserved++; - ClusterVO cluster = clusterDao.findById(h.getClusterId()); + ClusterVO cluster = clusterDao.findById(hostVO.getClusterId()); ClusterDetailsVO cluster_detail_cpu = clusterDetailsDao.findDetail(cluster.getId(), "cpuOvercommitRatio"); ClusterDetailsVO cluster_detail_ram = clusterDetailsDao.findDetail(cluster.getId(), "memoryOvercommitRatio"); Float cpuOvercommitRatio = Float.parseFloat(cluster_detail_cpu.getValue()); Float memoryOvercommitRatio = Float.parseFloat(cluster_detail_ram.getValue()); if (LOGGER.isDebugEnabled()) { - LOGGER.debug(String.format("Checking host ID: %s for capacity already reserved %d", h.getUuid(), reserved)); + LOGGER.debug(String.format("Checking host ID: %s for capacity already reserved %d", hostVO.getUuid(), reserved)); } - if (capacityManager.checkIfHostHasCapacity(h.getId(), cpu_requested * reserved, ram_requested * reserved, false, cpuOvercommitRatio, memoryOvercommitRatio, true)) { + if (capacityManager.checkIfHostHasCapacity(hostVO.getId(), cpu_requested * reserved, ram_requested * reserved, false, cpuOvercommitRatio, memoryOvercommitRatio, true)) { if (LOGGER.isDebugEnabled()) { - LOGGER.debug(String.format("Found host ID: %s for with enough capacity, CPU=%d RAM=%s", h.getUuid(), cpu_requested * reserved, toHumanReadableSize(ram_requested * reserved))); + LOGGER.debug(String.format("Found host ID: %s for with enough capacity, CPU=%d RAM=%s", hostVO.getUuid(), cpu_requested * reserved, toHumanReadableSize(ram_requested * reserved))); } - hostEntry.setValue(new Pair(h, reserved)); + hostEntry.setValue(new Pair(hostVO, reserved)); suitable_host_found = true; planCluster = cluster; break;