You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by da...@apache.org on 2026/04/14 12:51:01 UTC
(cloudstack) branch main updated (ed575cc0a10 -> 82bfa9fb3f4)
This is an automated email from the ASF dual-hosted git repository.
dahn pushed a change to branch main
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
from ed575cc0a10 New config.json variable to set the ACS default language (#12863)
add e297644ce1e KVM: Enable HA heartbeat on ShareMountPoint (#12773)
add 80ee7f183f7 Fix six package incompatiblity with EL10 (#12799)
add 27e4d979f12 Clean up backup references to their schedules when the schedules are deleted (#12401)
add 8f3c6fad7a9 set snapcpg config on copy (#12955)
add 273699cf566 kvm: fix wrong CheckVirtualMachineAnswer when vm does not exist (#12928)
add df7ff972719 Create volume on a specified storage pool (#12966)
add b196e97cc36 Prevent deletion of account and domain if either of them has deleted protected instance (#12901)
add 7c7b2ae75d1 Fix KVM incremental volume snapshot creation (#12666)
add 47c5bb8ee7a Support list/query async jobs by resource (#12983)
add ae455ee193e VPC restart cleanup for Public networks with multi-CIDR data (#12622)
add 161b4177c2d Add logs for storage pools reordering (#10419)
add feb60769305 Remove unused config consoleproxy.cmd.port (#12807)
add 38abe2df0bb Allow list async jobs by resource type alone (#13011)
add d75acb6efcc Fix rollback disk snapshots on instance snapshot failure (#12949)
add 37e36577707 [22.0] resource allocation
add 003c8408179 [22.0] resource instance limits
add 8d269cf5bef [22.0] Implement/fix limit validation for projects
add 831ef82ff9b [22.0] resource allocation vpc
add 1f849caa0be [22.0] resource reservation on volume creation
add 46a6bbad270 Fix: KVM Direct Download URL injection (#60)
add 7703fdacab4 [minio] Handle user's canned policy when a bucket is deleted
add 3d678e726ad [22.0] resource reservation on volume snapshot creation
add d11d182c715 [22.0] Fix resource limit reservation and check during StartVirtualMachine
add 95816b44e93 extensions: allow reserved resource details
add 4855d40e6e3 [22.0] secondary storage resource limit for download
add 5d5ee7b6893 volume download fix
add d7224151053 [22.0] secondary storage resource limit for upload
add 07c3dc86b2d [22.0] Consider infinite resources when calculating secondary storage limit for upload operations
add f7f0e751225 Fixed a merge issue in ImageStoreUploadMonitorImpl
add 9c0c8da706e [22.0] Address limit checks for VM, CPU, memory, volume, and primary storage
add 88a12a801f8 Cleanup imported VM from disk on failure due to volume allocation + prevent duplicate volume and primary storage increment on import
add c6b20b8cc7f Fix failing tests
add 9db630932e0 Address public IP limit validations
add 8ce1c9876ee fix restore volume from backup and attach
add 24fd440ee72 Fix create VM from backup
add 86c9f7bd941 Fix backup list
add e8d57d1b0dc Implement/fix limit validation for secondary storage
add f3331344566 Address merge issues
add 8608b4edd02 Fix snapshot copy resource limit concurrency
add 19b4ef10693 server: reserve backup, bucket resource limits during operations
add 1085da4ef8b Merge commit '19b4ef106931aa1d6a8fed06984009d86760e4de' into 4.22
add d6f4fc3ac40 Updating pom.xml version numbers for release 22.0.1
add 23f633ae835 Merge tag '4.22.0.1' into 4.22
new 82bfa9fb3f4 Merge branch '4.22'
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
agent/conf/agent.properties | 3 +
.../cloud/agent/properties/AgentProperties.java | 5 +
.../main/java/com/cloud/agent/api/to/BucketTO.java | 7 +
.../java/com/cloud/projects/ProjectService.java | 4 +-
.../storage/VMTemplateStorageResourceAssoc.java | 3 +-
.../java/com/cloud/user/ResourceLimitService.java | 20 +-
.../cloudstack/api/ApiCommandResourceType.java | 4 +-
.../org/apache/cloudstack/api/ApiConstants.java | 1 +
.../user/account/AddAccountToProjectCmd.java | 3 +-
.../command/user/account/AddUserToProjectCmd.java | 3 +-
.../RestoreVolumeFromBackupAndAttachToVMCmd.java | 4 +
.../api/command/user/job/ListAsyncJobsCmd.java | 15 +
.../command/user/job/QueryAsyncJobResultCmd.java | 18 +-
.../api/command/user/vm/CreateVMFromBackupCmd.java | 1 +
.../api/command/user/volume/CreateVolumeCmd.java | 15 +
.../cloudstack/api/response/ExtensionResponse.java | 10 +
.../cloudstack/extension/ExtensionHelper.java | 3 +
.../apache/cloudstack/resourcelimit/Reserver.java} | 16 +-
.../command/test/AddAccountToProjectCmdTest.java | 3 +
.../cloud/agent/api/storage/DownloadAnswer.java | 2 +-
.../download/DirectTemplateDownloaderImpl.java | 11 +-
.../download/MetalinkDirectTemplateDownloader.java | 2 +-
.../download/NfsDirectTemplateDownloader.java | 2 +-
.../command/TemplateOrVolumePostUploadCommand.java | 8 +
.../storage/command/UploadStatusCommand.java | 10 +
.../service/NetworkOrchestrationService.java | 2 +-
.../service/VolumeOrchestrationService.java | 2 +-
.../java/com/cloud/ha/HighAvailabilityManager.java | 3 +
.../com/cloud/vm/VirtualMachineManagerImpl.java | 26 +-
.../engine/orchestration/NetworkOrchestrator.java | 46 +-
.../engine/orchestration/VolumeOrchestrator.java | 24 +-
.../java/com/cloud/dc/dao/AccountVlanMapDao.java | 2 +-
.../com/cloud/dc/dao/AccountVlanMapDaoImpl.java | 4 +-
.../java/com/cloud/dc/dao/DomainVlanMapDao.java | 2 +-
.../com/cloud/dc/dao/DomainVlanMapDaoImpl.java | 4 +-
.../main/java/com/cloud/vm/dao/VMInstanceDao.java | 5 +
.../java/com/cloud/vm/dao/VMInstanceDaoImpl.java | 35 +
.../cloudstack/backup/dao/BackupScheduleDao.java | 6 -
.../backup/dao/BackupScheduleDaoImpl.java | 46 +-
.../resources/META-INF/db/schema-42200to42210.sql | 15 +
.../META-INF/db/views/cloud.user_vm_view.sql | 1 +
.../vmsnapshot/StorageVMSnapshotStrategy.java | 19 +-
.../vmsnapshot/VMSnapshotStrategyKVMTest.java | 4 +-
.../allocator/AbstractStoragePoolAllocator.java | 76 +--
.../storage/image/BaseImageStoreDriverImpl.java | 26 +-
.../extensions/api/CreateExtensionCmd.java | 10 +
.../extensions/api/UpdateExtensionCmd.java | 10 +
.../extensions/manager/ExtensionsManagerImpl.java | 98 ++-
.../extensions/api/CreateExtensionCmdTest.java | 14 +
.../extensions/api/UpdateExtensionCmdTest.java | 15 +
.../manager/ExtensionsManagerImplTest.java | 167 ++++-
.../cloudstack/framework/jobs/dao/AsyncJobDao.java | 18 +
.../framework/jobs/dao/AsyncJobDaoImpl.java | 33 +
packaging/el8/cloud.spec | 19 +-
.../manager/BareMetalTemplateAdapter.java | 1 -
.../cloud/hypervisor/kvm/resource/KVMHABase.java | 1 -
.../hypervisor/kvm/resource/KVMHAMonitor.java | 15 +-
.../kvm/resource/LibvirtComputingResource.java | 7 +-
...CheckVMActivityOnStoragePoolCommandWrapper.java | 2 +-
.../LibvirtCheckVirtualMachineCommandWrapper.java | 9 +-
.../kvm/storage/KVMStoragePoolManager.java | 4 +
.../kvm/storage/KVMStorageProcessor.java | 24 +-
.../hypervisor/kvm/storage/LibvirtStoragePool.java | 22 +-
...bvirtCheckVirtualMachineCommandWrapperTest.java | 191 ++++++
.../driver/MinIOObjectStoreDriverImpl.java | 81 ++-
.../driver/MinIOObjectStoreDriverImplTest.java | 7 +-
.../CloudStackPrimaryDataStoreDriverImpl.java | 3 +-
.../datastore/adapter/primera/PrimeraAdapter.java | 1 +
scripts/vm/hypervisor/kvm/kvmsmpheartbeat.sh | 218 ++++++
server/src/main/java/com/cloud/api/ApiDBUtils.java | 10 +-
.../main/java/com/cloud/api/ApiResponseHelper.java | 66 +-
.../java/com/cloud/api/query/QueryManagerImpl.java | 43 +-
.../com/cloud/api/query/ResourceIdSupport.java | 123 ++++
.../com/cloud/api/query/dao/UserVmJoinDaoImpl.java | 27 +-
.../java/com/cloud/api/query/vo/UserVmJoinVO.java | 7 +
.../configuration/ConfigurationManagerImpl.java | 141 ++--
.../cloud/consoleproxy/ConsoleProxyManager.java | 3 -
.../consoleproxy/ConsoleProxyManagerImpl.java | 2 +-
.../java/com/cloud/network/NetworkServiceImpl.java | 26 +-
.../java/com/cloud/network/vpc/VpcManagerImpl.java | 53 +-
.../com/cloud/projects/ProjectManagerImpl.java | 52 +-
.../cloud/resourcelimit/CheckedReservation.java | 117 +++-
.../com/cloud/resourcelimit/ReservationHelper.java | 16 +-
.../resourcelimit/ResourceLimitManagerImpl.java | 212 +++---
.../cloud/storage/ImageStoreUploadMonitorImpl.java | 180 ++++-
.../com/cloud/storage/VolumeApiServiceImpl.java | 752 ++++++++++++---------
.../storage/download/DownloadActiveState.java | 5 +
.../cloud/storage/download/DownloadErrorState.java | 5 +
.../storage/download/DownloadInactiveState.java | 6 +
...edState.java => DownloadLimitReachedState.java} | 21 +-
.../cloud/storage/download/DownloadListener.java | 89 ++-
.../com/cloud/storage/download/DownloadState.java | 6 +-
.../storage/snapshot/SnapshotManagerImpl.java | 238 ++++---
.../cloud/template/HypervisorTemplateAdapter.java | 39 +-
.../com/cloud/template/TemplateAdapterBase.java | 4 +-
.../com/cloud/template/TemplateManagerImpl.java | 309 +++++----
.../java/com/cloud/user/AccountManagerImpl.java | 18 +
.../java/com/cloud/user/DomainManagerImpl.java | 20 +
.../main/java/com/cloud/vm/UserVmManagerImpl.java | 295 ++++----
.../cloud/vm/snapshot/VMSnapshotManagerImpl.java | 29 +-
.../cloudstack/backup/BackupManagerImpl.java | 129 ++--
.../storage/object/BucketApiServiceImpl.java | 114 +++-
.../volume/VolumeImportUnmanageManagerImpl.java | 21 +-
.../cloudstack/vm/UnmanagedVMsManagerImpl.java | 489 +++++++-------
.../com/cloud/api/query/QueryManagerImplTest.java | 2 +-
.../cloud/api/query/dao/UserVmJoinDaoImplTest.java | 4 +
.../com/cloud/network/vpc/VpcManagerImplTest.java | 14 +-
.../resourcelimit/CheckedReservationTest.java | 17 +-
.../ResourceLimitManagerImplTest.java | 112 +--
.../cloud/storage/VolumeApiServiceImplTest.java | 52 +-
.../storage/snapshot/SnapshotManagerImplTest.java | 4 +-
.../storage/snapshot/SnapshotManagerTest.java | 55 +-
.../cloud/template/TemplateManagerImplTest.java | 137 ++--
.../java/com/cloud/user/DomainManagerImplTest.java | 7 +-
.../java/com/cloud/vm/UserVmManagerImplTest.java | 69 +-
.../cloud/vm/snapshot/VMSnapshotManagerTest.java | 8 +-
.../java/com/cloud/vpc/MockNetworkManagerImpl.java | 2 +-
.../cloud/vpc/MockResourceLimitManagerImpl.java | 41 +-
.../cloudstack/backup/BackupManagerTest.java | 194 ++++--
.../storage/object/BucketApiServiceImplTest.java | 137 +++-
.../VolumeImportUnmanageManagerImplTest.java | 3 -
.../cloudstack/vm/UnmanagedVMsManagerImplTest.java | 96 +--
.../storage/resource/HttpUploadServerHandler.java | 2 +
.../resource/NfsSecondaryStorageResource.java | 33 +-
.../storage/template/DownloadManagerImpl.java | 2 +-
ui/public/locales/en.json | 3 +
ui/src/config/section/extension.js | 2 +-
ui/src/views/extension/CreateExtension.vue | 11 +
ui/src/views/extension/UpdateExtension.vue | 17 +-
ui/src/views/storage/CreateVolume.vue | 74 ++
130 files changed, 4096 insertions(+), 2160 deletions(-)
copy api/src/main/java/{com/cloud/network/rules/LoadBalancer.java => org/apache/cloudstack/resourcelimit/Reserver.java} (68%)
create mode 100644 plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckVirtualMachineCommandWrapperTest.java
create mode 100755 scripts/vm/hypervisor/kvm/kvmsmpheartbeat.sh
create mode 100644 server/src/main/java/com/cloud/api/query/ResourceIdSupport.java
copy api/src/main/java/com/cloud/exception/InvalidParameterValueException.java => server/src/main/java/com/cloud/resourcelimit/ReservationHelper.java (72%)
copy server/src/main/java/com/cloud/storage/download/{DownloadAbandonedState.java => DownloadLimitReachedState.java} (67%)
(cloudstack) 01/01: Merge branch '4.22'
Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
dahn pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
commit 82bfa9fb3f409253dd43fb9ec90e2bb518fda490
Merge: ed575cc0a10 23f633ae835
Author: Daan Hoogland <da...@apache.org>
AuthorDate: Tue Apr 14 14:50:44 2026 +0200
Merge branch '4.22'
agent/conf/agent.properties | 3 +
.../cloud/agent/properties/AgentProperties.java | 5 +
.../main/java/com/cloud/agent/api/to/BucketTO.java | 7 +
.../java/com/cloud/projects/ProjectService.java | 4 +-
.../storage/VMTemplateStorageResourceAssoc.java | 3 +-
.../java/com/cloud/user/ResourceLimitService.java | 20 +-
.../cloudstack/api/ApiCommandResourceType.java | 4 +-
.../org/apache/cloudstack/api/ApiConstants.java | 1 +
.../user/account/AddAccountToProjectCmd.java | 3 +-
.../command/user/account/AddUserToProjectCmd.java | 3 +-
.../RestoreVolumeFromBackupAndAttachToVMCmd.java | 4 +
.../api/command/user/job/ListAsyncJobsCmd.java | 15 +
.../command/user/job/QueryAsyncJobResultCmd.java | 18 +-
.../api/command/user/vm/CreateVMFromBackupCmd.java | 1 +
.../api/command/user/volume/CreateVolumeCmd.java | 15 +
.../cloudstack/api/response/ExtensionResponse.java | 10 +
.../cloudstack/extension/ExtensionHelper.java | 3 +
.../Reserver.java} | 16 +-
.../command/test/AddAccountToProjectCmdTest.java | 3 +
.../cloud/agent/api/storage/DownloadAnswer.java | 2 +-
.../download/DirectTemplateDownloaderImpl.java | 11 +-
.../download/MetalinkDirectTemplateDownloader.java | 2 +-
.../download/NfsDirectTemplateDownloader.java | 2 +-
.../command/TemplateOrVolumePostUploadCommand.java | 8 +
.../storage/command/UploadStatusCommand.java | 10 +
.../service/NetworkOrchestrationService.java | 2 +-
.../service/VolumeOrchestrationService.java | 2 +-
.../java/com/cloud/ha/HighAvailabilityManager.java | 3 +
.../com/cloud/vm/VirtualMachineManagerImpl.java | 26 +-
.../engine/orchestration/NetworkOrchestrator.java | 46 +-
.../engine/orchestration/VolumeOrchestrator.java | 24 +-
.../java/com/cloud/dc/dao/AccountVlanMapDao.java | 2 +-
.../com/cloud/dc/dao/AccountVlanMapDaoImpl.java | 4 +-
.../java/com/cloud/dc/dao/DomainVlanMapDao.java | 2 +-
.../com/cloud/dc/dao/DomainVlanMapDaoImpl.java | 4 +-
.../main/java/com/cloud/vm/dao/VMInstanceDao.java | 5 +
.../java/com/cloud/vm/dao/VMInstanceDaoImpl.java | 35 +
.../cloudstack/backup/dao/BackupScheduleDao.java | 6 -
.../backup/dao/BackupScheduleDaoImpl.java | 46 +-
.../resources/META-INF/db/schema-42200to42210.sql | 15 +
.../META-INF/db/views/cloud.user_vm_view.sql | 1 +
.../vmsnapshot/StorageVMSnapshotStrategy.java | 19 +-
.../vmsnapshot/VMSnapshotStrategyKVMTest.java | 4 +-
.../allocator/AbstractStoragePoolAllocator.java | 76 +--
.../storage/image/BaseImageStoreDriverImpl.java | 26 +-
.../extensions/api/CreateExtensionCmd.java | 10 +
.../extensions/api/UpdateExtensionCmd.java | 10 +
.../extensions/manager/ExtensionsManagerImpl.java | 98 ++-
.../extensions/api/CreateExtensionCmdTest.java | 14 +
.../extensions/api/UpdateExtensionCmdTest.java | 15 +
.../manager/ExtensionsManagerImplTest.java | 167 ++++-
.../cloudstack/framework/jobs/dao/AsyncJobDao.java | 18 +
.../framework/jobs/dao/AsyncJobDaoImpl.java | 33 +
packaging/el8/cloud.spec | 19 +-
.../manager/BareMetalTemplateAdapter.java | 1 -
.../cloud/hypervisor/kvm/resource/KVMHABase.java | 1 -
.../hypervisor/kvm/resource/KVMHAMonitor.java | 15 +-
.../kvm/resource/LibvirtComputingResource.java | 7 +-
...CheckVMActivityOnStoragePoolCommandWrapper.java | 2 +-
.../LibvirtCheckVirtualMachineCommandWrapper.java | 9 +-
.../kvm/storage/KVMStoragePoolManager.java | 4 +
.../kvm/storage/KVMStorageProcessor.java | 24 +-
.../hypervisor/kvm/storage/LibvirtStoragePool.java | 22 +-
...bvirtCheckVirtualMachineCommandWrapperTest.java | 191 ++++++
.../driver/MinIOObjectStoreDriverImpl.java | 81 ++-
.../driver/MinIOObjectStoreDriverImplTest.java | 7 +-
.../CloudStackPrimaryDataStoreDriverImpl.java | 3 +-
.../datastore/adapter/primera/PrimeraAdapter.java | 1 +
scripts/vm/hypervisor/kvm/kvmsmpheartbeat.sh | 218 ++++++
server/src/main/java/com/cloud/api/ApiDBUtils.java | 10 +-
.../main/java/com/cloud/api/ApiResponseHelper.java | 66 +-
.../java/com/cloud/api/query/QueryManagerImpl.java | 43 +-
.../com/cloud/api/query/ResourceIdSupport.java | 123 ++++
.../com/cloud/api/query/dao/UserVmJoinDaoImpl.java | 27 +-
.../java/com/cloud/api/query/vo/UserVmJoinVO.java | 7 +
.../configuration/ConfigurationManagerImpl.java | 141 ++--
.../cloud/consoleproxy/ConsoleProxyManager.java | 3 -
.../consoleproxy/ConsoleProxyManagerImpl.java | 2 +-
.../java/com/cloud/network/NetworkServiceImpl.java | 26 +-
.../java/com/cloud/network/vpc/VpcManagerImpl.java | 53 +-
.../com/cloud/projects/ProjectManagerImpl.java | 52 +-
.../cloud/resourcelimit/CheckedReservation.java | 117 +++-
.../com/cloud/resourcelimit/ReservationHelper.java | 21 +-
.../resourcelimit/ResourceLimitManagerImpl.java | 212 +++---
.../cloud/storage/ImageStoreUploadMonitorImpl.java | 180 ++++-
.../com/cloud/storage/VolumeApiServiceImpl.java | 752 ++++++++++++---------
.../storage/download/DownloadActiveState.java | 5 +
.../cloud/storage/download/DownloadErrorState.java | 5 +
.../storage/download/DownloadInactiveState.java | 6 +
.../download/DownloadLimitReachedState.java | 54 ++
.../cloud/storage/download/DownloadListener.java | 89 ++-
.../com/cloud/storage/download/DownloadState.java | 6 +-
.../storage/snapshot/SnapshotManagerImpl.java | 238 ++++---
.../cloud/template/HypervisorTemplateAdapter.java | 39 +-
.../com/cloud/template/TemplateAdapterBase.java | 4 +-
.../com/cloud/template/TemplateManagerImpl.java | 309 +++++----
.../java/com/cloud/user/AccountManagerImpl.java | 18 +
.../java/com/cloud/user/DomainManagerImpl.java | 20 +
.../main/java/com/cloud/vm/UserVmManagerImpl.java | 295 ++++----
.../cloud/vm/snapshot/VMSnapshotManagerImpl.java | 29 +-
.../cloudstack/backup/BackupManagerImpl.java | 129 ++--
.../storage/object/BucketApiServiceImpl.java | 114 +++-
.../volume/VolumeImportUnmanageManagerImpl.java | 21 +-
.../cloudstack/vm/UnmanagedVMsManagerImpl.java | 489 +++++++-------
.../com/cloud/api/query/QueryManagerImplTest.java | 2 +-
.../cloud/api/query/dao/UserVmJoinDaoImplTest.java | 4 +
.../com/cloud/network/vpc/VpcManagerImplTest.java | 14 +-
.../resourcelimit/CheckedReservationTest.java | 17 +-
.../ResourceLimitManagerImplTest.java | 112 +--
.../cloud/storage/VolumeApiServiceImplTest.java | 52 +-
.../storage/snapshot/SnapshotManagerImplTest.java | 4 +-
.../storage/snapshot/SnapshotManagerTest.java | 55 +-
.../cloud/template/TemplateManagerImplTest.java | 137 ++--
.../java/com/cloud/user/DomainManagerImplTest.java | 7 +-
.../java/com/cloud/vm/UserVmManagerImplTest.java | 69 +-
.../cloud/vm/snapshot/VMSnapshotManagerTest.java | 8 +-
.../java/com/cloud/vpc/MockNetworkManagerImpl.java | 2 +-
.../cloud/vpc/MockResourceLimitManagerImpl.java | 41 +-
.../cloudstack/backup/BackupManagerTest.java | 194 ++++--
.../storage/object/BucketApiServiceImplTest.java | 137 +++-
.../VolumeImportUnmanageManagerImplTest.java | 3 -
.../cloudstack/vm/UnmanagedVMsManagerImplTest.java | 96 +--
.../storage/resource/HttpUploadServerHandler.java | 2 +
.../resource/NfsSecondaryStorageResource.java | 33 +-
.../storage/template/DownloadManagerImpl.java | 2 +-
ui/public/locales/en.json | 3 +
ui/src/config/section/extension.js | 2 +-
ui/src/views/extension/CreateExtension.vue | 11 +
ui/src/views/extension/UpdateExtension.vue | 17 +-
ui/src/views/storage/CreateVolume.vue | 74 ++
130 files changed, 4142 insertions(+), 2152 deletions(-)
diff --cc api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
index 05c6098bc72,43af4b94015..9ec85734233
--- a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
+++ b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
@@@ -507,8 -501,8 +507,9 @@@ public class ApiConstants
public static final String RECONNECT = "reconnect";
public static final String RECOVER = "recover";
public static final String REPAIR = "repair";
+ public static final String REPETITION_ALLOWED = "repetitionallowed";
public static final String REQUIRES_HVM = "requireshvm";
+ public static final String RESERVED_RESOURCE_DETAILS = "reservedresourcedetails";
public static final String RESOURCES = "resources";
public static final String RESOURCE_COUNT = "resourcecount";
public static final String RESOURCE_NAME = "resourcename";
diff --cc engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
index 77ea965e50a,f5545d7ea43..2ae228adba9
--- a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
+++ b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
@@@ -3124,9 -3125,10 +3125,10 @@@ public class NetworkOrchestrator extend
}
});
- CallContext.current().setEventDetails("Network Id: " + network.getId());
+ CallContext.current().setEventDetails("Network ID: " + network.getUuid());
CallContext.current().putContextParameter(Network.class, network.getUuid());
return network;
+ }
}
@Override
diff --cc engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocator.java
index cd9ab3adb21,4df54398f28..4057f7a051b
--- a/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocator.java
+++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocator.java
@@@ -240,14 -233,10 +233,10 @@@ public abstract class AbstractStoragePo
List<StoragePool> reorderStoragePoolsBasedOnAlgorithm(List<StoragePool> pools, DeploymentPlan plan, Account account) {
String volumeAllocationAlgorithm = VolumeOrchestrationService.VolumeAllocationAlgorithm.value();
- logger.debug("Using volume allocation algorithm {} to reorder pools.", volumeAllocationAlgorithm);
+ logger.info("Using volume allocation algorithm {} to reorder pools.", volumeAllocationAlgorithm);
- if (volumeAllocationAlgorithm.equals("random") || volumeAllocationAlgorithm.equals("userconcentratedpod_random") || (account == null)) {
+ if (volumeAllocationAlgorithm.equals("random") || (account == null)) {
reorderRandomPools(pools);
} else if (StringUtils.equalsAny(volumeAllocationAlgorithm, "userdispersing", "firstfitleastconsumed")) {
- if (logger.isTraceEnabled()) {
- logger.trace("Using reordering algorithm {}", volumeAllocationAlgorithm);
- }
-
if (volumeAllocationAlgorithm.equals("userdispersing")) {
pools = reorderPoolsByNumberOfVolumes(plan, pools, account);
} else {
diff --cc server/src/main/java/com/cloud/api/ApiResponseHelper.java
index bd09d1de48b,67f83dacaad..11ac3d639e9
--- a/server/src/main/java/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/main/java/com/cloud/api/ApiResponseHelper.java
@@@ -39,16 -40,21 +40,12 @@@ import java.util.stream.Collectors
import javax.inject.Inject;
- import com.cloud.domain.dao.DomainDao;
- import com.cloud.user.AccountVO;
- import com.cloud.user.ApiKeyPairState;
- import com.cloud.user.dao.AccountDao;
-import com.cloud.api.query.ResourceIdSupport;
-import com.cloud.bgp.ASNumber;
-import com.cloud.bgp.ASNumberRange;
-import com.cloud.configuration.ConfigurationService;
-import com.cloud.dc.ASNumberRangeVO;
-import com.cloud.dc.ASNumberVO;
-import com.cloud.dc.VlanDetailsVO;
-import com.cloud.dc.dao.ASNumberDao;
-import com.cloud.dc.dao.ASNumberRangeDao;
-import com.cloud.dc.dao.VlanDetailsDao;
-import com.cloud.hypervisor.Hypervisor;
-import com.cloud.network.vpc.VpcGateway;
-import com.cloud.storage.BucketVO;
import org.apache.cloudstack.acl.ControlledEntity;
import org.apache.cloudstack.acl.ControlledEntity.ACLType;
+import org.apache.cloudstack.acl.RoleVO;
+import org.apache.cloudstack.acl.apikeypair.ApiKeyPair;
+import org.apache.cloudstack.acl.apikeypair.ApiKeyPairPermission;
+import org.apache.cloudstack.acl.dao.RoleDao;
import org.apache.cloudstack.affinity.AffinityGroup;
import org.apache.cloudstack.affinity.AffinityGroupResponse;
import org.apache.cloudstack.annotation.AnnotationService;
@@@ -264,6 -270,6 +263,7 @@@ import com.cloud.api.query.vo.NetworkOf
import com.cloud.api.query.vo.ProjectAccountJoinVO;
import com.cloud.api.query.vo.ProjectInvitationJoinVO;
import com.cloud.api.query.vo.ProjectJoinVO;
++import com.cloud.api.query.ResourceIdSupport;
import com.cloud.api.query.vo.ResourceTagJoinVO;
import com.cloud.api.query.vo.SecurityGroupJoinVO;
import com.cloud.api.query.vo.ServiceOfferingJoinVO;
@@@ -297,13 -298,9 +297,14 @@@ import com.cloud.dc.Pod
import com.cloud.dc.StorageNetworkIpRange;
import com.cloud.dc.Vlan;
import com.cloud.dc.Vlan.VlanType;
+import com.cloud.dc.VlanDetailsVO;
import com.cloud.dc.VlanVO;
+import com.cloud.dc.dao.ASNumberDao;
+import com.cloud.dc.dao.ASNumberRangeDao;
+import com.cloud.dc.dao.VlanDetailsDao;
import com.cloud.domain.Domain;
import com.cloud.domain.DomainVO;
++import com.cloud.domain.dao.DomainDao;
import com.cloud.event.Event;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.exception.PermissionDeniedException;
@@@ -421,11 -414,11 +422,14 @@@ import com.cloud.tags.dao.ResourceTagDa
import com.cloud.template.VirtualMachineTemplate;
import com.cloud.user.Account;
import com.cloud.user.AccountManager;
++import com.cloud.user.AccountVO;
++import com.cloud.user.ApiKeyPairState;
import com.cloud.user.SSHKeyPair;
import com.cloud.user.User;
import com.cloud.user.UserAccount;
import com.cloud.user.UserData;
import com.cloud.user.UserStatisticsVO;
++import com.cloud.user.dao.AccountDao;
import com.cloud.user.dao.UserDataDao;
import com.cloud.user.dao.UserStatisticsDao;
import com.cloud.uservm.UserVm;
@@@ -539,9 -532,9 +543,11 @@@ public class ApiResponseHelper implemen
@Inject
RoutedIpv4Manager routedIpv4Manager;
@Inject
+ Site2SiteVpnManager site2SiteVpnManager;
+ @Inject
ResourceIconManager resourceIconManager;
+ @Inject
+ AsyncJobDao asyncJobDao;
public static String getPrettyDomainPath(String path) {
if (path == null) {
@@@ -814,7 -797,7 +820,7 @@@
if (mapCapabilities != null) {
String value = mapCapabilities.get(DataStoreCapabilities.STORAGE_SYSTEM_SNAPSHOT.toString());
-- Boolean supportsStorageSystemSnapshots = new Boolean(value);
++ boolean supportsStorageSystemSnapshots = Boolean.getBoolean(value);
if (supportsStorageSystemSnapshots) {
return DataStoreRole.Primary;
@@@ -5749,78 -5721,13 +5783,88 @@@ protected Map<String, ResourceIcon> get
return consoleSessionResponse;
}
+ @Override
+ public ApiKeyPairResponse createKeyPairResponse(ApiKeyPair keyPair) {
+ ApiKeyPairResponse apiKeyPairResponse = new ApiKeyPairResponse();
+
+ populateApiKeyPairInApiKeyPairResponse(keyPair, apiKeyPairResponse);
+ populateUserInApiKeyPairResponse(keyPair, apiKeyPairResponse);
+
+ AccountVO account = accountDao.findByIdIncludingRemoved(keyPair.getAccountId());
+ apiKeyPairResponse.setAccountId(account.getUuid());
+ apiKeyPairResponse.setAccountName(account.getAccountName());
+ apiKeyPairResponse.setAccountType(account.getType().toString());
+
+ populateDomainInApiKeyPairResponse(account.getDomainId(), apiKeyPairResponse);
+ populateRoleInApiKeyPairResponse(account.getRoleId(), apiKeyPairResponse);
+
+ return apiKeyPairResponse;
+ }
+
+ protected void populateRoleInApiKeyPairResponse(Long roleId, ApiKeyPairResponse apiKeyPairResponse) {
+ RoleVO roleVO = roleDao.findById(roleId);
+ apiKeyPairResponse.setRoleId(roleVO.getUuid());
+ apiKeyPairResponse.setRoleName(roleVO.getName());
+ apiKeyPairResponse.setRoleType(roleVO.getRoleType().name());
+ }
+
+ protected static void populateApiKeyPairInApiKeyPairResponse(ApiKeyPair keyPair, ApiKeyPairResponse apiKeyPairResponse) {
+ apiKeyPairResponse.setName(keyPair.getName());
+ apiKeyPairResponse.setApiKey(keyPair.getApiKey());
+ apiKeyPairResponse.setSecretKey(keyPair.getSecretKey());
+ apiKeyPairResponse.setDescription(keyPair.getDescription());
+ apiKeyPairResponse.setId(keyPair.getUuid());
+ apiKeyPairResponse.setCreated(keyPair.getCreated());
+ apiKeyPairResponse.setStartDate(keyPair.getStartDate());
+ apiKeyPairResponse.setEndDate(keyPair.getEndDate());
+
+ ApiKeyPairState state = ApiKeyPairState.ENABLED;
+ if (keyPair.getRemoved() != null) {
+ state = ApiKeyPairState.REMOVED;
+ } else if (keyPair.hasEndDatePassed()) {
+ state = ApiKeyPairState.EXPIRED;
+ }
+ apiKeyPairResponse.setState(state);
+ }
+
+ protected void populateUserInApiKeyPairResponse(ApiKeyPair keyPair, ApiKeyPairResponse apiKeyPairResponse) {
+ User user = ApiDBUtils.findUserById(keyPair.getUserId());
+ apiKeyPairResponse.setUserId(user.getUuid());
+ apiKeyPairResponse.setUsername(user.getUsername());
+ }
+
+ protected void populateDomainInApiKeyPairResponse(Long domainId, ApiKeyPairResponse apiKeyPairResponse) {
+ DomainVO domainVO = domainDao.findById(domainId);
+ apiKeyPairResponse.setDomainId(domainVO.getUuid());
+ apiKeyPairResponse.setDomainName(domainVO.getName());
+ StringBuilder domainPath = new StringBuilder("ROOT");
+ (domainPath.append(domainVO.getPath())).deleteCharAt(domainPath.length() - 1);
+ apiKeyPairResponse.setDomainPath(domainPath.toString());
+ }
+
+ @Override
+ public ListResponse<BaseRolePermissionResponse> createKeypairPermissionsResponse(final List<ApiKeyPairPermission> permissions) {
+ final ListResponse<BaseRolePermissionResponse> response = new ListResponse<>();
+ final List<BaseRolePermissionResponse> permissionResponses = new ArrayList<>();
+ for (final ApiKeyPairPermission permission : permissions) {
+ BaseRolePermissionResponse permissionResponse = new BaseRolePermissionResponse();
+ permissionResponse.setRule(permission.getRule());
+ permissionResponse.setRulePermission(permission.getPermission());
+ permissionResponse.setDescription(permission.getDescription());
+ permissionResponse.setObjectName("keypermission");
+ permissionResponses.add(permissionResponse);
+ }
+ response.setResponses(permissionResponses);
+ return response;
+ }
++
+ @Override
+ public EntityManager getEntityManager() {
+ return _entityMgr;
+ }
+
+ @Override
+ public AccountManager getAccountManager() {
+ return _accountMgr;
+ }
}
diff --cc server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java
index 156e71e72b8,d798afc644a..1203404c494
--- a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java
@@@ -180,6 -179,6 +180,7 @@@ import com.cloud.user.Account
import com.cloud.user.AccountManager;
import com.cloud.user.ResourceLimitService;
import com.cloud.user.User;
++import com.cloud.utils.DomainHelper;
import com.cloud.utils.NumbersUtil;
import com.cloud.utils.Pair;
import com.cloud.utils.StringUtils;
diff --cc server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java
index 17961dbd955,a92922aeff9..c5d85e6eef6
--- a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java
+++ b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java
@@@ -482,80 -494,83 +494,85 @@@ public class VolumeApiServiceImpl exten
final Long diskOfferingId = cmd.getDiskOfferingId();
String imageStoreUuid = cmd.getImageStoreUuid();
- validateVolume(caller, ownerId, zoneId, volumeName, null, format, diskOfferingId);
-
- return Transaction.execute(new TransactionCallbackWithException<GetUploadParamsResponse, MalformedURLException>() {
- @Override
- public GetUploadParamsResponse doInTransaction(TransactionStatus status) throws MalformedURLException {
-
- VolumeVO volume = persistVolume(owner, zoneId, volumeName, null, format, diskOfferingId, Volume.State.NotUploaded);
-
- final DataStore store = _tmpltMgr.getImageStore(imageStoreUuid, zoneId, volume);
-
- VolumeInfo vol = volFactory.getVolume(volume.getId());
-
- RegisterVolumePayload payload = new RegisterVolumePayload(null, cmd.getChecksum(), format);
- vol.addPayload(payload);
-
- Pair<EndPoint, DataObject> pair = volService.registerVolumeForPostUpload(vol, store);
- EndPoint ep = pair.first();
- DataObject dataObject = pair.second();
-
- GetUploadParamsResponse response = new GetUploadParamsResponse();
-
- String ssvmUrlDomain = _configDao.getValue(Config.SecStorageSecureCopyCert.key());
- String protocol = UseHttpsToUpload.valueIn(zoneId) ? "https" : "http";
-
- String url = ImageStoreUtil.generatePostUploadUrl(ssvmUrlDomain, ep.getPublicAddr(), vol.getUuid(),
- protocol);
- response.setPostURL(new URL(url));
-
- // set the post url, this is used in the monitoring thread to determine the SSVM
- VolumeDataStoreVO volumeStore = _volumeStoreDao.findByVolume(vol.getId());
- assert (volumeStore != null) : "sincle volume is registered, volumestore cannot be null at this stage";
- volumeStore.setExtractUrl(url);
- _volumeStoreDao.persist(volumeStore);
-
- response.setId(UUID.fromString(vol.getUuid()));
-
- int timeout = ImageStoreUploadMonitorImpl.getUploadOperationTimeout();
- DateTime currentDateTime = new DateTime(DateTimeZone.UTC);
- String expires = currentDateTime.plusMinutes(timeout).toString();
- response.setTimeout(expires);
-
- String key = _configDao.getValue(Config.SSVMPSK.key());
- /*
- * encoded metadata using the post upload config key
- */
- TemplateOrVolumePostUploadCommand command = new TemplateOrVolumePostUploadCommand(vol.getId(),
- vol.getUuid(), volumeStore.getInstallPath(), cmd.getChecksum(), vol.getType().toString(),
- vol.getName(), vol.getFormat().toString(), dataObject.getDataStore().getUri(),
- dataObject.getDataStore().getRole().toString(), zoneId);
- command.setLocalPath(volumeStore.getLocalDownloadPath());
- //using the existing max upload size configuration
- command.setProcessTimeout(NumbersUtil.parseLong(_configDao.getValue("vmware.package.ova.timeout"), 3600));
- command.setMaxUploadSize(_configDao.getValue(Config.MaxUploadVolumeSize.key()));
-
- long accountId = vol.getAccountId();
- Account account = _accountDao.findById(accountId);
- Domain domain = domainDao.findById(account.getDomainId());
+ List<Reserver> reservations = new ArrayList<>();
+ try {
+ validateVolume(caller, ownerId, zoneId, volumeName, null, format, diskOfferingId, reservations);
- command.setDefaultMaxSecondaryStorageInGB(_resourceLimitMgr.findCorrectResourceLimitForAccountAndDomain(account, domain, ResourceType.secondary_storage, null));
- command.setAccountId(accountId);
- Gson gson = new GsonBuilder().create();
- String metadata = EncryptionUtil.encodeData(gson.toJson(command), key);
- response.setMetadata(metadata);
+ return Transaction.execute(new TransactionCallbackWithException<GetUploadParamsResponse, MalformedURLException>() {
+ @Override
+ public GetUploadParamsResponse doInTransaction(TransactionStatus status) throws MalformedURLException {
+
+ VolumeVO volume = persistVolume(owner, zoneId, volumeName, null, format, diskOfferingId, Volume.State.NotUploaded);
+
+ final DataStore store = _tmpltMgr.getImageStore(imageStoreUuid, zoneId, volume);
+
+ VolumeInfo vol = volFactory.getVolume(volume.getId());
+
+ RegisterVolumePayload payload = new RegisterVolumePayload(null, cmd.getChecksum(), format);
+ vol.addPayload(payload);
+
+ Pair<EndPoint, DataObject> pair = volService.registerVolumeForPostUpload(vol, store);
+ EndPoint ep = pair.first();
+ DataObject dataObject = pair.second();
+
+ GetUploadParamsResponse response = new GetUploadParamsResponse();
+
+ String ssvmUrlDomain = _configDao.getValue(Config.SecStorageSecureCopyCert.key());
+ String protocol = UseHttpsToUpload.value() ? "https" : "http";
+
+ String url = ImageStoreUtil.generatePostUploadUrl(ssvmUrlDomain, ep.getPublicAddr(), vol.getUuid(), protocol);
+ response.setPostURL(new URL(url));
+
+ // set the post url, this is used in the monitoring thread to determine the SSVM
+ VolumeDataStoreVO volumeStore = _volumeStoreDao.findByVolume(vol.getId());
+ assert (volumeStore != null) : "sincle volume is registered, volumestore cannot be null at this stage";
+ volumeStore.setExtractUrl(url);
+ _volumeStoreDao.persist(volumeStore);
+
+ response.setId(UUID.fromString(vol.getUuid()));
+
+ int timeout = ImageStoreUploadMonitorImpl.getUploadOperationTimeout();
+ DateTime currentDateTime = new DateTime(DateTimeZone.UTC);
+ String expires = currentDateTime.plusMinutes(timeout).toString();
+ response.setTimeout(expires);
+
+ String key = _configDao.getValue(Config.SSVMPSK.key());
+ /*
+ * encoded metadata using the post upload config key
+ */
- TemplateOrVolumePostUploadCommand command = new TemplateOrVolumePostUploadCommand(vol.getId(), vol.getUuid(), volumeStore.getInstallPath(), cmd.getChecksum(), vol.getType().toString(),
- vol.getName(), vol.getFormat().toString(), dataObject.getDataStore().getUri(), dataObject.getDataStore().getRole().toString());
++ TemplateOrVolumePostUploadCommand command = new TemplateOrVolumePostUploadCommand(vol.getId(),
++ vol.getUuid(), volumeStore.getInstallPath(), cmd.getChecksum(), vol.getType().toString(),
++ vol.getName(), vol.getFormat().toString(), dataObject.getDataStore().getUri(),
++ dataObject.getDataStore().getRole().toString(), zoneId);
+ command.setLocalPath(volumeStore.getLocalDownloadPath());
+ //using the existing max upload size configuration
+ command.setProcessTimeout(NumbersUtil.parseLong(_configDao.getValue("vmware.package.ova.timeout"), 3600));
+ command.setMaxUploadSize(_configDao.getValue(Config.MaxUploadVolumeSize.key()));
+
+ long accountId = vol.getAccountId();
+ Account account = _accountDao.findById(accountId);
+ Domain domain = domainDao.findById(account.getDomainId());
+
+ command.setDefaultMaxSecondaryStorageInBytes(_resourceLimitMgr.findCorrectResourceLimitForAccountAndDomain(account, domain, ResourceType.secondary_storage, null));
+ command.setAccountId(accountId);
+ Gson gson = new GsonBuilder().create();
+ String metadata = EncryptionUtil.encodeData(gson.toJson(command), key);
+ response.setMetadata(metadata);
+
+ /*
+ * signature calculated on the url, expiry, metadata.
+ */
+ response.setSignature(EncryptionUtil.generateSignature(metadata + url + expires, key));
+ return response;
+ }
+ });
- /*
- * signature calculated on the url, expiry, metadata.
- */
- response.setSignature(EncryptionUtil.generateSignature(metadata + url + expires, key));
- return response;
- }
- });
+ } finally {
+ ReservationHelper.closeAll(reservations);
+ }
}
- private boolean validateVolume(Account caller, long ownerId, Long zoneId, String volumeName, String url, String format, Long diskOfferingId) throws ResourceAllocationException {
+ private boolean validateVolume(Account caller, long ownerId, Long zoneId, String volumeName, String url, String format, Long diskOfferingId, List<Reserver> reservations) throws ResourceAllocationException {
// permission check
Account volumeOwner = _accountMgr.getActiveAccountById(ownerId);
@@@ -1699,10 -1762,10 +1764,10 @@@
*
* A volume can be destroyed if it is not in any of the following states.
* <ul>
-- * <li> {@value Volume.State#Destroy};
-- * <li> {@value Volume.State#Expunging};
-- * <li> {@value Volume.State#Expunged};
-- * <li> {@value Volume.State#Allocated}.
++ * <li> {code}Volume.State#Destroy{code};
++ * <li> {code}Volume.State#Expunging{code};
++ * <li> {code}Volume.State#Expunged{code};
++ * <li> {code}Volume.State#Allocated{code}.
* </ul>
*
* The volume is destroyed via {@link VolumeService#destroyVolume(long)} method.
@@@ -2118,98 -2186,102 +2188,145 @@@
newSize = ((PrimaryDataStoreDriver) dataStore.getDriver()).getVolumeSizeRequiredOnPool(newSize, null, newDiskOffering.getEncrypt());
}
- validateVolumeResizeWithSize(volume, currentSize, newSize, shrinkOk, existingDiskOffering, newDiskOffering);
+ List<Reserver> reservations = new ArrayList<>();
+ try {
+ validateVolumeResizeWithSize(volume, currentSize, newSize, shrinkOk, existingDiskOffering, newDiskOffering, reservations);
- /* If this volume has never been beyond allocated state, short circuit everything and simply update the database. */
- // We need to publish this event to usage_volume table
- if (volume.getState() == Volume.State.Allocated) {
- logger.debug("Volume {} is in the allocated state, but has never been created. Simply updating database with new size and IOPS.", volume);
+ /* If this volume has never been beyond allocated state, short circuit everything and simply update the database. */
+ // We need to publish this event to usage_volume table
+ if (volume.getState() == Volume.State.Allocated) {
+ logger.debug("Volume {} is in the allocated state, but has never been created. Simply updating database with new size and IOPS.", volume);
- volume.setSize(newSize);
- volume.setMinIops(newMinIops);
- volume.setMaxIops(newMaxIops);
- volume.setHypervisorSnapshotReserve(newHypervisorSnapshotReserve);
+ volume.setSize(newSize);
+ volume.setMinIops(newMinIops);
+ volume.setMaxIops(newMaxIops);
+ volume.setHypervisorSnapshotReserve(newHypervisorSnapshotReserve);
- if (newDiskOffering != null) {
- volume.setDiskOfferingId(newDiskOfferingId);
- _volumeMgr.saveVolumeDetails(newDiskOfferingId, volume.getId());
- }
+ if (newDiskOffering != null) {
+ volume.setDiskOfferingId(newDiskOfferingId);
+ _volumeMgr.saveVolumeDetails(newDiskOfferingId, volume.getId());
+ }
- _volsDao.update(volume.getId(), volume);
- _resourceLimitMgr.updateVolumeResourceCountForDiskOfferingChange(volume.getAccountId(), volume.isDisplayVolume(), currentSize, newSize,
- existingDiskOffering, newDiskOffering);
+ _volsDao.update(volume.getId(), volume);
+ _resourceLimitMgr.updateVolumeResourceCountForDiskOfferingChange(volume.getAccountId(), volume.isDisplayVolume(), currentSize, newSize,
+ existingDiskOffering, newDiskOffering);
- if (currentSize != newSize) {
- UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_RESIZE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(),
- volume.getDiskOfferingId(), volume.getTemplateId(), volume.getSize(), Volume.class.getName(), volume.getUuid());
+ if (currentSize != newSize) {
+ UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_RESIZE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(),
+ volume.getDiskOfferingId(), volume.getTemplateId(), volume.getSize(), Volume.class.getName(), volume.getUuid());
+ }
+ return volume;
}
- return volume;
- }
-
+ if (currentSize != newSize || !compareEqualsIncludingNullOrZero(newMaxIops, volume.getMaxIops()) || !compareEqualsIncludingNullOrZero(newMinIops, volume.getMinIops())) {
+ volumeResizeRequired = true;
+ validateVolumeReadyStateAndHypervisorChecks(volume, currentSize, newSize);
+ }
-
+ StoragePoolVO existingStoragePool = _storagePoolDao.findById(volume.getPoolId());
- if (currentSize != newSize || !compareEqualsIncludingNullOrZero(newMaxIops, volume.getMaxIops()) || !compareEqualsIncludingNullOrZero(newMinIops, volume.getMinIops())) {
- volumeResizeRequired = true;
- validateVolumeReadyStateAndHypervisorChecks(volume, currentSize, newSize);
- }
+ Pair<List<? extends StoragePool>, List<? extends StoragePool>> poolsPair = managementService.listStoragePoolsForSystemMigrationOfVolume(volume.getId(), newDiskOffering.getId(), currentSize, newMinIops, newMaxIops, true, false);
+ List<? extends StoragePool> suitableStoragePools = poolsPair.second();
-
+ if (!suitableStoragePools.stream().anyMatch(p -> (p.getId() == existingStoragePool.getId()))) {
+ volumeMigrateRequired = true;
+ if (!autoMigrateVolume) {
+ throw new InvalidParameterValueException(String.format("Failed to change offering for volume %s since automigrate is set to false but volume needs to migrated", volume.getUuid()));
+ }
+ }
- StoragePoolVO existingStoragePool = _storagePoolDao.findById(volume.getPoolId());
+ if (!volumeMigrateRequired && !volumeResizeRequired) {
+ _volsDao.updateDiskOffering(volume.getId(), newDiskOffering.getId());
+ volume = _volsDao.findById(volume.getId());
+ updateStorageWithTheNewDiskOffering(volume, newDiskOffering);
- Pair<List<? extends StoragePool>, List<? extends StoragePool>> poolsPair = managementService.listStoragePoolsForSystemMigrationOfVolume(volume.getId(), newDiskOffering.getId(), currentSize, newMinIops, newMaxIops, true, false);
- List<? extends StoragePool> suitableStoragePools = poolsPair.second();
+ return volume;
+ }
- if (!suitableStoragePools.stream().anyMatch(p -> (p.getId() == existingStoragePool.getId()))) {
- volumeMigrateRequired = true;
- if (!autoMigrateVolume) {
- throw new InvalidParameterValueException(String.format("Failed to change offering for volume %s since automigrate is set to false but volume needs to migrated", volume.getUuid()));
++ if (volumeMigrateRequired) {
++ if (CollectionUtils.isEmpty(poolsPair.first()) && CollectionUtils.isEmpty(poolsPair.second())) {
++ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Volume change offering operation failed for volume: %s as no suitable pool(s) found for migrating to support new disk offering", volume));
++ }
++ final Long newSizeFinal = newSize;
++ List<? extends StoragePool> suitableStoragePoolsWithEnoughSpace = suitableStoragePools.stream().filter(pool -> storageMgr.storagePoolHasEnoughSpaceForResize(pool, 0L, newSizeFinal)).collect(Collectors.toList());
++ if (CollectionUtils.isEmpty(suitableStoragePoolsWithEnoughSpace)) {
++ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Volume change offering operation failed for volume: %s as no suitable pool(s) with enough space found for volume migration.", volume));
++ }
++ Collections.shuffle(suitableStoragePoolsWithEnoughSpace);
++ MigrateVolumeCmd migrateVolumeCmd = new MigrateVolumeCmd(volume.getId(), suitableStoragePoolsWithEnoughSpace.get(0).getId(), newDiskOffering.getId(), true);
++ String volumeUuid = volume.getUuid();
++ try {
++ Volume result = migrateVolume(migrateVolumeCmd);
++ volume = (result != null) ? _volsDao.findById(result.getId()) : null;
++ if (volume == null) {
++ throw new CloudRuntimeException("Change offering for the volume failed.");
++ }
++ } catch (Exception e) {
++ logger.error("Volume change offering operation failed for volume ID: {} migration failed to storage pool {} due to {}", volumeUuid, suitableStoragePoolsWithEnoughSpace.get(0).getId(), e.getMessage());
++ throw new CloudRuntimeException("Change offering for the volume failed.", e);
++ }
+ }
- }
+
- if (!volumeMigrateRequired && !volumeResizeRequired) {
- _volsDao.updateDiskOffering(volume.getId(), newDiskOffering.getId());
- volume = _volsDao.findById(volume.getId());
- updateStorageWithTheNewDiskOffering(volume, newDiskOffering);
++ if (volumeResizeRequired) {
++ // refresh volume data
++ volume = _volsDao.findById(volume.getId());
++ try {
++ volume = resizeVolumeInternal(volume, newDiskOffering, currentSize, newSize, newMinIops, newMaxIops, newHypervisorSnapshotReserve, shrinkOk);
++ } catch (Exception e) {
++ if (volumeMigrateRequired) {
++ logger.warn(String.format("Volume change offering operation succeeded for volume ID: %s but volume resize operation failed, so please try resize volume operation separately", volume.getUuid()));
++ } else {
++ throw new CloudRuntimeException(String.format("Volume disk offering change operation failed for volume ID [%s] because the volume resize operation failed.", volume.getUuid()));
++ }
++ }
++ }
+
- return volume;
- }
++ if (!volumeMigrateRequired && !volumeResizeRequired) {
++ _volsDao.updateDiskOffering(volume.getId(), newDiskOffering.getId());
++ volume = _volsDao.findById(volume.getId());
++ updateStorageWithTheNewDiskOffering(volume, newDiskOffering);
+
- if (volumeMigrateRequired) {
- if (CollectionUtils.isEmpty(poolsPair.first()) && CollectionUtils.isEmpty(poolsPair.second())) {
- throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Volume change offering operation failed for volume: %s as no suitable pool(s) found for migrating to support new disk offering", volume));
- }
- final Long newSizeFinal = newSize;
- List<? extends StoragePool> suitableStoragePoolsWithEnoughSpace = suitableStoragePools.stream().filter(pool -> storageMgr.storagePoolHasEnoughSpaceForResize(pool, 0L, newSizeFinal)).collect(Collectors.toList());
- if (CollectionUtils.isEmpty(suitableStoragePoolsWithEnoughSpace)) {
- throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Volume change offering operation failed for volume: %s as no suitable pool(s) with enough space found for volume migration.", volume));
++ return volume;
+ }
- Collections.shuffle(suitableStoragePoolsWithEnoughSpace);
- MigrateVolumeCmd migrateVolumeCmd = new MigrateVolumeCmd(volume.getId(), suitableStoragePoolsWithEnoughSpace.get(0).getId(), newDiskOffering.getId(), true);
- String volumeUuid = volume.getUuid();
- try {
- Volume result = migrateVolume(migrateVolumeCmd);
- volume = (result != null) ? _volsDao.findById(result.getId()) : null;
- if (volume == null) {
- throw new CloudRuntimeException("Change offering for the volume failed.");
++
+ if (volumeMigrateRequired) {
+ if (CollectionUtils.isEmpty(poolsPair.first()) && CollectionUtils.isEmpty(poolsPair.second())) {
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Volume change offering operation failed for volume: %s as no suitable pool(s) found for migrating to support new disk offering", volume));
+ }
+ final Long newSizeFinal = newSize;
+ List<? extends StoragePool> suitableStoragePoolsWithEnoughSpace = suitableStoragePools.stream().filter(pool -> storageMgr.storagePoolHasEnoughSpaceForResize(pool, 0L, newSizeFinal)).collect(Collectors.toList());
+ if (CollectionUtils.isEmpty(suitableStoragePoolsWithEnoughSpace)) {
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Volume change offering operation failed for volume: %s as no suitable pool(s) with enough space found for volume migration.", volume));
+ }
+ Collections.shuffle(suitableStoragePoolsWithEnoughSpace);
+ MigrateVolumeCmd migrateVolumeCmd = new MigrateVolumeCmd(volume.getId(), suitableStoragePoolsWithEnoughSpace.get(0).getId(), newDiskOffering.getId(), true);
+ try {
+ Volume result = migrateVolume(migrateVolumeCmd);
+ volume = (result != null) ? _volsDao.findById(result.getId()) : null;
+ if (volume == null) {
+ throw new CloudRuntimeException(String.format("Volume change offering operation failed for volume: %s migration failed to storage pool %s", volume, suitableStoragePools.get(0)));
+ }
+ } catch (Exception e) {
+ throw new CloudRuntimeException(String.format("Volume change offering operation failed for volume: %s migration failed to storage pool %s due to %s", volume, suitableStoragePools.get(0), e.getMessage()));
}
- } catch (Exception e) {
- logger.error("Volume change offering operation failed for volume ID: {} migration failed to storage pool {} due to {}", volumeUuid, suitableStoragePoolsWithEnoughSpace.get(0).getId(), e.getMessage());
- throw new CloudRuntimeException("Change offering for the volume failed.", e);
}
- }
- if (volumeResizeRequired) {
- // refresh volume data
- volume = _volsDao.findById(volume.getId());
- try {
- volume = resizeVolumeInternal(volume, newDiskOffering, currentSize, newSize, newMinIops, newMaxIops, newHypervisorSnapshotReserve, shrinkOk);
- } catch (Exception e) {
- if (volumeMigrateRequired) {
- logger.warn(String.format("Volume change offering operation succeeded for volume ID: %s but volume resize operation failed, so please try resize volume operation separately", volume.getUuid()));
- } else {
- throw new CloudRuntimeException(String.format("Volume disk offering change operation failed for volume ID [%s] because the volume resize operation failed.", volume.getUuid()));
+ if (volumeResizeRequired) {
+ // refresh volume data
+ volume = _volsDao.findById(volume.getId());
+ try {
+ volume = resizeVolumeInternal(volume, newDiskOffering, currentSize, newSize, newMinIops, newMaxIops, newHypervisorSnapshotReserve, shrinkOk);
+ } catch (Exception e) {
+ if (volumeMigrateRequired) {
+ logger.warn(String.format("Volume change offering operation succeeded for volume ID: %s but volume resize operation failed, so please try resize volume operation separately", volume.getUuid()));
+ } else {
+ throw new CloudRuntimeException(String.format("Volume change offering operation failed for volume ID: %s due to resize volume operation failed", volume.getUuid()));
+ }
}
}
- }
- return volume;
+ return volume;
+
+ } finally {
+ ReservationHelper.closeAll(reservations);
+ }
}
private void updateStorageWithTheNewDiskOffering(VolumeVO volume, DiskOfferingVO newDiskOffering) {
diff --cc server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
index 9e325fdefcf,dbc28cb2d7c..0242243af3a
--- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
@@@ -60,9 -60,7 +60,6 @@@ import javax.naming.ConfigurationExcept
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
- import com.cloud.serializer.GsonHelper;
- import com.cloud.storage.SnapshotPolicyVO;
- import com.cloud.storage.dao.SnapshotPolicyDao;
-import com.cloud.resourcelimit.ReservationHelper;
import org.apache.cloudstack.acl.ControlledEntity;
import org.apache.cloudstack.acl.ControlledEntity.ACLType;
import org.apache.cloudstack.acl.SecurityChecker.AccessType;
@@@ -315,8 -314,9 +314,10 @@@ import com.cloud.org.Grouping
import com.cloud.resource.ResourceManager;
import com.cloud.resource.ResourceState;
import com.cloud.resourcelimit.CheckedReservation;
++import com.cloud.resourcelimit.ReservationHelper;
++import com.cloud.serializer.GsonHelper;
import com.cloud.server.ManagementService;
import com.cloud.server.ResourceTag;
-import com.cloud.server.StatsCollector;
import com.cloud.service.ServiceOfferingVO;
import com.cloud.service.dao.ServiceOfferingDao;
import com.cloud.service.dao.ServiceOfferingDetailsDao;
@@@ -628,17 -634,10 +631,20 @@@ public class UserVmManagerImpl extends
NetworkService networkService;
@Inject
SnapshotDataFactory snapshotDataFactory;
+ @Inject
+ private OrchestrationService _orchSrvc;
+ @Inject
+ private VolumeOrchestrationService volumeMgr;
+ @Inject
+ private ManagementService _mgr;
+ @Inject
+ private UserDataManager userDataManager;
+ @Inject
+ VnfTemplateManager vnfTemplateManager;
+ @Inject
+ ExtensionHelper extensionHelper;
+
private ScheduledExecutorService _executor = null;
private ScheduledExecutorService _vmIpFetchExecutor = null;
private int _expungeInterval;
diff --cc server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java
index ccacb82236c,152d6286969..090f702c466
--- a/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java
+++ b/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java
@@@ -89,7 -86,10 +90,9 @@@ import org.apache.commons.lang.math.Num
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
+ import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
+ import org.apache.commons.lang3.builder.ToStringStyle;
-import com.amazonaws.util.CollectionUtils;
import com.cloud.alert.AlertManager;
import com.cloud.api.ApiDispatcher;
import com.cloud.api.ApiGsonHelper;
@@@ -243,7 -240,7 +245,9 @@@ public class BackupManagerImpl extends
@Inject
private GuestOSDao _guestOSDao;
@Inject
+ private DomainHelper domainHelper;
++ @Inject
+ ReservationDao reservationDao;
private AsyncJobDispatcher asyncJobDispatcher;
private Timer backupTimer;
diff --cc server/src/test/java/org/apache/cloudstack/backup/BackupManagerTest.java
index f5ec79fbeaf,1864eb81d5a..e486abc4e7a
--- a/server/src/test/java/org/apache/cloudstack/backup/BackupManagerTest.java
+++ b/server/src/test/java/org/apache/cloudstack/backup/BackupManagerTest.java
@@@ -16,9 -16,73 +16,77 @@@
// under the License.
package org.apache.cloudstack.backup;
+ import static org.junit.Assert.assertEquals;
+ import static org.junit.Assert.assertFalse;
+ import static org.junit.Assert.assertNull;
+ import static org.junit.Assert.assertTrue;
+ import static org.junit.Assert.fail;
+ import static org.mockito.ArgumentMatchers.any;
+ import static org.mockito.ArgumentMatchers.anyInt;
+ import static org.mockito.ArgumentMatchers.anyString;
+ import static org.mockito.Mockito.atLeastOnce;
+ import static org.mockito.Mockito.doNothing;
+ import static org.mockito.Mockito.doReturn;
+ import static org.mockito.Mockito.mock;
+ import static org.mockito.Mockito.never;
+ import static org.mockito.Mockito.times;
+ import static org.mockito.Mockito.verify;
+ import static org.mockito.Mockito.when;
+
+ import java.util.ArrayList;
+ import java.util.Collections;
+ import java.util.HashMap;
+ import java.util.List;
+ import java.util.Map;
+ import java.util.Optional;
+ import java.util.TimeZone;
+ import java.util.UUID;
+
+ import org.junit.After;
+ import org.junit.Assert;
+ import org.junit.Before;
+ import org.junit.Test;
+ import org.junit.runner.RunWith;
++import org.mockito.ArgumentCaptor;
+ import org.mockito.InjectMocks;
+ import org.mockito.Mock;
+ import org.mockito.MockedStatic;
+ import org.mockito.Mockito;
+ import org.mockito.MockitoAnnotations;
+ import org.mockito.Spy;
+ import org.mockito.junit.MockitoJUnitRunner;
+ import org.mockito.stubbing.Answer;
+ import org.springframework.test.util.ReflectionTestUtils;
+
+ import org.apache.cloudstack.api.ApiConstants;
+ import org.apache.cloudstack.api.ServerApiException;
++import org.apache.cloudstack.api.command.admin.backup.CloneBackupOfferingCmd;
+ import org.apache.cloudstack.api.command.admin.backup.ImportBackupOfferingCmd;
+ import org.apache.cloudstack.api.command.admin.backup.UpdateBackupOfferingCmd;
+ import org.apache.cloudstack.api.command.user.backup.CreateBackupCmd;
+ import org.apache.cloudstack.api.command.user.backup.CreateBackupScheduleCmd;
+ import org.apache.cloudstack.api.command.user.backup.DeleteBackupScheduleCmd;
++import org.apache.cloudstack.api.command.user.backup.ListBackupOfferingsCmd;
+ import org.apache.cloudstack.api.command.user.backup.ListBackupScheduleCmd;
+ import org.apache.cloudstack.api.response.BackupResponse;
+ import org.apache.cloudstack.backup.dao.BackupDao;
+ import org.apache.cloudstack.backup.dao.BackupDetailsDao;
++import org.apache.cloudstack.backup.dao.BackupOfferingDetailsDao;
+ import org.apache.cloudstack.backup.dao.BackupOfferingDao;
+ import org.apache.cloudstack.backup.dao.BackupScheduleDao;
+ import org.apache.cloudstack.context.CallContext;
+ import org.apache.cloudstack.framework.config.ConfigKey;
+ import org.apache.cloudstack.framework.config.impl.ConfigDepotImpl;
+ import org.apache.cloudstack.framework.jobs.AsyncJobManager;
+ import org.apache.cloudstack.framework.jobs.impl.AsyncJobVO;
+ import org.apache.cloudstack.reservation.ReservationVO;
+ import org.apache.cloudstack.reservation.dao.ReservationDao;
+ import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+ import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+
+ import com.cloud.alert.AlertManager;
import com.cloud.api.query.dao.UserVmJoinDao;
import com.cloud.api.query.vo.UserVmJoinVO;
- import com.cloud.alert.AlertManager;
import com.cloud.capacity.CapacityVO;
import com.cloud.configuration.Resource;
import com.cloud.dc.DataCenter;
@@@ -60,8 -124,9 +128,10 @@@ import com.cloud.user.ResourceLimitServ
import com.cloud.user.User;
import com.cloud.user.dao.AccountDao;
import com.cloud.utils.DateUtil;
+import com.cloud.utils.DomainHelper;
import com.cloud.utils.Pair;
+ import com.cloud.utils.StringUtils;
+ import com.cloud.utils.db.DbUtil;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.exception.CloudRuntimeException;