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

pearl11594 pushed a commit to branch support-list-policies
in repository https://gitbox.apache.org/repos/asf/cloudstack.git

commit 8f806ff221ebd48109a2d68a350fbba3e0183634
Author: Pearl Dsilva <[email protected]>
AuthorDate: Fri Sep 5 14:09:37 2025 -0400

    API: Add support to list all snapshot policies & backup schedules
---
 .../cloud/storage/snapshot/SnapshotApiService.java |  2 +-
 .../com/cloud/storage/snapshot/SnapshotPolicy.java |  3 +-
 .../command/user/backup/ListBackupScheduleCmd.java |  3 +-
 .../user/snapshot/ListSnapshotPoliciesCmd.java     |  7 +--
 .../apache/cloudstack/backup/BackupManager.java    |  3 +-
 .../apache/cloudstack/backup/BackupSchedule.java   |  3 +-
 .../java/com/cloud/storage/SnapshotPolicyVO.java   | 38 +++++++++++++-
 .../com/cloud/upgrade/dao/Upgrade42100to42200.java | 50 ++++++++++++++++++
 .../apache/cloudstack/backup/BackupScheduleVO.java | 30 ++++++++++-
 .../resources/META-INF/db/schema-42100to42200.sql  |  3 ++
 .../storage/test/SnapshotTestWithFakeData.java     |  2 +-
 .../storage/snapshot/SnapshotManagerImpl.java      | 59 +++++++++++++++-------
 .../cloudstack/backup/BackupManagerImpl.java       | 13 +++--
 .../storage/snapshot/SnapshotManagerTest.java      |  6 ++-
 14 files changed, 184 insertions(+), 38 deletions(-)

