summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephen Finucane <sfinucan@redhat.com>2020-02-14 10:20:56 +0000
committerStephen Finucane <sfinucan@redhat.com>2020-02-19 08:24:31 +0000
commit9009d56d21e3494541972a4a6879b12ca84f9307 (patch)
tree7bf470f0221a86b2f6d12f917bce6f6bd8778286
parentfa5e1b556f3e70feeaeb52da75723d01b2a1464d (diff)
downloadnova-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>
-rw-r--r--doc/api_samples/flavor-extra-specs/flavor-extra-specs-create-req.json6
-rw-r--r--doc/api_samples/flavor-extra-specs/flavor-extra-specs-create-resp.json6
-rw-r--r--doc/api_samples/flavor-extra-specs/flavor-extra-specs-get-resp.json4
-rw-r--r--doc/api_samples/flavor-extra-specs/flavor-extra-specs-list-resp.json6
-rw-r--r--doc/api_samples/flavor-extra-specs/flavor-extra-specs-update-req.json4
-rw-r--r--doc/api_samples/flavor-extra-specs/flavor-extra-specs-update-resp.json4
-rw-r--r--doc/api_samples/flavors/v2.61/flavor-get-resp.json4
-rw-r--r--doc/api_samples/flavors/v2.61/flavors-detail-resp.json4
-rw-r--r--doc/api_samples/flavors/v2.75/flavor-get-resp.json4
-rw-r--r--doc/api_samples/flavors/v2.75/flavors-detail-resp.json4
-rw-r--r--doc/notification_samples/flavor-update.json3
-rw-r--r--nova/tests/functional/api_sample_tests/api_samples/flavor-extra-specs/flavor-extra-specs-create-req.json.tpl4
-rw-r--r--nova/tests/functional/api_sample_tests/api_samples/flavor-extra-specs/flavor-extra-specs-create-resp.json.tpl4
-rw-r--r--nova/tests/functional/api_sample_tests/api_samples/flavor-extra-specs/flavor-extra-specs-get-resp.json.tpl2
-rw-r--r--nova/tests/functional/api_sample_tests/api_samples/flavor-extra-specs/flavor-extra-specs-list-resp.json.tpl4
-rw-r--r--nova/tests/functional/api_sample_tests/api_samples/flavor-extra-specs/flavor-extra-specs-update-req.json.tpl2
-rw-r--r--nova/tests/functional/api_sample_tests/api_samples/flavor-extra-specs/flavor-extra-specs-update-resp.json.tpl2
-rw-r--r--nova/tests/functional/api_sample_tests/api_samples/flavors/v2.61/flavor-get-resp.json.tpl4
-rw-r--r--nova/tests/functional/api_sample_tests/api_samples/flavors/v2.61/flavors-detail-resp.json.tpl4
-rw-r--r--nova/tests/functional/api_sample_tests/api_samples/flavors/v2.75/flavor-get-resp.json.tpl4
-rw-r--r--nova/tests/functional/api_sample_tests/api_samples/flavors/v2.75/flavors-detail-resp.json.tpl4
-rw-r--r--nova/tests/functional/api_sample_tests/test_flavor_extraspecs.py24
-rw-r--r--nova/tests/functional/api_sample_tests/test_flavors.py5
-rw-r--r--nova/tests/functional/notification_sample_tests/test_flavor.py3
-rw-r--r--nova/tests/functional/test_cross_cell_migrate.py7
-rw-r--r--nova/tests/unit/api/openstack/compute/test_flavors_extra_specs.py161
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)