summaryrefslogtreecommitdiff
path: root/openstackclient/volume/v1/volume.py
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient/volume/v1/volume.py')
-rw-r--r--openstackclient/volume/v1/volume.py62
1 files changed, 42 insertions, 20 deletions
diff --git a/openstackclient/volume/v1/volume.py b/openstackclient/volume/v1/volume.py
index b29429ef..36c7ef89 100644
--- a/openstackclient/volume/v1/volume.py
+++ b/openstackclient/volume/v1/volume.py
@@ -16,8 +16,11 @@
"""Volume v1 Volume action implementations"""
import argparse
+import functools
import logging
+from cliff import columns as cliff_columns
+from osc_lib.cli import format_columns
from osc_lib.cli import parseractions
from osc_lib.command import command
from osc_lib import exceptions
@@ -30,6 +33,37 @@ from openstackclient.i18n import _
LOG = logging.getLogger(__name__)
+class AttachmentsColumn(cliff_columns.FormattableColumn):
+ """Formattable column for attachments column.
+
+ Unlike the parent FormattableColumn class, the initializer of the
+ class takes server_cache as the second argument.
+ osc_lib.utils.get_item_properties instantiate cliff FormattableColumn
+ object with a single parameter "column value", so you need to pass
+ a partially initialized class like
+ ``functools.partial(AttachmentsColumn, server_cache)``.
+ """
+
+ def __init__(self, value, server_cache=None):
+ super(AttachmentsColumn, self).__init__(value)
+ self._server_cache = server_cache or {}
+
+ def human_readable(self):
+ """Return a formatted string of a volume's attached instances
+
+ :rtype: a string of formatted instances
+ """
+
+ msg = ''
+ for attachment in self._value:
+ server = attachment['server_id']
+ if server in self._server_cache.keys():
+ server = self._server_cache[server].name
+ device = attachment['device']
+ msg += 'Attached to %s on %s ' % (server, device)
+ return msg
+
+
def _check_size_arg(args):
"""Check whether --size option is required or not.
@@ -207,7 +241,8 @@ class CreateVolume(command.ShowOne):
# Map 'metadata' column to 'properties'
volume._info.update(
{
- 'properties': utils.format_dict(volume._info.pop('metadata')),
+ 'properties':
+ format_columns.DictColumn(volume._info.pop('metadata')),
'type': volume._info.pop('volume_type'),
},
)
@@ -307,22 +342,6 @@ class ListVolume(command.Lister):
volume_client = self.app.client_manager.volume
compute_client = self.app.client_manager.compute
- def _format_attach(attachments):
- """Return a formatted string of a volume's attached instances
-
- :param attachments: a volume.attachments field
- :rtype: a string of formatted instances
- """
-
- msg = ''
- for attachment in attachments:
- server = attachment['server_id']
- if server in server_cache.keys():
- server = server_cache[server].name
- device = attachment['device']
- msg += 'Attached to %s on %s ' % (server, device)
- return msg
-
if parsed_args.long:
columns = (
'ID',
@@ -368,6 +387,8 @@ class ListVolume(command.Lister):
except Exception:
# Just forget it if there's any trouble
pass
+ AttachmentsColumnWithCache = functools.partial(
+ AttachmentsColumn, server_cache=server_cache)
search_opts = {
'all_tenants': parsed_args.all_projects,
@@ -385,8 +406,8 @@ class ListVolume(command.Lister):
return (column_headers,
(utils.get_item_properties(
s, columns,
- formatters={'Metadata': utils.format_dict,
- 'Attachments': _format_attach},
+ formatters={'Metadata': format_columns.DictColumn,
+ 'Attachments': AttachmentsColumnWithCache},
) for s in data))
@@ -575,7 +596,8 @@ class ShowVolume(command.ShowOne):
# Map 'metadata' column to 'properties'
volume._info.update(
{
- 'properties': utils.format_dict(volume._info.pop('metadata')),
+ 'properties':
+ format_columns.DictColumn(volume._info.pop('metadata')),
'type': volume._info.pop('volume_type'),
},
)