summaryrefslogtreecommitdiff
path: root/openstackclient/volume/v2/volume.py
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient/volume/v2/volume.py')
-rw-r--r--openstackclient/volume/v2/volume.py62
1 files changed, 42 insertions, 20 deletions
diff --git a/openstackclient/volume/v2/volume.py b/openstackclient/volume/v2/volume.py
index ef65d097..17ccd3d3 100644
--- a/openstackclient/volume/v2/volume.py
+++ b/openstackclient/volume/v2/volume.py
@@ -16,8 +16,11 @@
import argparse
import copy
+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
@@ -31,6 +34,37 @@ from openstackclient.identity import common as identity_common
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.
@@ -212,7 +246,8 @@ class CreateVolume(command.ShowOne):
# Remove key links from being displayed
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')
}
)
@@ -331,22 +366,6 @@ class ListVolume(command.Lister):
compute_client = self.app.client_manager.compute
identity_client = self.app.client_manager.identity
- 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:
- server = server_cache[server].name
- device = attachment['device']
- msg += 'Attached to %s on %s ' % (server, device)
- return msg
-
if parsed_args.long:
columns = [
'ID',
@@ -381,6 +400,8 @@ class ListVolume(command.Lister):
except Exception:
# Just forget it if there's any trouble
pass
+ AttachmentsColumnWithCache = functools.partial(
+ AttachmentsColumn, server_cache=server_cache)
project_id = None
if parsed_args.project:
@@ -417,8 +438,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))
@@ -722,7 +743,8 @@ class ShowVolume(command.ShowOne):
# 'volume_type' --> 'type'
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'),
},
)