diff options
author | Jenkins <jenkins@review.openstack.org> | 2017-01-18 19:23:29 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2017-01-18 19:23:29 +0000 |
commit | f63226ee491491caf5d8261e2959769675c00656 (patch) | |
tree | 872b926f881960d1a93841fb25550c75d8452f98 | |
parent | 936ad27a1f5622cc00923cdc20ce23a7276357a3 (diff) | |
parent | 056cf5c0591465dadd5017be9349d8f272fdddd0 (diff) | |
download | python-cinderclient-f63226ee491491caf5d8261e2959769675c00656.tar.gz |
Merge "Metadata based snapshop filtering"
-rw-r--r-- | cinderclient/tests/unit/v3/test_shell.py | 9 | ||||
-rw-r--r-- | cinderclient/tests/unit/v3/test_volumes.py | 9 | ||||
-rw-r--r-- | cinderclient/v3/shell.py | 91 |
3 files changed, 109 insertions, 0 deletions
diff --git a/cinderclient/tests/unit/v3/test_shell.py b/cinderclient/tests/unit/v3/test_shell.py index e6a1eca..e3b2617 100644 --- a/cinderclient/tests/unit/v3/test_shell.py +++ b/cinderclient/tests/unit/v3/test_shell.py @@ -26,6 +26,8 @@ from cinderclient.tests.unit import utils from cinderclient.tests.unit.v3 import fakes from cinderclient.tests.unit.fixture_data import keystone_client +from six.moves.urllib import parse + @ddt.ddt @mock.patch.object(client, 'Client', fakes.FakeClient) @@ -344,6 +346,13 @@ class ShellTest(utils.TestCase): self.run_command('--os-volume-api-version 3.3 message-list') self.assert_called('GET', '/messages') + def test_snapshot_list_with_metadata(self): + self.run_command('--os-volume-api-version 3.22 ' + 'snapshot-list --metadata key1=val1') + expected = ("/snapshots/detail?metadata=%s" + % parse.quote_plus("{'key1': 'val1'}")) + self.assert_called('GET', expected) + @ddt.data(('resource_type',), ('event_id',), ('resource_uuid',), ('level', 'message_level'), ('request_id',)) def test_list_messages_with_filters(self, filter): diff --git a/cinderclient/tests/unit/v3/test_volumes.py b/cinderclient/tests/unit/v3/test_volumes.py index 22ffa75..fe27a51 100644 --- a/cinderclient/tests/unit/v3/test_volumes.py +++ b/cinderclient/tests/unit/v3/test_volumes.py @@ -20,6 +20,8 @@ from cinderclient.tests.unit import utils from cinderclient.tests.unit.v3 import fakes from cinderclient.v3 import volumes +from six.moves.urllib import parse + cs = fakes.FakeClient() @@ -84,3 +86,10 @@ class VolumesTest(utils.TestCase): cs = fakes.FakeClient(api_versions.APIVersion('3.8')) cs.volume_snapshots.list_manageable('host1', detailed=True) cs.assert_called('GET', '/manageable_snapshots/detail?host=host1') + + def test_snapshot_list_with_metadata(self): + cs = fakes.FakeClient(api_versions.APIVersion('3.22')) + cs.volume_snapshots.list(search_opts={'metadata': {'key1': 'val1'}}) + expected = ("/snapshots/detail?metadata=%s" + % parse.quote_plus("{'key1': 'val1'}")) + cs.assert_called('GET', expected) diff --git a/cinderclient/v3/shell.py b/cinderclient/v3/shell.py index 6a5d355..d89e10c 100644 --- a/cinderclient/v3/shell.py +++ b/cinderclient/v3/shell.py @@ -1210,3 +1210,94 @@ def do_message_delete(cs, args): if failure_count == len(args.message): raise exceptions.CommandError("Unable to delete any of the specified " "messages.") + + +@utils.arg('--all-tenants', + dest='all_tenants', + metavar='<0|1>', + nargs='?', + type=int, + const=1, + default=0, + help='Shows details for all tenants. Admin only.') +@utils.arg('--all_tenants', + nargs='?', + type=int, + const=1, + help=argparse.SUPPRESS) +@utils.arg('--name', + metavar='<name>', + default=None, + help='Filters results by a name. Default=None.') +@utils.arg('--display-name', + help=argparse.SUPPRESS) +@utils.arg('--display_name', + help=argparse.SUPPRESS) +@utils.arg('--status', + metavar='<status>', + default=None, + help='Filters results by a status. Default=None.') +@utils.arg('--volume-id', + metavar='<volume-id>', + default=None, + help='Filters results by a volume ID. Default=None.') +@utils.arg('--volume_id', + help=argparse.SUPPRESS) +@utils.arg('--marker', + metavar='<marker>', + default=None, + help='Begin returning snapshots that appear later in the snapshot ' + 'list than that represented by this id. ' + 'Default=None.') +@utils.arg('--limit', + metavar='<limit>', + default=None, + help='Maximum number of snapshots to return. Default=None.') +@utils.arg('--sort', + metavar='<key>[:<direction>]', + default=None, + help=(('Comma-separated list of sort keys and directions in the ' + 'form of <key>[:<asc|desc>]. ' + 'Valid keys: %s. ' + 'Default=None.') % ', '.join(base.SORT_KEY_VALUES))) +@utils.arg('--tenant', + type=str, + dest='tenant', + nargs='?', + metavar='<tenant>', + help='Display information from single tenant (Admin only).') +@utils.arg('--metadata', + nargs='*', + metavar='<key=value>', + default=None, + start_version='3.22', + help='Filters results by a metadata key and value pair. Require ' + 'volume api version >=3.22. Default=None.') +@utils.service_type('volumev3') +def do_snapshot_list(cs, args): + """Lists all snapshots.""" + all_tenants = (1 if args.tenant else + int(os.environ.get("ALL_TENANTS", args.all_tenants))) + + if args.display_name is not None: + args.name = args.display_name + + search_opts = { + 'all_tenants': all_tenants, + 'name': args.name, + 'status': args.status, + 'volume_id': args.volume_id, + 'project_id': args.tenant, + 'metadata': shell_utils.extract_metadata(args) + if args.metadata else None, + } + + snapshots = cs.volume_snapshots.list(search_opts=search_opts, + marker=args.marker, + limit=args.limit, + sort=args.sort) + shell_utils.translate_volume_snapshot_keys(snapshots) + sortby_index = None if args.sort else 0 + utils.print_list(snapshots, + ['ID', 'Volume ID', 'Status', 'Name', 'Size'], + sortby_index=sortby_index)
\ No newline at end of file |