This is an automated email from the ASF dual-hosted git repository.

sureshanaparti pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudstack.git

commit 2d6280b9daa7abea59be891b10ba6d405c57dc78
Merge: 82bfa9fb3f4 13a2c7793c2
Author: Suresh Kumar Anaparti <[email protected]>
AuthorDate: Fri Apr 17 04:35:25 2026 +0530

    Merge branch '4.22'

 agent/conf/agent.properties                        |  13 +
 .../cloud/agent/properties/AgentProperties.java    |  24 +
 .../com/cloud/agent/api/to/RemoteInstanceTO.java   |  20 +-
 api/src/main/java/com/cloud/host/Host.java         |   3 +
 .../org/apache/cloudstack/api/ApiConstants.java    |   3 +-
 .../api/command/admin/vm/ImportVmCmd.java          |  12 +
 .../api/command/user/bucket/DeleteBucketCmd.java   |   3 +-
 .../apache/cloudstack/backup/BackupManager.java    |   2 +-
 .../storage/object/BucketApiService.java           |   2 +-
 .../agent/api/CheckConvertInstanceCommand.java     |  23 +
 .../cloud/agent/api/ConvertInstanceCommand.java    |  36 +
 .../agent/api/PropagateResourceEventCommand.java   |  17 +
 .../api/routing/LoadBalancerConfigCommand.java     |   4 +-
 .../com/cloud/network/HAProxyConfigurator.java     |  13 +
 .../resource/virtualnetwork/ConfigHelperTest.java  |   2 +-
 .../virtualnetwork/VirtualRoutingResourceTest.java |   4 +-
 .../com/cloud/network/HAProxyConfiguratorTest.java |  32 +-
 .../service/NetworkOrchestrationService.java       |   8 +
 .../java/com/cloud/resource/ResourceManager.java   |   2 +
 .../com/cloud/agent/manager/AgentManagerImpl.java  |  25 +-
 .../agent/manager/ClusteredAgentManagerImpl.java   |  11 +-
 .../engine/orchestration/NetworkOrchestrator.java  | 468 ++++++-------
 .../cloud/upgrade/DatabaseVersionHierarchy.java    |   5 +-
 .../com/cloud/upgrade/dao/Upgrade42020to42030.java |   4 -
 .../resources/META-INF/db/schema-42000to42010.sql  |   2 +-
 .../resources/META-INF/db/schema-42200to42210.sql  |   7 +
 .../cloud/upgrade/DatabaseUpgradeCheckerTest.java  |  20 +
 .../kvm/resource/LibvirtComputingResource.java     | 162 +++++
 .../LibvirtCheckConvertInstanceCommandWrapper.java |  10 +-
 .../LibvirtConvertInstanceCommandWrapper.java      | 307 ++++++--
 .../wrapper/LibvirtReadyCommandWrapper.java        |   4 +
 ...virtCheckConvertInstanceCommandWrapperTest.java |  25 +
 .../LibvirtConvertInstanceCommandWrapperTest.java  | 124 ++++
 ...ernetesClusterResourceModifierActionWorker.java |   2 +-
 .../KubernetesClusterScaleWorker.java              |   8 +-
 .../network/lb/ElasticLoadBalancerManagerImpl.java |   3 +-
 .../lb/InternalLoadBalancerVMManagerImpl.java      |   3 +-
 .../apache/cloudstack/service/NsxApiClient.java    | 218 ++++--
 .../apache/cloudstack/service/PagedFetcher.java    |  82 +++
 .../cloudstack/service/NsxApiClientTest.java       | 311 +++++++++
 .../cloudstack/service/PagedFetcherTest.java       | 156 +++++
 .../java/com/cloud/network/NetworkServiceImpl.java |  28 +-
 .../cloud/network/router/CommandSetupHelper.java   |   3 +-
 .../router/VirtualNetworkApplianceManagerImpl.java |   2 +-
 .../java/com/cloud/network/vpc/VpcManagerImpl.java |  34 +-
 .../com/cloud/projects/ProjectManagerImpl.java     | 111 ++-
 .../com/cloud/resource/ResourceManagerImpl.java    |  24 +-
 .../cloud/storage/ImageStoreUploadMonitorImpl.java |   2 +-
 .../java/com/cloud/storage/StorageManagerImpl.java |  18 +-
 .../com/cloud/storage/VolumeApiServiceImpl.java    |  24 +-
 .../cloud/storage/download/DownloadListener.java   |   4 +-
 .../storage/snapshot/SnapshotManagerImpl.java      |  22 +-
 .../com/cloud/template/TemplateManagerImpl.java    |  21 +-
 .../main/java/com/cloud/vm/UserVmManagerImpl.java  | 161 ++---
 .../cloud/vm/snapshot/VMSnapshotManagerImpl.java   |  54 +-
 .../cloudstack/backup/BackupManagerImpl.java       |  29 +-
 .../storage/object/BucketApiServiceImpl.java       |  63 +-
 .../volume/VolumeImportUnmanageManagerImpl.java    |  20 +-
 .../cloudstack/vm/UnmanagedVMsManagerImpl.java     | 386 ++++++++---
 .../java/com/cloud/hypervisor/KVMGuruTest.java     |  50 +-
 .../com/cloud/network/vpc/VpcManagerImplTest.java  |   1 +
 .../cloud/resource/MockResourceManagerImpl.java    |   5 +
 .../cloud/resource/ResourceManagerImplTest.java    |  27 +
 .../cloud/template/TemplateManagerImplTest.java    |   2 +-
 .../java/com/cloud/vm/UserVmManagerImplTest.java   | 135 +++-
 .../cloud/vm/snapshot/VMSnapshotManagerTest.java   |  50 +-
 .../cloudstack/backup/BackupManagerTest.java       |  14 +-
 .../storage/object/BucketApiServiceImplTest.java   |   2 +-
 .../cloudstack/vm/UnmanagedVMsManagerImplTest.java | 310 ++++++++-
 systemvm/debian/opt/cloud/bin/cs/CsAddress.py      |  47 +-
 systemvm/debian/opt/cloud/bin/cs/CsHelper.py       |  30 +
 systemvm/debian/opt/cloud/bin/cs/CsNetfilter.py    |   2 +
 systemvm/debian/opt/cloud/bin/cs/CsStaticRoutes.py |  40 +-
 .../debian/root/health_checks/haproxy_check.py     |  43 +-
 .../test_redundant_router_deployment_planning.py   | 770 +++++++++++----------
 test/integration/smoke/test_public_ip_range.py     |  68 +-
 ui/public/locales/en.json                          |   3 +
 ui/src/views/infra/HostInfo.vue                    |  16 +
 ui/src/views/tools/ImportUnmanagedInstance.vue     | 100 ++-
 79 files changed, 3626 insertions(+), 1275 deletions(-)

