From 25348405a151a867b7138cfefd512041ebb1ff60 Mon Sep 17 00:00:00 2001 From: Daan Hoogland Date: Tue, 13 Feb 2024 10:06:19 +0100 Subject: [PATCH 1/4] list by isEncrypted --- .../main/java/org/apache/cloudstack/api/ApiConstants.java | 1 + .../cloudstack/api/command/user/volume/ListVolumesCmd.java | 7 +++++++ .../src/main/java/com/cloud/storage/dao/VolumeDao.java | 1 + .../src/main/java/com/cloud/storage/dao/VolumeDaoImpl.java | 7 +++++++ .../main/java/com/cloud/api/query/QueryManagerImpl.java | 4 ++-- 5 files changed, 18 insertions(+), 2 deletions(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java index 7565b679e587..7512120cc00a 100644 --- a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java +++ b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java @@ -263,6 +263,7 @@ public class ApiConstants { public static final String IS_CLEANUP_REQUIRED = "iscleanuprequired"; public static final String IS_DYNAMIC = "isdynamic"; public static final String IS_EDGE = "isedge"; + public static final String IS_ENCRYPTED = "isencrypted"; public static final String IS_EXTRACTABLE = "isextractable"; public static final String IS_FEATURED = "isfeatured"; public static final String IS_PORTABLE = "isportable"; diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java index b62a909d71fd..b11ac2ca5c5b 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java @@ -96,6 +96,9 @@ public class ListVolumesCmd extends BaseListRetrieveOnlyResourceCountCmd impleme @Parameter(name = ApiConstants.STATE, type = CommandType.STRING, description = "state of the volume. Possible values are: Ready, Allocated, Destroy, Expunging, Expunged.") private String state; + @Parameter(name = ApiConstants.IS_ENCRYPTED, type = CommandType.BOOLEAN, description = "list only volumes that are encrypted", since = "4.20", + authorized = { RoleType.Admin }) + private Boolean encrypted; ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -153,6 +156,10 @@ public String getState() { return state; } + public Boolean isEncrypted() { + return encrypted; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDao.java b/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDao.java index be6588e3189f..22eaa07c9819 100644 --- a/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDao.java +++ b/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDao.java @@ -18,6 +18,7 @@ import java.util.Date; import java.util.List; +import java.util.Set; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.storage.ScopeType; diff --git a/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDaoImpl.java b/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDaoImpl.java index a773a9502ce2..dfd44e99070d 100644 --- a/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDaoImpl.java +++ b/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDaoImpl.java @@ -16,12 +16,14 @@ // under the License. package com.cloud.storage.dao; +import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; import java.util.Date; +import java.util.HashSet; import java.util.List; import javax.inject.Inject; @@ -67,6 +69,7 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol protected final SearchBuilder RootDiskStateSearch; private final SearchBuilder storeAndInstallPathSearch; private final SearchBuilder volumeIdSearch; + private final SearchBuilder encryptedIdSearch; protected GenericSearchBuilder CountByAccount; protected GenericSearchBuilder primaryStorageSearch; protected GenericSearchBuilder primaryStorageSearch2; @@ -489,6 +492,10 @@ public VolumeDaoImpl() { volumeIdSearch.and("idIN", volumeIdSearch.entity().getId(), Op.IN); volumeIdSearch.done(); + encryptedIdSearch = createSearchBuilder(); + encryptedIdSearch.and("encryptionMethod", encryptedIdSearch.entity().getId(), Op.NNULL); + encryptedIdSearch.done(); + poolAndPathSearch = createSearchBuilder(); poolAndPathSearch.and("poolId", poolAndPathSearch.entity().getPoolId(), Op.EQ); poolAndPathSearch.and("path", poolAndPathSearch.entity().getPath(), Op.EQ); diff --git a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java index dc591e8f30c0..7da0512a3e40 100644 --- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java @@ -2396,7 +2396,7 @@ private Pair, Integer> searchForVolumesInternal(ListVolumesCm private Pair, Integer> searchForVolumeIdsAndCount(ListVolumesCmd cmd) { Account caller = CallContext.current().getCallingAccount(); - List permittedAccounts = new ArrayList(); + List permittedAccounts = new ArrayList<>(); Long id = cmd.getId(); Long vmInstanceId = cmd.getVirtualMachineId(); @@ -2416,7 +2416,7 @@ private Pair, Integer> searchForVolumeIdsAndCount(ListVolumesCmd cmd) List ids = getIdsListFromCmd(cmd.getId(), cmd.getIds()); - Ternary domainIdRecursiveListProject = new Ternary(cmd.getDomainId(), cmd.isRecursive(), null); + Ternary domainIdRecursiveListProject = new Ternary<>(cmd.getDomainId(), cmd.isRecursive(), null); accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, cmd.listAll(), false); Long domainId = domainIdRecursiveListProject.first(); Boolean isRecursive = domainIdRecursiveListProject.second(); From d561e13005339089699a46c5560e5f3f664c01ab Mon Sep 17 00:00:00 2001 From: Daan Hoogland Date: Tue, 30 Apr 2024 12:10:25 +0200 Subject: [PATCH 2/4] use filter on VO and cleanup --- .../src/main/java/com/cloud/storage/dao/VolumeDao.java | 4 ++-- .../main/java/com/cloud/storage/dao/VolumeDaoImpl.java | 8 -------- .../main/java/com/cloud/api/query/QueryManagerImpl.java | 7 +++++++ 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDao.java b/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDao.java index 22eaa07c9819..7aec8f02c761 100644 --- a/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDao.java +++ b/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDao.java @@ -18,7 +18,6 @@ import java.util.Date; import java.util.List; -import java.util.Set; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.storage.ScopeType; @@ -113,7 +112,8 @@ public interface VolumeDao extends GenericDao, StateDao virtualRouters); diff --git a/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDaoImpl.java b/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDaoImpl.java index dfd44e99070d..be1a7e01b4e2 100644 --- a/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDaoImpl.java +++ b/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDaoImpl.java @@ -16,14 +16,12 @@ // under the License. package com.cloud.storage.dao; -import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; import java.util.Date; -import java.util.HashSet; import java.util.List; import javax.inject.Inject; @@ -69,7 +67,6 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol protected final SearchBuilder RootDiskStateSearch; private final SearchBuilder storeAndInstallPathSearch; private final SearchBuilder volumeIdSearch; - private final SearchBuilder encryptedIdSearch; protected GenericSearchBuilder CountByAccount; protected GenericSearchBuilder primaryStorageSearch; protected GenericSearchBuilder primaryStorageSearch2; @@ -78,7 +75,6 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol @Inject ResourceTagDao _tagsDao; - protected static final String SELECT_VM_SQL = "SELECT DISTINCT instance_id from volumes v where v.host_id = ? and v.mirror_state = ?"; // need to account for zone-wide primary storage where storage_pool has // null-value pod and cluster, where hypervisor information is stored in // storage_pool @@ -492,10 +488,6 @@ public VolumeDaoImpl() { volumeIdSearch.and("idIN", volumeIdSearch.entity().getId(), Op.IN); volumeIdSearch.done(); - encryptedIdSearch = createSearchBuilder(); - encryptedIdSearch.and("encryptionMethod", encryptedIdSearch.entity().getId(), Op.NNULL); - encryptedIdSearch.done(); - poolAndPathSearch = createSearchBuilder(); poolAndPathSearch.and("poolId", poolAndPathSearch.entity().getPoolId(), Op.EQ); poolAndPathSearch.and("path", poolAndPathSearch.entity().getPath(), Op.EQ); diff --git a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java index 7da0512a3e40..6da82ad2d5c4 100644 --- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java @@ -2436,6 +2436,13 @@ private Pair, Integer> searchForVolumeIdsAndCount(ListVolumesCmd cmd) volumeSearchBuilder.and("uuid", volumeSearchBuilder.entity().getUuid(), SearchCriteria.Op.NNULL); volumeSearchBuilder.and("instanceId", volumeSearchBuilder.entity().getInstanceId(), SearchCriteria.Op.EQ); volumeSearchBuilder.and("dataCenterId", volumeSearchBuilder.entity().getDataCenterId(), SearchCriteria.Op.EQ); + if (cmd.isEncrypted() != null) { + if (cmd.isEncrypted()) { + volumeSearchBuilder.and("encryptFormat", volumeSearchBuilder.entity().getEncryptFormat(), SearchCriteria.Op.NNULL); + } else { + volumeSearchBuilder.and("encryptFormat", volumeSearchBuilder.entity().getEncryptFormat(), SearchCriteria.Op.NULL); + } + } if (keyword != null) { volumeSearchBuilder.and().op("keywordName", volumeSearchBuilder.entity().getName(), SearchCriteria.Op.LIKE); From d4f99cc7e4eb60dc1ed1512ed1ab212ac123f08f Mon Sep 17 00:00:00 2001 From: Daan Hoogland Date: Mon, 10 Jun 2024 15:26:15 +0200 Subject: [PATCH 3/4] add encryption type to volume response --- .../apache/cloudstack/api/response/VolumeResponse.java | 8 ++++---- .../java/com/cloud/api/query/dao/VolumeJoinDaoImpl.java | 3 ++- .../main/java/com/cloud/api/query/vo/VolumeJoinVO.java | 7 +++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/response/VolumeResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/VolumeResponse.java index 2ddc5fd097e6..726c9adf8a3c 100644 --- a/api/src/main/java/org/apache/cloudstack/api/response/VolumeResponse.java +++ b/api/src/main/java/org/apache/cloudstack/api/response/VolumeResponse.java @@ -298,8 +298,8 @@ public class VolumeResponse extends BaseResponseWithTagInformation implements Co private Map volumeRepairResult; @SerializedName(ApiConstants.ENCRYPT_FORMAT) - @Param(description = "the encrypt format of the volume", since = "4.19.1") - private String encryptFormat; + @Param(description = "the format of the disk encryption if applicable", since = "4.19.1") + private String encryptionFormat; public String getPath() { return path; @@ -847,7 +847,7 @@ public void setVolumeRepairResult(Map volumeRepairResult) { this.volumeRepairResult = volumeRepairResult; } - public void setEncryptFormat(String encryptFormat) { - this.encryptFormat = encryptFormat; + public void setEncryptionFormat(String encryptionFormat) { + this.encryptionFormat = encryptionFormat; } } diff --git a/server/src/main/java/com/cloud/api/query/dao/VolumeJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/VolumeJoinDaoImpl.java index c4e4ba223d81..e309a7534a3a 100644 --- a/server/src/main/java/com/cloud/api/query/dao/VolumeJoinDaoImpl.java +++ b/server/src/main/java/com/cloud/api/query/dao/VolumeJoinDaoImpl.java @@ -180,7 +180,7 @@ public VolumeResponse newVolumeResponse(ResponseView view, VolumeJoinVO volume) if (view == ResponseView.Full) { volResponse.setPath(volume.getPath()); - volResponse.setEncryptFormat(volume.getEncryptFormat()); + volResponse.setEncryptionFormat(volume.getEncryptionFormat()); } // populate owner. @@ -279,6 +279,7 @@ public VolumeResponse newVolumeResponse(ResponseView view, VolumeJoinVO volume) volResponse.setObjectName("volume"); volResponse.setExternalUuid(volume.getExternalUuid()); + volResponse.setEncryptionFormat(volume.getEncryptionFormat()); return volResponse; } diff --git a/server/src/main/java/com/cloud/api/query/vo/VolumeJoinVO.java b/server/src/main/java/com/cloud/api/query/vo/VolumeJoinVO.java index a8fcbfe824e0..ee82f809aaf3 100644 --- a/server/src/main/java/com/cloud/api/query/vo/VolumeJoinVO.java +++ b/server/src/main/java/com/cloud/api/query/vo/VolumeJoinVO.java @@ -276,7 +276,7 @@ public class VolumeJoinVO extends BaseViewWithTagInformationVO implements Contro private String externalUuid = null; @Column(name = "encrypt_format") - private String encryptFormat; + private String encryptionFormat = null; public VolumeJoinVO() { } @@ -613,13 +613,12 @@ public void setExternalUuid(String externalUuid) { this.externalUuid = externalUuid; } - public String getEncryptFormat() { - return encryptFormat; + public String getEncryptionFormat() { + return encryptionFormat; } @Override public Class getEntityType() { return Volume.class; } - } From f1b5b2d93e7ddc8d5a313cfadd6c4242e5a79753 Mon Sep 17 00:00:00 2001 From: dahn Date: Wed, 12 Jun 2024 07:50:35 +0200 Subject: [PATCH 4/4] Update api/src/main/java/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java Co-authored-by: Suresh Kumar Anaparti --- .../cloudstack/api/command/user/volume/ListVolumesCmd.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java index b11ac2ca5c5b..18a32e324f7b 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java @@ -96,7 +96,7 @@ public class ListVolumesCmd extends BaseListRetrieveOnlyResourceCountCmd impleme @Parameter(name = ApiConstants.STATE, type = CommandType.STRING, description = "state of the volume. Possible values are: Ready, Allocated, Destroy, Expunging, Expunged.") private String state; - @Parameter(name = ApiConstants.IS_ENCRYPTED, type = CommandType.BOOLEAN, description = "list only volumes that are encrypted", since = "4.20", + @Parameter(name = ApiConstants.IS_ENCRYPTED, type = CommandType.BOOLEAN, description = "list only volumes that are encrypted", since = "4.19.1", authorized = { RoleType.Admin }) private Boolean encrypted; /////////////////////////////////////////////////////