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 6ad17393be9fefd1886bb43ea824c2ed031b5e14 Merge: ed6ee6b704f a4263da8aea Author: Daan Hoogland <[email protected]> AuthorDate: Fri Jul 25 17:13: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 | 81 ++++- .../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 | 28 +- .../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 | 392 +-------------------- 24 files changed, 426 insertions(+), 514 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..14ea043aa97 --- 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 locating 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..df8727a7b31 --- 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,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 = 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) { String srcIp = command.getRemoteIp(); @@@ -55,37 -65,80 +63,80 @@@ 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); - logger.debug("Volume " + srcFile + " copy successful, copied to file: " + filename); - s_logger.debug("Volume " + srcFile + " copy successful, copied to file: " + filename); ++ logger.debug("Volume {} copy successful, copied to file: {}", srcFile, 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); } } catch (final Exception e) { - logger.error("Error while copying volume file from remote host: " + e.getMessage(), e); - s_logger.error("Error while copying volume file from remote host: " + e.getMessage(), e); ++ logger.error("Error while copying volume file from remote host: {}", e.getMessage(), e); String msg = "Failed to copy volume due to: " + e.getMessage(); return new Answer(command, false, msg); } } - private long getVirtualSizeFromFile(String path) { + private Map<VolumeOnStorageTO.Detail, String> getVolumeDetails(KVMStoragePool pool, KVMPhysicalDisk disk) { + Map<String, String> info = getDiskFileInfo(pool, disk, true); + if (MapUtils.isEmpty(info)) { + return null; + } + + Map<VolumeOnStorageTO.Detail, String> volumeDetails = new HashMap<>(); + + String backingFilePath = info.get(QemuImg.BACKING_FILE); + if (StringUtils.isNotBlank(backingFilePath)) { + volumeDetails.put(VolumeOnStorageTO.Detail.BACKING_FILE, backingFilePath); + } + String backingFileFormat = info.get(QemuImg.BACKING_FILE_FORMAT); + if (StringUtils.isNotBlank(backingFileFormat)) { + volumeDetails.put(VolumeOnStorageTO.Detail.BACKING_FILE_FORMAT, backingFileFormat); + } + String clusterSize = info.get(QemuImg.CLUSTER_SIZE); + if (StringUtils.isNotBlank(clusterSize)) { + volumeDetails.put(VolumeOnStorageTO.Detail.CLUSTER_SIZE, clusterSize); + } + String fileFormat = info.get(QemuImg.FILE_FORMAT); + if (StringUtils.isNotBlank(fileFormat)) { + volumeDetails.put(VolumeOnStorageTO.Detail.FILE_FORMAT, fileFormat); + } + String encrypted = info.get(QemuImg.ENCRYPTED); + if (StringUtils.isNotBlank(encrypted) && encrypted.equalsIgnoreCase("yes")) { + volumeDetails.put(VolumeOnStorageTO.Detail.IS_ENCRYPTED, String.valueOf(Boolean.TRUE)); + } + Boolean isLocked = isDiskFileLocked(pool, disk); + volumeDetails.put(VolumeOnStorageTO.Detail.IS_LOCKED, String.valueOf(isLocked)); + + return volumeDetails; + } + + private Map<String, String> getDiskFileInfo(KVMStoragePool pool, KVMPhysicalDisk disk, boolean secure) { + if (!STORAGE_POOL_TYPES_SUPPORTED.contains(pool.getType())) { + return new HashMap<>(); // unknown + } try { QemuImg qemu = new QemuImg(0); - QemuImgFile qemuFile = new QemuImgFile(path); - Map<String, String> info = qemu.info(qemuFile); - if (info.containsKey(QemuImg.VIRTUAL_SIZE)) { - return Long.parseLong(info.get(QemuImg.VIRTUAL_SIZE)); - } else { - throw new CloudRuntimeException("Unable to determine virtual size of volume at path " + path); - } + QemuImgFile qemuFile = new QemuImgFile(disk.getPath(), disk.getFormat()); + return qemu.info(qemuFile, secure); } catch (QemuImgException | LibvirtException ex) { - throw new CloudRuntimeException("Error when inspecting volume at path " + path, ex); - logger.error("Failed to get info of disk file: " + ex.getMessage()); ++ logger.error("Failed to get info of disk file: {}", ex.getMessage()); + return null; } } + + private boolean isDiskFileLocked(KVMStoragePool pool, KVMPhysicalDisk disk) { + Map<String, String> info = getDiskFileInfo(pool, disk, false); + return info == null; + } } 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..1a2090a6a77 --- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java @@@ -4504,8 -4455,8 +4507,8 @@@ public class QueryManagerImpl extends M 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 +4536,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 +4545,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 +4643,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 +4982,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 diff --cc vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HostMO.java index 189797a3cb2,93a471d56bb..dd3f5dd3cb7 --- 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 @@@ -33,16 -34,16 +33,11 @@@ import com.vmware.vim25.AlreadyExistsFa import com.vmware.vim25.ClusterDasConfigInfo; import com.vmware.vim25.ComputeResourceSummary; import com.vmware.vim25.CustomFieldStringValue; --import com.vmware.vim25.DatastoreSummary; import com.vmware.vim25.DynamicProperty; import com.vmware.vim25.GuestOsDescriptor; import com.vmware.vim25.HostConfigManager; 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; import com.vmware.vim25.HostNetworkInfo; @@@ -51,7 -52,7 +46,6 @@@ import com.vmware.vim25.HostNetworkSecu import com.vmware.vim25.HostNetworkTrafficShapingPolicy; import com.vmware.vim25.HostOpaqueNetworkInfo; import com.vmware.vim25.HostPortGroup; --import com.vmware.vim25.HostPortGroupPort; import com.vmware.vim25.HostPortGroupSpec; import com.vmware.vim25.HostRuntimeInfo; import com.vmware.vim25.HostSystemConnectionState; @@@ -61,57 -62,59 +55,41 @@@ import com.vmware.vim25.ManagedObjectRe import com.vmware.vim25.NasDatastoreInfo; import com.vmware.vim25.ObjectContent; import com.vmware.vim25.ObjectSpec; --import com.vmware.vim25.OptionValue; import com.vmware.vim25.PropertyFilterSpec; import com.vmware.vim25.PropertySpec; import com.vmware.vim25.TraversalSpec; import com.vmware.vim25.VirtualMachineConfigSpec; import com.vmware.vim25.VirtualNicManagerNetConfig; import com.cloud.hypervisor.vmware.util.VmwareContext; --import com.cloud.hypervisor.vmware.util.VmwareHelper; import com.cloud.utils.LogUtils; import com.cloud.utils.Pair; public class HostMO extends BaseMO implements VmwareHypervisorHost { - private static final Logger s_logger = Logger.getLogger(HostMO.class); Map<String, VirtualMachineMO> _vmCache = new HashMap<>(); -- //Map<String, String> _vmInternalNameMapCache = new HashMap<String, String>(); -- public HostMO(VmwareContext context, ManagedObjectReference morHost) { super(context, morHost); } -- public HostMO(VmwareContext context, String morType, String morValue) { -- super(context, morType, morValue); -- } -- public HostHardwareSummary getHostHardwareSummary() throws Exception { HostConnectInfo hostInfo = _context.getService().queryHostConnectionInfo(_mor); - HostHardwareSummary hardwareSummary = hostInfo.getHost().getHardware(); - return hardwareSummary; + return hostInfo.getHost().getHardware(); } 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 { @@@ -130,43 -133,43 +108,6 @@@ return null; } -- public List<HostPortGroupSpec> getHostPortGroupSpecs() throws Exception { -- HostNetworkInfo hostNetInfo = getHostNetworkInfo(); -- if (hostNetInfo == null) { -- return null; -- } -- -- List<HostPortGroup> portGroups = hostNetInfo.getPortgroup(); -- if (CollectionUtils.isEmpty(portGroups)) { -- return null; -- } -- - List<HostPortGroupSpec> portGroupSpecs = new ArrayList<>(); - List<HostPortGroupSpec> portGroupSpecs = new ArrayList<HostPortGroupSpec>(); -- for (HostPortGroup portGroup : portGroups) { -- if (!isVMKernelPort(portGroup)) { -- portGroupSpecs.add(portGroup.getSpec()); -- } -- } -- -- return portGroupSpecs; -- } -- -- private boolean isVMKernelPort(HostPortGroup portGroup) { -- assert (portGroup != null); -- List<HostPortGroupPort> ports = portGroup.getPort(); -- if (CollectionUtils.isEmpty(ports)) { -- return false; -- } -- -- for (HostPortGroupPort port : ports) { -- if (port.getType().equalsIgnoreCase("host")) { -- return true; -- } -- } -- -- return false; -- } -- @Override public String getHyperHostName() throws Exception { return getName(); @@@ -214,53 -217,53 +155,18 @@@ throw new Exception("Could not find host default gateway, host is not properly configured?"); } -- public HostStorageSystemMO getHostStorageSystemMO() throws Exception { - return new HostStorageSystemMO(_context, _context.getVimClient().getDynamicProperty(_mor, "configManager.storageSystem")); - return new HostStorageSystemMO(_context, (ManagedObjectReference)_context.getVimClient().getDynamicProperty(_mor, "configManager.storageSystem")); -- } -- public HostDatastoreSystemMO getHostDatastoreSystemMO() throws Exception { - return new HostDatastoreSystemMO(_context, (ManagedObjectReference)_context.getVimClient().getDynamicProperty(_mor, "configManager.datastoreSystem")); - } - - public HostDatastoreBrowserMO getHostDatastoreBrowserMO() throws Exception { - return new HostDatastoreBrowserMO(_context, (ManagedObjectReference)_context.getVimClient().getDynamicProperty(_mor, "datastoreBrowser")); - } - - private DatastoreMO getHostDatastoreMO(String datastoreName) throws Exception { - ObjectContent[] ocs = getDatastorePropertiesOnHyperHost(new String[] {"name"}); - if (ocs != null && ocs.length > 0) { - for (ObjectContent oc : ocs) { - List<DynamicProperty> objProps = oc.getPropSet(); - if (objProps != null) { - for (DynamicProperty objProp : objProps) { - if (objProp.getVal().toString().equals(datastoreName)) - return new DatastoreMO(_context, oc.getObj()); - } - } - } - } - return null; + return new HostDatastoreSystemMO(_context, _context.getVimClient().getDynamicProperty(_mor, "configManager.datastoreSystem")); } - public HostDatastoreBrowserMO getHostDatastoreBrowserMO() throws Exception { - return new HostDatastoreBrowserMO(_context, _context.getVimClient().getDynamicProperty(_mor, "datastoreBrowser")); - } - - private DatastoreMO getHostDatastoreMO(String datastoreName) throws Exception { - ObjectContent[] ocs = getDatastorePropertiesOnHyperHost(new String[] {"name"}); - if (ocs != null) { - for (ObjectContent oc : ocs) { - List<DynamicProperty> objProps = oc.getPropSet(); - if (objProps != null) { - for (DynamicProperty objProp : objProps) { - if (objProp.getVal().toString().equals(datastoreName)) - return new DatastoreMO(_context, oc.getObj()); - } - } - } - } - return null; - } - public HostNetworkSystemMO getHostNetworkSystemMO() throws Exception { HostConfigManager configMgr = getHostConfigManager(); return new HostNetworkSystemMO(_context, configMgr.getNetworkSystem()); } -- public HostFirewallSystemMO getHostFirewallSystemMO() throws Exception { -- HostConfigManager configMgr = getHostConfigManager(); -- ManagedObjectReference morFirewall = configMgr.getFirewallSystem(); -- -- // only ESX hosts have firewall manager -- if (morFirewall != null) -- return new HostFirewallSystemMO(_context, morFirewall); -- return null; -- } -- @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 +188,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 +200,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 +219,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 +233,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(); @@@ -451,7 -459,7 +267,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 +287,7 @@@ spec.setName(portGroupName); if (vlanId != null) -- spec.setVlanId(vlanId.intValue()); ++ spec.setVlanId(vlanId); HostNetworkPolicy policy = new HostNetworkPolicy(); if (secPolicy != null) policy.setSecurity(secPolicy); @@@ -481,13 -489,13 +297,6 @@@ hostNetMo.updatePortGroup(portGroupName, spec); } -- public void deletePortGroup(String portGroupName) throws Exception { -- assert (portGroupName != null); -- HostNetworkSystemMO hostNetMo = getHostNetworkSystemMO(); -- assert (hostNetMo != null); -- hostNetMo.removePortGroup(portGroupName); -- } -- public ManagedObjectReference getNetworkMor(String portGroupName) throws Exception { PropertySpec pSpec = new PropertySpec(); pSpec.setType("Network"); @@@ -525,15 -533,15 +334,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 @@@ -658,52 -666,52 +460,10 @@@ return false; } -- public HashMap<String, Integer> getVmVncPortsOnHost() throws Exception { -- -- int key = getCustomFieldKey("VirtualMachine", CustomFieldConstants.CLOUD_VM_INTERNAL_NAME); -- if (key == 0) { - logger.warn("Custom field " + CustomFieldConstants.CLOUD_VM_INTERNAL_NAME + " is not registered ?!"); - s_logger.warn("Custom field " + CustomFieldConstants.CLOUD_VM_INTERNAL_NAME + " is not registered ?!"); -- } -- -- ObjectContent[] ocs = getVmPropertiesOnHyperHost(new String[] {"name", "config.extraConfig[\"RemoteDisplay.vnc.port\"]", "value[" + key + "]"}); -- - HashMap<String, Integer> portInfo = new HashMap<>(); - if (ocs != null) { - HashMap<String, Integer> portInfo = new HashMap<String, Integer>(); - if (ocs != null && ocs.length > 0) { -- for (ObjectContent oc : ocs) { -- List<DynamicProperty> objProps = oc.getPropSet(); -- if (objProps != null) { -- String vmName = null; -- String value = null; -- String vmInternalCSName = null; -- for (DynamicProperty objProp : objProps) { -- if (objProp.getName().equals("name")) { -- vmName = (String)objProp.getVal(); -- } else if (objProp.getName().startsWith("value[")) { -- if (objProp.getVal() != null) -- vmInternalCSName = ((CustomFieldStringValue)objProp.getVal()).getValue(); -- } else { -- OptionValue optValue = (OptionValue)objProp.getVal(); -- value = (String)optValue.getValue(); -- } -- } -- -- if (vmInternalCSName != null && isUserVMInternalCSName(vmInternalCSName)) -- vmName = vmInternalCSName; -- -- if (vmName != null && value != null) { -- portInfo.put(vmName, Integer.parseInt(value)); -- } -- } -- } -- } -- -- return portInfo; -- } -- @Override public ObjectContent[] getVmPropertiesOnHyperHost(String[] propertyPaths) throws Exception { - if (s_logger.isTraceEnabled()) - s_logger.trace("vCenter API trace - retrieveProperties() for VM properties. target MOR: " + _mor.getValue() + ", properties: " + + if (logger.isTraceEnabled()) + logger.trace("vCenter API trace - retrieveProperties() for VM properties. target MOR: " + _mor.getValue() + ", properties: " + new Gson().toJson(propertyPaths)); PropertySpec pSpec = new PropertySpec(); @@@ -723,7 -731,7 +483,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 +516,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); @@@ -779,41 -787,41 +539,6 @@@ return mounts; } -- public List<Pair<ManagedObjectReference, String>> getLocalDatastoreOnHost() throws Exception { - List<Pair<ManagedObjectReference, String>> dsList = new ArrayList<>(); - List<Pair<ManagedObjectReference, String>> dsList = new ArrayList<Pair<ManagedObjectReference, String>>(); -- -- ObjectContent[] ocs = getDatastorePropertiesOnHyperHost(new String[] {"name", "summary"}); -- if (ocs != null) { -- for (ObjectContent oc : ocs) { -- DatastoreSummary dsSummary = (DatastoreSummary)VmwareHelper.getPropValue(oc, "summary"); -- if (dsSummary.isMultipleHostAccess() == false && dsSummary.isAccessible() && dsSummary.getType().equalsIgnoreCase("vmfs")) { -- ManagedObjectReference morDs = oc.getObj(); -- String name = (String)VmwareHelper.getPropValue(oc, "name"); -- -- if (!name.startsWith("-iqn.") && !name.startsWith("_iqn.")) { - dsList.add(new Pair<>(morDs, name)); - dsList.add(new Pair<ManagedObjectReference, String>(morDs, name)); -- } -- } -- } -- } -- 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 { @@@ -1105,19 -1113,19 +830,6 @@@ return runtimeInfo != null && runtimeInfo.getConnectionState() == HostSystemConnectionState.CONNECTED; } -- public boolean revertToSnapshot(ManagedObjectReference morSnapshot) throws Exception { -- ManagedObjectReference morTask = _context.getService().revertToSnapshotTask(morSnapshot, _mor, false); -- boolean result = _context.getVimClient().waitForTask(morTask); -- if (result) { -- _context.waitForTaskProgressDone(morTask); -- return true; -- } else { - logger.error("VMware revert to snapshot failed due to " + TaskMO.getTaskFailureInfo(_context, morTask)); - s_logger.error("VMware revert to snapshot failed due to " + TaskMO.getTaskFailureInfo(_context, morTask)); -- } -- -- return false; -- } -- @Override public LicenseAssignmentManagerMO getLicenseAssignmentManager() throws Exception { ManagedObjectReference licenseMgr; @@@ -1131,28 -1139,28 +843,6 @@@ return new LicenseAssignmentManagerMO(_context, licenseAssignmentManager); } -- public void enableVncOnHostFirewall() throws Exception { -- HostFirewallSystemMO firewallMo = getHostFirewallSystemMO(); -- boolean bRefresh = false; -- if (firewallMo != null) { -- HostFirewallInfo firewallInfo = firewallMo.getFirewallInfo(); -- if (firewallInfo != null && firewallInfo.getRuleset() != null) { -- for (HostFirewallRuleset rule : firewallInfo.getRuleset()) { -- if ("vncServer".equalsIgnoreCase(rule.getKey())) { -- bRefresh = true; -- firewallMo.enableRuleset("vncServer"); -- } else if ("gdbserver".equalsIgnoreCase(rule.getKey())) { -- bRefresh = true; -- firewallMo.enableRuleset("gdbserver"); -- } -- } -- } -- -- if (bRefresh) -- firewallMo.refreshFirewall(); -- } -- } -- @Override public String getRecommendedDiskController(String guestOsId) throws Exception { ManagedObjectReference morParent = getParentMor(); @@@ -1183,21 -1191,21 +873,6 @@@ return null; } -- public String getHostManagementIp(String managementPortGroup) throws Exception { -- HostNetworkInfo netInfo = getHostNetworkInfo(); -- -- List<HostVirtualNic> nics = netInfo.getVnic(); -- for (HostVirtualNic nic : nics) { -- if (nic.getPortgroup().equals(managementPortGroup)) { -- HostIpConfig ipConfig = nic.getSpec().getIp(); -- -- return ipConfig.getIpAddress(); -- } -- } -- -- return null; -- } -- public List<ManagedObjectReference> getHostNetworks() throws Exception { return _context.getVimClient().getDynamicProperty(_mor, "network"); } @@@ -1214,41 -1222,41 +889,6 @@@ return networkName; } -- public void createPortGroup(HostPortGroupSpec spec) throws Exception { -- if (spec == null) { -- return; -- } -- -- synchronized (_mor.getValue().intern()) { -- HostNetworkSystemMO hostNetMo = getHostNetworkSystemMO(); -- if (hostNetMo == null) { -- return; -- } -- -- ManagedObjectReference morNetwork = getNetworkMor(spec.getName()); -- if (morNetwork == null) { -- hostNetMo.addPortGroup(spec); -- } -- } -- } -- -- public void copyPortGroupsFromHost(HostMO srcHost) throws Exception { -- if (srcHost == null) { -- return; -- } -- -- List<HostPortGroupSpec> portGroupSpecs = srcHost.getHostPortGroupSpecs(); -- if (CollectionUtils.isEmpty(portGroupSpecs)) { - logger.debug("No port groups in the host: " + srcHost.getName()); - s_logger.debug("No port groups in the host: " + srcHost.getName()); -- return; -- } -- -- for (HostPortGroupSpec spec : portGroupSpecs) { - logger.debug("Creating port group: " + spec.getName() + " in the host: " + getName()); - s_logger.debug("Creating port group: " + spec.getName() + " in the host: " + getName()); -- createPortGroup(spec); -- } -- } -- public void createPortGroup(HostVirtualSwitch vSwitch, String portGroupName, Integer vlanId, HostNetworkSecurityPolicy secPolicy, HostNetworkTrafficShapingPolicy shapingPolicy, long timeOutMs) throws Exception { @@@ -1303,21 -1311,21 +943,9 @@@ return morNetwork; } -- public String getProductVersion() throws Exception { -- return getHostAboutInfo().getVersion(); -- } -- -- public boolean isUefiLegacySupported() throws Exception { -- String hostVersion = getProductVersion(); -- if (hostVersion.compareTo(VmwareHelper.MIN_VERSION_UEFI_LEGACY) >= 0) { -- return true; -- } -- return false; -- } -- private synchronized VirtualMachineMO findVmOnHyperHostWithHypervisorName(String vmName) throws Exception { - if (s_logger.isDebugEnabled()) - s_logger.debug("find VM hypervisor name: " + vmName + " on host"); + if (logger.isDebugEnabled()) + logger.debug("find VM hypervisor name: " + vmName + " on host"); VirtualMachineMO vmMo = getVmWithHypervisorName(_vmCache.values(), vmName); if (vmMo != null) {