diff --cc api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
index 9ec85734233,03b73834a94..7eae16a2a37
--- a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
+++ b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
@@@ -526,9 -519,9 +526,8 @@@ public class ApiConstants 
      public static final String SCHEDULE = "schedule";
      public static final String SCHEDULE_ID = "scheduleid";
      public static final String SCOPE = "scope";
-     public static final String USER_SECRET_KEY = "usersecretkey";
      public static final String SEARCH_BASE = "searchbase";
      public static final String SECONDARY_IP = "secondaryip";
 -    public static final String SECRET_KEY = "secretkey";
      public static final String SECURITY_GROUP_IDS = "securitygroupids";
      public static final String SECURITY_GROUP_NAMES = "securitygroupnames";
      public static final String SECURITY_GROUP_NAME = "securitygroupname";
diff --cc 
api/src/main/java/org/apache/cloudstack/api/command/user/bucket/DeleteBucketCmd.java
index 4a9a0569c3b,e7b940fc0ad..abbb1760f9d
--- 
a/api/src/main/java/org/apache/cloudstack/api/command/user/bucket/DeleteBucketCmd.java
+++ 
b/api/src/main/java/org/apache/cloudstack/api/command/user/bucket/DeleteBucketCmd.java
@@@ -82,8 -83,8 +83,8 @@@ public class DeleteBucketCmd extends Ba
      }
  
      @Override
