From b9fab849f7be93fa62e793ce68303a9473c54fa7 Mon Sep 17 00:00:00 2001
From: Pavlo Shchelokovskyy <shchelokovskyy@gmail.com>
Date: Mon, 14 May 2018 17:57:28 +0000
Subject: [PATCH] Skip calls to glance and nova when got no servers

save (potentially many) HTTP calls to Glance API for image list
and a call to Nova API for flavor list when the server list
actually returned no servers.

Change-Id: I93a56138c50b82fb4dce67a2f788107f71c5f423
Story: #2002039
Task: #19681
---
 openstackclient/compute/v2/server.py          |  4 ++--
 .../tests/unit/compute/v2/test_server.py      | 19 +++++++++++++++++++
 2 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py
index b82f895c0e..777f7744e7 100644
--- a/openstackclient/compute/v2/server.py
+++ b/openstackclient/compute/v2/server.py
@@ -1226,7 +1226,7 @@ class ListServer(command.Lister):
         # Create a dict that maps image_id to image object.
         # Needed so that we can display the "Image Name" column.
         # "Image Name" is not crucial, so we swallow any exceptions.
-        if not parsed_args.no_name_lookup:
+        if data and not parsed_args.no_name_lookup:
             try:
                 images_list = self.app.client_manager.image.images.list()
                 for i in images_list:
@@ -1238,7 +1238,7 @@ class ListServer(command.Lister):
         # Create a dict that maps flavor_id to flavor object.
         # Needed so that we can display the "Flavor Name" column.
         # "Flavor Name" is not crucial, so we swallow any exceptions.
-        if not parsed_args.no_name_lookup:
+        if data and not parsed_args.no_name_lookup:
             try:
                 flavors_list = compute_client.flavors.list(is_public=None)
                 for i in flavors_list:
diff --git a/openstackclient/tests/unit/compute/v2/test_server.py b/openstackclient/tests/unit/compute/v2/test_server.py
index a53c6c8193..46d4c24114 100644
--- a/openstackclient/tests/unit/compute/v2/test_server.py
+++ b/openstackclient/tests/unit/compute/v2/test_server.py
@@ -1947,6 +1947,25 @@ class TestServerList(TestServer):
         self.assertEqual(self.columns, columns)
         self.assertEqual(tuple(self.data), tuple(data))
 
+    def test_server_list_no_servers(self):
+        arglist = []
+        verifylist = [
+            ('all_projects', False),
+            ('long', False),
+            ('deleted', False),
+        ]
+        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+        self.servers_mock.list.return_value = []
+        self.data = ()
+
+        columns, data = self.cmd.take_action(parsed_args)
+
+        self.servers_mock.list.assert_called_with(**self.kwargs)
+        self.assertEqual(0, self.images_mock.list.call_count)
+        self.assertEqual(0, self.flavors_mock.list.call_count)
+        self.assertEqual(self.columns, columns)
+        self.assertEqual(tuple(self.data), tuple(data))
+
     def test_server_list_long_option(self):
         arglist = [
             '--long',