From 469381795dc1672bf4c0447b7b55b3255f6a1a61 Mon Sep 17 00:00:00 2001 From: Chris Dent Date: Fri, 1 Mar 2019 00:06:05 +0000 Subject: [PATCH] Add support for 1.18 microversion The 1.18 microversion of placement adds support for the required parameter when requesting a list of resource providers. The values are traits which limit the results to only those providers that have those traits. The --required argument may be specified multiple times. Note the NOTE in the added test about raciness. There's not a ton we can do about that since the functional tests aren't actually functional tests, they are integration. Change-Id: If79b4d12c712fdeeafa5ea77ae3411d31c8cfe9b --- osc_placement/resources/resource_provider.py | 13 +++++++ osc_placement/tests/functional/base.py | 4 +- .../functional/test_allocation_candidate.py | 4 ++ .../functional/test_resource_provider.py | 38 +++++++++++++++++++ osc_placement/version.py | 3 +- ...ider-required-traits-2ff846221bb297b9.yaml | 8 ++++ 6 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 releasenotes/notes/microversion-1.18-resource-provider-required-traits-2ff846221bb297b9.yaml diff --git a/osc_placement/resources/resource_provider.py b/osc_placement/resources/resource_provider.py index a7bd875..0358c13 100644 --- a/osc_placement/resources/resource_provider.py +++ b/osc_placement/resources/resource_provider.py @@ -118,6 +118,16 @@ class ListResourceProvider(command.Lister, version.CheckerMixin): ' This option requires at least' ' ``--os-placement-api-version 1.14``.' ) + parser.add_argument( + '--required', + metavar='', + action='append', + default=[], + help='A required trait. May be repeated. Resource providers ' + 'must collectively contain all of the required traits. ' + 'This option requires at least ' + '``--os-placement-api-version 1.18``.' + ) return parser @@ -140,6 +150,9 @@ class ListResourceProvider(command.Lister, version.CheckerMixin): if 'in_tree' in parsed_args and parsed_args.in_tree: self.check_version(version.ge('1.14')) filters['in_tree'] = parsed_args.in_tree + if 'required' in parsed_args and parsed_args.required: + self.check_version(version.ge('1.18')) + filters['required'] = ','.join(parsed_args.required) url = common.url_with_filters(BASE_URL, filters) resources = http.request('GET', url).json()['resource_providers'] diff --git a/osc_placement/tests/functional/base.py b/osc_placement/tests/functional/base.py index 112bdc6..c4ec2c6 100644 --- a/osc_placement/tests/functional/base.py +++ b/osc_placement/tests/functional/base.py @@ -123,7 +123,7 @@ class BaseTestCase(base.BaseTestCase): def resource_provider_list(self, uuid=None, name=None, aggregate_uuids=None, resources=None, - in_tree=None): + in_tree=None, required=None): to_exec = 'resource provider list' if uuid: to_exec += ' --uuid ' + uuid @@ -136,6 +136,8 @@ class BaseTestCase(base.BaseTestCase): to_exec += ' ' + ' '.join('--resource %s' % r for r in resources) if in_tree: to_exec += ' --in-tree ' + in_tree + if required: + to_exec += ' ' + ' '.join('--required %s' % t for t in required) return self.openstack(to_exec, use_json=True) diff --git a/osc_placement/tests/functional/test_allocation_candidate.py b/osc_placement/tests/functional/test_allocation_candidate.py index c913846..4c5ed7d 100644 --- a/osc_placement/tests/functional/test_allocation_candidate.py +++ b/osc_placement/tests/functional/test_allocation_candidate.py @@ -129,6 +129,10 @@ class TestAllocationCandidate116(base.BaseTestCase): class TestAllocationCandidate117(base.BaseTestCase): VERSION = '1.17' + # NOTE(cdent): The choice of traits here is important. We need to + # make sure that we do not overlap with 'test_show_required_trait' + # in TestResourceProvider118 which also creates some resource + # providers. In a multi-process enviromment, the tests can race. def test_show_required_trait(self): rp1 = self.resource_provider_create() rp2 = self.resource_provider_create() diff --git a/osc_placement/tests/functional/test_resource_provider.py b/osc_placement/tests/functional/test_resource_provider.py index 3c9e3d3..2142dbe 100644 --- a/osc_placement/tests/functional/test_resource_provider.py +++ b/osc_placement/tests/functional/test_resource_provider.py @@ -266,3 +266,41 @@ class TestResourceProvider114(base.BaseTestCase): self.resource_provider_delete, parent['uuid']) self.assertIn('HTTP 409', exc.output.decode('utf-8')) + + +class TestResourceProvider118(base.BaseTestCase): + VERSION = '1.18' + + # NOTE(cdent): The choice of traits here is important. We need to + # make sure that we do not overlap with 'test_show_required_trait' + # in TestAllocationCandidate117 which also creates some resource + # providers. In a multi-process enviromment, the tests can race. + def test_show_required_trait(self): + rp1 = self.resource_provider_create() + rp2 = self.resource_provider_create() + self.resource_inventory_set( + rp1['uuid'], 'MEMORY_MB=8192', 'DISK_GB=512') + self.resource_inventory_set( + rp2['uuid'], 'MEMORY_MB=8192', 'DISK_GB=512') + self.resource_provider_trait_set( + rp1['uuid'], 'STORAGE_DISK_SSD', 'HW_NIC_SRIOV_MULTIQUEUE') + self.resource_provider_trait_set( + rp2['uuid'], 'STORAGE_DISK_HDD', 'HW_NIC_SRIOV_MULTIQUEUE') + + rps = self.resource_provider_list( + resources=('MEMORY_MB=1024', 'DISK_GB=80'), + required=('HW_NIC_SRIOV_MULTIQUEUE',)) + + uuids = [rp['uuid'] for rp in rps] + + self.assertEqual(2, len(rps)) + self.assertIn(rp1['uuid'], uuids) + self.assertIn(rp2['uuid'], uuids) + + # Narrow the results and check multiple args. + rps = self.resource_provider_list( + resources=('MEMORY_MB=1024', 'DISK_GB=80'), + required=('STORAGE_DISK_HDD', 'HW_NIC_SRIOV_MULTIQUEUE',)) + + self.assertEqual(1, len(rps)) + self.assertEqual(rp2['uuid'], rps[0]['uuid']) diff --git a/osc_placement/version.py b/osc_placement/version.py index f073e55..efdc1fb 100644 --- a/osc_placement/version.py +++ b/osc_placement/version.py @@ -32,7 +32,8 @@ SUPPORTED_VERSIONS = [ '1.14', '1.15', # unused '1.16', - '1.17' + '1.17', + '1.18', ] diff --git a/releasenotes/notes/microversion-1.18-resource-provider-required-traits-2ff846221bb297b9.yaml b/releasenotes/notes/microversion-1.18-resource-provider-required-traits-2ff846221bb297b9.yaml new file mode 100644 index 0000000..0889815 --- /dev/null +++ b/releasenotes/notes/microversion-1.18-resource-provider-required-traits-2ff846221bb297b9.yaml @@ -0,0 +1,8 @@ +--- +features: + - | + Support is added for the `1.18`_ placement API microversion by adding + the ``--required`` option to the ``openstack resource provider list`` + command. + + .. _1.18: https://docs.openstack.org/placement/latest/placement-api-microversion-history.html#support-required-traits-queryparam-on-get-resource-providers