diff --git a/api-guide/source/down_cells.rst b/api-guide/source/down_cells.rst index 0a1fa4aeb3..c7bdb83f5d 100644 --- a/api-guide/source/down_cells.rst +++ b/api-guide/source/down_cells.rst @@ -240,6 +240,7 @@ behavior are described below: - availability_zone: The availability_zone of the server if it was specified during during boot time and "UNKNOWN" otherwise. - power_state: Its value will be 0 (``NOSTATE``). + - links: Links to the servers in question. - server_groups: The UUIDs of the server groups to which the server belongs. Currently this can contain at most one entry. Note that this key will be in the response only from the "2.71" microversion. @@ -275,6 +276,16 @@ behavior are described below: }, "OS-EXT-AZ:availability_zone": "geneva", "OS-EXT-STS:power_state": 0, + "links": [ + { + "href": "http://openstack.example.com/v2.1/6f70656e737461636b20342065766572/servers/bcc6c6dd-3d0a-4633-9586-60878fd68edb", + "rel": "self" + }, + { + "href": "http://openstack.example.com/6f70656e737461636b20342065766572/servers/bcc6c6dd-3d0a-4633-9586-60878fd68edb", + "rel": "bookmark" + } + ], "server_groups": ["0fd77252-4eef-4ec4-ae9b-e05dfc98aeac"] } ] diff --git a/doc/api_samples/servers/v2.69/server-get-resp.json b/doc/api_samples/servers/v2.69/server-get-resp.json index 586664d0bb..107930f21f 100644 --- a/doc/api_samples/servers/v2.69/server-get-resp.json +++ b/doc/api_samples/servers/v2.69/server-get-resp.json @@ -24,6 +24,16 @@ }, "status": "UNKNOWN", "tenant_id": "project", - "user_id": "fake" + "user_id": "fake", + "links": [ + { + "href": "http://openstack.example.com/v2.1/6f70656e737461636b20342065766572/servers/33748c23-38dd-4f70-b774-522fc69e7b67", + "rel": "self" + }, + { + "href": "http://openstack.example.com/6f70656e737461636b20342065766572/servers/33748c23-38dd-4f70-b774-522fc69e7b67", + "rel": "bookmark" + } + ] } } \ No newline at end of file diff --git a/doc/api_samples/servers/v2.71/server-get-down-cell-resp.json b/doc/api_samples/servers/v2.71/server-get-down-cell-resp.json index 2d506c5d89..08cc753b5f 100644 --- a/doc/api_samples/servers/v2.71/server-get-down-cell-resp.json +++ b/doc/api_samples/servers/v2.71/server-get-down-cell-resp.json @@ -27,6 +27,16 @@ ], "status": "UNKNOWN", "tenant_id": "project", - "user_id": "fake" + "user_id": "fake", + "links": [ + { + "href": "http://openstack.example.com/v2.1/6f70656e737461636b20342065766572/servers/2669556b-b4a3-41f1-a0c1-f9c7ff75e53c", + "rel": "self" + }, + { + "href": "http://openstack.example.com/6f70656e737461636b20342065766572/servers/2669556b-b4a3-41f1-a0c1-f9c7ff75e53c", + "rel": "bookmark" + } + ] } } diff --git a/nova/api/openstack/compute/views/servers.py b/nova/api/openstack/compute/views/servers.py index e0340274dc..eada38bf5a 100644 --- a/nova/api/openstack/compute/views/servers.py +++ b/nova/api/openstack/compute/views/servers.py @@ -149,6 +149,8 @@ class ViewBuilder(common.ViewBuilder): "status": "UNKNOWN", "tenant_id": instance.project_id, "created": utils.isotime(instance.created_at), + "links": self._get_links( + request, instance.uuid, self._collection_name), }, } if 'flavor' in instance: @@ -177,10 +179,6 @@ class ViewBuilder(common.ViewBuilder): context = request.environ['nova.context'] ret['server']['server_groups'] = self._get_server_groups( context, instance) - else: - # GET /servers/detail includes links for GET /servers/{server_id}. - ret['server']["links"] = self._get_links( - request, instance.uuid, self._collection_name) return ret def show(self, request, instance, extend_address=True, diff --git a/nova/tests/functional/api_sample_tests/api_samples/servers/v2.69/server-get-resp.json.tpl b/nova/tests/functional/api_sample_tests/api_samples/servers/v2.69/server-get-resp.json.tpl index f01e9074c0..12a67c6691 100644 --- a/nova/tests/functional/api_sample_tests/api_samples/servers/v2.69/server-get-resp.json.tpl +++ b/nova/tests/functional/api_sample_tests/api_samples/servers/v2.69/server-get-resp.json.tpl @@ -24,6 +24,16 @@ }, "status": "UNKNOWN", "tenant_id": "project", - "user_id": "fake" + "user_id": "fake", + "links": [ + { + "href": "%(versioned_compute_endpoint)s/servers/%(uuid)s", + "rel": "self" + }, + { + "href": "%(compute_endpoint)s/servers/%(uuid)s", + "rel": "bookmark" + } + ] } } \ No newline at end of file diff --git a/nova/tests/functional/api_sample_tests/api_samples/servers/v2.71/server-get-down-cell-resp.json.tpl b/nova/tests/functional/api_sample_tests/api_samples/servers/v2.71/server-get-down-cell-resp.json.tpl index 355594317b..5f732b8400 100644 --- a/nova/tests/functional/api_sample_tests/api_samples/servers/v2.71/server-get-down-cell-resp.json.tpl +++ b/nova/tests/functional/api_sample_tests/api_samples/servers/v2.71/server-get-down-cell-resp.json.tpl @@ -25,6 +25,16 @@ "status": "UNKNOWN", "server_groups": ["%(uuid)s"], "tenant_id": "project", - "user_id": "fake" + "user_id": "fake", + "links": [ + { + "href": "%(versioned_compute_endpoint)s/servers/%(uuid)s", + "rel": "self" + }, + { + "href": "%(compute_endpoint)s/servers/%(uuid)s", + "rel": "bookmark" + } + ] } } diff --git a/nova/tests/unit/api/openstack/compute/test_serversV21.py b/nova/tests/unit/api/openstack/compute/test_serversV21.py index 483cd10b2c..f5f69a0596 100644 --- a/nova/tests/unit/api/openstack/compute/test_serversV21.py +++ b/nova/tests/unit/api/openstack/compute/test_serversV21.py @@ -7633,8 +7633,8 @@ class ServersViewBuilderTestV269(ServersViewBuilderTest): req = self.req('/fake/servers/%s' % FAKE_UUID) output = self.view_builder.show(req, self.instance, cell_down_support=True) - # nine fields from request_spec and instance_mapping - self.assertEqual(9, len(output['server'])) + # ten fields from request_spec and instance_mapping + self.assertEqual(10, len(output['server'])) image_bookmark = "http://localhost/fake/images/5" expected = { "server": { @@ -7662,7 +7662,19 @@ class ServersViewBuilderTestV269(ServersViewBuilderTest): 'swap': 0 }, "OS-EXT-AZ:availability_zone": "nova", - "OS-EXT-STS:power_state": 0 + "OS-EXT-STS:power_state": 0, + "links": [ + { + "rel": "self", + "href": "http://localhost/v2/fake/servers/%s" % + self.uuid, + }, + { + "rel": "bookmark", + "href": "http://localhost/fake/servers/%s" % + self.uuid, + }, + ] } } self.assertThat(output, matchers.DictMatches(expected)) @@ -7685,7 +7697,7 @@ class ServersViewBuilderTestV269(ServersViewBuilderTest): output = self.view_builder.show(req, self.instance, cell_down_support=True) # nine fields from request_spec and instance_mapping - self.assertEqual(9, len(output['server'])) + self.assertEqual(10, len(output['server'])) expected = { "server": { "id": self.uuid, @@ -7704,7 +7716,19 @@ class ServersViewBuilderTestV269(ServersViewBuilderTest): 'swap': 0 }, "OS-EXT-AZ:availability_zone": "UNKNOWN", - "OS-EXT-STS:power_state": 0 + "OS-EXT-STS:power_state": 0, + "links": [ + { + "rel": "self", + "href": "http://localhost/v2/fake/servers/%s" % + self.uuid, + }, + { + "rel": "bookmark", + "href": "http://localhost/fake/servers/%s" % + self.uuid, + }, + ] } } self.assertThat(output, matchers.DictMatches(expected))