diff options
Diffstat (limited to 'openstackclient/image')
| -rw-r--r-- | openstackclient/image/v1/image.py | 96 | ||||
| -rw-r--r-- | openstackclient/image/v2/image.py | 81 |
2 files changed, 155 insertions, 22 deletions
diff --git a/openstackclient/image/v1/image.py b/openstackclient/image/v1/image.py index fc70000d..2490d2a0 100644 --- a/openstackclient/image/v1/image.py +++ b/openstackclient/image/v1/image.py @@ -15,6 +15,7 @@ """Image V1 Action Implementations""" +import argparse import io import logging import os @@ -31,6 +32,7 @@ from cliff import lister from cliff import show from glanceclient.common import utils as gc_utils +from openstackclient.api import utils as api_utils from openstackclient.common import exceptions from openstackclient.common import parseractions from openstackclient.common import utils @@ -40,6 +42,21 @@ DEFAULT_CONTAINER_FORMAT = 'bare' DEFAULT_DISK_FORMAT = 'raw' +def _format_visibility(data): + """Return a formatted visibility string + + :param data: + The server's visibility (is_public) status value: True, False + :rtype: + A string formatted to public/private + """ + + if data: + return 'public' + else: + return 'private' + + class CreateImage(show.ShowOne): """Create/upload an image""" @@ -295,11 +312,6 @@ class ListImage(lister.Lister): def get_parser(self, prog_name): parser = super(ListImage, self).get_parser(prog_name) - parser.add_argument( - "--page-size", - metavar="<size>", - help="Number of images to request in each paginated request", - ) public_group = parser.add_mutually_exclusive_group() public_group.add_argument( "--public", @@ -315,12 +327,34 @@ class ListImage(lister.Lister): default=False, help="List only private images", ) + # Included for silent CLI compatibility with v2 + public_group.add_argument( + "--shared", + dest="shared", + action="store_true", + default=False, + help=argparse.SUPPRESS, + ) + parser.add_argument( + '--property', + metavar='<key=value>', + action=parseractions.KeyValueAction, + help='Filter output based on property', + ) parser.add_argument( '--long', action='store_true', default=False, help='List additional fields in output', ) + + # --page-size has never worked, leave here for silent compatability + # We'll implement limit/marker differently later + parser.add_argument( + "--page-size", + metavar="<size>", + help=argparse.SUPPRESS, + ) return parser def take_action(self, parsed_args): @@ -329,23 +363,63 @@ class ListImage(lister.Lister): image_client = self.app.client_manager.image kwargs = {} - if parsed_args.page_size is not None: - kwargs["page_size"] = parsed_args.page_size if parsed_args.public: kwargs['public'] = True if parsed_args.private: kwargs['private'] = True - kwargs['detailed'] = parsed_args.long + kwargs['detailed'] = bool(parsed_args.property or parsed_args.long) if parsed_args.long: - columns = ('ID', 'Name', 'Disk Format', 'Container Format', - 'Size', 'Status') + columns = ( + 'ID', + 'Name', + 'Disk Format', + 'Container Format', + 'Size', + 'Status', + 'is_public', + 'protected', + 'owner', + 'properties', + ) + column_headers = ( + 'ID', + 'Name', + 'Disk Format', + 'Container Format', + 'Size', + 'Status', + 'Visibility', + 'Protected', + 'Owner', + 'Properties', + ) else: columns = ("ID", "Name") + column_headers = columns data = image_client.api.image_list(**kwargs) - return (columns, (utils.get_dict_properties(s, columns) for s in data)) + if parsed_args.property: + # NOTE(dtroyer): coerce to a list to subscript it in py3 + attr, value = list(parsed_args.property.items())[0] + api_utils.simple_filter( + data, + attr=attr, + value=value, + property_field='properties', + ) + return ( + column_headers, + (utils.get_dict_properties( + s, + columns, + formatters={ + 'is_public': _format_visibility, + 'properties': utils.format_dict, + }, + ) for s in data) + ) class SaveImage(command.Command): diff --git a/openstackclient/image/v2/image.py b/openstackclient/image/v2/image.py index 2e0fd393..4eda506c 100644 --- a/openstackclient/image/v2/image.py +++ b/openstackclient/image/v2/image.py @@ -15,6 +15,7 @@ """Image V2 Action Implementations""" +import argparse import logging import six @@ -23,6 +24,8 @@ from cliff import lister from cliff import show from glanceclient.common import utils as gc_utils +from openstackclient.api import utils as api_utils +from openstackclient.common import parseractions from openstackclient.common import utils @@ -60,11 +63,6 @@ class ListImage(lister.Lister): def get_parser(self, prog_name): parser = super(ListImage, self).get_parser(prog_name) - parser.add_argument( - "--page-size", - metavar="<size>", - help="Number of images to request in each paginated request", - ) public_group = parser.add_mutually_exclusive_group() public_group.add_argument( "--public", @@ -80,12 +78,33 @@ class ListImage(lister.Lister): default=False, help="List only private images", ) + public_group.add_argument( + "--shared", + dest="shared", + action="store_true", + default=False, + help="List only shared images", + ) + parser.add_argument( + '--property', + metavar='<key=value>', + action=parseractions.KeyValueAction, + help='Filter output based on property', + ) parser.add_argument( '--long', action='store_true', default=False, help='List additional fields in output', ) + + # --page-size has never worked, leave here for silent compatability + # We'll implement limit/marker differently later + parser.add_argument( + "--page-size", + metavar="<size>", + help=argparse.SUPPRESS, + ) return parser def take_action(self, parsed_args): @@ -94,23 +113,63 @@ class ListImage(lister.Lister): image_client = self.app.client_manager.image kwargs = {} - if parsed_args.page_size is not None: - kwargs["page_size"] = parsed_args.page_size if parsed_args.public: kwargs['public'] = True if parsed_args.private: kwargs['private'] = True - kwargs['detailed'] = parsed_args.long + if parsed_args.shared: + kwargs['shared'] = True if parsed_args.long: - columns = ('ID', 'Name', 'Disk Format', 'Container Format', - 'Size', 'Status') + columns = ( + 'ID', + 'Name', + 'Disk Format', + 'Container Format', + 'Size', + 'Status', + 'visibility', + 'protected', + 'owner', + 'tags', + ) + column_headers = ( + 'ID', + 'Name', + 'Disk Format', + 'Container Format', + 'Size', + 'Status', + 'Visibility', + 'Protected', + 'Owner', + 'Tags', + ) else: columns = ("ID", "Name") + column_headers = columns data = image_client.api.image_list(**kwargs) - return (columns, (utils.get_dict_properties(s, columns) for s in data)) + if parsed_args.property: + # NOTE(dtroyer): coerce to a list to subscript it in py3 + attr, value = list(parsed_args.property.items())[0] + api_utils.simple_filter( + data, + attr=attr, + value=value, + property_field='properties', + ) + return ( + column_headers, + (utils.get_dict_properties( + s, + columns, + formatters={ + 'tags': utils.format_dict, + }, + ) for s in data) + ) class SaveImage(command.Command): |
