From 808885a2b30c09890dce2ebf6ee00ad7232ba29a Mon Sep 17 00:00:00 2001 From: hamdykhader Date: Fri, 22 May 2026 19:46:30 +0300 Subject: [PATCH] feat: add --pool option to list snapshots by pool id or name --- simplyblock_cli/cli-reference.yaml | 4 ++++ simplyblock_cli/cli.py | 1 + simplyblock_cli/clibase.py | 2 +- .../controllers/snapshot_controller.py | 17 +++++++++++++++-- simplyblock_core/db_controller.py | 8 ++++++++ 5 files changed, 29 insertions(+), 3 deletions(-) diff --git a/simplyblock_cli/cli-reference.yaml b/simplyblock_cli/cli-reference.yaml index 6637f28c7..02ec253cf 100644 --- a/simplyblock_cli/cli-reference.yaml +++ b/simplyblock_cli/cli-reference.yaml @@ -2226,6 +2226,10 @@ commands: dest: with_details type: bool action: store_true + - name: "--pool" + help: "List snapshots in particular pool id or name." + dest: pool + type: str - name: delete help: "Deletes a snapshot." arguments: diff --git a/simplyblock_cli/cli.py b/simplyblock_cli/cli.py index 714cff99f..0033fb2e2 100755 --- a/simplyblock_cli/cli.py +++ b/simplyblock_cli/cli.py @@ -905,6 +905,7 @@ def init_snapshot__list(self, subparser): argument = subcommand.add_argument('--all', help='List soft deleted snapshots.', dest='all', action='store_true') argument = subcommand.add_argument('--cluster-id', help='Filter snapshots by cluster UUID', type=str, dest='cluster_id', required=False) argument = subcommand.add_argument('--with-details', help='List snapshots with replicate and chaining details', dest='with_details', action='store_true') + argument = subcommand.add_argument('--pool', help='List snapshots in particular pool id or name.', type=str, dest='pool') def init_snapshot__delete(self, subparser): subcommand = self.add_sub_command(subparser, 'delete', 'Deletes a snapshot.') diff --git a/simplyblock_cli/clibase.py b/simplyblock_cli/clibase.py index 174e7a852..96db5e584 100755 --- a/simplyblock_cli/clibase.py +++ b/simplyblock_cli/clibase.py @@ -785,7 +785,7 @@ def snapshot__backup(self, sub_command, args): return True def snapshot__list(self, sub_command, args): - return snapshot_controller.list(args.all, args.cluster_id, args.with_details) + return snapshot_controller.list(args.all, args.cluster_id, args.with_details, args.pool) def snapshot__delete(self, sub_command, args): return snapshot_controller.delete(args.snapshot_id, args.force) diff --git a/simplyblock_core/controllers/snapshot_controller.py b/simplyblock_core/controllers/snapshot_controller.py index 46bcfaf7b..a331b86d3 100644 --- a/simplyblock_core/controllers/snapshot_controller.py +++ b/simplyblock_core/controllers/snapshot_controller.py @@ -329,8 +329,21 @@ def add(lvol_id, snapshot_name, backup=False, lock=True): return snap.uuid, False -def list(all=False, cluster_id=None, with_details=False): - snaps = db_controller.get_snapshots(cluster_id) +def list(all=False, cluster_id=None, with_details=False, pool_id_or_name=None): + if pool_id_or_name: + try: + pool = ( + db_controller.get_pool_by_id(pool_id_or_name) + if utils.UUID_PATTERN.match(pool_id_or_name) is not None + else db_controller.get_pool_by_name(pool_id_or_name) + ) + snaps = db_controller.get_snapshots_by_pool_id(pool.get_id()) + except KeyError: + logger.error("Can not find pool with provided pool_id_or_name: %s", pool_id_or_name) + return False + else: + snaps = db_controller.get_snapshots(cluster_id) + snaps = sorted(snaps, key=lambda snap: snap.created_at) # Build set of lvol UUIDs with active migrations (single DB scan) diff --git a/simplyblock_core/db_controller.py b/simplyblock_core/db_controller.py index 03ff2d0d5..e3e27fc00 100644 --- a/simplyblock_core/db_controller.py +++ b/simplyblock_core/db_controller.py @@ -299,6 +299,14 @@ def get_snapshots_by_node_id(self, node_id) -> List[SnapShot]: ret.append(snap) return sorted(ret, key=lambda x: x.create_dt) + def get_snapshots_by_pool_id(self, pool_id) -> List[SnapShot]: + ret = [] + snaps = SnapShot().read_from_db(self.kv_store) + for snap in snaps: + if snap.pool_uuid == pool_id: + ret.append(snap) + return sorted(ret, key=lambda x: x.create_dt) + def get_snapshots_by_lvol_id(self, lvol_id) -> List[SnapShot]: return [s for s in self.get_snapshots() if s.lvol and s.lvol.get_id() == lvol_id]