diff options
author | Stephen Finucane <sfinucan@redhat.com> | 2020-02-14 10:20:56 +0000 |
---|---|---|
committer | Stephen Finucane <sfinucan@redhat.com> | 2020-02-19 08:24:31 +0000 |
commit | 9009d56d21e3494541972a4a6879b12ca84f9307 (patch) | |
tree | 7bf470f0221a86b2f6d12f917bce6f6bd8778286 | |
parent | fa5e1b556f3e70feeaeb52da75723d01b2a1464d (diff) | |
download | nova-9009d56d21e3494541972a4a6879b12ca84f9307.tar.gz |
trivial: Use recognized extra specs in tests
Tests were previously using arbitrary keys that weren't published
anywhere in the codebase. Switch to using meaningful ones.
Change-Id: I8da84b48e4d630eeb91d92346aa2323e25e28e3b
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
26 files changed, 160 insertions, 123 deletions
diff --git a/doc/api_samples/flavor-extra-specs/flavor-extra-specs-create-req.json b/doc/api_samples/flavor-extra-specs/flavor-extra-specs-create-req.json index 63fc8738b0..856fc38c01 100644 --- a/doc/api_samples/flavor-extra-specs/flavor-extra-specs-create-req.json +++ b/doc/api_samples/flavor-extra-specs/flavor-extra-specs-create-req.json @@ -1,6 +1,6 @@ { "extra_specs": { - "key1": "value1", - "key2": "value2" + "hw:cpu_policy": "shared", + "hw:numa_nodes": "1" } -}
\ No newline at end of file +} diff --git a/doc/api_samples/flavor-extra-specs/flavor-extra-specs-create-resp.json b/doc/api_samples/flavor-extra-specs/flavor-extra-specs-create-resp.json index 63fc8738b0..856fc38c01 100644 --- a/doc/api_samples/flavor-extra-specs/flavor-extra-specs-create-resp.json +++ b/doc/api_samples/flavor-extra-specs/flavor-extra-specs-create-resp.json @@ -1,6 +1,6 @@ { "extra_specs": { - "key1": "value1", - "key2": "value2" + "hw:cpu_policy": "shared", + "hw:numa_nodes": "1" } -}
\ No newline at end of file +} diff --git a/doc/api_samples/flavor-extra-specs/flavor-extra-specs-get-resp.json b/doc/api_samples/flavor-extra-specs/flavor-extra-specs-get-resp.json index e71755fe67..02284618e5 100644 --- a/doc/api_samples/flavor-extra-specs/flavor-extra-specs-get-resp.json +++ b/doc/api_samples/flavor-extra-specs/flavor-extra-specs-get-resp.json @@ -1,3 +1,3 @@ { - "key1": "value1" -}
\ No newline at end of file + "hw:numa_nodes": "1" +} diff --git a/doc/api_samples/flavor-extra-specs/flavor-extra-specs-list-resp.json b/doc/api_samples/flavor-extra-specs/flavor-extra-specs-list-resp.json index 63fc8738b0..856fc38c01 100644 --- a/doc/api_samples/flavor-extra-specs/flavor-extra-specs-list-resp.json +++ b/doc/api_samples/flavor-extra-specs/flavor-extra-specs-list-resp.json @@ -1,6 +1,6 @@ { "extra_specs": { - "key1": "value1", - "key2": "value2" + "hw:cpu_policy": "shared", + "hw:numa_nodes": "1" } -}
\ No newline at end of file +} diff --git a/doc/api_samples/flavor-extra-specs/flavor-extra-specs-update-req.json b/doc/api_samples/flavor-extra-specs/flavor-extra-specs-update-req.json index a40d79e320..eca615335a 100644 --- a/doc/api_samples/flavor-extra-specs/flavor-extra-specs-update-req.json +++ b/doc/api_samples/flavor-extra-specs/flavor-extra-specs-update-req.json @@ -1,3 +1,3 @@ { - "key1": "new_value1" -}
\ No newline at end of file + "hw:numa_nodes": "2" +} diff --git a/doc/api_samples/flavor-extra-specs/flavor-extra-specs-update-resp.json b/doc/api_samples/flavor-extra-specs/flavor-extra-specs-update-resp.json index a40d79e320..eca615335a 100644 --- a/doc/api_samples/flavor-extra-specs/flavor-extra-specs-update-resp.json +++ b/doc/api_samples/flavor-extra-specs/flavor-extra-specs-update-resp.json @@ -1,3 +1,3 @@ { - "key1": "new_value1" -}
\ No newline at end of file + "hw:numa_nodes": "2" +} diff --git a/doc/api_samples/flavors/v2.61/flavor-get-resp.json b/doc/api_samples/flavors/v2.61/flavor-get-resp.json index 124110adb7..324b7711b8 100644 --- a/doc/api_samples/flavors/v2.61/flavor-get-resp.json +++ b/doc/api_samples/flavors/v2.61/flavor-get-resp.json @@ -22,8 +22,8 @@ "rxtx_factor": 1.0, "description": "test description", "extra_specs": { - "key1": "value1", - "key2": "value2" + "hw:cpu_policy": "shared", + "hw:numa_nodes": "1" } } } diff --git a/doc/api_samples/flavors/v2.61/flavors-detail-resp.json b/doc/api_samples/flavors/v2.61/flavors-detail-resp.json index 980603f890..d4efe491f2 100644 --- a/doc/api_samples/flavors/v2.61/flavors-detail-resp.json +++ b/doc/api_samples/flavors/v2.61/flavors-detail-resp.json @@ -169,8 +169,8 @@ "rxtx_factor": 1.0, "description": "test description", "extra_specs": { - "key1": "value1", - "key2": "value2" + "hw:cpu_policy": "shared", + "hw:numa_nodes": "1" } } ] diff --git a/doc/api_samples/flavors/v2.75/flavor-get-resp.json b/doc/api_samples/flavors/v2.75/flavor-get-resp.json index e5581409f9..1d3c709b72 100644 --- a/doc/api_samples/flavors/v2.75/flavor-get-resp.json +++ b/doc/api_samples/flavors/v2.75/flavor-get-resp.json @@ -22,8 +22,8 @@ "rxtx_factor": 1.0, "description": "test description", "extra_specs": { - "key1": "value1", - "key2": "value2" + "hw:cpu_policy": "shared", + "hw:numa_nodes": "1" } } } diff --git a/doc/api_samples/flavors/v2.75/flavors-detail-resp.json b/doc/api_samples/flavors/v2.75/flavors-detail-resp.json index 7adc9084df..35eac681e7 100644 --- a/doc/api_samples/flavors/v2.75/flavors-detail-resp.json +++ b/doc/api_samples/flavors/v2.75/flavors-detail-resp.json @@ -169,8 +169,8 @@ "rxtx_factor": 1.0, "description": "test description", "extra_specs": { - "key1": "value1", - "key2": "value2" + "hw:cpu_policy": "shared", + "hw:numa_nodes": "1" } } ] diff --git a/doc/notification_samples/flavor-update.json b/doc/notification_samples/flavor-update.json index e6af0d70c5..9b2a719f5f 100644 --- a/doc/notification_samples/flavor-update.json +++ b/doc/notification_samples/flavor-update.json @@ -11,8 +11,7 @@ "disabled": false, "vcpus": 2, "extra_specs": { - "key1": "value1", - "key2": "value2" + "hw:numa_nodes": "2" }, "projects": ["fake_tenant"], "swap": 0, diff --git a/nova/tests/functional/api_sample_tests/api_samples/flavor-extra-specs/flavor-extra-specs-create-req.json.tpl b/nova/tests/functional/api_sample_tests/api_samples/flavor-extra-specs/flavor-extra-specs-create-req.json.tpl index dd858e76c5..7a08358b30 100644 --- a/nova/tests/functional/api_sample_tests/api_samples/flavor-extra-specs/flavor-extra-specs-create-req.json.tpl +++ b/nova/tests/functional/api_sample_tests/api_samples/flavor-extra-specs/flavor-extra-specs-create-req.json.tpl @@ -1,6 +1,6 @@ { "extra_specs": { - "key1": "%(value1)s", - "key2": "%(value2)s" + "hw:cpu_policy": "%(value1)s", + "hw:numa_nodes": "%(value2)s" } } diff --git a/nova/tests/functional/api_sample_tests/api_samples/flavor-extra-specs/flavor-extra-specs-create-resp.json.tpl b/nova/tests/functional/api_sample_tests/api_samples/flavor-extra-specs/flavor-extra-specs-create-resp.json.tpl index dd858e76c5..7a08358b30 100644 --- a/nova/tests/functional/api_sample_tests/api_samples/flavor-extra-specs/flavor-extra-specs-create-resp.json.tpl +++ b/nova/tests/functional/api_sample_tests/api_samples/flavor-extra-specs/flavor-extra-specs-create-resp.json.tpl @@ -1,6 +1,6 @@ { "extra_specs": { - "key1": "%(value1)s", - "key2": "%(value2)s" + "hw:cpu_policy": "%(value1)s", + "hw:numa_nodes": "%(value2)s" } } diff --git a/nova/tests/functional/api_sample_tests/api_samples/flavor-extra-specs/flavor-extra-specs-get-resp.json.tpl b/nova/tests/functional/api_sample_tests/api_samples/flavor-extra-specs/flavor-extra-specs-get-resp.json.tpl index adfa77008f..b89fb5a17e 100644 --- a/nova/tests/functional/api_sample_tests/api_samples/flavor-extra-specs/flavor-extra-specs-get-resp.json.tpl +++ b/nova/tests/functional/api_sample_tests/api_samples/flavor-extra-specs/flavor-extra-specs-get-resp.json.tpl @@ -1,3 +1,3 @@ { - "key1": "%(value1)s" + "hw:numa_nodes": "%(value1)s" } diff --git a/nova/tests/functional/api_sample_tests/api_samples/flavor-extra-specs/flavor-extra-specs-list-resp.json.tpl b/nova/tests/functional/api_sample_tests/api_samples/flavor-extra-specs/flavor-extra-specs-list-resp.json.tpl index dd858e76c5..7a08358b30 100644 --- a/nova/tests/functional/api_sample_tests/api_samples/flavor-extra-specs/flavor-extra-specs-list-resp.json.tpl +++ b/nova/tests/functional/api_sample_tests/api_samples/flavor-extra-specs/flavor-extra-specs-list-resp.json.tpl @@ -1,6 +1,6 @@ { "extra_specs": { - "key1": "%(value1)s", - "key2": "%(value2)s" + "hw:cpu_policy": "%(value1)s", + "hw:numa_nodes": "%(value2)s" } } diff --git a/nova/tests/functional/api_sample_tests/api_samples/flavor-extra-specs/flavor-extra-specs-update-req.json.tpl b/nova/tests/functional/api_sample_tests/api_samples/flavor-extra-specs/flavor-extra-specs-update-req.json.tpl index adfa77008f..b89fb5a17e 100644 --- a/nova/tests/functional/api_sample_tests/api_samples/flavor-extra-specs/flavor-extra-specs-update-req.json.tpl +++ b/nova/tests/functional/api_sample_tests/api_samples/flavor-extra-specs/flavor-extra-specs-update-req.json.tpl @@ -1,3 +1,3 @@ { - "key1": "%(value1)s" + "hw:numa_nodes": "%(value1)s" } diff --git a/nova/tests/functional/api_sample_tests/api_samples/flavor-extra-specs/flavor-extra-specs-update-resp.json.tpl b/nova/tests/functional/api_sample_tests/api_samples/flavor-extra-specs/flavor-extra-specs-update-resp.json.tpl index adfa77008f..b89fb5a17e 100644 --- a/nova/tests/functional/api_sample_tests/api_samples/flavor-extra-specs/flavor-extra-specs-update-resp.json.tpl +++ b/nova/tests/functional/api_sample_tests/api_samples/flavor-extra-specs/flavor-extra-specs-update-resp.json.tpl @@ -1,3 +1,3 @@ { - "key1": "%(value1)s" + "hw:numa_nodes": "%(value1)s" } diff --git a/nova/tests/functional/api_sample_tests/api_samples/flavors/v2.61/flavor-get-resp.json.tpl b/nova/tests/functional/api_sample_tests/api_samples/flavors/v2.61/flavor-get-resp.json.tpl index c086c874da..8c201b2223 100644 --- a/nova/tests/functional/api_sample_tests/api_samples/flavors/v2.61/flavor-get-resp.json.tpl +++ b/nova/tests/functional/api_sample_tests/api_samples/flavors/v2.61/flavor-get-resp.json.tpl @@ -22,8 +22,8 @@ "rxtx_factor": 1.0, "description": "test description", "extra_specs": { - "key1": "value1", - "key2": "value2" + "hw:cpu_policy": "shared", + "hw:numa_nodes": "1" } } } diff --git a/nova/tests/functional/api_sample_tests/api_samples/flavors/v2.61/flavors-detail-resp.json.tpl b/nova/tests/functional/api_sample_tests/api_samples/flavors/v2.61/flavors-detail-resp.json.tpl index 23bfdf27e5..32b7ee85f5 100644 --- a/nova/tests/functional/api_sample_tests/api_samples/flavors/v2.61/flavors-detail-resp.json.tpl +++ b/nova/tests/functional/api_sample_tests/api_samples/flavors/v2.61/flavors-detail-resp.json.tpl @@ -169,8 +169,8 @@ "rxtx_factor": 1.0, "description": "test description", "extra_specs": { - "key1": "value1", - "key2": "value2" + "hw:cpu_policy": "shared", + "hw:numa_nodes": "1" } } ] diff --git a/nova/tests/functional/api_sample_tests/api_samples/flavors/v2.75/flavor-get-resp.json.tpl b/nova/tests/functional/api_sample_tests/api_samples/flavors/v2.75/flavor-get-resp.json.tpl index afa3eccbea..e9dd2bbea3 100644 --- a/nova/tests/functional/api_sample_tests/api_samples/flavors/v2.75/flavor-get-resp.json.tpl +++ b/nova/tests/functional/api_sample_tests/api_samples/flavors/v2.75/flavor-get-resp.json.tpl @@ -22,8 +22,8 @@ "rxtx_factor": 1.0, "description": "test description", "extra_specs": { - "key1": "value1", - "key2": "value2" + "hw:cpu_policy": "shared", + "hw:numa_nodes": "1" } } } diff --git a/nova/tests/functional/api_sample_tests/api_samples/flavors/v2.75/flavors-detail-resp.json.tpl b/nova/tests/functional/api_sample_tests/api_samples/flavors/v2.75/flavors-detail-resp.json.tpl index bb4092aebc..9a03bee772 100644 --- a/nova/tests/functional/api_sample_tests/api_samples/flavors/v2.75/flavors-detail-resp.json.tpl +++ b/nova/tests/functional/api_sample_tests/api_samples/flavors/v2.75/flavors-detail-resp.json.tpl @@ -169,8 +169,8 @@ "rxtx_factor": 1.0, "description": "test description", "extra_specs": { - "key1": "value1", - "key2": "value2" + "hw:cpu_policy": "shared", + "hw:numa_nodes": "1" } } ] diff --git a/nova/tests/functional/api_sample_tests/test_flavor_extraspecs.py b/nova/tests/functional/api_sample_tests/test_flavor_extraspecs.py index a653bcf67c..329d565e9d 100644 --- a/nova/tests/functional/api_sample_tests/test_flavor_extraspecs.py +++ b/nova/tests/functional/api_sample_tests/test_flavor_extraspecs.py @@ -21,8 +21,9 @@ class FlavorExtraSpecsSampleJsonTests(api_sample_base.ApiSampleTestBaseV21): sample_dir = 'flavor-extra-specs' def _flavor_extra_specs_create(self): - subs = {'value1': 'value1', - 'value2': 'value2' + subs = { + 'value1': 'shared', + 'value2': '1', } response = self._do_post('flavors/1/os-extra_specs', 'flavor-extra-specs-create-req', subs) @@ -30,15 +31,18 @@ class FlavorExtraSpecsSampleJsonTests(api_sample_base.ApiSampleTestBaseV21): subs, response, 200) def test_flavor_extra_specs_get(self): - subs = {'value1': 'value1'} + subs = { + 'value1': '1', + } self._flavor_extra_specs_create() - response = self._do_get('flavors/1/os-extra_specs/key1') + response = self._do_get('flavors/1/os-extra_specs/hw:numa_nodes') self._verify_response('flavor-extra-specs-get-resp', subs, response, 200) def test_flavor_extra_specs_list(self): - subs = {'value1': 'value1', - 'value2': 'value2' + subs = { + 'value1': 'shared', + 'value2': '1', } self._flavor_extra_specs_create() response = self._do_get('flavors/1/os-extra_specs') @@ -49,15 +53,17 @@ class FlavorExtraSpecsSampleJsonTests(api_sample_base.ApiSampleTestBaseV21): self._flavor_extra_specs_create() def test_flavor_extra_specs_update(self): - subs = {'value1': 'new_value1'} + subs = { + 'value1': '2', + } self._flavor_extra_specs_create() - response = self._do_put('flavors/1/os-extra_specs/key1', + response = self._do_put('flavors/1/os-extra_specs/hw:numa_nodes', 'flavor-extra-specs-update-req', subs) self._verify_response('flavor-extra-specs-update-resp', subs, response, 200) def test_flavor_extra_specs_delete(self): self._flavor_extra_specs_create() - response = self._do_delete('flavors/1/os-extra_specs/key1') + response = self._do_delete('flavors/1/os-extra_specs/hw:numa_nodes') self.assertEqual(200, response.status_code) self.assertEqual('', response.text) diff --git a/nova/tests/functional/api_sample_tests/test_flavors.py b/nova/tests/functional/api_sample_tests/test_flavors.py index 69cc2a9697..6d1612b08a 100644 --- a/nova/tests/functional/api_sample_tests/test_flavors.py +++ b/nova/tests/functional/api_sample_tests/test_flavors.py @@ -121,7 +121,10 @@ class FlavorsSampleJsonTest2_61(FlavorsSampleJsonTest): new_flavor = objects.Flavor( ctxt, memory_mb=2048, vcpus=1, root_gb=20, flavorid=new_flavor_id, name='m1.small.description', description='test description', - extra_specs={"key1": "value1", "key2": "value2"}) + extra_specs={ + 'hw:numa_nodes': '1', + 'hw:cpu_policy': 'shared', + }) new_flavor.create() self.flavor_show_id = new_flavor_id self.subs = {'flavorid': new_flavor_id} diff --git a/nova/tests/functional/notification_sample_tests/test_flavor.py b/nova/tests/functional/notification_sample_tests/test_flavor.py index e10e8df760..f206a01b97 100644 --- a/nova/tests/functional/notification_sample_tests/test_flavor.py +++ b/nova/tests/functional/notification_sample_tests/test_flavor.py @@ -67,8 +67,7 @@ class TestFlavorNotificationSample( body = { "extra_specs": { - "key1": "value1", - "key2": "value2" + "hw:numa_nodes": "2", } } self.admin_api.api_post( diff --git a/nova/tests/functional/test_cross_cell_migrate.py b/nova/tests/functional/test_cross_cell_migrate.py index 8c34336c29..26233f0761 100644 --- a/nova/tests/functional/test_cross_cell_migrate.py +++ b/nova/tests/functional/test_cross_cell_migrate.py @@ -869,8 +869,11 @@ class TestMultiCellMigrate(integrated_helpers.ProviderUsageBaseTestCase): 'disk': old_flavor['disk'] } self.admin_api.post_flavor({'flavor': new_flavor}) - self.admin_api.post_extra_spec(new_flavor['id'], - {'extra_specs': {'foo': 'bar'}}) + # TODO(stephenfin): What do I do with this??? + self.admin_api.post_extra_spec( + new_flavor['id'], + {'extra_specs': {'aggregate_instance_extra_specs:foo': 'bar'}} + ) # Enable AggregateInstanceExtraSpecsFilter and restart the scheduler. enabled_filters = CONF.filter_scheduler.enabled_filters if 'AggregateInstanceExtraSpecsFilter' not in enabled_filters: diff --git a/nova/tests/unit/api/openstack/compute/test_flavors_extra_specs.py b/nova/tests/unit/api/openstack/compute/test_flavors_extra_specs.py index 178c7b4e3c..a85eb7f717 100644 --- a/nova/tests/unit/api/openstack/compute/test_flavors_extra_specs.py +++ b/nova/tests/unit/api/openstack/compute/test_flavors_extra_specs.py @@ -48,11 +48,9 @@ def delete_flavor_extra_specs(context, flavor_id, key): def stub_flavor_extra_specs(): specs = { - "key1": "value1", - "key2": "value2", - "key3": "value3", - "key4": "value4", - "key5": "value5"} + 'hw:cpu_policy': 'shared', + 'hw:numa_nodes': '1', + } return specs @@ -60,10 +58,14 @@ class FlavorsExtraSpecsTestV21(test.TestCase): bad_request = exception.ValidationError flavorextraspecs = flavorextraspecs_v21 - def _get_request(self, url, use_admin_context=False): + def _get_request(self, url, use_admin_context=False, version=None): + kwargs = {} + if version: + kwargs['version'] = version req_url = '/v2/%s/flavors/%s' % (fakes.FAKE_PROJECT_ID, url) - return fakes.HTTPRequest.blank(req_url, - use_admin_context=use_admin_context) + return fakes.HTTPRequest.blank( + req_url, use_admin_context=use_admin_context, **kwargs, + ) def setUp(self): super(FlavorsExtraSpecsTestV21, self).setUp() @@ -72,15 +74,16 @@ class FlavorsExtraSpecsTestV21(test.TestCase): def test_index(self): flavor = dict(test_flavor.fake_flavor, - extra_specs={'key1': 'value1'}) + extra_specs={'hw:numa_nodes': '1'}) req = self._get_request('1/os-extra_specs') - with mock.patch('nova.objects.Flavor._flavor_get_by_flavor_id_from_db' - ) as mock_get: + with mock.patch( + 'nova.objects.Flavor._flavor_get_by_flavor_id_from_db' + ) as mock_get: mock_get.return_value = flavor res_dict = self.controller.index(req, 1) - self.assertEqual('value1', res_dict['extra_specs']['key1']) + self.assertEqual('1', res_dict['extra_specs']['hw:numa_nodes']) @mock.patch('nova.objects.Flavor.get_by_flavor_id') def test_index_no_data(self, mock_get): @@ -101,57 +104,61 @@ class FlavorsExtraSpecsTestV21(test.TestCase): req, 1) def test_show(self): - flavor = objects.Flavor(flavorid='1', extra_specs={'key5': 'value5'}) - req = self._get_request('1/os-extra_specs/key5') + flavor = objects.Flavor( + flavorid='1', extra_specs={'hw:numa_nodes': '1'} + ) + req = self._get_request('1/os-extra_specs/hw:numa_nodes') with mock.patch('nova.objects.Flavor.get_by_flavor_id') as mock_get: mock_get.return_value = flavor - res_dict = self.controller.show(req, 1, 'key5') + res_dict = self.controller.show(req, 1, 'hw:numa_nodes') - self.assertEqual('value5', res_dict['key5']) + self.assertEqual('1', res_dict['hw:numa_nodes']) @mock.patch('nova.objects.Flavor.get_by_flavor_id') def test_show_spec_not_found(self, mock_get): mock_get.return_value = objects.Flavor(extra_specs={}) - req = self._get_request('1/os-extra_specs/key6') + req = self._get_request('1/os-extra_specs/hw:cpu_thread_policy') self.assertRaises(webob.exc.HTTPNotFound, self.controller.show, - req, 1, 'key6') + req, 1, 'hw:cpu_thread_policy') def test_not_found_because_flavor(self): - req = self._get_request('1/os-extra_specs/key5', + req = self._get_request('1/os-extra_specs/hw:numa_nodes', use_admin_context=True) with mock.patch('nova.objects.Flavor.get_by_flavor_id') as mock_get: mock_get.side_effect = exception.FlavorNotFound(flavor_id='1') self.assertRaises(webob.exc.HTTPNotFound, self.controller.show, - req, 1, 'key5') + req, 1, 'hw:numa_nodes') self.assertRaises(webob.exc.HTTPNotFound, self.controller.update, - req, 1, 'key5', body={'key5': 'value5'}) + req, 1, 'hw:numa_nodes', + body={'hw:numa_nodes': '1'}) self.assertRaises(webob.exc.HTTPNotFound, self.controller.delete, - req, 1, 'key5') + req, 1, 'hw:numa_nodes') req = self._get_request('1/os-extra_specs', use_admin_context=True) with mock.patch('nova.objects.Flavor.get_by_flavor_id') as mock_get: mock_get.side_effect = exception.FlavorNotFound(flavor_id='1') self.assertRaises(webob.exc.HTTPNotFound, self.controller.create, - req, 1, body={'extra_specs': {'key5': 'value5'}}) + req, 1, body={'extra_specs': { + 'hw:numa_nodes': '1'}}) @mock.patch('nova.objects.Flavor._flavor_get_by_flavor_id_from_db') def test_delete(self, mock_get): flavor = dict(test_flavor.fake_flavor, - extra_specs={'key5': 'value5'}) - req = self._get_request('1/os-extra_specs/key5', + extra_specs={'hw:numa_nodes': '1'}) + req = self._get_request('1/os-extra_specs/hw:numa_nodes', use_admin_context=True) mock_get.return_value = flavor with mock.patch('nova.objects.Flavor.save'): - self.controller.delete(req, 1, 'key5') + self.controller.delete(req, 1, 'hw:numa_nodes') def test_delete_no_admin(self): self.stub_out('nova.objects.flavor._flavor_extra_specs_del', delete_flavor_extra_specs) - req = self._get_request('1/os-extra_specs/key5') + req = self._get_request('1/os-extra_specs/hw:numa_nodes') self.assertRaises(exception.Forbidden, self.controller.delete, - req, 1, 'key 5') + req, 1, 'hw numa nodes') def test_delete_spec_not_found(self): req = self._get_request('1/os-extra_specs/key6', @@ -160,24 +167,28 @@ class FlavorsExtraSpecsTestV21(test.TestCase): req, 1, 'key6') def test_create(self): - body = {"extra_specs": {"key1": "value1", "key2": 0.5, "key3": 5}} + body = { + 'extra_specs': { + 'hw:cpu_policy': 'shared', + 'hw:numa_nodes': '1', + } + } req = self._get_request('1/os-extra_specs', use_admin_context=True) res_dict = self.controller.create(req, 1, body=body) - self.assertEqual('value1', res_dict['extra_specs']['key1']) - self.assertEqual(0.5, res_dict['extra_specs']['key2']) - self.assertEqual(5, res_dict['extra_specs']['key3']) + self.assertEqual('shared', res_dict['extra_specs']['hw:cpu_policy']) + self.assertEqual('1', res_dict['extra_specs']['hw:numa_nodes']) def test_create_no_admin(self): - body = {"extra_specs": {"key1": "value1"}} + body = {'extra_specs': {'hw:numa_nodes': '1'}} req = self._get_request('1/os-extra_specs') self.assertRaises(exception.Forbidden, self.controller.create, req, 1, body=body) def test_create_flavor_not_found(self): - body = {"extra_specs": {"key1": "value1"}} + body = {'extra_specs': {'hw:numa_nodes': '1'}} req = self._get_request('1/os-extra_specs', use_admin_context=True) with mock.patch('nova.objects.Flavor.save', side_effect=exception.FlavorNotFound(flavor_id='')): @@ -185,7 +196,7 @@ class FlavorsExtraSpecsTestV21(test.TestCase): req, 1, body=body) def test_create_flavor_db_duplicate(self): - body = {"extra_specs": {"key1": "value1"}} + body = {'extra_specs': {'hw:numa_nodes': '1'}} req = self._get_request('1/os-extra_specs', use_admin_context=True) with mock.patch( 'nova.objects.Flavor.save', @@ -212,7 +223,7 @@ class FlavorsExtraSpecsTestV21(test.TestCase): self._test_create_bad_request({"extra_specs": {None: "value1"}}) def test_create_non_string_value(self): - self._test_create_bad_request({"extra_specs": {"key1": None}}) + self._test_create_bad_request({"extra_specs": {"hw:numa_nodes": None}}) def test_create_zero_length_key(self): self._test_create_bad_request({"extra_specs": {"": "value1"}}) @@ -223,7 +234,9 @@ class FlavorsExtraSpecsTestV21(test.TestCase): def test_create_long_value(self): value = "a" * 256 - self._test_create_bad_request({"extra_specs": {"key1": value}}) + self._test_create_bad_request( + {"extra_specs": {"hw_numa_nodes": value}} + ) def test_create_really_long_integer_value(self): value = 10 ** 1000 @@ -232,55 +245,69 @@ class FlavorsExtraSpecsTestV21(test.TestCase): self.assertRaises(webob.exc.HTTPBadRequest, self.controller.create, req, 1, body={"extra_specs": {"key1": value}}) - def test_create_invalid_specs_key(self): - invalid_keys = ("key1/", "<key>", "$$akey$", "!akey", "") - - for key in invalid_keys: - body = {"extra_specs": {key: "value1"}} + def test_create_invalid_specs(self): + """Test generic invalid specs. + + These are invalid regardless of the validation scheme, if any, in use. + """ + invalid_specs = { + 'key1/': 'value1', + '<key>': 'value1', + '$$akey$': 'value1', + '!akey': 'value1', + '': 'value1', + } + + for key, value in invalid_specs.items(): + body = {"extra_specs": {key: value}} req = self._get_request('1/os-extra_specs', use_admin_context=True) self.assertRaises(self.bad_request, self.controller.create, req, 1, body=body) @mock.patch('nova.objects.flavor._flavor_extra_specs_add') - def test_create_valid_specs_key(self, mock_flavor_extra_specs): - valid_keys = ("key1", "month.price", "I_am-a Key", "finance:g2") + def test_create_valid_specs(self, mock_flavor_extra_specs): + valid_specs = { + 'hide_hypervisor_id': 'true', + 'hw:numa_nodes': '1', + 'hw:numa_cpus.0': '0-3,8-9,11,10', + } mock_flavor_extra_specs.side_effect = return_create_flavor_extra_specs - for key in valid_keys: - body = {"extra_specs": {key: "value1"}} + for key, value in valid_specs.items(): + body = {"extra_specs": {key: value}} req = self._get_request('1/os-extra_specs', use_admin_context=True) res_dict = self.controller.create(req, 1, body=body) - self.assertEqual('value1', res_dict['extra_specs'][key]) + self.assertEqual(value, res_dict['extra_specs'][key]) @mock.patch('nova.objects.flavor._flavor_extra_specs_add') def test_update_item(self, mock_add): mock_add.side_effect = return_create_flavor_extra_specs - body = {"key1": "value1"} + body = {'hw:cpu_policy': 'shared'} - req = self._get_request('1/os-extra_specs/key1', + req = self._get_request('1/os-extra_specs/hw:cpu_policy', use_admin_context=True) - res_dict = self.controller.update(req, 1, 'key1', body=body) + res_dict = self.controller.update(req, 1, 'hw:cpu_policy', body=body) - self.assertEqual('value1', res_dict['key1']) + self.assertEqual('shared', res_dict['hw:cpu_policy']) def test_update_item_no_admin(self): - body = {"key1": "value1"} + body = {'hw:cpu_policy': 'shared'} - req = self._get_request('1/os-extra_specs/key1') + req = self._get_request('1/os-extra_specs/hw:cpu_policy') self.assertRaises(exception.Forbidden, self.controller.update, req, 1, 'key1', body=body) def _test_update_item_bad_request(self, body): - req = self._get_request('1/os-extra_specs/key1', + req = self._get_request('1/os-extra_specs/hw:cpu_policy', use_admin_context=True) self.assertRaises(self.bad_request, self.controller.update, - req, 1, 'key1', body=body) + req, 1, 'hw:cpu_policy', body=body) def test_update_item_empty_body(self): self._test_update_item_bad_request('') def test_update_item_too_many_keys(self): - body = {"key1": "value1", "key2": "value2"} + body = {"hw:cpu_policy": "dedicated", "hw:numa_nodes": "2"} self._test_update_item_bad_request(body) def test_update_item_non_dict_extra_specs(self): @@ -290,7 +317,7 @@ class FlavorsExtraSpecsTestV21(test.TestCase): self._test_update_item_bad_request({None: "value1"}) def test_update_item_non_string_value(self): - self._test_update_item_bad_request({"key1": None}) + self._test_update_item_bad_request({"hw:cpu_policy": None}) def test_update_item_zero_length_key(self): self._test_update_item_bad_request({"": "value1"}) @@ -304,38 +331,38 @@ class FlavorsExtraSpecsTestV21(test.TestCase): self._test_update_item_bad_request({"key1": value}) def test_update_item_body_uri_mismatch(self): - body = {"key1": "value1"} + body = {'hw:cpu_policy': 'shared'} req = self._get_request('1/os-extra_specs/bad', use_admin_context=True) self.assertRaises(webob.exc.HTTPBadRequest, self.controller.update, req, 1, 'bad', body=body) def test_update_flavor_not_found(self): - body = {"key1": "value1"} + body = {'hw:cpu_policy': 'shared'} - req = self._get_request('1/os-extra_specs/key1', + req = self._get_request('1/os-extra_specs/hw:cpu_policy', use_admin_context=True) with mock.patch('nova.objects.Flavor.save', side_effect=exception.FlavorNotFound(flavor_id='')): self.assertRaises(webob.exc.HTTPNotFound, self.controller.update, - req, 1, 'key1', body=body) + req, 1, 'hw:cpu_policy', body=body) def test_update_flavor_db_duplicate(self): - body = {"key1": "value1"} + body = {'hw:cpu_policy': 'shared'} - req = self._get_request('1/os-extra_specs/key1', + req = self._get_request('1/os-extra_specs/hw:cpu_policy', use_admin_context=True) with mock.patch( 'nova.objects.Flavor.save', side_effect=exception.FlavorExtraSpecUpdateCreateFailed( id=1, retries=5)): self.assertRaises(webob.exc.HTTPConflict, self.controller.update, - req, 1, 'key1', body=body) + req, 1, 'hw:cpu_policy', body=body) def test_update_really_long_integer_value(self): - value = 10 ** 1000 + body = {'hw:numa_nodes': 10 ** 1000} - req = self._get_request('1/os-extra_specs/key1', + req = self._get_request('1/os-extra_specs/hw:numa_nodes', use_admin_context=True) self.assertRaises(webob.exc.HTTPBadRequest, self.controller.update, - req, 1, 'key1', body={"key1": value}) + req, 1, 'hw:numa_nodes', body=body) |