From 153b1edf7d55d77064098a18ac45f8cf4e685726 Mon Sep 17 00:00:00 2001 From: Chris Dent Date: Mon, 29 May 2017 16:38:59 +0000 Subject: [PATCH] [placement] adjust resource provider links by microversion The resource provider representation includes links to other related resources. Those links should vary depending on microversion as some of the related resources did not show up until a later microversion. This change makes it so 'aggregates' show up at microverison 1.1 and beyond and traits in microversion 1.6 and beyond. A new gabbit has been added, resource-provider-links which exercises this. Only the single resource provider representation is tested because the same code is used for single and collection representations. Change-Id: Ife64922ee91a775fabdcf718e6eb0e0c7ddfde7a Closes-Bug: #1693353 --- .../placement/handlers/resource_provider.py | 8 +- .../gabbits/resource-provider-links.yaml | 92 +++++++++++++++++++ .../placement/gabbits/resource-provider.yaml | 8 -- 3 files changed, 99 insertions(+), 9 deletions(-) create mode 100644 nova/tests/functional/api/openstack/placement/gabbits/resource-provider-links.yaml diff --git a/nova/api/openstack/placement/handlers/resource_provider.py b/nova/api/openstack/placement/handlers/resource_provider.py index ffedd1446..1eef16f4a 100644 --- a/nova/api/openstack/placement/handlers/resource_provider.py +++ b/nova/api/openstack/placement/handlers/resource_provider.py @@ -144,7 +144,13 @@ def _normalize_resources_qs_param(qs): def _serialize_links(environ, resource_provider): url = util.resource_provider_url(environ, resource_provider) links = [{'rel': 'self', 'href': url}] - for rel in ('aggregates', 'inventories', 'usages', 'traits'): + rel_types = ['inventories', 'usages'] + want_version = environ[microversion.MICROVERSION_ENVIRON] + if want_version >= (1, 1): + rel_types.append('aggregates') + if want_version >= (1, 6): + rel_types.append('traits') + for rel in rel_types: links.append({'rel': rel, 'href': '%s/%s' % (url, rel)}) return links diff --git a/nova/tests/functional/api/openstack/placement/gabbits/resource-provider-links.yaml b/nova/tests/functional/api/openstack/placement/gabbits/resource-provider-links.yaml new file mode 100644 index 000000000..766c26541 --- /dev/null +++ b/nova/tests/functional/api/openstack/placement/gabbits/resource-provider-links.yaml @@ -0,0 +1,92 @@ +# Confirm that the links provided when getting one or more resources +# providers are correct. They vary across different microversions. + +fixtures: + - APIFixture + +defaults: + request_headers: + x-auth-token: admin + accept: application/json + +tests: +- name: post new resource provider + POST: /resource_providers + request_headers: + content-type: application/json + data: + name: $ENVIRON['RP_NAME'] + uuid: $ENVIRON['RP_UUID'] + status: 201 + +- name: get rp latest + GET: /resource_providers/$ENVIRON['RP_UUID'] + request_headers: + openstack-api-version: placement latest + response_json_paths: + $.links.`len`: 5 + $.links[?rel = "self"].href: /resource_providers/$ENVIRON['RP_UUID'] + $.links[?rel = "inventories"].href: /resource_providers/$ENVIRON['RP_UUID']/inventories + $.links[?rel = "aggregates"].href: /resource_providers/$ENVIRON['RP_UUID']/aggregates + $.links[?rel = "usages"].href: /resource_providers/$ENVIRON['RP_UUID']/usages + $.links[?rel = "traits"].href: /resource_providers/$ENVIRON['RP_UUID']/traits + +- name: get rp 1.0 + GET: /resource_providers/$ENVIRON['RP_UUID'] + request_headers: + openstack-api-version: placement 1.0 + response_json_paths: + $.links.`len`: 3 + $.links[?rel = "self"].href: /resource_providers/$ENVIRON['RP_UUID'] + $.links[?rel = "inventories"].href: /resource_providers/$ENVIRON['RP_UUID']/inventories + $.links[?rel = "usages"].href: /resource_providers/$ENVIRON['RP_UUID']/usages + +- name: get rp 1.1 + desc: aggregates added in 1.1 + GET: /resource_providers/$ENVIRON['RP_UUID'] + request_headers: + openstack-api-version: placement 1.1 + response_json_paths: + $.links.`len`: 4 + $.links[?rel = "self"].href: /resource_providers/$ENVIRON['RP_UUID'] + $.links[?rel = "inventories"].href: /resource_providers/$ENVIRON['RP_UUID']/inventories + $.links[?rel = "usages"].href: /resource_providers/$ENVIRON['RP_UUID']/usages + $.links[?rel = "aggregates"].href: /resource_providers/$ENVIRON['RP_UUID']/aggregates + +- name: get rp 1.5 + desc: traits added after 1.5 + GET: /resource_providers/$ENVIRON['RP_UUID'] + request_headers: + openstack-api-version: placement 1.5 + response_json_paths: + $.links.`len`: 4 + $.links[?rel = "self"].href: /resource_providers/$ENVIRON['RP_UUID'] + $.links[?rel = "inventories"].href: /resource_providers/$ENVIRON['RP_UUID']/inventories + $.links[?rel = "usages"].href: /resource_providers/$ENVIRON['RP_UUID']/usages + $.links[?rel = "aggregates"].href: /resource_providers/$ENVIRON['RP_UUID']/aggregates + +- name: get rp 1.6 + desc: traits added in 1.6 + GET: /resource_providers/$ENVIRON['RP_UUID'] + request_headers: + openstack-api-version: placement 1.6 + response_json_paths: + $.links.`len`: 5 + $.links[?rel = "self"].href: /resource_providers/$ENVIRON['RP_UUID'] + $.links[?rel = "inventories"].href: /resource_providers/$ENVIRON['RP_UUID']/inventories + $.links[?rel = "usages"].href: /resource_providers/$ENVIRON['RP_UUID']/usages + $.links[?rel = "aggregates"].href: /resource_providers/$ENVIRON['RP_UUID']/aggregates + $.links[?rel = "traits"].href: /resource_providers/$ENVIRON['RP_UUID']/traits + +- name: get rp 1.7 + desc: nothing new in 1.7 + GET: /resource_providers/$ENVIRON['RP_UUID'] + request_headers: + openstack-api-version: placement 1.7 + response_json_paths: + $.links.`len`: 5 + $.links[?rel = "self"].href: /resource_providers/$ENVIRON['RP_UUID'] + $.links[?rel = "inventories"].href: /resource_providers/$ENVIRON['RP_UUID']/inventories + $.links[?rel = "usages"].href: /resource_providers/$ENVIRON['RP_UUID']/usages + $.links[?rel = "aggregates"].href: /resource_providers/$ENVIRON['RP_UUID']/aggregates + $.links[?rel = "traits"].href: /resource_providers/$ENVIRON['RP_UUID']/traits diff --git a/nova/tests/functional/api/openstack/placement/gabbits/resource-provider.yaml b/nova/tests/functional/api/openstack/placement/gabbits/resource-provider.yaml index b24dae5a4..9ad2de113 100644 --- a/nova/tests/functional/api/openstack/placement/gabbits/resource-provider.yaml +++ b/nova/tests/functional/api/openstack/placement/gabbits/resource-provider.yaml @@ -81,9 +81,7 @@ tests: $.generation: 0 $.links[?rel = "self"].href: /resource_providers/$ENVIRON['RP_UUID'] $.links[?rel = "inventories"].href: /resource_providers/$ENVIRON['RP_UUID']/inventories - $.links[?rel = "aggregates"].href: /resource_providers/$ENVIRON['RP_UUID']/aggregates $.links[?rel = "usages"].href: /resource_providers/$ENVIRON['RP_UUID']/usages - $.links[?rel = "traits"].href: /resource_providers/$ENVIRON['RP_UUID']/traits - name: get resource provider works with no accept GET: /resource_providers/$ENVIRON['RP_UUID'] @@ -109,9 +107,7 @@ tests: $.resource_providers[0].generation: 0 $.resource_providers[0].links[?rel = "self"].href: /resource_providers/$ENVIRON['RP_UUID'] $.resource_providers[0].links[?rel = "inventories"].href: /resource_providers/$ENVIRON['RP_UUID']/inventories - $.resource_providers[0].links[?rel = "aggregates"].href: /resource_providers/$ENVIRON['RP_UUID']/aggregates $.resource_providers[0].links[?rel = "usages"].href: /resource_providers/$ENVIRON['RP_UUID']/usages - $.resource_providers[0].links[?rel = "traits"].href: /resource_providers/$ENVIRON['RP_UUID']/traits - name: filter out all resource providers by name GET: /resource_providers?name=flubblebubble @@ -131,9 +127,7 @@ tests: $.resource_providers[0].name: $ENVIRON['RP_NAME'] $.resource_providers[0].links[?rel = "self"].href: /resource_providers/$ENVIRON['RP_UUID'] $.resource_providers[0].links[?rel = "inventories"].href: /resource_providers/$ENVIRON['RP_UUID']/inventories - $.resource_providers[0].links[?rel = "aggregates"].href: /resource_providers/$ENVIRON['RP_UUID']/aggregates $.resource_providers[0].links[?rel = "usages"].href: /resource_providers/$ENVIRON['RP_UUID']/usages - $.resource_providers[0].links[?rel = "traits"].href: /resource_providers/$ENVIRON['RP_UUID']/traits - name: list resource providers filtering by invalid uuid GET: /resource_providers?uuid=spameggs @@ -159,9 +153,7 @@ tests: $.resource_providers[0].name: $ENVIRON['RP_NAME'] $.resource_providers[0].links[?rel = "self"].href: /resource_providers/$ENVIRON['RP_UUID'] $.resource_providers[0].links[?rel = "inventories"].href: /resource_providers/$ENVIRON['RP_UUID']/inventories - $.resource_providers[0].links[?rel = "aggregates"].href: /resource_providers/$ENVIRON['RP_UUID']/aggregates $.resource_providers[0].links[?rel = "usages"].href: /resource_providers/$ENVIRON['RP_UUID']/usages - $.resource_providers[0].links[?rel = "traits"].href: /resource_providers/$ENVIRON['RP_UUID']/traits - name: update a resource provider PUT: /resource_providers/$RESPONSE['$.resource_providers[0].uuid']