Skip to content

Commit f1cf991

Browse files
committed
MB-70102 Add --cloud-versions flag to the repo-remove command
If passed, old versions of cloud objects will be deleted as well. The --delete-data flags should also be provided. Change-Id: Iae7f5960a89b0513686220c609d574cf4b3592c1 Reviewed-on: https://review.couchbase.org/c/couchbase-cli/+/238418 Reviewed-by: Safian Ali <safian.ali@couchbase.com> Tested-by: Build Bot <build@couchbase.com>
1 parent c33a28b commit f1cf991

5 files changed

Lines changed: 47 additions & 10 deletions

File tree

cbmgr.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7483,14 +7483,19 @@ def __init__(self, subparser):
74837483
help='The repository state.', required=True)
74847484
group.add_argument('--delete-data', action='store_true',
74857485
help='Used to delete the repository data of an archived repository')
7486+
group.add_argument('--cloud-versions', action='store_true',
7487+
help='Delete all versions of cloud repository objects')
74867488

74877489
@rest_initialiser(version_check=True, enterprise_check=True, cluster_init_check=True)
74887490
def execute(self, opts):
74897491
"""Run the backup-service repo-remove subcommand"""
74907492
if opts.delete_data and opts.state == 'imported':
74917493
_exit_if_errors(['cannot delete the data of an imported repository'])
74927494

7493-
_, errors = self.rest.delete_backup_repository(opts.id, opts.state, opts.delete_data)
7495+
if opts.cloud_versions and not opts.delete_data:
7496+
_exit_if_errors(['to delete old object versions, the repository data must also be deleted'])
7497+
7498+
_, errors = self.rest.delete_backup_repository(opts.id, opts.state, opts.delete_data, opts.cloud_versions)
74947499
_exit_if_errors(errors)
74957500
_success('Repository was removed')
74967501

