Skip to content

Commit b74be57

Browse files
committed
"server list": "Image Name", "Image ID" columns
The `Image Name` column is shown by default (i.e.: without passing `--long`). E.g.: ``` $ openstack server list WARNING: openstackclient.common.utils is deprecated and will be removed after Jun 2017. Please use osc_lib.utils +--------------------------------------+-----------------+---------+----------------------+----------------------+ | ID | Name | Status | Networks | Image Name | +--------------------------------------+-----------------+---------+----------------------+----------------------+ | abe67035-b14f-4541-b436-e0e778ec4227 | n9anonw302mgm1 | ACTIVE | mnky3-3000=10.3.0.55 | Koala.2016-07-01-175 | | 8f6a2d12-2bc3-4d89-ba94-8916ce9cdf92 | n9anonw301mgm1 | ACTIVE | mnky3-3000=10.3.0.37 | Koala.2016-07-01-175 | | b316d6d1-67cf-4f75-94a4-4c9a2b03f6a4 | n9dobby301mgm0 | ACTIVE | mnky3-3000=10.3.0.36 | Koala.2016-05-04-130 | +--------------------------------------+-----------------+---------+----------------------+----------------------+ ``` The `Image ID` column is only available with `--long`. E.g.: ``` $ openstack server list --long -c Name -c "Image Name" -c "Image ID" WARNING: openstackclient.common.utils is deprecated and will be removed after Jun 2017. Please use osc_lib.utils +-----------------+----------------------+--------------------------------------+ | Name | Image Name | Image ID | +-----------------+----------------------+--------------------------------------+ | n9anonw302mgm1 | Koala.2016-07-01-175 | f587c6fc-1df3-42cd-ac86-8cd2c995a8d9 | | n9anonw301mgm1 | Koala.2016-07-01-175 | f587c6fc-1df3-42cd-ac86-8cd2c995a8d9 | | n9dobby301mgm0 | Koala.2016-05-04-130 | 37ff47a6-3e51-4986-bfa5-62afbfad5dfc | +-----------------+----------------------+--------------------------------------+ ``` Closes-Bug: #1599304 Change-Id: I477995b840eb9520b285948926ebbfe1777dd86c
1 parent 44d4188 commit b74be57

2 files changed

Lines changed: 56 additions & 12 deletions

File tree

openstackclient/compute/v2/server.py

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -776,6 +776,8 @@ def take_action(self, parsed_args):
776776
'OS-EXT-STS:task_state',
777777
'OS-EXT-STS:power_state',
778778
'Networks',
779+
'Image Name',
780+
'Image ID',
779781
'OS-EXT-AZ:availability_zone',
780782
'OS-EXT-SRV-ATTR:host',
781783
'Metadata',
@@ -787,6 +789,8 @@ def take_action(self, parsed_args):
787789
'Task State',
788790
'Power State',
789791
'Networks',
792+
'Image Name',
793+
'Image ID',
790794
'Availability Zone',
791795
'Host',
792796
'Properties',
@@ -803,12 +807,14 @@ def take_action(self, parsed_args):
803807
'Name',
804808
'Status',
805809
'Networks',
810+
'Image Name',
806811
)
807812
column_headers = (
808813
'ID',
809814
'Name',
810815
'Status',
811816
'Networks',
817+
'Image Name',
812818
)
813819
mixed_case_fields = []
814820

@@ -820,17 +826,42 @@ def take_action(self, parsed_args):
820826
data = compute_client.servers.list(search_opts=search_opts,
821827
marker=marker_id,
822828
limit=parsed_args.limit)
823-
return (column_headers,
824-
(utils.get_item_properties(
825-
s, columns,
826-
mixed_case_fields=mixed_case_fields,
827-
formatters={
828-
'OS-EXT-STS:power_state':
829-
_format_servers_list_power_state,
830-
'Networks': _format_servers_list_networks,
831-
'Metadata': utils.format_dict,
832-
},
833-
) for s in data))
829+
830+
images = {}
831+
# Create a dict that maps image_id to image object.
832+
# Needed so that we can display the "Image Name" column.
833+
# "Image Name" is not crucial, so we swallow any exceptions.
834+
try:
835+
images_list = self.app.client_manager.image.images.list()
836+
for i in images_list:
837+
images[i.id] = i
838+
except Exception:
839+
pass
840+
841+
# Populate image_name and image_id attributes of server objects
842+
# so that we can display "Image Name" and "Image ID" columns.
843+
for s in data:
844+
if 'id' in s.image:
845+
image = images.get(s.image['id'])
846+
if image:
847+
s.image_name = image.name
848+
s.image_id = s.image['id']
849+
else:
850+
s.image_name = ''
851+
s.image_id = ''
852+
853+
table = (column_headers,
854+
(utils.get_item_properties(
855+
s, columns,
856+
mixed_case_fields=mixed_case_fields,
857+
formatters={
858+
'OS-EXT-STS:power_state':
859+
_format_servers_list_power_state,
860+
'Networks': _format_servers_list_networks,
861+
'Metadata': utils.format_dict,
862+
},
863+
) for s in data))
864+
return table
834865

835866

836867
class LockServer(command.Command):

openstackclient/tests/compute/v2/test_server.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
# License for the specific language governing permissions and limitations
1313
# under the License.
1414
#
15+
import collections
1516
import getpass
1617
import mock
1718
from mock import call
@@ -519,6 +520,7 @@ class TestServerList(TestServer):
519520
'Name',
520521
'Status',
521522
'Networks',
523+
'Image Name',
522524
)
523525
columns_long = (
524526
'ID',
@@ -527,6 +529,8 @@ class TestServerList(TestServer):
527529
'Task State',
528530
'Power State',
529531
'Networks',
532+
'Image Name',
533+
'Image ID',
530534
'Availability Zone',
531535
'Host',
532536
'Properties',
@@ -589,12 +593,19 @@ def setUp(self):
589593
self.data = []
590594
self.data_long = []
591595

596+
Image = collections.namedtuple('Image', 'id name')
597+
self.images_mock.list.return_value = [
598+
Image(id=s.image['id'], name=self.image.name)
599+
for s in self.servers
600+
]
601+
592602
for s in self.servers:
593603
self.data.append((
594604
s.id,
595605
s.name,
596606
s.status,
597607
server._format_servers_list_networks(s.networks),
608+
self.image.name,
598609
))
599610
self.data_long.append((
600611
s.id,
@@ -605,6 +616,8 @@ def setUp(self):
605616
getattr(s, 'OS-EXT-STS:power_state')
606617
),
607618
server._format_servers_list_networks(s.networks),
619+
self.image.name,
620+
s.image['id'],
608621
getattr(s, 'OS-EXT-AZ:availability_zone'),
609622
getattr(s, 'OS-EXT-SRV-ATTR:host'),
610623
s.Metadata,
@@ -652,7 +665,7 @@ def test_server_list_with_image(self):
652665
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
653666
columns, data = self.cmd.take_action(parsed_args)
654667

655-
self.cimages_mock.get.assert_called_with(self.image.id)
668+
self.cimages_mock.get.assert_any_call(self.image.id)
656669

657670
self.search_opts['image'] = self.image.id
658671
self.servers_mock.list.assert_called_with(**self.kwargs)

0 commit comments

Comments
 (0)