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 {
  


Reply via email to