@@ -7743,7 +7748,7 @@ def remove_repository(self, repository_id: str, state: str, delete_repo: bool =
77437748
if delete_repo and state == 'imported':
77447749
_exit_if_errors(['cannot delete the repository for an imported repository'])
77457750

7746-
_, errors = self.rest.delete_backup_repository(repository_id, state, delete_repo)
7751+
_, errors = self.rest.delete_backup_repository(repository_id, state, delete_repo, False)
77477752
_exit_if_errors(errors)
77487753
_success('Repository was deleted')
77497754

cluster_manager.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2785,21 +2785,21 @@ def delete_backup_plan(self, name: str):
27852785

27862786
return self._delete(f'{hosts[0]}/api/v1/plan/{name}', None)
27872787

2788-
def delete_backup_repository(self, repository_id: str, state: str, delete_repo: bool, cluster: str = 'self'):
2788+
def delete_backup_repository(self, repository_id: str, state: str, delete_repo: bool, cloud_versions: bool):
27892789
"""Delete a backup repository
27902790
Args:
27912791
repository_id (str): The id to be deleted.
27922792
state (str): The state in which the instance to be deleted is.
27932793
delete_repo (bool): Whether or not to delete the backup Repository.
2794-
cluster (str): Only 'self' is supported.
27952794
"""
27962795
hosts, errors = self.get_hostnames_for_service(BACKUP_SERVICE)
27972796
if errors:
27982797
return None, errors
27992798

28002799
if not hosts:
28012800
raise ServiceNotAvailableException(BACKUP_SERVICE)
2802-
url = f'{hosts[0]}/api/v1/cluster/{cluster}/repository/{state}/{repository_id}?remove_repository={delete_repo!s}'
2801+
query_params = f'remove_repository={delete_repo!s}&cloud_versions={cloud_versions!s}'
2802+
url = f'{hosts[0]}/api/v1/cluster/self/repository/{state}/{repository_id}?{query_params}'
28032803
return self._delete(url, None)
28042804

28052805
def add_backup_plan(self, name: str, plan: Dict[str, Any]):

docs/modules/cli/pages/cbcli/couchbase-cli-backup-service-repo-remove.adoc

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ _couchbase-cli backup-service_ [--cluster <url>] [--username <user>]
1616
[--password <password>] [--client-cert <path>]
1717
[--client-cert-password <password>] [--client-key <path>]
1818
[--client-key-password <password>] _repo-remove_ [--id <id>]
19-
[--state <state>] [--delete-data]
19+
[--state <state>] [--delete-data] [--cloud-versions]
2020

2121
== DESCRIPTION
2222

@@ -42,6 +42,13 @@ repository, it must first be archived. This can be done using the `repo-archive`
4242
is only valid for archived repositories. Imported repositories cannot have
4343
their data deleted.
4444

45+
--cloud-versions::
46+
If specified, all versions of cloud repository objects will be deleted. The
47+
--delete-data flag must also be provided. Versioning permissions are also
48+
required. In case versioning permissions have been disabled for the repo, they
49+
can be re-enabled using the man:couchbase-cli-backup-service-repo-cloud-config[1]
50+
command.
51+
4552
include::{partialsdir}/cbcli/part-common-options.adoc[]
4653

4754
include::{partialsdir}/cbcli/part-host-formats.adoc[]
@@ -84,7 +91,8 @@ man:couchbase-cli-backup-service[1],
8491
man:couchbase-cli-backup-service-repo-add[1],
8592
man:couchbase-cli-backup-service-repo-get[1],
8693
man:couchbase-cli-backup-service-repo-list[1],
87-
man:couchbase-cli-backup-service-repo-archive[1]
94+
man:couchbase-cli-backup-service-repo-archive[1],
95+
man:couchbase-cli-backup-service-repo-cloud-config[1]
8896

8997
include::{partialsdir}/cbcli/part-footer.adoc[]
9098

docs/modules/cli/pages/cbcli/couchbase-cli-backup-service-repo-worm.adoc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ This command allows you to either set a WORM compliance period (in days) or
2828
disable WORM for a repository once its validity period has expired. Only paused
2929
repositories can have their WORM configuration modified.
3030

31+
Object versioning needs to be enabled. In case it has been disabled, it can be
32+
re-enabled using the man:couchbase-cli-backup-service-repo-cloud-config[1] command.
33+
3134
== OPTIONS
3235

3336
--id <id>::
@@ -85,6 +88,7 @@ include::{partialsdir}/cbcli/part-common-env.adoc[]
8588
== SEE ALSO
8689

8790
man:couchbase-cli-backup-service[1],
91+
man:couchbase-cli-backup-service-repo-cloud-config[1],
8892
man:couchbase-cli-backup-service-repo-list[1],
8993
man:couchbase-cli-backup-service-repo-get[1],
9094
man:couchbase-cli-backup-service-repo-add[1],

test/test_cli.py

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5448,7 +5448,7 @@ def test_remove_archived_with_delete_data(self):
54485448
self.no_error_run(self.command + ['--id', 'archivedrepo', '--state', 'archived', '--delete-data'],
54495449
self.server_args)
54505450
self.assertIn('DELETE:/api/v1/cluster/self/repository/archived/archivedrepo', self.server.trace)
5451-
self.assertIn('remove_repository=True', self.server.queries)
5451+
self.assertIn('remove_repository=True', self.server.queries[0])
54525452
self.assertIn('Repository was removed', self.str_output)
54535453

54545454
def test_cannot_delete_data_for_imported(self):
@@ -5460,7 +5460,27 @@ def test_cannot_delete_data_for_imported(self):
54605460
def test_remove_repository_without_delete_data(self):
54615461
"""Test that remove_repository=False is passed when --delete-data is not specified"""
54625462
self.no_error_run(self.command + ['--id', 'repo1', '--state', 'archived'], self.server_args)
5463-
self.assertIn('remove_repository=False', self.server.queries)
5463+
self.assertIn('remove_repository=False', self.server.queries[0])
5464+
5465+
def test_cloud_versions_without_delete_data_fails(self):
5466+
"""Test that --cloud-versions fails without --delete-data"""
5467+
self.system_exit_run(self.command + ['--id', 'repo1', '--state', 'archived', '--cloud-versions'],
5468+
self.server_args)
5469+
self.assertIn('to delete old object versions, the repository data must also be deleted', self.str_output)
5470+
5471+
def test_cloud_versions_with_delete_data_success(self):
5472+
"""Test that --cloud-versions with --delete-data succeeds"""
5473+
self.no_error_run(self.command + ['--id', 'archivedrepo', '--state', 'archived', '--delete-data',
5474+
'--cloud-versions'], self.server_args)
5475+
self.assertIn('DELETE:/api/v1/cluster/self/repository/archived/archivedrepo', self.server.trace)
5476+
self.assertIn('remove_repository=True', self.server.queries[0])
5477+
self.assertIn('cloud_versions=True', self.server.queries[0])
5478+
self.assertIn('Repository was removed', self.str_output)
5479+
5480+
def test_cloud_versions_false_when_not_specified(self):
5481+
"""Test that cloud_versions=False is passed when --cloud-versions is not specified"""
5482+
self.no_error_run(self.command + ['--id', 'repo1', '--state', 'archived', '--delete-data'], self.server_args)
5483+
self.assertIn('cloud_versions=False', self.server.queries[0])
54645484

54655485

54665486
class TestBackupServiceRepoPause(CommandTest):
@@ -5934,7 +5954,7 @@ def test_remove_valid_request(self):
59345954
self.no_error_run(self.command + ['--remove', '--id', 'r', '--state', 'archived', '--remove-data'],
59355955
self.server_args)
59365956
self.assertIn('DELETE:/api/v1/cluster/self/repository/archived/r', self.server.trace)
5937-
self.assertIn('remove_repository=True', self.server.queries)
5957+
self.assertIn('remove_repository=True', self.server.queries[0])
59385958

59395959

59405960
class TestBackupServicePlan(CommandTest):

0 commit comments

Comments
 (0)