This is an automated email from the ASF dual-hosted git repository. dahn pushed a commit to branch 4.20 in repository https://gitbox.apache.org/repos/asf/cloudstack.git
commit 609efcc231a625145e42c3b1af11d9d68d2d7ad8 Merge: ed6ee6b704f a4263da8aea Author: Daan Hoogland <d...@apache.org> AuthorDate: Fri Jul 25 22:01:17 2025 +0200 Merge branch '4.19' into 4.20 .../command/user/config/ListCapabilitiesCmd.java | 1 + .../api/response/CapabilitiesResponse.java | 8 ++ .../com/cloud/agent/api/CheckVolumeAnswer.java | 15 +- .../cloud/agent/api/CopyRemoteVolumeAnswer.java | 15 +- .../wrapper/LibvirtCheckVolumeCommandWrapper.java | 80 +++++++++-- .../LibvirtCopyRemoteVolumeCommandWrapper.java | 76 +++++++++-- .../LibvirtGetVolumesOnStorageCommandWrapper.java | 66 +++++---- .../wrapper/LibvirtResizeVolumeCommandWrapper.java | 19 +-- .../hypervisor/kvm/storage/KVMPhysicalDisk.java | 33 +++++ plugins/storage/volume/linstor/CHANGELOG.md | 6 + .../kvm/storage/LinstorStorageAdaptor.java | 2 +- .../driver/LinstorPrimaryDataStoreDriverImpl.java | 12 +- .../java/com/cloud/api/query/QueryManagerImpl.java | 55 +++++--- .../cloud/api/query/dao/TemplateJoinDaoImpl.java | 7 +- .../com/cloud/server/ManagementServerImpl.java | 1 + .../cloudstack/vm/UnmanagedVMsManagerImpl.java | 37 ++++- .../storage/resource/HttpUploadServerHandler.java | 12 +- .../plugins/linstor/test_linstor_volumes.py | 73 +++++++++- ui/src/components/view/InfoCard.vue | 3 + ui/src/config/section/domain.js | 5 + ui/src/views/compute/DeployVM.vue | 14 +- ui/src/views/compute/DeployVnfAppliance.vue | 14 +- ui/src/views/compute/EditVM.vue | 16 +-- .../com/cloud/hypervisor/vmware/mo/HostMO.java | 152 ++------------------- 24 files changed, 440 insertions(+), 282 deletions(-) diff --cc api/src/main/java/org/apache/cloudstack/api/command/user/config/ListCapabilitiesCmd.java index 0cecbb37020,4f036e89a64..bd3f39a09aa --- a/api/src/main/java/org/apache/cloudstack/api/command/user/config/ListCapabilitiesCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/config/ListCapabilitiesCmd.java @@@ -70,8 -71,7 +70,9 @@@ public class ListCapabilitiesCmd extend response.setInstancesStatsUserOnly((Boolean) capabilities.get(ApiConstants.INSTANCES_STATS_USER_ONLY)); response.setInstancesDisksStatsRetentionEnabled((Boolean) capabilities.get(ApiConstants.INSTANCES_DISKS_STATS_RETENTION_ENABLED)); response.setInstancesDisksStatsRetentionTime((Integer) capabilities.get(ApiConstants.INSTANCES_DISKS_STATS_RETENTION_TIME)); + response.setSharedFsVmMinCpuCount((Integer)capabilities.get(ApiConstants.SHAREDFSVM_MIN_CPU_COUNT)); + response.setSharedFsVmMinRamSize((Integer)capabilities.get(ApiConstants.SHAREDFSVM_MIN_RAM_SIZE)); + response.setDynamicScalingEnabled((Boolean) capabilities.get(ApiConstants.DYNAMIC_SCALING_ENABLED)); response.setObjectName("capability"); response.setResponseName(getCommandName()); this.setResponseObject(response); diff --cc api/src/main/java/org/apache/cloudstack/api/response/CapabilitiesResponse.java index 3861ac455ed,83fb4f4b372..ff2e33b1389 --- a/api/src/main/java/org/apache/cloudstack/api/response/CapabilitiesResponse.java +++ b/api/src/main/java/org/apache/cloudstack/api/response/CapabilitiesResponse.java @@@ -128,14 -124,10 +128,18 @@@ public class CapabilitiesResponse exten @Param(description = "the retention time for Instances disks stats", since = "4.18.0") private Integer instancesDisksStatsRetentionTime; + @SerializedName(ApiConstants.SHAREDFSVM_MIN_CPU_COUNT) + @Param(description = "the min CPU count for the service offering used by the shared filesystem instance", since = "4.20.0") + private Integer sharedFsVmMinCpuCount; + + @SerializedName(ApiConstants.SHAREDFSVM_MIN_RAM_SIZE) + @Param(description = "the min Ram size for the service offering used by the shared filesystem instance", since = "4.20.0") + private Integer sharedFsVmMinRamSize; + + @SerializedName(ApiConstants.DYNAMIC_SCALING_ENABLED) + @Param(description = "true if dynamically scaling for instances is enabled", since = "4.21.0") + private Boolean dynamicScalingEnabled; + public void setSecurityGroupsEnabled(boolean securityGroupsEnabled) { this.securityGroupsEnabled = securityGroupsEnabled; } @@@ -240,11 -228,7 +244,15 @@@ this.customHypervisorDisplayName = customHypervisorDisplayName; } + public void setSharedFsVmMinCpuCount(Integer sharedFsVmMinCpuCount) { + this.sharedFsVmMinCpuCount = sharedFsVmMinCpuCount; + } + + public void setSharedFsVmMinRamSize(Integer sharedFsVmMinRamSize) { + this.sharedFsVmMinRamSize = sharedFsVmMinRamSize; + } ++ + public void setDynamicScalingEnabled(Boolean dynamicScalingEnabled) { + this.dynamicScalingEnabled = dynamicScalingEnabled; + } } diff --cc plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckVolumeCommandWrapper.java index c8b0aafd0d6,2caf8da2914..55225ba086c --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckVolumeCommandWrapper.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckVolumeCommandWrapper.java @@@ -34,13 -35,22 +35,20 @@@ import org.apache.cloudstack.storage.vo import org.apache.cloudstack.utils.qemu.QemuImg; import org.apache.cloudstack.utils.qemu.QemuImgException; import org.apache.cloudstack.utils.qemu.QemuImgFile; + import org.apache.commons.collections.MapUtils; + import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; import org.libvirt.LibvirtException; + import java.util.Arrays; + import java.util.HashMap; + import java.util.List; import java.util.Map; @ResourceWrapper(handles = CheckVolumeCommand.class) public final class LibvirtCheckVolumeCommandWrapper extends CommandWrapper<CheckVolumeCommand, Answer, LibvirtComputingResource> { - private static final Logger s_logger = Logger.getLogger(LibvirtCheckVolumeCommandWrapper.class); + private static final List<Storage.StoragePoolType> STORAGE_POOL_TYPES_SUPPORTED = Arrays.asList(Storage.StoragePoolType.Filesystem, Storage.StoragePoolType.NetworkFilesystem); + @Override public Answer execute(final CheckVolumeCommand command, final LibvirtComputingResource libvirtComputingResource) { String result = null; @@@ -59,9 -74,8 +72,8 @@@ } else { return new Answer(command, false, "Unsupported Storage Pool"); } - } catch (final Exception e) { - logger.error("Error while locating disk: "+ e.getMessage()); - s_logger.error("Error while checking the disk: " + e.getMessage()); ++ logger.error("Error while checking the disk: {}", e.getMessage()); return new Answer(command, false, result); } } diff --cc plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCopyRemoteVolumeCommandWrapper.java index e6ec05fec23,6edf5cbd906..04a94dae830 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCopyRemoteVolumeCommandWrapper.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCopyRemoteVolumeCommandWrapper.java @@@ -34,12 -35,21 +35,18 @@@ import org.apache.cloudstack.storage.vo import org.apache.cloudstack.utils.qemu.QemuImg; import org.apache.cloudstack.utils.qemu.QemuImgException; import org.apache.cloudstack.utils.qemu.QemuImgFile; + import org.apache.commons.collections.MapUtils; + import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; import org.libvirt.LibvirtException; + import java.util.Arrays; + import java.util.HashMap; + import java.util.List; import java.util.Map; @ResourceWrapper(handles = CopyRemoteVolumeCommand.class) public final class LibvirtCopyRemoteVolumeCommandWrapper extends CommandWrapper<CopyRemoteVolumeCommand, Answer, LibvirtComputingResource> { - - private static final Logger s_logger = Logger.getLogger(LibvirtCopyRemoteVolumeCommandWrapper.class); + private static final List<Storage.StoragePoolType> STORAGE_POOL_TYPES_SUPPORTED = Arrays.asList(Storage.StoragePoolType.Filesystem, Storage.StoragePoolType.NetworkFilesystem); @Override public Answer execute(final CopyRemoteVolumeCommand command, final LibvirtComputingResource libvirtComputingResource) { @@@ -55,14 -65,19 +62,19 @@@ int timeoutInSecs = command.getWait(); try { - if (storageFilerTO.getType() == Storage.StoragePoolType.Filesystem || - storageFilerTO.getType() == Storage.StoragePoolType.NetworkFilesystem) { + if (STORAGE_POOL_TYPES_SUPPORTED.contains(storageFilerTO.getType())) { String filename = libvirtComputingResource.copyVolume(srcIp, username, password, dstPath, srcFile, tmpPath, timeoutInSecs); - s_logger.debug("Volume " + srcFile + " copy successful, copied to file: " + filename); + logger.debug("Volume " + srcFile + " copy successful, copied to file: " + filename); final KVMPhysicalDisk vol = pool.getPhysicalDisk(filename); final String path = vol.getPath(); - long size = getVirtualSizeFromFile(path); - return new CopyRemoteVolumeAnswer(command, "", filename, size); + try { + KVMPhysicalDisk.checkQcow2File(path); + } catch (final CloudRuntimeException e) { + return new CopyRemoteVolumeAnswer(command, false, "", filename, 0, getVolumeDetails(pool, vol)); + } + + long size = KVMPhysicalDisk.getVirtualSizeFromFile(path); + return new CopyRemoteVolumeAnswer(command, true, "", filename, size, getVolumeDetails(pool, vol)); } else { String msg = "Unsupported storage pool type: " + storageFilerTO.getType().toString() + ", only local and NFS pools are supported"; return new Answer(command, false, msg); diff --cc plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtResizeVolumeCommandWrapper.java index 6a3901e345c,aa1a0f41f1b..f2af46d4cc8 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtResizeVolumeCommandWrapper.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtResizeVolumeCommandWrapper.java @@@ -33,8 -32,8 +32,7 @@@ import org.apache.cloudstack.utils.qemu import org.apache.cloudstack.utils.qemu.QemuImg; import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat; import org.apache.cloudstack.utils.qemu.QemuImgException; - import org.apache.cloudstack.utils.qemu.QemuImgFile; import org.apache.cloudstack.utils.qemu.QemuObject; -import org.apache.log4j.Logger; import org.libvirt.Connect; import org.libvirt.Domain; import org.libvirt.DomainInfo; diff --cc server/src/main/java/com/cloud/api/query/QueryManagerImpl.java index 7c8c9ae28c8,1d8e8687051..6fb9ab515cb --- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java @@@ -164,6 -165,7 +165,7 @@@ import org.apache.commons.collections.C import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.EnumUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; ++import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Component; import com.cloud.api.query.dao.AccountJoinDao; @@@ -4313,128 -4378,13 +4315,130 @@@ public class QueryManagerImpl extends M count++; } } + } - return _dcJoinDao.searchAndCount(sc, searchFilter); + /** + * List all resources due to Explicit Dedication except the + * dedicated resources of other account + */ + private void buildSearchCriteriaForOwnedExplicitlyDedicatedResources(Long domainId, SearchCriteria<DataCenterJoinVO> sc, Account account) { + if (domainId != null) { + buildSearchCriteriaForZonesBelongingToDomain(domainId, sc, account); + } else if (accountMgr.isNormalUser(account.getId())) { + buildSearchCriteriaForUserDomainAndAbove(sc, account); + } else if (accountMgr.isDomainAdmin(account.getId()) || accountMgr.isResourceDomainAdmin(account.getId())) { + buildSearchCriteriaForDomainAdmins(sc, account); + } } - private List<Long> removeDedicatedZoneNotSuitabe(List<Long> domainIds) { + /** + * Return all zones for the domain admin, and everything above till root, as well as zones till the domain leaf + */ + private void buildSearchCriteriaForDomainAdmins(SearchCriteria<DataCenterJoinVO> sc, Account account) { + List<Long> domainIds = new ArrayList<>(); - DomainVO domainRecord = _domainDao.findById(account.getDomainId()); - if (domainRecord == null) { - logger.error("Could not find the domainId for account: {}", account); - throw new CloudAuthenticationException("Could not find the domainId for account:" + account.getAccountName()); - } ++ DomainVO domainRecord = getDomainForAccount(account); + logger.trace("adding caller's domain {} to the list of domains to search for zones", account.getDomainId()); + domainIds.add(domainRecord.getId()); + // find all domain Ids till leaf + List<DomainVO> allChildDomains = _domainDao.findAllChildren(domainRecord.getPath(), domainRecord.getId()); + for (DomainVO domain : allChildDomains) { + logger.trace("adding caller domain's child {} to the list of domains to search for zones", domain.getId()); + domainIds.add(domain.getId()); + } + // then find all domain Id up to root domain for this account + while (domainRecord.getParent() != null) { + domainRecord = _domainDao.findById(domainRecord.getParent()); + logger.trace("adding caller domain's ancestor {} to the list of domains to search for zones", domainRecord.getId()); + domainIds.add(domainRecord.getId()); + } + + // so search for domainId == null (public zones) or domainId this user has access to + SearchCriteria<DataCenterJoinVO> sdc = _dcJoinDao.createSearchCriteria(); + sdc.addOr("domainId", Op.IN, domainIds.toArray()); + sdc.addOr("domainId", Op.NULL); + sc.addAnd("domainId", Op.SC, sdc); + + // remove disabled zones + sc.addAnd("allocationState", Op.NEQ, Grouping.AllocationState.Disabled); + + // remove Dedicated zones not dedicated to this domainId or + // subdomainId + List<Long> dedicatedZoneIds = removeDedicatedZoneNotSuitable(domainIds); + if (!dedicatedZoneIds.isEmpty()) { + sdc.addAnd("id", Op.NIN, dedicatedZoneIds.toArray(new Object[0])); + } + } + ++ @NotNull ++ private DomainVO getDomainForAccount(Account account) { ++ DomainVO domainRecord = _domainDao.findById(account.getDomainId()); ++ if (domainRecord == null) { ++ logger.error("Could not find the domainId for account: {}", account); ++ throw new CloudAuthenticationException("Could not find the domainId for account:" + account.getAccountName()); ++ } ++ return domainRecord; ++ } ++ + /** + * Return all zones for the user's domain, and everything above till root + * list all zones belonging to this domain, and all of its parents + * check the parent, if not null, add zones for that parent to list + */ + private void buildSearchCriteriaForUserDomainAndAbove(SearchCriteria<DataCenterJoinVO> sc, Account account) { + + // find all domain Id up to root domain for this account + List<Long> domainIds = new ArrayList<>(); - DomainVO domainRecord = _domainDao.findById(account.getDomainId()); - if (domainRecord == null) { - logger.error("Could not find the domainId for account: {}", account); - throw new CloudAuthenticationException("Could not find the domainId for account:" + account.getAccountName()); - } ++ DomainVO domainRecord = getDomainForAccount(account); + domainIds.add(domainRecord.getId()); + while (domainRecord.getParent() != null) { + domainRecord = _domainDao.findById(domainRecord.getParent()); + domainIds.add(domainRecord.getId()); + } + // domainId == null (public zones) or domainId IN [all domain id + // up to root domain] + SearchCriteria<DataCenterJoinVO> sdc = _dcJoinDao.createSearchCriteria(); + sdc.addOr("domainId", Op.IN, domainIds.toArray()); + sdc.addOr("domainId", Op.NULL); + sc.addAnd("domainId", Op.SC, sdc); + + // remove disabled zones + sc.addAnd("allocationState", Op.NEQ, Grouping.AllocationState.Disabled); + + // accountId == null (zones dedicated to a domain) or + // accountId = caller + SearchCriteria<DataCenterJoinVO> sdc2 = _dcJoinDao.createSearchCriteria(); + sdc2.addOr("accountId", Op.EQ, account.getId()); + sdc2.addOr("accountId", Op.NULL); + + sc.addAnd("accountId", Op.SC, sdc2); + + // remove Dedicated zones not dedicated to this domainId or + // subdomainId + List<Long> dedicatedZoneIds = removeDedicatedZoneNotSuitable(domainIds); + if (!dedicatedZoneIds.isEmpty()) { + sdc.addAnd("id", Op.NIN, dedicatedZoneIds.toArray(new Object[0])); + } + } + + private void buildSearchCriteriaForZonesBelongingToDomain(Long domainId, SearchCriteria<DataCenterJoinVO> sc, Account account) { + // for domainId != null // right now, we made the decision to + // only list zones associated // with this domain, private zone + sc.addAnd("domainId", Op.EQ, domainId); + + if (accountMgr.isNormalUser(account.getId())) { + // accountId == null (zones dedicated to a domain) or + // accountId = caller + SearchCriteria<DataCenterJoinVO> sdc = _dcJoinDao.createSearchCriteria(); + sdc.addOr("accountId", Op.EQ, account.getId()); + sdc.addOr("accountId", Op.NULL); + + sc.addAnd("accountId", Op.SC, sdc); + } + } + + private List<Long> removeDedicatedZoneNotSuitable(List<Long> domainIds) { // remove dedicated zone of other domain - List<Long> dedicatedZoneIds = new ArrayList<Long>(); + List<Long> dedicatedZoneIds = new ArrayList<>(); List<DedicatedResourceVO> dedicatedResources = _dedicatedDao.listZonesNotInDomainIds(domainIds); for (DedicatedResourceVO dr : dedicatedResources) { if (dr != null) { @@@ -4504,8 -4455,8 +4510,8 @@@ listAll = true; } - List<Long> permittedAccountIds = new ArrayList<Long>(); + List<Long> permittedAccountIds = new ArrayList<>(); - Ternary<Long, Boolean, ListProjectResourcesCriteria> domainIdRecursiveListProject = new Ternary<>(cmd.getDomainId(), cmd.isRecursive(), null); + Ternary<Long, Boolean, ListProjectResourcesCriteria> domainIdRecursiveListProject = new Ternary<>(domainId, isRecursive, null); accountMgr.buildACLSearchParameters( caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccountIds, domainIdRecursiveListProject, listAll, false @@@ -4533,7 -4484,7 +4539,7 @@@ null, cmd.getPageSizeVal(), cmd.getStartIndex(), cmd.getZoneId(), cmd.getStoragePoolId(), cmd.getImageStoreId(), hypervisorType, showDomr, cmd.listInReadyState(), permittedAccounts, caller, listProjectResourcesCriteria, tags, showRemovedTmpl, cmd.getIds(), parentTemplateId, cmd.getShowUnique(), - templateType, isVnf, cmd.getArch()); - templateType, isVnf, domainId, isRecursive); ++ templateType, isVnf, domainId, isRecursive, cmd.getArch()); } private Pair<List<TemplateJoinVO>, Integer> searchForTemplatesInternal(Long templateId, String name, String keyword, @@@ -4542,7 -4493,7 +4548,7 @@@ boolean showDomr, boolean onlyReady, List<Account> permittedAccounts, Account caller, ListProjectResourcesCriteria listProjectResourcesCriteria, Map<String, String> tags, boolean showRemovedTmpl, List<Long> ids, Long parentTemplateId, Boolean showUnique, String templateType, - Boolean isVnf, CPU.CPUArch arch) { - Boolean isVnf, Long domainId, boolean isRecursive) { ++ Boolean isVnf, Long domainId, boolean isRecursive, CPU.CPUArch arch) { // check if zone is configured, if not, just return empty list List<HypervisorType> hypers = null; @@@ -4640,14 -4587,18 +4646,18 @@@ sc.addAnd("accountType", SearchCriteria.Op.EQ, Account.Type.PROJECT); } - // add criteria for domain path in case of domain admin + // add criteria for domain path in case of admins if ((templateFilter == TemplateFilter.self || templateFilter == TemplateFilter.selfexecutable) - && (caller.getType() == Account.Type.DOMAIN_ADMIN || caller.getType() == Account.Type.RESOURCE_DOMAIN_ADMIN)) { - sc.addAnd("domainPath", SearchCriteria.Op.LIKE, domain.getPath() + "%"); + && (accountMgr.isAdmin(caller.getAccountId()))) { + if (isRecursive) { + sc.addAnd("domainPath", SearchCriteria.Op.LIKE, domain.getPath() + "%"); + } else { + sc.addAnd("domainPath", SearchCriteria.Op.EQ, domain.getPath()); + } } - List<Long> relatedDomainIds = new ArrayList<Long>(); - List<Long> permittedAccountIds = new ArrayList<Long>(); + List<Long> relatedDomainIds = new ArrayList<>(); + List<Long> permittedAccountIds = new ArrayList<>(); if (!permittedAccounts.isEmpty()) { for (Account account : permittedAccounts) { permittedAccountIds.add(account.getId()); @@@ -4973,7 -4926,8 +4985,8 @@@ return searchForTemplatesInternal(cmd.getId(), cmd.getIsoName(), cmd.getKeyword(), isoFilter, true, cmd.isBootable(), cmd.getPageSizeVal(), cmd.getStartIndex(), cmd.getZoneId(), cmd.getStoragePoolId(), cmd.getImageStoreId(), hypervisorType, true, cmd.listInReadyState(), permittedAccounts, caller, listProjectResourcesCriteria, - tags, showRemovedISO, null, null, cmd.getShowUnique(), null, null, cmd.getArch()); + tags, showRemovedISO, null, null, cmd.getShowUnique(), null, null, - domainId, isRecursive); ++ domainId, isRecursive, cmd.getArch()); } @Override @@@ -5051,13 -5003,9 +5064,13 @@@ options.put(VmDetailConstants.VIDEO_HARDWARE, Arrays.asList("cirrus", "vga", "qxl", "virtio")); options.put(VmDetailConstants.VIDEO_RAM, Collections.emptyList()); options.put(VmDetailConstants.IO_POLICY, Arrays.asList("threads", "native", "io_uring", "storage_specific")); -- options.put(VmDetailConstants.IOTHREADS, Arrays.asList("enabled")); ++ options.put(VmDetailConstants.IOTHREADS, List.of("enabled")); options.put(VmDetailConstants.NIC_MULTIQUEUE_NUMBER, Collections.emptyList()); options.put(VmDetailConstants.NIC_PACKED_VIRTQUEUES_ENABLED, Arrays.asList("true", "false")); + options.put(VmDetailConstants.VIRTUAL_TPM_MODEL, Arrays.asList("tpm-tis", "tpm-crb")); + options.put(VmDetailConstants.VIRTUAL_TPM_VERSION, Arrays.asList("1.2", "2.0")); + options.put(VmDetailConstants.GUEST_CPU_MODE, Arrays.asList("custom", "host-model", "host-passthrough")); + options.put(VmDetailConstants.GUEST_CPU_MODEL, Collections.emptyList()); } if (HypervisorType.VMware.equals(hypervisorType)) { @@@ -5090,7 -5037,7 +5103,7 @@@ Long domainId = cmd.getDomainId(); final Long projectId = cmd.getProjectId(); Boolean isRecursive = cmd.isRecursive(); -- final Boolean listAll = cmd.listAll(); ++ final boolean listAll = cmd.listAll(); final Long startIndex = cmd.getStartIndex(); final Long pageSize = cmd.getPageSizeVal(); final String keyword = cmd.getKeyword(); diff --cc vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HostMO.java index 189797a3cb2,93a471d56bb..d3c3a9d465e --- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HostMO.java +++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HostMO.java @@@ -41,7 -42,7 +41,6 @@@ import com.vmware.vim25.HostConnectInfo import com.vmware.vim25.HostFirewallInfo; import com.vmware.vim25.HostFirewallRuleset; import com.vmware.vim25.HostHardwareSummary; --import com.vmware.vim25.HostHyperThreadScheduleInfo; import com.vmware.vim25.HostIpConfig; import com.vmware.vim25.HostIpRouteEntry; import com.vmware.vim25.HostListSummaryQuickStats; @@@ -91,27 -94,27 +90,19 @@@ public class HostMO extends BaseMO impl } public HostConfigManager getHostConfigManager() throws Exception { - return (HostConfigManager)_context.getVimClient().getDynamicProperty(_mor, "configManager"); - } - - public List<VirtualNicManagerNetConfig> getHostVirtualNicManagerNetConfig() throws Exception { - return _context.getVimClient().getDynamicProperty(_mor, "config.virtualNicManagerInfo.netConfig"); + return _context.getVimClient().getDynamicProperty(_mor, "configManager"); } - public List<VirtualNicManagerNetConfig> getHostVirtualNicManagerNetConfig() throws Exception { - return _context.getVimClient().getDynamicProperty(_mor, "config.virtualNicManagerInfo.netConfig"); - } - public List<HostIpRouteEntry> getHostIpRouteEntries() throws Exception { return _context.getVimClient().getDynamicProperty(_mor, "config.network.routeTableInfo.ipRoute"); } public HostListSummaryQuickStats getHostQuickStats() throws Exception { - return (HostListSummaryQuickStats)_context.getVimClient().getDynamicProperty(_mor, "summary.quickStats"); - } - - public HostHyperThreadScheduleInfo getHostHyperThreadInfo() throws Exception { - return (HostHyperThreadScheduleInfo)_context.getVimClient().getDynamicProperty(_mor, "config.hyperThread"); + return _context.getVimClient().getDynamicProperty(_mor, "summary.quickStats"); } - public HostHyperThreadScheduleInfo getHostHyperThreadInfo() throws Exception { - return _context.getVimClient().getDynamicProperty(_mor, "config.hyperThread"); - } - public HostNetworkInfo getHostNetworkInfo() throws Exception { - return (HostNetworkInfo)_context.getVimClient().getDynamicProperty(_mor, "config.network"); + return _context.getVimClient().getDynamicProperty(_mor, "config.network"); } public HostPortGroupSpec getHostPortGroupSpec(String portGroupName) throws Exception { @@@ -260,7 -263,7 +251,6 @@@ @Override public ManagedObjectReference getHyperHostDatacenter() throws Exception { Pair<DatacenterMO, String> dcPair = DatacenterMO.getOwnerDatacenter(getContext(), getMor()); -- assert (dcPair != null); return dcPair.first().getMor(); } @@@ -282,19 -285,19 +272,6 @@@ throw new Exception("Standalone host is not supported"); } -- public ManagedObjectReference[] getHostLocalDatastore() throws Exception { -- List<ManagedObjectReference> datastores = _context.getVimClient().getDynamicProperty(_mor, "datastore"); - List<ManagedObjectReference> l = new ArrayList<>(); - List<ManagedObjectReference> l = new ArrayList<ManagedObjectReference>(); -- if (datastores != null) { -- for (ManagedObjectReference mor : datastores) { - DatastoreSummary summary = _context.getVimClient().getDynamicProperty(mor, "summary"); - DatastoreSummary summary = (DatastoreSummary)_context.getVimClient().getDynamicProperty(mor, "summary"); -- if (summary.getType().equalsIgnoreCase("VMFS") && !summary.isMultipleHostAccess()) -- l.add(mor); -- } -- } -- return l.toArray(new ManagedObjectReference[1]); -- } -- public HostVirtualSwitch getHostVirtualSwitchByName(String name) throws Exception { List<HostVirtualSwitch> switches = _context.getVimClient().getDynamicProperty(_mor, "config.network.vswitch"); @@@ -307,16 -310,21 +284,17 @@@ return null; } -- public List<HostVirtualSwitch> getHostVirtualSwitch() throws Exception { -- return _context.getVimClient().getDynamicProperty(_mor, "config.network.vswitch"); -- } -- public AboutInfo getHostAboutInfo() throws Exception { - return (AboutInfo)_context.getVimClient().getDynamicProperty(_mor, "config.product"); + return _context.getVimClient().getDynamicProperty(_mor, "config.product"); } public VmwareHostType getHostType() throws Exception { AboutInfo aboutInfo = getHostAboutInfo(); + if (aboutInfo == null) { + String msg = "no type info about host known, assuming ESXi"; - s_logger.warn(msg); ++ logger.warn(msg); + return VmwareHostType.ESXi; + } if ("VMware ESXi".equals(aboutInfo.getName())) return VmwareHostType.ESXi; else if ("VMware ESX".equals(aboutInfo.getName())) @@@ -325,50 -333,50 +303,6 @@@ throw new Exception("Unrecognized VMware host type " + aboutInfo.getName()); } -- // default virtual switch is which management network residents on -- public HostVirtualSwitch getHostDefaultVirtualSwitch() throws Exception { -- String managementPortGroup = getPortGroupNameByNicType(HostVirtualNicType.management); -- if (managementPortGroup != null) -- return getPortGroupVirtualSwitch(managementPortGroup); -- -- return null; -- } -- -- public HostVirtualSwitch getPortGroupVirtualSwitch(String portGroupName) throws Exception { -- String vSwitchName = getPortGroupVirtualSwitchName(portGroupName); -- if (vSwitchName != null) -- return getVirtualSwitchByName(vSwitchName); -- -- return null; -- } -- -- public HostVirtualSwitch getVirtualSwitchByName(String vSwitchName) throws Exception { -- -- List<HostVirtualSwitch> vSwitchs = getHostVirtualSwitch(); -- if (vSwitchs != null) { -- for (HostVirtualSwitch vSwitch : vSwitchs) { -- if (vSwitch.getName().equals(vSwitchName)) -- return vSwitch; -- } -- } -- -- return null; -- } -- -- public String getPortGroupVirtualSwitchName(String portGroupName) throws Exception { -- HostNetworkInfo hostNetInfo = getHostNetworkInfo(); -- List<HostPortGroup> portGroups = hostNetInfo.getPortgroup(); -- if (portGroups != null) { -- for (HostPortGroup portGroup : portGroups) { -- HostPortGroupSpec spec = portGroup.getSpec(); -- if (spec.getName().equals(portGroupName)) -- return spec.getVswitchName(); -- } -- } -- -- return null; -- } -- public HostPortGroupSpec getPortGroupSpec(String portGroupName) throws Exception { HostNetworkInfo hostNetInfo = getHostNetworkInfo(); List<HostPortGroup> portGroups = hostNetInfo.getPortgroup(); @@@ -383,40 -391,40 +317,6 @@@ return null; } -- public String getPortGroupNameByNicType(HostVirtualNicType nicType) throws Exception { -- assert (nicType != null); -- -- List<VirtualNicManagerNetConfig> netConfigs = -- _context.getVimClient().getDynamicProperty(_mor, "config.virtualNicManagerInfo.netConfig"); -- -- if (netConfigs != null) { -- for (VirtualNicManagerNetConfig netConfig : netConfigs) { -- if (netConfig.getNicType().equals(nicType.toString())) { -- List<HostVirtualNic> nics = netConfig.getCandidateVnic(); -- if (nics != null) { -- for (HostVirtualNic nic : nics) { -- return nic.getPortgroup(); -- } -- } -- } -- } -- } -- -- if (nicType == HostVirtualNicType.management) { -- // ESX management network is configured in service console -- HostNetworkInfo netInfo = getHostNetworkInfo(); -- assert (netInfo != null); -- List<HostVirtualNic> nics = netInfo.getConsoleVnic(); -- if (nics != null) { -- for (HostVirtualNic nic : nics) { -- return nic.getPortgroup(); -- } -- } -- } -- -- return null; -- } -- public boolean hasOpaqueNSXNetwork() throws Exception{ HostNetworkInfo netInfo = getHostNetworkInfo(); List<HostOpaqueNetworkInfo> opaqueNetworks = netInfo.getOpaqueNetwork(); @@@ -436,9 -444,9 +336,7 @@@ public boolean hasPortGroup(HostVirtualSwitch vSwitch, String portGroupName) throws Exception { ManagedObjectReference morNetwork = getNetworkMor(portGroupName); -- if (morNetwork != null) -- return true; -- return false; ++ return morNetwork != null; } public void createPortGroup(HostVirtualSwitch vSwitch, String portGroupName, Integer vlanId, HostNetworkSecurityPolicy secPolicy, @@@ -451,7 -459,7 +349,7 @@@ spec.setName(portGroupName); if (vlanId != null) -- spec.setVlanId(vlanId.intValue()); ++ spec.setVlanId(vlanId); HostNetworkPolicy policy = new HostNetworkPolicy(); if (secPolicy != null) policy.setSecurity(secPolicy); @@@ -471,7 -479,7 +369,7 @@@ spec.setName(portGroupName); if (vlanId != null) -- spec.setVlanId(vlanId.intValue()); ++ spec.setVlanId(vlanId); HostNetworkPolicy policy = new HostNetworkPolicy(); if (secPolicy != null) policy.setSecurity(secPolicy); @@@ -525,15 -533,15 +423,8 @@@ return null; } -- public List<ManagedObjectReference> getVmMorsOnNetwork(String portGroupName) throws Exception { -- ManagedObjectReference morNetwork = getNetworkMor(portGroupName); -- if (morNetwork != null) -- return _context.getVimClient().getDynamicProperty(morNetwork, "vm"); -- return null; -- } -- public String getHostName() throws Exception { -- return (String)_context.getVimClient().getDynamicProperty(_mor, "name"); ++ return _context.getVimClient().getDynamicProperty(_mor, "name"); } @Override @@@ -572,11 -580,11 +463,7 @@@ String internalCSUserVMNamingPattern = "^[i][-][0-9]+[-][0-9]+[-]"; Pattern p = Pattern.compile(internalCSUserVMNamingPattern); java.util.regex.Matcher m = p.matcher(vmInternalCSName); -- if (m.find()) { -- return true; -- } else { -- return false; -- } ++ return m.find(); } private void loadVmCache() throws Exception { @@@ -723,7 -731,7 +610,7 @@@ PropertyFilterSpec pfSpec = new PropertyFilterSpec(); pfSpec.getPropSet().add(pSpec); pfSpec.getObjectSet().add(oSpec); -- List<PropertyFilterSpec> pfSpecArr = new ArrayList<PropertyFilterSpec>(); ++ List<PropertyFilterSpec> pfSpecArr = new ArrayList<>(); pfSpecArr.add(pfSpec); List<ObjectContent> properties = _context.getService().retrieveProperties(_context.getPropertyCollector(), pfSpecArr); @@@ -756,7 -764,7 +643,7 @@@ PropertyFilterSpec pfSpec = new PropertyFilterSpec(); pfSpec.getPropSet().add(pSpec); pfSpec.getObjectSet().add(oSpec); -- List<PropertyFilterSpec> pfSpecArr = new ArrayList<PropertyFilterSpec>(); ++ List<PropertyFilterSpec> pfSpecArr = new ArrayList<>(); pfSpecArr.add(pfSpec); List<ObjectContent> properties = _context.getService().retrieveProperties(_context.getPropertyCollector(), pfSpecArr); @@@ -799,21 -807,21 +686,6 @@@ return dsList; } -- public void importVmFromOVF(String ovfFilePath, String vmName, String datastoreName, String diskOption, String configurationId) throws Exception { - if (logger.isTraceEnabled()) - logger.trace("vCenter API trace - importVmFromOVF(). target MOR: " + _mor.getValue() + ", ovfFilePath: " + ovfFilePath + ", vmName: " + vmName + - if (s_logger.isTraceEnabled()) - s_logger.trace("vCenter API trace - importVmFromOVF(). target MOR: " + _mor.getValue() + ", ovfFilePath: " + ovfFilePath + ", vmName: " + vmName + -- ",datastoreName: " + datastoreName + ", diskOption: " + diskOption); -- -- DatastoreMO dsMo = getHostDatastoreMO(datastoreName); -- if (dsMo == null) -- throw new Exception("Invalid datastore name: " + datastoreName); -- -- importVmFromOVF(ovfFilePath, vmName, dsMo, diskOption, configurationId); -- - if (logger.isTraceEnabled()) - logger.trace("vCenter API trace - importVmFromOVF() done"); - if (s_logger.isTraceEnabled()) - s_logger.trace("vCenter API trace - importVmFromOVF() done"); -- } -- @Override public void importVmFromOVF(String ovfFilePath, String vmName, DatastoreMO dsMo, String diskOption, String configurationId) throws Exception {