-     public void execute() throws ConcurrentOperationException {
+     public void execute() throws ConcurrentOperationException, 
ResourceAllocationException {
 -        CallContext.current().setEventDetails("Bucket Id: " + 
this._uuidMgr.getUuid(Bucket.class, getId()));
 +        CallContext.current().setEventDetails("Bucket ID: " + 
getResourceUuid(ApiConstants.ID));
          boolean result = _bucketService.deleteBucket(id, 
CallContext.current().getCallingAccount());
          SuccessResponse response = new SuccessResponse(getCommandName());
          response.setSuccess(result);
diff --cc server/src/main/java/com/cloud/projects/ProjectManagerImpl.java
index 06397f5a81b,d165f0cd1b6..92af441d06b
--- a/server/src/main/java/com/cloud/projects/ProjectManagerImpl.java
+++ b/server/src/main/java/com/cloud/projects/ProjectManagerImpl.java
@@@ -277,40 -277,39 +277,39 @@@ public class ProjectManagerImpl extend
          }
  
          try (CheckedReservation projectReservation = new 
CheckedReservation(owner, ResourceType.project, null, null, 1L, reservationDao, 
_resourceLimitMgr)) {
+             final Account ownerFinal = owner;
+             User finalUser = user;
+             Project project =  Transaction.execute(new 
TransactionCallback<Project>() {
+                 @Override
+                 public Project doInTransaction(TransactionStatus status) {
  
-         final Account ownerFinal = owner;
-         User finalUser = user;
-         Project project =  Transaction.execute(new 
TransactionCallback<Project>() {
-             @Override
-             public Project doInTransaction(TransactionStatus status) {
- 
-                 //Create an account associated with the project
-                 StringBuilder acctNm = new StringBuilder("PrjAcct-");
-                 
acctNm.append(name).append("-").append(ownerFinal.getDomainId());
+                     //Create an account associated with the project
+                     StringBuilder acctNm = new StringBuilder("PrjAcct-");
+                     
acctNm.append(name).append("-").append(ownerFinal.getDomainId());
  
-                 Account projectAccount = 
_accountMgr.createAccount(acctNm.toString(), Account.Type.PROJECT, null, 
domainId, null, null, UUID.randomUUID().toString());
+                     Account projectAccount = 
_accountMgr.createAccount(acctNm.toString(), Account.Type.PROJECT, null, 
domainId, null, null, UUID.randomUUID().toString());
  
-                 Project project = _projectDao.persist(new ProjectVO(name, 
displayText, ownerFinal.getDomainId(), projectAccount.getId()));
+                     Project project = _projectDao.persist(new ProjectVO(name, 
displayText, ownerFinal.getDomainId(), projectAccount.getId()));
  
-                 //assign owner to the project
-                 assignAccountToProject(project, ownerFinal.getId(), 
ProjectAccount.Role.Admin,
-                         
Optional.ofNullable(finalUser).map(User::getId).orElse(null),  null);
+                     //assign owner to the project
+                     assignAccountToProject(project, ownerFinal.getId(), 
ProjectAccount.Role.Admin,
+                             
Optional.ofNullable(finalUser).map(User::getId).orElse(null),  null);
  
 -                    if (project != null) {
 -                        CallContext.current().setEventDetails("Project id=" + 
project.getId());
 -                        
CallContext.current().putContextParameter(Project.class, project.getUuid());
 -                    }
 +                if (project != null) {
 +                    CallContext.current().setEventDetails("Project ID: " + 
project.getUuid());
 +                    CallContext.current().putContextParameter(Project.class, 
project.getUuid());
 +                }
  
-                 //Increment resource count
-                 _resourceLimitMgr.incrementResourceCount(ownerFinal.getId(), 
ResourceType.project);
+                     //Increment resource count
+                     
_resourceLimitMgr.incrementResourceCount(ownerFinal.getId(), 
ResourceType.project);
  
-                 return project;
-             }
-         });
+                     return project;
+                 }
+             });
  
-         messageBus.publish(_name, 
ProjectManager.MESSAGE_CREATE_TUNGSTEN_PROJECT_EVENT, PublishScope.LOCAL, 
project);
+             messageBus.publish(_name, 
ProjectManager.MESSAGE_CREATE_TUNGSTEN_PROJECT_EVENT, PublishScope.LOCAL, 
project);
  
-         return project;
+             return project;
          }
      }
  
diff --cc server/src/main/java/com/cloud/storage/StorageManagerImpl.java
index a7c700debb7,2d170049663..7c501c78bee
--- a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java
+++ b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java
@@@ -1038,7 -1033,14 +1038,11 @@@ public class StorageManagerImpl extend
          if (Grouping.AllocationState.Disabled == zone.getAllocationState() && 
!_accountMgr.isRootAdmin(account.getId())) {
              throw new PermissionDeniedException(String.format("Cannot perform 
this operation, Zone is currently disabled: %s", zone));
          }
+         // Check if it's local storage and if it's enabled on the zone
+         if (isFileScheme && !isLocalStorageEnabledForZone(zone)) {
+             throw new InvalidParameterValueException("Local storage is not 
enabled for zone: " + zone);
+         }
  
 -        
managementService.checkJsInterpretationAllowedIfNeededForParameterValue(ApiConstants.IS_TAG_A_RULE,
 -                Boolean.TRUE.equals(cmd.isTagARule()));
 -
          Map<String, Object> params = new HashMap<>();
          params.put("zoneId", zone.getId());
          params.put("clusterId", clusterId);
diff --cc server/src/test/java/com/cloud/vm/UserVmManagerImplTest.java
index 341d6abe332,cb15298fbf3..ff67d73c0f4
--- a/server/src/test/java/com/cloud/vm/UserVmManagerImplTest.java
+++ b/server/src/test/java/com/cloud/vm/UserVmManagerImplTest.java
@@@ -139,19 -138,14 +144,13 @@@ import com.cloud.host.Host
  import com.cloud.host.HostVO;
  import com.cloud.host.dao.HostDao;
  import com.cloud.hypervisor.Hypervisor;
 -import com.cloud.kubernetes.cluster.KubernetesServiceHelper;
  import com.cloud.network.Network;
  import com.cloud.network.NetworkModel;
- import com.cloud.network.as.AutoScaleManager;
- import com.cloud.network.dao.FirewallRulesDao;
- import com.cloud.network.dao.IPAddressDao;
- import com.cloud.network.dao.IPAddressVO;
- import com.cloud.network.dao.LoadBalancerVMMapDao;
- import com.cloud.network.dao.LoadBalancerVMMapVO;
  import com.cloud.network.dao.NetworkDao;
  import com.cloud.network.dao.NetworkVO;
 -import com.cloud.network.element.UserDataServiceProvider;
  import com.cloud.network.dao.PhysicalNetworkDao;
  import com.cloud.network.dao.PhysicalNetworkVO;
 +import com.cloud.network.element.UserDataServiceProvider;
  import com.cloud.network.guru.NetworkGuru;
  import com.cloud.network.rules.FirewallRuleVO;
  import com.cloud.network.rules.PortForwardingRule;

Reply via email to