Skip to content

Commit ec8dba2

Browse files
pshchelostephenfin
authored andcommitted
Speed up standard flavor list command
currently this command tries to fetch extra_specs for any flavor that does not have them (which is quite usual), regardless if the command was even asked to display them (--long) at all. This significantly slows down this command as it makes a lot of unnecessary REST calls, one per each flavor to fetch extra_specs for. With this patch, client only attempts to fetch flavor extra_specs if the user actually called the client with --long. Change-Id: Ia36414d891a41b641d7a9a04f0a1e7d43cfee351 Story: 2010343 Task: 46484
1 parent 00d8d94 commit ec8dba2

3 files changed

Lines changed: 66 additions & 1 deletion

File tree

openstackclient/compute/v2/flavor.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ def take_action(self, parsed_args):
333333
# Even if server supports 2.61 some policy might stop it sending us
334334
# extra_specs. So try to fetch them if they are absent
335335
for f in data:
336-
if not f.extra_specs:
336+
if parsed_args.long and not f.extra_specs:
337337
compute_client.fetch_flavor_extra_specs(f)
338338

339339
columns = (

openstackclient/tests/unit/compute/v2/test_flavor.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -523,6 +523,7 @@ def test_flavor_list_no_options(self):
523523
self.sdk_client.flavors.assert_called_with(
524524
**kwargs
525525
)
526+
self.sdk_client.fetch_flavor_extra_specs.assert_not_called()
526527

527528
self.assertEqual(self.columns, columns)
528529
self.assertEqual(self.data, tuple(data))
@@ -550,6 +551,7 @@ def test_flavor_list_all_flavors(self):
550551
self.sdk_client.flavors.assert_called_with(
551552
**kwargs
552553
)
554+
self.sdk_client.fetch_flavor_extra_specs.assert_not_called()
553555

554556
self.assertEqual(self.columns, columns)
555557
self.assertEqual(self.data, tuple(data))
@@ -577,6 +579,7 @@ def test_flavor_list_private_flavors(self):
577579
self.sdk_client.flavors.assert_called_with(
578580
**kwargs
579581
)
582+
self.sdk_client.fetch_flavor_extra_specs.assert_not_called()
580583

581584
self.assertEqual(self.columns, columns)
582585
self.assertEqual(self.data, tuple(data))
@@ -604,6 +607,7 @@ def test_flavor_list_public_flavors(self):
604607
self.sdk_client.flavors.assert_called_with(
605608
**kwargs
606609
)
610+
self.sdk_client.fetch_flavor_extra_specs.assert_not_called()
607611

608612
self.assertEqual(self.columns, columns)
609613
self.assertEqual(self.data, tuple(data))
@@ -631,6 +635,58 @@ def test_flavor_list_long(self):
631635
self.sdk_client.flavors.assert_called_with(
632636
**kwargs
633637
)
638+
self.sdk_client.fetch_flavor_extra_specs.assert_not_called()
639+
640+
self.assertEqual(self.columns_long, columns)
641+
self.assertCountEqual(self.data_long, tuple(data))
642+
643+
def test_flavor_list_long_no_extra_specs(self):
644+
# use flavor with no extra specs for this test
645+
flavor = compute_fakes.FakeFlavor.create_one_flavor(
646+
attrs={"extra_specs": {}})
647+
self.data = ((
648+
flavor.id,
649+
flavor.name,
650+
flavor.ram,
651+
flavor.disk,
652+
flavor.ephemeral,
653+
flavor.vcpus,
654+
flavor.is_public,
655+
),)
656+
self.data_long = (self.data[0] + (
657+
flavor.swap,
658+
flavor.rxtx_factor,
659+
format_columns.DictColumn(flavor.extra_specs)
660+
),)
661+
self.api_mock.side_effect = [[flavor], [], ]
662+
663+
self.sdk_client.flavors = self.api_mock
664+
self.sdk_client.fetch_flavor_extra_specs = mock.Mock(return_value=None)
665+
666+
arglist = [
667+
'--long',
668+
]
669+
verifylist = [
670+
('long', True),
671+
]
672+
673+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
674+
675+
# In base command class Lister in cliff, abstract method take_action()
676+
# returns a tuple containing the column names and an iterable
677+
# containing the data to be listed.
678+
columns, data = self.cmd.take_action(parsed_args)
679+
680+
# Set expected values
681+
kwargs = {
682+
'is_public': True,
683+
}
684+
685+
self.sdk_client.flavors.assert_called_with(
686+
**kwargs
687+
)
688+
self.sdk_client.fetch_flavor_extra_specs.assert_called_once_with(
689+
flavor)
634690

635691
self.assertEqual(self.columns_long, columns)
636692
self.assertCountEqual(self.data_long, tuple(data))
@@ -662,6 +718,7 @@ def test_flavor_list_min_disk_min_ram(self):
662718
self.sdk_client.flavors.assert_called_with(
663719
**kwargs
664720
)
721+
self.sdk_client.fetch_flavor_extra_specs.assert_not_called()
665722

666723
self.assertEqual(self.columns, columns)
667724
self.assertEqual(tuple(self.data), tuple(data))
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
fixes:
3+
- |
4+
The ``flavor list`` command will no longer attempt to fetch extra specs
5+
unless they are actually required (by using the ``--long``) option. This
6+
should significantly improve performance on clouds with a large number of
7+
flavors.
8+
[Story `2010343 <https://storyboard.openstack.org/#!/story/2010343>`_]

0 commit comments

Comments
 (0)