Merge "Addition of volume/snapshot_metadata CLI"
This commit is contained in:
commit
f9e0a9a4a3
@ -746,3 +746,18 @@ class FakeHTTPClient(base_client.HTTPClient):
|
||||
},
|
||||
]
|
||||
})
|
||||
|
||||
def post_snapshots_1234_metadata(self, **kw):
|
||||
return (200, {}, {"metadata": {"key1": "val1", "key2": "val2"}})
|
||||
|
||||
def delete_snapshots_1234_metadata_key1(self, **kw):
|
||||
return (200, {}, None)
|
||||
|
||||
def delete_snapshots_1234_metadata_key2(self, **kw):
|
||||
return (200, {}, None)
|
||||
|
||||
def put_volumes_1234_metadata(self, **kw):
|
||||
return (200, {}, {"metadata": {"key1": "val1", "key2": "val2"}})
|
||||
|
||||
def put_snapshots_1234_metadata(self, **kw):
|
||||
return (200, {}, {"metadata": {"key1": "val1", "key2": "val2"}})
|
||||
|
@ -278,3 +278,29 @@ class ShellTest(utils.TestCase):
|
||||
expected = {'os-migrate_volume': {'force_host_copy': 'True',
|
||||
'host': 'fakehost'}}
|
||||
self.assert_called('POST', '/volumes/1234/action', body=expected)
|
||||
|
||||
def test_snapshot_metadata_set(self):
|
||||
self.run_command('snapshot-metadata 1234 set key1=val1 key2=val2')
|
||||
self.assert_called('POST', '/snapshots/1234/metadata',
|
||||
{'metadata': {'key1': 'val1', 'key2': 'val2'}})
|
||||
|
||||
def test_snapshot_metadata_unset_dict(self):
|
||||
self.run_command('snapshot-metadata 1234 unset key1=val1 key2=val2')
|
||||
self.assert_called('DELETE', '/snapshots/1234/metadata/key1')
|
||||
self.assert_called('DELETE', '/snapshots/1234/metadata/key2', pos=-2)
|
||||
|
||||
def test_snapshot_metadata_unset_keys(self):
|
||||
self.run_command('snapshot-metadata 1234 unset key1 key2')
|
||||
self.assert_called('DELETE', '/snapshots/1234/metadata/key1')
|
||||
self.assert_called('DELETE', '/snapshots/1234/metadata/key2', pos=-2)
|
||||
|
||||
def test_volume_metadata_update_all(self):
|
||||
self.run_command('metadata-update-all 1234 key1=val1 key2=val2')
|
||||
self.assert_called('PUT', '/volumes/1234/metadata',
|
||||
{'metadata': {'key1': 'val1', 'key2': 'val2'}})
|
||||
|
||||
def test_snapshot_metadata_update_all(self):
|
||||
self.run_command('snapshot-metadata-update-all\
|
||||
1234 key1=val1 key2=val2')
|
||||
self.assert_called('PUT', '/snapshots/1234/metadata',
|
||||
{'metadata': {'key1': 'val1', 'key2': 'val2'}})
|
||||
|
@ -96,3 +96,8 @@ class VolumesTest(utils.TestCase):
|
||||
v = cs.volumes.get('1234')
|
||||
cs.volumes.migrate_volume(v, 'dest', False)
|
||||
cs.assert_called('POST', '/volumes/1234/action')
|
||||
|
||||
def test_metadata_update_all(self):
|
||||
cs.volumes.update_all_metadata(1234, {'k1': 'v1'})
|
||||
cs.assert_called('PUT', '/volumes/1234/metadata',
|
||||
{'metadata': {'k1': 'v1'}})
|
||||
|
@ -754,3 +754,18 @@ class FakeHTTPClient(base_client.HTTPClient):
|
||||
},
|
||||
]
|
||||
})
|
||||
|
||||
def post_snapshots_1234_metadata(self, **kw):
|
||||
return (200, {}, {"metadata": {"key1": "val1", "key2": "val2"}})
|
||||
|
||||
def delete_snapshots_1234_metadata_key1(self, **kw):
|
||||
return (200, {}, None)
|
||||
|
||||
def delete_snapshots_1234_metadata_key2(self, **kw):
|
||||
return (200, {}, None)
|
||||
|
||||
def put_volumes_1234_metadata(self, **kw):
|
||||
return (200, {}, {"metadata": {"key1": "val1", "key2": "val2"}})
|
||||
|
||||
def put_snapshots_1234_metadata(self, **kw):
|
||||
return (200, {}, {"metadata": {"key1": "val1", "key2": "val2"}})
|
||||
|
@ -256,3 +256,29 @@ class ShellTest(utils.TestCase):
|
||||
expected = {'os-migrate_volume': {'force_host_copy': 'True',
|
||||
'host': 'fakehost'}}
|
||||
self.assert_called('POST', '/volumes/1234/action', body=expected)
|
||||
|
||||
def test_snapshot_metadata_set(self):
|
||||
self.run_command('snapshot-metadata 1234 set key1=val1 key2=val2')
|
||||
self.assert_called('POST', '/snapshots/1234/metadata',
|
||||
{'metadata': {'key1': 'val1', 'key2': 'val2'}})
|
||||
|
||||
def test_snapshot_metadata_unset_dict(self):
|
||||
self.run_command('snapshot-metadata 1234 unset key1=val1 key2=val2')
|
||||
self.assert_called('DELETE', '/snapshots/1234/metadata/key1')
|
||||
self.assert_called('DELETE', '/snapshots/1234/metadata/key2', pos=-2)
|
||||
|
||||
def test_snapshot_metadata_unset_keys(self):
|
||||
self.run_command('snapshot-metadata 1234 unset key1 key2')
|
||||
self.assert_called('DELETE', '/snapshots/1234/metadata/key1')
|
||||
self.assert_called('DELETE', '/snapshots/1234/metadata/key2', pos=-2)
|
||||
|
||||
def test_volume_metadata_update_all(self):
|
||||
self.run_command('metadata-update-all 1234 key1=val1 key2=val2')
|
||||
self.assert_called('PUT', '/volumes/1234/metadata',
|
||||
{'metadata': {'key1': 'val1', 'key2': 'val2'}})
|
||||
|
||||
def test_snapshot_metadata_update_all(self):
|
||||
self.run_command('snapshot-metadata-update-all\
|
||||
1234 key1=val1 key2=val2')
|
||||
self.assert_called('PUT', '/snapshots/1234/metadata',
|
||||
{'metadata': {'key1': 'val1', 'key2': 'val2'}})
|
||||
|
@ -99,3 +99,8 @@ class VolumesTest(utils.TestCase):
|
||||
v = cs.volumes.get('1234')
|
||||
cs.volumes.migrate_volume(v, 'dest', False)
|
||||
cs.assert_called('POST', '/volumes/1234/action')
|
||||
|
||||
def test_metadata_update_all(self):
|
||||
cs.volumes.update_all_metadata(1234, {'k1': 'v1'})
|
||||
cs.assert_called('PUT', '/volumes/1234/metadata',
|
||||
{'metadata': {'k1': 'v1'}})
|
||||
|
@ -1252,3 +1252,80 @@ def do_qos_get_association(cs, args):
|
||||
"""Get all associations of specific qos specs."""
|
||||
associations = cs.qos_specs.get_associations(args.qos_specs)
|
||||
_print_associations_list(associations)
|
||||
|
||||
|
||||
@utils.arg('snapshot',
|
||||
metavar='<snapshot>',
|
||||
help='ID of the snapshot to update metadata on.')
|
||||
@utils.arg('action',
|
||||
metavar='<action>',
|
||||
choices=['set', 'unset'],
|
||||
help="Actions: 'set' or 'unset'")
|
||||
@utils.arg('metadata',
|
||||
metavar='<key=value>',
|
||||
nargs='+',
|
||||
default=[],
|
||||
help='Metadata to set/unset (only key is necessary on unset)')
|
||||
@utils.service_type('volume')
|
||||
def do_snapshot_metadata(cs, args):
|
||||
"""Set or Delete metadata of a snapshot."""
|
||||
snapshot = _find_volume_snapshot(cs, args.snapshot)
|
||||
metadata = _extract_metadata(args)
|
||||
|
||||
if args.action == 'set':
|
||||
metadata = snapshot.set_metadata(metadata)
|
||||
utils.print_dict(metadata._info)
|
||||
elif args.action == 'unset':
|
||||
snapshot.delete_metadata(list(metadata.keys()))
|
||||
|
||||
|
||||
@utils.arg('snapshot', metavar='<snapshot>',
|
||||
help='ID of snapshot')
|
||||
@utils.service_type('volume')
|
||||
def do_snapshot_metadata_show(cs, args):
|
||||
"""Show metadata of given snapshot."""
|
||||
snapshot = _find_volume_snapshot(cs, args.snapshot)
|
||||
utils.print_dict(snapshot._info['metadata'], 'Metadata-property')
|
||||
|
||||
|
||||
@utils.arg('volume', metavar='<volume>',
|
||||
help='ID of volume')
|
||||
@utils.service_type('volume')
|
||||
def do_metadata_show(cs, args):
|
||||
"""Show metadata of given volume."""
|
||||
volume = utils.find_volume(cs, args.volume)
|
||||
utils.print_dict(volume._info['metadata'], 'Metadata-property')
|
||||
|
||||
|
||||
@utils.arg('volume',
|
||||
metavar='<volume>',
|
||||
help='ID of the volume to update metadata on.')
|
||||
@utils.arg('metadata',
|
||||
metavar='<key=value>',
|
||||
nargs='+',
|
||||
default=[],
|
||||
help='Metadata entry/entries to update.')
|
||||
@utils.service_type('volume')
|
||||
def do_metadata_update_all(cs, args):
|
||||
"""Update all metadata of a volume."""
|
||||
volume = utils.find_volume(cs, args.volume)
|
||||
metadata = _extract_metadata(args)
|
||||
metadata = volume.update_all_metadata(metadata)
|
||||
utils.print_dict(metadata)
|
||||
|
||||
|
||||
@utils.arg('snapshot',
|
||||
metavar='<snapshot>',
|
||||
help='ID of the snapshot to update metadata on.')
|
||||
@utils.arg('metadata',
|
||||
metavar='<key=value>',
|
||||
nargs='+',
|
||||
default=[],
|
||||
help='Metadata entry/entries to update.')
|
||||
@utils.service_type('volume')
|
||||
def do_snapshot_metadata_update_all(cs, args):
|
||||
"""Update all metadata of a snapshot."""
|
||||
snapshot = _find_volume_snapshot(cs, args.snapshot)
|
||||
metadata = _extract_metadata(args)
|
||||
metadata = snapshot.update_all_metadata(metadata)
|
||||
utils.print_dict(metadata)
|
||||
|
@ -57,6 +57,18 @@ class Snapshot(base.Resource):
|
||||
"""Update the snapshot with the privided state."""
|
||||
self.manager.reset_state(self, state)
|
||||
|
||||
def set_metadata(self, metadata):
|
||||
"""Set metadata of this snapshot."""
|
||||
return self.manager.set_metadata(self, metadata)
|
||||
|
||||
def delete_metadata(self, keys):
|
||||
"""Delete metadata of this snapshot."""
|
||||
return self.manager.delete_metadata(self, keys)
|
||||
|
||||
def update_all_metadata(self, metadata):
|
||||
"""Update_all metadata of this snapshot."""
|
||||
return self.manager.update_all_metadata(self, metadata)
|
||||
|
||||
|
||||
class SnapshotManager(base.ManagerWithFind):
|
||||
"""
|
||||
@ -158,3 +170,33 @@ class SnapshotManager(base.ManagerWithFind):
|
||||
def update_snapshot_status(self, snapshot, update_dict):
|
||||
return self._action('os-update_snapshot_status',
|
||||
base.getid(snapshot), update_dict)
|
||||
|
||||
def set_metadata(self, snapshot, metadata):
|
||||
"""Update/Set a snapshots metadata.
|
||||
|
||||
:param snapshot: The :class:`Snapshot`.
|
||||
:param metadata: A list of keys to be set.
|
||||
"""
|
||||
body = {'metadata': metadata}
|
||||
return self._create("/snapshots/%s/metadata" % base.getid(snapshot),
|
||||
body, "metadata")
|
||||
|
||||
def delete_metadata(self, snapshot, keys):
|
||||
"""Delete specified keys from snapshot metadata.
|
||||
|
||||
:param snapshot: The :class:`Snapshot`.
|
||||
:param keys: A list of keys to be removed.
|
||||
"""
|
||||
snapshot_id = base.getid(snapshot)
|
||||
for k in keys:
|
||||
self._delete("/snapshots/%s/metadata/%s" % (snapshot_id, k))
|
||||
|
||||
def update_all_metadata(self, snapshot, metadata):
|
||||
"""Update_all snapshot metadata.
|
||||
|
||||
:param snapshot: The :class:`Snapshot`.
|
||||
:param metadata: A list of keys to be updated.
|
||||
"""
|
||||
body = {'metadata': metadata}
|
||||
return self._update("/snapshots/%s/metadata" % base.getid(snapshot),
|
||||
body)
|
||||
|
@ -123,6 +123,10 @@ class Volume(base.Resource):
|
||||
# self.manager.migrate_volume_completion(self, old_volume,
|
||||
# new_volume, error)
|
||||
|
||||
def update_all_metadata(self, metadata):
|
||||
"""Update all metadata of this volume."""
|
||||
return self.manager.update_all_metadata(self, metadata)
|
||||
|
||||
|
||||
class VolumeManager(base.ManagerWithFind):
|
||||
"""
|
||||
@ -331,7 +335,7 @@ class VolumeManager(base.ManagerWithFind):
|
||||
Delete specified keys from volumes metadata.
|
||||
|
||||
:param volume: The :class:`Volume`.
|
||||
:param metadata: A list of keys to be removed.
|
||||
:param keys: A list of keys to be removed.
|
||||
"""
|
||||
for k in keys:
|
||||
self._delete("/volumes/%s/metadata/%s" % (base.getid(volume), k))
|
||||
@ -395,3 +399,13 @@ class VolumeManager(base.ManagerWithFind):
|
||||
return self._action('os-migrate_volume_completion',
|
||||
old_volume,
|
||||
{'new_volume': new_volume_id, 'error': error})[1]
|
||||
|
||||
def update_all_metadata(self, volume, metadata):
|
||||
"""Update all metadata of a volume.
|
||||
|
||||
:param volume: The :class:`Volume`.
|
||||
:param metadata: A list of keys to be updated.
|
||||
"""
|
||||
body = {'metadata': metadata}
|
||||
return self._update("/volumes/%s/metadata" % base.getid(volume),
|
||||
body)
|
||||
|
@ -1331,3 +1331,80 @@ def do_qos_get_association(cs, args):
|
||||
"""Get all associations of specific qos specs."""
|
||||
associations = cs.qos_specs.get_associations(args.qos_specs)
|
||||
_print_associations_list(associations)
|
||||
|
||||
|
||||
@utils.arg('snapshot',
|
||||
metavar='<snapshot>',
|
||||
help='ID of the snapshot to update metadata on.')
|
||||
@utils.arg('action',
|
||||
metavar='<action>',
|
||||
choices=['set', 'unset'],
|
||||
help="Actions: 'set' or 'unset'")
|
||||
@utils.arg('metadata',
|
||||
metavar='<key=value>',
|
||||
nargs='+',
|
||||
default=[],
|
||||
help='Metadata to set/unset (only key is necessary on unset)')
|
||||
@utils.service_type('volumev2')
|
||||
def do_snapshot_metadata(cs, args):
|
||||
"""Set or Delete metadata of a snapshot."""
|
||||
snapshot = _find_volume_snapshot(cs, args.snapshot)
|
||||
metadata = _extract_metadata(args)
|
||||
|
||||
if args.action == 'set':
|
||||
metadata = snapshot.set_metadata(metadata)
|
||||
utils.print_dict(metadata._info)
|
||||
elif args.action == 'unset':
|
||||
snapshot.delete_metadata(list(metadata.keys()))
|
||||
|
||||
|
||||
@utils.arg('snapshot', metavar='<snapshot>',
|
||||
help='ID of snapshot')
|
||||
@utils.service_type('volumev2')
|
||||
def do_snapshot_metadata_show(cs, args):
|
||||
"""Show metadata of given snapshot."""
|
||||
snapshot = _find_volume_snapshot(cs, args.snapshot)
|
||||
utils.print_dict(snapshot._info['metadata'], 'Metadata-property')
|
||||
|
||||
|
||||
@utils.arg('volume', metavar='<volume>',
|
||||
help='ID of volume')
|
||||
@utils.service_type('volumev2')
|
||||
def do_metadata_show(cs, args):
|
||||
"""Show metadata of given volume."""
|
||||
volume = utils.find_volume(cs, args.volume)
|
||||
utils.print_dict(volume._info['metadata'], 'Metadata-property')
|
||||
|
||||
|
||||
@utils.arg('volume',
|
||||
metavar='<volume>',
|
||||
help='ID of the volume to update metadata on.')
|
||||
@utils.arg('metadata',
|
||||
metavar='<key=value>',
|
||||
nargs='+',
|
||||
default=[],
|
||||
help='Metadata entry/entries to update.')
|
||||
@utils.service_type('volumev2')
|
||||
def do_metadata_update_all(cs, args):
|
||||
"""Update all metadata of a volume."""
|
||||
volume = utils.find_volume(cs, args.volume)
|
||||
metadata = _extract_metadata(args)
|
||||
metadata = volume.update_all_metadata(metadata)
|
||||
utils.print_dict(metadata)
|
||||
|
||||
|
||||
@utils.arg('snapshot',
|
||||
metavar='<snapshot>',
|
||||
help='ID of the snapshot to update metadata on.')
|
||||
@utils.arg('metadata',
|
||||
metavar='<key=value>',
|
||||
nargs='+',
|
||||
default=[],
|
||||
help='Metadata entry/entries to update')
|
||||
@utils.service_type('volumev2')
|
||||
def do_snapshot_metadata_update_all(cs, args):
|
||||
"""Update all metadata of a snapshot."""
|
||||
snapshot = _find_volume_snapshot(cs, args.snapshot)
|
||||
metadata = _extract_metadata(args)
|
||||
metadata = snapshot.update_all_metadata(metadata)
|
||||
utils.print_dict(metadata)
|
||||
|
@ -49,6 +49,18 @@ class Snapshot(base.Resource):
|
||||
"""Update the snapshot with the provided state."""
|
||||
self.manager.reset_state(self, state)
|
||||
|
||||
def set_metadata(self, metadata):
|
||||
"""Set metadata of this snapshot."""
|
||||
return self.manager.set_metadata(self, metadata)
|
||||
|
||||
def delete_metadata(self, keys):
|
||||
"""Delete metadata of this snapshot."""
|
||||
return self.manager.delete_metadata(self, keys)
|
||||
|
||||
def update_all_metadata(self, metadata):
|
||||
"""Update_all metadata of this snapshot."""
|
||||
return self.manager.update_all_metadata(self, metadata)
|
||||
|
||||
|
||||
class SnapshotManager(base.ManagerWithFind):
|
||||
"""Manage :class:`Snapshot` resources."""
|
||||
@ -143,3 +155,33 @@ class SnapshotManager(base.ManagerWithFind):
|
||||
def update_snapshot_status(self, snapshot, update_dict):
|
||||
return self._action('os-update_snapshot_status',
|
||||
base.getid(snapshot), update_dict)
|
||||
|
||||
def set_metadata(self, snapshot, metadata):
|
||||
"""Update/Set a snapshots metadata.
|
||||
|
||||
:param snapshot: The :class:`Snapshot`.
|
||||
:param metadata: A list of keys to be set.
|
||||
"""
|
||||
body = {'metadata': metadata}
|
||||
return self._create("/snapshots/%s/metadata" % base.getid(snapshot),
|
||||
body, "metadata")
|
||||
|
||||
def delete_metadata(self, snapshot, keys):
|
||||
"""Delete specified keys from snapshot metadata.
|
||||
|
||||
:param snapshot: The :class:`Snapshot`.
|
||||
:param keys: A list of keys to be removed.
|
||||
"""
|
||||
snapshot_id = base.getid(snapshot)
|
||||
for k in keys:
|
||||
self._delete("/snapshots/%s/metadata/%s" % (snapshot_id, k))
|
||||
|
||||
def update_all_metadata(self, snapshot, metadata):
|
||||
"""Update_all snapshot metadata.
|
||||
|
||||
:param snapshot: The :class:`Snapshot`.
|
||||
:param metadata: A list of keys to be updated.
|
||||
"""
|
||||
body = {'metadata': metadata}
|
||||
return self._update("/snapshots/%s/metadata" % base.getid(snapshot),
|
||||
body)
|
||||
|
@ -121,6 +121,10 @@ class Volume(base.Resource):
|
||||
# self.manager.migrate_volume_completion(self, old_volume,
|
||||
# new_volume, error)
|
||||
|
||||
def update_all_metadata(self, metadata):
|
||||
"""Update all metadata of this volume."""
|
||||
return self.manager.update_all_metadata(self, metadata)
|
||||
|
||||
|
||||
class VolumeManager(base.ManagerWithFind):
|
||||
"""Manage :class:`Volume` resources."""
|
||||
@ -314,7 +318,7 @@ class VolumeManager(base.ManagerWithFind):
|
||||
"""Delete specified keys from volumes metadata.
|
||||
|
||||
:param volume: The :class:`Volume`.
|
||||
:param metadata: A list of keys to be removed.
|
||||
:param keys: A list of keys to be removed.
|
||||
"""
|
||||
for k in keys:
|
||||
self._delete("/volumes/%s/metadata/%s" % (base.getid(volume), k))
|
||||
@ -377,3 +381,13 @@ class VolumeManager(base.ManagerWithFind):
|
||||
return self._action('os-migrate_volume_completion',
|
||||
old_volume,
|
||||
{'new_volume': new_volume_id, 'error': error})[1]
|
||||
|
||||
def update_all_metadata(self, volume, metadata):
|
||||
"""Update all metadata of a volume.
|
||||
|
||||
:param volume: The :class:`Volume`.
|
||||
:param metadata: A list of keys to be updated.
|
||||
"""
|
||||
body = {'metadata': metadata}
|
||||
return self._update("/volumes/%s/metadata" % base.getid(volume),
|
||||
body)
|
||||
|
Loading…
Reference in New Issue
Block a user