summaryrefslogtreecommitdiff
path: root/openstackclient/image
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient/image')
-rw-r--r--openstackclient/image/v1/image.py96
-rw-r--r--openstackclient/image/v2/image.py81
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):