diff --git a/doc/api_samples/server-detail-get-resp.json b/doc/api_samples/server-detail-get-resp.json new file mode 100644 index 000000000000..3ea61531e5cd --- /dev/null +++ b/doc/api_samples/server-detail-get-resp.json @@ -0,0 +1,56 @@ +{ + "servers": [ + { + "accessIPv4": "", + "accessIPv6": "", + "addresses": { + "private": [ + { + "addr": "192.168.0.3", + "version": 4 + } + ] + }, + "created": "2012-09-07T16:56:37Z", + "flavor": { + "id": "1", + "links": [ + { + "href": "http://openstack.example.com/openstack/flavors/1", + "rel": "bookmark" + } + ] + }, + "hostId": "16d193736a5cfdb60c697ca27ad071d6126fa13baeb670fc9d10645e", + "id": "05184ba3-00ba-4fbc-b7a2-03b62b884931", + "image": { + "id": "70a599e0-31e7-49b7-b260-868f441e862b", + "links": [ + { + "href": "http://openstack.example.com/openstack/images/70a599e0-31e7-49b7-b260-868f441e862b", + "rel": "bookmark" + } + ] + }, + "links": [ + { + "href": "http://openstack.example.com/v2/openstack/servers/05184ba3-00ba-4fbc-b7a2-03b62b884931", + "rel": "self" + }, + { + "href": "http://openstack.example.com/openstack/servers/05184ba3-00ba-4fbc-b7a2-03b62b884931", + "rel": "bookmark" + } + ], + "metadata": { + "My Server Name": "Apache1" + }, + "name": "new-server-test", + "progress": 0, + "status": "ACTIVE", + "tenant_id": "openstack", + "updated": "2012-09-07T16:56:37Z", + "user_id": "fake" + } + ] +} \ No newline at end of file diff --git a/doc/api_samples/server-detail-get-resp.xml b/doc/api_samples/server-detail-get-resp.xml new file mode 100644 index 000000000000..83bcf0f79bd9 --- /dev/null +++ b/doc/api_samples/server-detail-get-resp.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + Apache1 + + + + + + + + + + \ No newline at end of file diff --git a/doc/api_samples/server-metadata-all-req.json b/doc/api_samples/server-metadata-all-req.json new file mode 100644 index 000000000000..03925e4a4a0f --- /dev/null +++ b/doc/api_samples/server-metadata-all-req.json @@ -0,0 +1,5 @@ +{ + "metadata" : { + "foo" : "Foo Value" + } +} \ No newline at end of file diff --git a/doc/api_samples/server-metadata-all-req.xml b/doc/api_samples/server-metadata-all-req.xml new file mode 100644 index 000000000000..72811e302531 --- /dev/null +++ b/doc/api_samples/server-metadata-all-req.xml @@ -0,0 +1,5 @@ + + + + Foo Value + \ No newline at end of file diff --git a/doc/api_samples/server-metadata-all-resp.json b/doc/api_samples/server-metadata-all-resp.json new file mode 100644 index 000000000000..81cd4eb94a72 --- /dev/null +++ b/doc/api_samples/server-metadata-all-resp.json @@ -0,0 +1,5 @@ +{ + "metadata": { + "foo": "Foo Value" + } +} \ No newline at end of file diff --git a/doc/api_samples/server-metadata-all-resp.xml b/doc/api_samples/server-metadata-all-resp.xml new file mode 100644 index 000000000000..55c949c5770c --- /dev/null +++ b/doc/api_samples/server-metadata-all-resp.xml @@ -0,0 +1,4 @@ + + + Foo Value + \ No newline at end of file diff --git a/doc/api_samples/server-metadata-req.json b/doc/api_samples/server-metadata-req.json new file mode 100644 index 000000000000..7124bb237000 --- /dev/null +++ b/doc/api_samples/server-metadata-req.json @@ -0,0 +1,5 @@ +{ + "meta" : { + "foo" : "Bar Value" + } +} \ No newline at end of file diff --git a/doc/api_samples/server-metadata-req.xml b/doc/api_samples/server-metadata-req.xml new file mode 100644 index 000000000000..f237b2b3699d --- /dev/null +++ b/doc/api_samples/server-metadata-req.xml @@ -0,0 +1,3 @@ + + +Bar Value \ No newline at end of file diff --git a/doc/api_samples/server-metadata-resp.json b/doc/api_samples/server-metadata-resp.json new file mode 100644 index 000000000000..802b37d7f494 --- /dev/null +++ b/doc/api_samples/server-metadata-resp.json @@ -0,0 +1,5 @@ +{ + "meta": { + "foo": "Bar Value" + } +} \ No newline at end of file diff --git a/doc/api_samples/server-metadata-resp.xml b/doc/api_samples/server-metadata-resp.xml new file mode 100644 index 000000000000..c01e16a47a24 --- /dev/null +++ b/doc/api_samples/server-metadata-resp.xml @@ -0,0 +1,2 @@ + +Bar Value \ No newline at end of file diff --git a/nova/tests/integrated/api_samples/server-detail-get-resp.json.tpl b/nova/tests/integrated/api_samples/server-detail-get-resp.json.tpl new file mode 100644 index 000000000000..921bfdf88883 --- /dev/null +++ b/nova/tests/integrated/api_samples/server-detail-get-resp.json.tpl @@ -0,0 +1,56 @@ +{ + "servers": [ + { + "accessIPv4": "", + "accessIPv6": "", + "addresses": { + "private": [ + { + "addr": "%(ip)s", + "version": 4 + } + ] + }, + "created": "%(timestamp)s", + "flavor": { + "id": "1", + "links": [ + { + "href": "%(host)s/openstack/flavors/1", + "rel": "bookmark" + } + ] + }, + "hostId": "%(hostid)s", + "id": "%(uuid)s", + "image": { + "id": "%(uuid)s", + "links": [ + { + "href": "%(host)s/openstack/images/%(uuid)s", + "rel": "bookmark" + } + ] + }, + "links": [ + { + "href": "%(host)s/v2/openstack/servers/%(uuid)s", + "rel": "self" + }, + { + "href": "%(host)s/openstack/servers/%(uuid)s", + "rel": "bookmark" + } + ], + "metadata": { + "My Server Name": "Apache1" + }, + "name": "new-server-test", + "progress": 0, + "status": "ACTIVE", + "tenant_id": "openstack", + "updated": "%(timestamp)s", + "user_id": "fake" + } + ] +} diff --git a/nova/tests/integrated/api_samples/server-detail-get-resp.xml.tpl b/nova/tests/integrated/api_samples/server-detail-get-resp.xml.tpl new file mode 100644 index 000000000000..4465f68d7faa --- /dev/null +++ b/nova/tests/integrated/api_samples/server-detail-get-resp.xml.tpl @@ -0,0 +1,21 @@ + + + + + + + + + + + Apache1 + + + + + + + + + + diff --git a/nova/tests/integrated/api_samples/server-metadata-all-req.json.tpl b/nova/tests/integrated/api_samples/server-metadata-all-req.json.tpl new file mode 100644 index 000000000000..2278d2afd806 --- /dev/null +++ b/nova/tests/integrated/api_samples/server-metadata-all-req.json.tpl @@ -0,0 +1,5 @@ +{ + "metadata" : { + "foo" : "%(value)s" + } +} diff --git a/nova/tests/integrated/api_samples/server-metadata-all-req.xml.tpl b/nova/tests/integrated/api_samples/server-metadata-all-req.xml.tpl new file mode 100644 index 000000000000..e74270673657 --- /dev/null +++ b/nova/tests/integrated/api_samples/server-metadata-all-req.xml.tpl @@ -0,0 +1,5 @@ + + + + %(value)s + diff --git a/nova/tests/integrated/api_samples/server-metadata-all-resp.json.tpl b/nova/tests/integrated/api_samples/server-metadata-all-resp.json.tpl new file mode 100644 index 000000000000..2278d2afd806 --- /dev/null +++ b/nova/tests/integrated/api_samples/server-metadata-all-resp.json.tpl @@ -0,0 +1,5 @@ +{ + "metadata" : { + "foo" : "%(value)s" + } +} diff --git a/nova/tests/integrated/api_samples/server-metadata-all-resp.xml.tpl b/nova/tests/integrated/api_samples/server-metadata-all-resp.xml.tpl new file mode 100644 index 000000000000..e74270673657 --- /dev/null +++ b/nova/tests/integrated/api_samples/server-metadata-all-resp.xml.tpl @@ -0,0 +1,5 @@ + + + + %(value)s + diff --git a/nova/tests/integrated/api_samples/server-metadata-req.json.tpl b/nova/tests/integrated/api_samples/server-metadata-req.json.tpl new file mode 100644 index 000000000000..35872e95fc5b --- /dev/null +++ b/nova/tests/integrated/api_samples/server-metadata-req.json.tpl @@ -0,0 +1,5 @@ +{ + "meta" : { + "foo" : "%(value)s" + } +} diff --git a/nova/tests/integrated/api_samples/server-metadata-req.xml.tpl b/nova/tests/integrated/api_samples/server-metadata-req.xml.tpl new file mode 100644 index 000000000000..fa9d6ad4801c --- /dev/null +++ b/nova/tests/integrated/api_samples/server-metadata-req.xml.tpl @@ -0,0 +1,3 @@ + + +%(value)s diff --git a/nova/tests/integrated/api_samples/server-metadata-resp.json.tpl b/nova/tests/integrated/api_samples/server-metadata-resp.json.tpl new file mode 100644 index 000000000000..85d69ec95697 --- /dev/null +++ b/nova/tests/integrated/api_samples/server-metadata-resp.json.tpl @@ -0,0 +1,5 @@ +{ + "meta": { + "foo": "%(value)s" + } +} diff --git a/nova/tests/integrated/api_samples/server-metadata-resp.xml.tpl b/nova/tests/integrated/api_samples/server-metadata-resp.xml.tpl new file mode 100644 index 000000000000..fa9d6ad4801c --- /dev/null +++ b/nova/tests/integrated/api_samples/server-metadata-resp.xml.tpl @@ -0,0 +1,3 @@ + + +%(value)s diff --git a/nova/tests/integrated/test_api_samples.py b/nova/tests/integrated/test_api_samples.py index 6f103f6c2077..3786e29755e1 100644 --- a/nova/tests/integrated/test_api_samples.py +++ b/nova/tests/integrated/test_api_samples.py @@ -157,6 +157,10 @@ class ApiSampleTestBase(integrated_helpers._IntegratedTestBase): if match.groups(): matched_value = match.groups()[0] else: + if isinstance(expected, basestring): + # NOTE(danms): Ignore whitespace in this comparison + expected = expected.strip() + result = result.strip() if expected != result: raise NoMatch(_('Values do not match:\n' '%(expected)s\n%(result)s') % locals()) @@ -217,6 +221,9 @@ class ApiSampleTestBase(integrated_helpers._IntegratedTestBase): def _do_put(self, url, name, subs): return self._do_post(url, name, subs, method='PUT') + def _do_delete(self, url): + return self._get_response(url, 'DELETE') + class VersionsSampleJsonTest(ApiSampleTestBase): def test_servers_get(self): @@ -229,8 +236,8 @@ class VersionsSampleXmlTest(VersionsSampleJsonTest): ctype = 'xml' -class ServersSampleJsonTest(ApiSampleTestBase): - def test_servers_post(self): +class ServersSampleBase(ApiSampleTestBase): + def _post_server(self): subs = { 'image_id': fake.get_valid_image_id(), 'host': self._get_host(), @@ -240,6 +247,11 @@ class ServersSampleJsonTest(ApiSampleTestBase): subs = self._get_regexes() return self._verify_response('server-post-resp', subs, response) + +class ServersSampleJsonTest(ServersSampleBase): + def test_servers_post(self): + return self._post_server() + def test_servers_get(self): uuid = self.test_servers_post() response = self._do_get('servers/%s' % uuid) @@ -252,6 +264,20 @@ class ServersSampleXmlTest(ServersSampleJsonTest): ctype = 'xml' +class ServersDetailJsonTest(ServersSampleBase): + def test_servers_detail_get(self): + uuid = self._post_server() + response = self._do_get('servers/detail') + self.assertEqual(response.status, 200) + subs = self._get_regexes() + subs['hostid'] = '[a-f0-9]+' + return self._verify_response('server-detail-get-resp', subs, response) + + +class ServersDetailXmlTest(ServersDetailJsonTest): + ctype = 'xml' + + class ServersSampleAllExtensionJsonTest(ServersSampleJsonTest): all_extensions = True @@ -260,6 +286,73 @@ class ServersSampleAllExtensionXmlTest(ServersSampleXmlTest): all_extensions = True +class ServersMetadataJsonTest(ServersSampleBase): + def _create_and_set(self, subs): + uuid = self._post_server() + response = self._do_put('servers/%s/metadata' % uuid, + 'server-metadata-all-req', + subs) + self.assertEqual(response.status, 200) + self._verify_response('server-metadata-all-resp', subs, response) + + return uuid + + def test_metadata_put_all(self): + """Test setting all metadata for a server""" + subs = {'value': 'Foo Value'} + return self._create_and_set(subs) + + def test_metadata_post_all(self): + """Test updating all metadata for a server""" + subs = {'value': 'Foo Value'} + uuid = self._create_and_set(subs) + subs['value'] = 'Bar Value' + response = self._do_post('servers/%s/metadata' % uuid, + 'server-metadata-all-req', + subs) + self.assertEqual(response.status, 200) + self._verify_response('server-metadata-all-resp', subs, response) + + def test_metadata_get_all(self): + """Test getting all metadata for a server""" + subs = {'value': 'Foo Value'} + uuid = self._create_and_set(subs) + response = self._do_get('servers/%s/metadata' % uuid) + self.assertEqual(response.status, 200) + self._verify_response('server-metadata-all-resp', subs, response) + + def test_metadata_put(self): + """Test putting an individual metadata item for a server""" + subs = {'value': 'Foo Value'} + uuid = self._create_and_set(subs) + subs['value'] = 'Bar Value' + response = self._do_put('servers/%s/metadata/foo' % uuid, + 'server-metadata-req', + subs) + self.assertEqual(response.status, 200) + return self._verify_response('server-metadata-resp', subs, response) + + def test_metadata_get(self): + """Test getting an individual metadata item for a server""" + subs = {'value': 'Foo Value'} + uuid = self._create_and_set(subs) + response = self._do_get('servers/%s/metadata/foo' % uuid) + self.assertEqual(response.status, 200) + return self._verify_response('server-metadata-resp', subs, response) + + def test_metadata_delete(self): + """Test deleting an individual metadata item for a server""" + subs = {'value': 'Foo Value'} + uuid = self._create_and_set(subs) + response = self._do_delete('servers/%s/metadata/foo' % uuid) + self.assertEqual(response.status, 204) + self.assertEqual(response.read(), '') + + +class ServersMetadataXmlTest(ServersMetadataJsonTest): + ctype = 'xml' + + class ExtensionsSampleJsonTest(ApiSampleTestBase): all_extensions = True