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( 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; diff --git a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java index 795489c696f..86c1b558f3a 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(); 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);