(WIP) feat: support list and get server's metadata.

Support list metadata, or get metadata items.

Change-Id: Ie0803defaef0ff9f4691011c1e807fc8f3be7143
This commit is contained in:
Kien Nguyen 2024-04-12 11:31:19 +07:00
parent 68219061fd
commit 0f33b3e73b
3 changed files with 35 additions and 6 deletions

View File

@ -2536,7 +2536,7 @@ nova meta
usage: nova meta <server> <action> <key=value> [<key=value> ...]
Set or delete metadata on a server.
Set, get, delete or list metadata on a server.
**Positional arguments:**
@ -2544,7 +2544,7 @@ Set or delete metadata on a server.
Name or ID of server.
``<action>``
Actions: 'set' or 'delete'.
Actions: 'set', 'delete', 'get', 'list'.
``<key=value>``
Metadata to set or delete (only key is necessary on delete).

View File

@ -2018,6 +2018,28 @@ class ServerManager(base.BootingManagerWithFind):
'rotation': rotation}
return self._action('createBackup', server, body)
def list_meta(self, server):
"""
Lists all metadata for a server.
:param server: The :class:`Server` (or its ID) to share onto.
:returns: A dict of metadata.
"""
return self._get("/servers/%s/metadata" % base.getid(server))
def get_meta(self, server, keys):
"""
Shows details for a metadata item, by key, for a server.
:param server: The :class:`Server` to add metadata to
:param keys: A list of metadata keys to delete from the server
"""
result = {'meta': {}}
for k in keys:
resp, body = self._get("/servers/%s/metadata/%s" % (base.getid(server), k))
result['meta'].update(body.get('meta', {}))
return result
def set_meta(self, server, metadata):
"""
Set a server's metadata

View File

@ -2523,17 +2523,20 @@ def do_backup(cs, args):
@utils.arg(
'action',
metavar='<action>',
choices=['set', 'delete'],
help=_("Actions: 'set' or 'delete'."))
choices=['set', 'delete', 'get', 'list'],
help=_("Actions: 'set', 'delete', 'get', 'list'"))
@utils.arg(
'metadata',
metavar='<key=value>',
nargs='+',
action='append',
default=[],
help=_('Metadata to set or delete (only key is necessary on delete).'))
help=_('Metadata to perform action (set, delete, get or list): '
'both key and value are required on set; '
'only key is necessary on get or delele; '
'list does not require any metadata.'))
def do_meta(cs, args):
"""Set or delete metadata on a server."""
"""Set, get, delete or list metadata on a server."""
server = _find_server(cs, args.server)
metadata = _extract_metadata(args)
@ -2541,6 +2544,10 @@ def do_meta(cs, args):
cs.servers.set_meta(server, metadata)
elif args.action == 'delete':
cs.servers.delete_meta(server, sorted(metadata.keys(), reverse=True))
elif args.action == 'get':
cs.servers.get_meta(server, sorted(metadata.keys(), reverse=True))
elif args.action == 'list':
cs.servers.list_meta(server)
def _print_server(cs, args, server=None, wrap=0):