diff --git 
a/api/src/main/java/com/cloud/storage/snapshot/SnapshotApiService.java 
b/api/src/main/java/com/cloud/storage/snapshot/SnapshotApiService.java
index 67afd6aa4e2..d52e645ec79 100644
--- a/api/src/main/java/com/cloud/storage/snapshot/SnapshotApiService.java
+++ b/api/src/main/java/com/cloud/storage/snapshot/SnapshotApiService.java
@@ -85,7 +85,7 @@ public interface SnapshotApiService {
      *            the command that specifies the volume criteria
      * @return list of snapshot policies
      */
-    Pair<List<? extends SnapshotPolicy>, Integer> 
listPoliciesforVolume(ListSnapshotPoliciesCmd cmd);
+    Pair<List<? extends SnapshotPolicy>, Integer> 
listSnapshotPolicies(ListSnapshotPoliciesCmd cmd);
 
     boolean deleteSnapshotPolicies(DeleteSnapshotPoliciesCmd cmd);
 
diff --git a/api/src/main/java/com/cloud/storage/snapshot/SnapshotPolicy.java 
b/api/src/main/java/com/cloud/storage/snapshot/SnapshotPolicy.java
index 22d5dfb9c1b..13009a9808a 100644
--- a/api/src/main/java/com/cloud/storage/snapshot/SnapshotPolicy.java
+++ b/api/src/main/java/com/cloud/storage/snapshot/SnapshotPolicy.java
@@ -16,11 +16,12 @@
 // under the License.
 package com.cloud.storage.snapshot;
 
+import org.apache.cloudstack.acl.ControlledEntity;
 import org.apache.cloudstack.api.Displayable;
 import org.apache.cloudstack.api.Identity;
 import org.apache.cloudstack.api.InternalIdentity;
 
-public interface SnapshotPolicy extends Identity, InternalIdentity, 
Displayable {
+public interface SnapshotPolicy extends ControlledEntity, Identity, 
InternalIdentity, Displayable {
 
     long getVolumeId();
 
diff --git 
a/api/src/main/java/org/apache/cloudstack/api/command/user/backup/ListBackupScheduleCmd.java
 
b/api/src/main/java/org/apache/cloudstack/api/command/user/backup/ListBackupScheduleCmd.java
index fa6e3ea5d45..0d494834344 100644
--- 
a/api/src/main/java/org/apache/cloudstack/api/command/user/backup/ListBackupScheduleCmd.java
+++ 
b/api/src/main/java/org/apache/cloudstack/api/command/user/backup/ListBackupScheduleCmd.java
@@ -60,7 +60,6 @@ public class ListBackupScheduleCmd extends BaseCmd {
     @Parameter(name = ApiConstants.VIRTUAL_MACHINE_ID,
             type = CommandType.UUID,
             entityType = UserVmResponse.class,
-            required = true,
             description = "ID of the VM")
     private Long vmId;
 
@@ -79,7 +78,7 @@ public class ListBackupScheduleCmd extends BaseCmd {
     @Override
     public void execute() throws ResourceUnavailableException, 
InsufficientCapacityException, ServerApiException, 
ConcurrentOperationException, ResourceAllocationException, 
NetworkRuleConflictException {
         try{
-            List<BackupSchedule> schedules = 
backupManager.listBackupSchedule(getVmId());
+            List<BackupSchedule> schedules = 
backupManager.listBackupSchedule(this);
             ListResponse<BackupScheduleResponse> response = new 
ListResponse<>();
             List<BackupScheduleResponse> scheduleResponses = new ArrayList<>();
             if (!CollectionUtils.isNullOrEmpty(schedules)) {
diff --git 
a/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/ListSnapshotPoliciesCmd.java
 
b/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/ListSnapshotPoliciesCmd.java
index 126a4080e6d..20e362472cd 100644
--- 
a/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/ListSnapshotPoliciesCmd.java
+++ 
b/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/ListSnapshotPoliciesCmd.java
@@ -23,7 +23,7 @@ import org.apache.cloudstack.acl.RoleType;
 
 import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.ApiConstants;
-import org.apache.cloudstack.api.BaseListCmd;
+import org.apache.cloudstack.api.BaseListDomainResourcesCmd;
 import org.apache.cloudstack.api.Parameter;
 import org.apache.cloudstack.api.response.ListResponse;
 import org.apache.cloudstack.api.response.SnapshotPolicyResponse;
@@ -34,7 +34,7 @@ import com.cloud.utils.Pair;
 
 @APICommand(name = "listSnapshotPolicies", description = "Lists snapshot 
policies.", responseObject = SnapshotPolicyResponse.class,
         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
-public class ListSnapshotPoliciesCmd extends BaseListCmd {
+public class ListSnapshotPoliciesCmd extends BaseListDomainResourcesCmd {
 
 
     /////////////////////////////////////////////////////
@@ -69,13 +69,14 @@ public class ListSnapshotPoliciesCmd extends BaseListCmd {
     public Long getId() {
         return id;
     }
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
 
     @Override
     public void execute() {
-        Pair<List<? extends SnapshotPolicy>, Integer> result = 
_snapshotService.listPoliciesforVolume(this);
+        Pair<List<? extends SnapshotPolicy>, Integer> result = 
_snapshotService.listSnapshotPolicies(this);
         ListResponse<SnapshotPolicyResponse> response = new 
ListResponse<SnapshotPolicyResponse>();
         List<SnapshotPolicyResponse> policyResponses = new 
ArrayList<SnapshotPolicyResponse>();
         for (SnapshotPolicy policy : result.first()) {
diff --git a/api/src/main/java/org/apache/cloudstack/backup/BackupManager.java 
b/api/src/main/java/org/apache/cloudstack/backup/BackupManager.java
index c4b92fc9e05..f9d396ecc1d 100644
--- a/api/src/main/java/org/apache/cloudstack/backup/BackupManager.java
+++ b/api/src/main/java/org/apache/cloudstack/backup/BackupManager.java
@@ -28,6 +28,7 @@ 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.command.user.backup.ListBackupsCmd;
 import org.apache.cloudstack.api.response.BackupResponse;
 import org.apache.cloudstack.framework.config.ConfigKey;
@@ -174,7 +175,7 @@ public interface BackupManager extends BackupService, 
Configurable, PluggableSer
      * @param vmId
      * @return
      */
-    List<BackupSchedule> listBackupSchedule(Long vmId);
+    List<BackupSchedule> listBackupSchedule(ListBackupScheduleCmd cmd);
 
     /**
      * Deletes VM backup schedule for a VM
diff --git a/api/src/main/java/org/apache/cloudstack/backup/BackupSchedule.java 
b/api/src/main/java/org/apache/cloudstack/backup/BackupSchedule.java
index b5138d34de1..44fdf70c4c1 100644
--- a/api/src/main/java/org/apache/cloudstack/backup/BackupSchedule.java
+++ b/api/src/main/java/org/apache/cloudstack/backup/BackupSchedule.java
@@ -19,11 +19,12 @@ package org.apache.cloudstack.backup;
 
 import java.util.Date;
 
+import org.apache.cloudstack.acl.ControlledEntity;
 import org.apache.cloudstack.api.InternalIdentity;
 
 import com.cloud.utils.DateUtil;
 
-public interface BackupSchedule extends InternalIdentity {
+public interface BackupSchedule extends ControlledEntity, InternalIdentity {
     Long getVmId();
     DateUtil.IntervalType getScheduleType();
     String getSchedule();
diff --git 
a/engine/schema/src/main/java/com/cloud/storage/SnapshotPolicyVO.java 
b/engine/schema/src/main/java/com/cloud/storage/SnapshotPolicyVO.java
index f57d9d3dccf..299c6380ab6 100644
--- a/engine/schema/src/main/java/com/cloud/storage/SnapshotPolicyVO.java
+++ b/engine/schema/src/main/java/com/cloud/storage/SnapshotPolicyVO.java
@@ -59,6 +59,12 @@ public class SnapshotPolicyVO implements SnapshotPolicy {
     @Column(name = "uuid")
     String uuid;
 
+    @Column(name = "account_id")
+    long accountId;
+
+    @Column(name = "domain_id")
+    long domainId;
+
     @Column(name = "display", updatable = true, nullable = false)
     protected boolean display = true;
 
@@ -66,7 +72,7 @@ public class SnapshotPolicyVO implements SnapshotPolicy {
         this.uuid = UUID.randomUUID().toString();
     }
 
-    public SnapshotPolicyVO(long volumeId, String schedule, String timezone, 
IntervalType intvType, int maxSnaps, boolean display) {
+    public SnapshotPolicyVO(long volumeId, String schedule, String timezone, 
IntervalType intvType, int maxSnaps, long accountId, long domainId, boolean 
display) {
         this.volumeId = volumeId;
         this.schedule = schedule;
         this.timezone = timezone;
@@ -75,6 +81,8 @@ public class SnapshotPolicyVO implements SnapshotPolicy {
         this.active = true;
         this.display = display;
         this.uuid = UUID.randomUUID().toString();
+        this.accountId = accountId;
+        this.domainId = domainId;
     }
 
     @Override
@@ -160,4 +168,32 @@ public class SnapshotPolicyVO implements SnapshotPolicy {
     public void setDisplay(boolean display) {
         this.display = display;
     }
+
+    @Override
+    public long getAccountId() {
+        return accountId;
+    }
+
+    public void setAccountId(long accountId) {
+        this.accountId = accountId;
+    }
+
+    @Override
+    public long getDomainId() {
+        return domainId;
+    }
+
+    public void setDomainId(long domainId) {
+        this.domainId = domainId;
+    }
+
+    @Override
+    public Class<?> getEntityType() {
+        return SnapshotPolicy.class;
+    }
+
+    @Override
+    public String getName() {
+        return null;
+    }
 }
diff --git 
a/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade42100to42200.java 
b/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade42100to42200.java
index c2cfd02c15c..169e10d1eca 100644
--- a/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade42100to42200.java
+++ b/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade42100to42200.java
@@ -16,6 +16,14 @@
 // under the License.
 package com.cloud.upgrade.dao;
 
+import com.cloud.utils.exception.CloudRuntimeException;
+
+import java.io.InputStream;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
 public class Upgrade42100to42200 extends DbUpgradeAbstractImpl implements 
DbUpgrade, DbUpgradeSystemVmTemplate {
 
     @Override
@@ -27,4 +35,46 @@ public class Upgrade42100to42200 extends 
DbUpgradeAbstractImpl implements DbUpgr
     public String getUpgradedVersion() {
         return "4.22.0.0";
     }
+
+    @Override
+    public InputStream[] getPrepareScripts() {
+        final String scriptFile = "META-INF/db/schema-42100to42200.sql";
+        final InputStream script = 
Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile);
+        if (script == null) {
+            throw new CloudRuntimeException("Unable to find " + scriptFile);
+        }
+
+        return new InputStream[] {script};
+    }
+
+    @Override
+    public void performDataMigration(Connection conn) {
+        updateSnapshotPolicyOwnership(conn);
+    }
+
+    private void updateSnapshotPolicyOwnership(Connection conn) {
+        // set account_id and domain_id in snapshot_policy table from volume 
table
+        String selectSql = "SELECT sp.id, v.account_id, v.domain_id FROM 
snapshot_policy sp, volumes v WHERE sp.volume_id = v.id AND (sp.account_id IS 
NULL AND sp.domain_id IS NULL)";
+        String updateSql = "UPDATE snapshot_policy SET account_id = ?, 
domain_id = ? WHERE id = ?";
+
+        try (PreparedStatement selectPstmt = conn.prepareStatement(selectSql);
+             ResultSet rs = selectPstmt.executeQuery();
+             PreparedStatement updatePstmt = conn.prepareStatement(updateSql)) 
{
+
+            while (rs.next()) {
+                long policyId = rs.getLong(1);
+                long accountId = rs.getLong(2);
+                long domainId = rs.getLong(3);
+
+                updatePstmt.setLong(1, accountId);
+                updatePstmt.setLong(2, domainId);
+                updatePstmt.setLong(3, policyId);
+                updatePstmt.executeUpdate();
+            }
+        } catch (SQLException e) {
+            throw new CloudRuntimeException("Unable to update snapshot_policy 
table with account_id and domain_id", e);
+        }
+    }
+
+
 }
diff --git 
a/engine/schema/src/main/java/org/apache/cloudstack/backup/BackupScheduleVO.java
 
b/engine/schema/src/main/java/org/apache/cloudstack/backup/BackupScheduleVO.java
index 37e8105e3d5..511a6b735d8 100644
--- 
a/engine/schema/src/main/java/org/apache/cloudstack/backup/BackupScheduleVO.java
+++ 
b/engine/schema/src/main/java/org/apache/cloudstack/backup/BackupScheduleVO.java
@@ -68,10 +68,16 @@ public class BackupScheduleVO implements BackupSchedule {
     @Column(name = "quiescevm")
     Boolean quiesceVM = false;
 
+    @Column(name = "account_id")
+    Long accountId;
+
+    @Column(name = "domain_id")
+    Long domainId;
+
     public BackupScheduleVO() {
     }
 
-    public BackupScheduleVO(Long vmId, DateUtil.IntervalType scheduleType, 
String schedule, String timezone, Date scheduledTimestamp, int maxBackups, 
Boolean quiesceVM) {
+    public BackupScheduleVO(Long vmId, DateUtil.IntervalType scheduleType, 
String schedule, String timezone, Date scheduledTimestamp, int maxBackups, 
Boolean quiesceVM, Long accountId, Long domainId) {
         this.vmId = vmId;
         this.scheduleType = (short) scheduleType.ordinal();
         this.schedule = schedule;
@@ -79,6 +85,8 @@ public class BackupScheduleVO implements BackupSchedule {
         this.scheduledTimestamp = scheduledTimestamp;
         this.maxBackups = maxBackups;
         this.quiesceVM = quiesceVM;
+        this.accountId = accountId;
+        this.domainId = domainId;
     }
 
     @Override
@@ -161,4 +169,24 @@ public class BackupScheduleVO implements BackupSchedule {
     public Boolean getQuiesceVM() {
         return quiesceVM;
     }
+
+    @Override
+    public Class<?> getEntityType() {
+        return BackupSchedule.class;
+    }
+
+    @Override
+    public String getName() {
+        return null;
+    }
+
+    @Override
+    public long getDomainId() {
+        return domainId;
+    }
+
+    @Override
+    public long getAccountId() {
+        return accountId;
+    }
 }
diff --git 
a/engine/schema/src/main/resources/META-INF/db/schema-42100to42200.sql 
b/engine/schema/src/main/resources/META-INF/db/schema-42100to42200.sql
index cf3fe2ed772..e9f30f6408f 100644
--- a/engine/schema/src/main/resources/META-INF/db/schema-42100to42200.sql
+++ b/engine/schema/src/main/resources/META-INF/db/schema-42100to42200.sql
@@ -21,3 +21,6 @@
 
 -- Increase length of scripts_version column to 128 due to md5sum to sha512sum 
change
 CALL `cloud`.`IDEMPOTENT_CHANGE_COLUMN`('cloud.domain_router', 
'scripts_version', 'scripts_version', 'VARCHAR(128)');
+
+CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.snapshot_policy','domain_id', 
'BIGINT(20) DEFAULT NULL');
+CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.snapshot_policy','account_id', 
'BIGINT(20) DEFAULT NULL');
diff --git 
a/engine/storage/integration-test/src/test/java/org/apache/cloudstack/storage/test/SnapshotTestWithFakeData.java
 
b/engine/storage/integration-test/src/test/java/org/apache/cloudstack/storage/test/SnapshotTestWithFakeData.java
index 152c279547c..9868ccdf29a 100644
--- 
a/engine/storage/integration-test/src/test/java/org/apache/cloudstack/storage/test/SnapshotTestWithFakeData.java
+++ 
b/engine/storage/integration-test/src/test/java/org/apache/cloudstack/storage/test/SnapshotTestWithFakeData.java
@@ -305,7 +305,7 @@ public class SnapshotTestWithFakeData {
     }
 
     protected SnapshotPolicyVO createSnapshotPolicy(Long volId) {
-        SnapshotPolicyVO policyVO = new SnapshotPolicyVO(volId, "jfkd", 
"fdfd", DateUtil.IntervalType.DAILY, 8, true);
+        SnapshotPolicyVO policyVO = new SnapshotPolicyVO(volId, "jfkd", 
"fdfd", DateUtil.IntervalType.DAILY, 8, 1, 1, true);
             policyVO = snapshotPolicyDao.persist(policyVO);
             return policyVO;
         }
diff --git 
a/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java 
b/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java
index f6c8655fd66..e6e42c8b244 100755
--- a/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java
+++ b/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java
@@ -1301,7 +1301,8 @@ public class SnapshotManagerImpl extends 
MutualExclusiveIdsManagerBase implement
     }
 
     protected SnapshotPolicyVO createSnapshotPolicy(long volumeId, String 
schedule, String timezone, IntervalType intervalType, int maxSnaps, boolean 
display, List<Long> zoneIds, List<Long> poolIds) {
-        SnapshotPolicyVO policy = new SnapshotPolicyVO(volumeId, schedule, 
timezone, intervalType, maxSnaps, display);
+        VolumeVO volume = _volsDao.findById(volumeId);
+        SnapshotPolicyVO policy = new SnapshotPolicyVO(volumeId, schedule, 
timezone, intervalType, maxSnaps, volume.getAccountId(), volume.getDomainId(), 
display);
         policy = _snapshotPolicyDao.persist(policy);
         if (CollectionUtils.isNotEmpty(zoneIds)) {
             List<SnapshotPolicyDetailVO> details = new ArrayList<>();
@@ -1386,28 +1387,48 @@ public class SnapshotManagerImpl extends 
MutualExclusiveIdsManagerBase implement
     }
 
     @Override
-    public Pair<List<? extends SnapshotPolicy>, Integer> 
listPoliciesforVolume(ListSnapshotPoliciesCmd cmd) {
+    public Pair<List<? extends SnapshotPolicy>, Integer> 
listSnapshotPolicies(ListSnapshotPoliciesCmd cmd) {
         Long volumeId = cmd.getVolumeId();
-        boolean display = cmd.isDisplay();
         Long id = cmd.getId();
-        Pair<List<SnapshotPolicyVO>, Integer> result = null;
-        // TODO - Have a better way of doing this.
-        if (id != null) {
-            result = _snapshotPolicyDao.listAndCountById(id, display, null);
-            if (result != null && result.first() != null && 
!result.first().isEmpty()) {
-                SnapshotPolicyVO snapshotPolicy = result.first().get(0);
-                volumeId = snapshotPolicy.getVolumeId();
-            }
+        Account caller = CallContext.current().getCallingAccount();
+        boolean isRootAdmin = _accountMgr.isRootAdmin(caller.getId());
+        List<Long> permittedAccounts = new ArrayList<>();
+        Long domainId = null;
+        Boolean isRecursive = null;
+        ListProjectResourcesCriteria listProjectResourcesCriteria = null;
+
+        if (!isRootAdmin) {
+            Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject =
+                    new Ternary<>(cmd.getDomainId(), cmd.isRecursive(), null);
+            _accountMgr.buildACLSearchParameters(caller, id, null, null, 
permittedAccounts, domainIdRecursiveListProject, cmd.listAll(), false);
+            domainId = domainIdRecursiveListProject.first();
+            isRecursive = domainIdRecursiveListProject.second();
+            listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
         }
-        VolumeVO volume = _volsDao.findById(volumeId);
-        if (volume == null) {
-            throw new InvalidParameterValueException("Unable to find a volume 
with id " + volumeId);
+        Filter searchFilter = new Filter(SnapshotPolicyVO.class, "id", false, 
cmd.getStartIndex(), cmd.getPageSizeVal());
+        SearchBuilder<SnapshotPolicyVO> policySearch = 
_snapshotPolicyDao.createSearchBuilder();
+
+        if (!isRootAdmin) {
+            _accountMgr.buildACLSearchBuilder(policySearch, domainId, 
isRecursive, permittedAccounts, listProjectResourcesCriteria);
         }
-        _accountMgr.checkAccess(CallContext.current().getCallingAccount(), 
null, true, volume);
-        if (result != null)
-            return new Pair<List<? extends SnapshotPolicy>, 
Integer>(result.first(), result.second());
-        result = _snapshotPolicyDao.listAndCountByVolumeId(volumeId, display);
-        return new Pair<List<? extends SnapshotPolicy>, 
Integer>(result.first(), result.second());
+
+        policySearch.and("id", policySearch.entity().getId(), 
SearchCriteria.Op.EQ);
+        policySearch.and("volumeId", policySearch.entity().getVolumeId(), 
SearchCriteria.Op.EQ);
+
+        SearchCriteria<SnapshotPolicyVO> sc = policySearch.create();
+        if (!isRootAdmin) {
+            _accountMgr.buildACLSearchCriteria(sc, domainId, isRecursive, 
permittedAccounts, listProjectResourcesCriteria);
+        }
+
+        if (volumeId != null) {
+            sc.setParameters("volumeId", volumeId);
+        }
+        if (id != null) {
+            sc.setParameters("id", id);
+        }
+
+        Pair<List<SnapshotPolicyVO>, Integer> result = 
_snapshotPolicyDao.searchAndCount(sc, searchFilter);
+        return new Pair<>(result.first(), result.second());
     }
 
     private List<SnapshotPolicyVO> listPoliciesforVolume(long volumeId) {
diff --git 
a/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java 
b/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java
index 112626adf4f..72c5e481523 100644
--- a/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java
+++ b/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java
@@ -588,7 +588,7 @@ public class BackupManagerImpl extends ManagerBase 
implements BackupManager {
 
         final BackupScheduleVO schedule = 
backupScheduleDao.findByVMAndIntervalType(vmId, intervalType);
         if (schedule == null) {
-            return backupScheduleDao.persist(new BackupScheduleVO(vmId, 
intervalType, scheduleString, timezoneId, nextDateTime, maxBackups, 
cmd.getQuiesceVM()));
+            return backupScheduleDao.persist(new BackupScheduleVO(vmId, 
intervalType, scheduleString, timezoneId, nextDateTime, maxBackups, 
cmd.getQuiesceVM(), vm.getAccountId(), vm.getDomainId()));
         }
 
         schedule.setScheduleType((short) intervalType.ordinal());
@@ -639,10 +639,13 @@ public class BackupManagerImpl extends ManagerBase 
implements BackupManager {
     }
 
     @Override
-    public List<BackupSchedule> listBackupSchedule(final Long vmId) {
-        final VMInstanceVO vm = findVmById(vmId);
-        validateBackupForZone(vm.getDataCenterId());
-        accountManager.checkAccess(CallContext.current().getCallingAccount(), 
null, true, vm);
+    public List<BackupSchedule> listBackupSchedule(ListBackupScheduleCmd cmd) {
+        Long vmId = cmd.getVmId();
+        if (vmId != null) {
+            final VMInstanceVO vm = findVmById(vmId);
+            validateBackupForZone(vm.getDataCenterId());
+            
accountManager.checkAccess(CallContext.current().getCallingAccount(), null, 
true, vm);
+        }
 
         return 
backupScheduleDao.listByVM(vmId).stream().map(BackupSchedule.class::cast).collect(Collectors.toList());
     }
diff --git 
a/server/src/test/java/com/cloud/storage/snapshot/SnapshotManagerTest.java 
b/server/src/test/java/com/cloud/storage/snapshot/SnapshotManagerTest.java
index 4d802319935..3b5d92103e7 100755
--- a/server/src/test/java/com/cloud/storage/snapshot/SnapshotManagerTest.java
+++ b/server/src/test/java/com/cloud/storage/snapshot/SnapshotManagerTest.java
@@ -209,6 +209,8 @@ public class SnapshotManagerTest {
     private static final String TEST_SNAPSHOT_POLICY_TIMEZONE = "";
     private static final IntervalType TEST_SNAPSHOT_POLICY_INTERVAL = 
IntervalType.MONTHLY;
     private static final int TEST_SNAPSHOT_POLICY_MAX_SNAPS = 1;
+    private static final long TEST_SNAPSHOT_POLICY_ACCOUNT_ID = 1;
+    private static final long TEST_SNAPSHOT_POLICY_DOMAIN_ID = 1;
     private static final boolean TEST_SNAPSHOT_POLICY_DISPLAY = true;
     private static final boolean TEST_SNAPSHOT_POLICY_ACTIVE = true;
     private static final long TEST_ZONE_ID = 7L;
@@ -251,7 +253,7 @@ public class SnapshotManagerTest {
         
when(_resourceMgr.listAllUpAndEnabledHostsInOneZoneByHypervisor(any(HypervisorType.class),
 anyLong())).thenReturn(null);
 
         snapshotPolicyVoInstance = new SnapshotPolicyVO(TEST_VOLUME_ID, 
TEST_SNAPSHOT_POLICY_SCHEDULE, TEST_SNAPSHOT_POLICY_TIMEZONE, 
TEST_SNAPSHOT_POLICY_INTERVAL,
-          TEST_SNAPSHOT_POLICY_MAX_SNAPS, TEST_SNAPSHOT_POLICY_DISPLAY);
+          TEST_SNAPSHOT_POLICY_MAX_SNAPS, TEST_SNAPSHOT_POLICY_ACCOUNT_ID, 
TEST_SNAPSHOT_POLICY_DOMAIN_ID, TEST_SNAPSHOT_POLICY_DISPLAY);
 
         apiDBUtilsMock = Mockito.mockStatic(ApiDBUtils.class);
     }
@@ -442,7 +444,7 @@ public class SnapshotManagerTest {
         
Mockito.doReturn(true).when(taggedResourceServiceMock).deleteTags(any(), any(), 
any());
 
         SnapshotPolicyVO snapshotPolicyVo = new 
SnapshotPolicyVO(TEST_VOLUME_ID, TEST_SNAPSHOT_POLICY_SCHEDULE, 
TEST_SNAPSHOT_POLICY_TIMEZONE, TEST_SNAPSHOT_POLICY_INTERVAL,
-          TEST_SNAPSHOT_POLICY_MAX_SNAPS, TEST_SNAPSHOT_POLICY_DISPLAY);
+          TEST_SNAPSHOT_POLICY_MAX_SNAPS, TEST_SNAPSHOT_POLICY_ACCOUNT_ID, 
TEST_SNAPSHOT_POLICY_DOMAIN_ID, TEST_SNAPSHOT_POLICY_DISPLAY);
 
         _snapshotMgr.updateSnapshotPolicy(snapshotPolicyVo, 
TEST_SNAPSHOT_POLICY_SCHEDULE, TEST_SNAPSHOT_POLICY_TIMEZONE,
           TEST_SNAPSHOT_POLICY_INTERVAL, TEST_SNAPSHOT_POLICY_MAX_SNAPS, 
TEST_SNAPSHOT_POLICY_DISPLAY, TEST_SNAPSHOT_POLICY_ACTIVE, null, null);

Reply via email to