diff --git a/doc/v3/api_samples/servers/server-get-resp.json b/doc/v3/api_samples/servers/server-get-resp.json index 408915b1cb98..b7bbfa031fb5 100644 --- a/doc/v3/api_samples/servers/server-get-resp.json +++ b/doc/v3/api_samples/servers/server-get-resp.json @@ -12,7 +12,7 @@ } ] }, - "created": "2013-08-27T00:21:41Z", + "created": "2013-09-03T04:01:32Z", "flavor": { "id": "1", "links": [ @@ -22,8 +22,8 @@ } ] }, - "host_id": "89429d40116cdb1f85f09de69dbc250f040a62db4a20e08b730b88c5", - "id": "5c2f3a9d-1858-454d-b2a2-ac2e93036d16", + "host_id": "92154fab69d5883ba2c8622b7e65f745dd33257221c07af363c51b29", + "id": "0e44cc9c-e052-415d-afbf-469b0d384170", "image": { "id": "70a599e0-31e7-49b7-b260-868f441e862b", "links": [ @@ -33,13 +33,14 @@ } ] }, + "key_name": null, "links": [ { - "href": "http://openstack.example.com/v3/servers/5c2f3a9d-1858-454d-b2a2-ac2e93036d16", + "href": "http://openstack.example.com/v3/servers/0e44cc9c-e052-415d-afbf-469b0d384170", "rel": "self" }, { - "href": "http://openstack.example.com/servers/5c2f3a9d-1858-454d-b2a2-ac2e93036d16", + "href": "http://openstack.example.com/servers/0e44cc9c-e052-415d-afbf-469b0d384170", "rel": "bookmark" } ], @@ -50,7 +51,7 @@ "progress": 0, "status": "ACTIVE", "tenant_id": "openstack", - "updated": "2013-08-27T00:21:41Z", + "updated": "2013-09-03T04:01:33Z", "user_id": "fake" } } \ No newline at end of file diff --git a/doc/v3/api_samples/servers/server-get-resp.xml b/doc/v3/api_samples/servers/server-get-resp.xml index c40b8f83253f..437132be18ee 100644 --- a/doc/v3/api_samples/servers/server-get-resp.xml +++ b/doc/v3/api_samples/servers/server-get-resp.xml @@ -1,5 +1,5 @@ - + @@ -14,6 +14,6 @@ - - + + \ No newline at end of file diff --git a/doc/v3/api_samples/servers/server-post-resp.json b/doc/v3/api_samples/servers/server-post-resp.json index 7be48ad56c69..1c6feaa0bd91 100644 --- a/doc/v3/api_samples/servers/server-post-resp.json +++ b/doc/v3/api_samples/servers/server-post-resp.json @@ -1,14 +1,14 @@ { "server": { - "admin_pass": "2pXrV3mMFkxH", - "id": "f85df75c-cf69-4723-b861-deff54b7cf70", + "admin_pass": "6NpUwoz2QDRN", + "id": "f5dc173b-6804-445a-a6d8-c705dad5b5eb", "links": [ { - "href": "http://openstack.example.com/v3/servers/f85df75c-cf69-4723-b861-deff54b7cf70", + "href": "http://openstack.example.com/v3/servers/f5dc173b-6804-445a-a6d8-c705dad5b5eb", "rel": "self" }, { - "href": "http://openstack.example.com/servers/f85df75c-cf69-4723-b861-deff54b7cf70", + "href": "http://openstack.example.com/servers/f5dc173b-6804-445a-a6d8-c705dad5b5eb", "rel": "bookmark" } ] diff --git a/doc/v3/api_samples/servers/server-post-resp.xml b/doc/v3/api_samples/servers/server-post-resp.xml index f5c7a8713cd0..d88145f6a2a8 100644 --- a/doc/v3/api_samples/servers/server-post-resp.xml +++ b/doc/v3/api_samples/servers/server-post-resp.xml @@ -1,6 +1,6 @@ - + - - + + \ No newline at end of file diff --git a/doc/v3/api_samples/servers/servers-details-resp.json b/doc/v3/api_samples/servers/servers-details-resp.json index 1487ae729d1e..07995f2b75f0 100644 --- a/doc/v3/api_samples/servers/servers-details-resp.json +++ b/doc/v3/api_samples/servers/servers-details-resp.json @@ -13,7 +13,7 @@ } ] }, - "created": "2013-08-27T00:34:14Z", + "created": "2013-09-03T04:01:32Z", "flavor": { "id": "1", "links": [ @@ -23,8 +23,8 @@ } ] }, - "host_id": "3da3b81edf53783e31c0bb9292c85b478943a79528028ed642c46c57", - "id": "aa830ba3-7562-44c4-b794-6e1678402854", + "host_id": "bcf92836fc9ed4203a75cb0337afc7f917d2be504164b995c2334b25", + "id": "f5dc173b-6804-445a-a6d8-c705dad5b5eb", "image": { "id": "70a599e0-31e7-49b7-b260-868f441e862b", "links": [ @@ -34,13 +34,14 @@ } ] }, + "key_name": null, "links": [ { - "href": "http://openstack.example.com/v3/servers/aa830ba3-7562-44c4-b794-6e1678402854", + "href": "http://openstack.example.com/v3/servers/f5dc173b-6804-445a-a6d8-c705dad5b5eb", "rel": "self" }, { - "href": "http://openstack.example.com/servers/aa830ba3-7562-44c4-b794-6e1678402854", + "href": "http://openstack.example.com/servers/f5dc173b-6804-445a-a6d8-c705dad5b5eb", "rel": "bookmark" } ], @@ -51,7 +52,7 @@ "progress": 0, "status": "ACTIVE", "tenant_id": "openstack", - "updated": "2013-08-27T00:34:14Z", + "updated": "2013-09-03T04:01:32Z", "user_id": "fake" } ] diff --git a/doc/v3/api_samples/servers/servers-details-resp.xml b/doc/v3/api_samples/servers/servers-details-resp.xml index fab520299e01..5a89018f2a27 100644 --- a/doc/v3/api_samples/servers/servers-details-resp.xml +++ b/doc/v3/api_samples/servers/servers-details-resp.xml @@ -1,6 +1,6 @@ - + @@ -15,7 +15,7 @@ - - + + \ No newline at end of file diff --git a/doc/v3/api_samples/servers/servers-list-resp.json b/doc/v3/api_samples/servers/servers-list-resp.json index dcef4422f7b9..9cb57a72098b 100644 --- a/doc/v3/api_samples/servers/servers-list-resp.json +++ b/doc/v3/api_samples/servers/servers-list-resp.json @@ -1,14 +1,14 @@ { "servers": [ { - "id": "204da46b-4fc9-4761-9bab-aa28add417e6", + "id": "22c91117-08de-4894-9aa9-6ef382400985", "links": [ { - "href": "http://openstack.example.com/v3/servers/204da46b-4fc9-4761-9bab-aa28add417e6", + "href": "http://openstack.example.com/v3/servers/22c91117-08de-4894-9aa9-6ef382400985", "rel": "self" }, { - "href": "http://openstack.example.com/servers/204da46b-4fc9-4761-9bab-aa28add417e6", + "href": "http://openstack.example.com/servers/22c91117-08de-4894-9aa9-6ef382400985", "rel": "bookmark" } ], diff --git a/doc/v3/api_samples/servers/servers-list-resp.xml b/doc/v3/api_samples/servers/servers-list-resp.xml index 1c9d40634740..337f0525fb2e 100644 --- a/doc/v3/api_samples/servers/servers-list-resp.xml +++ b/doc/v3/api_samples/servers/servers-list-resp.xml @@ -1,7 +1,7 @@ - - - + + + \ No newline at end of file diff --git a/etc/nova/policy.json b/etc/nova/policy.json index 55bf5b2fc40b..4797b5b7bbfd 100644 --- a/etc/nova/policy.json +++ b/etc/nova/policy.json @@ -163,13 +163,13 @@ "compute_extension:keypairs:show": "", "compute_extension:keypairs:create": "", "compute_extension:keypairs:delete": "", + "compute_extension:v3:keypairs:discoverable": "", + "compute_extension:v3:keypairs": "", + "compute_extension:v3:keypairs:index": "", + "compute_extension:v3:keypairs:show": "", + "compute_extension:v3:keypairs:create": "", + "compute_extension:v3:keypairs:delete": "", "compute_extension:v3:limits:discoverable": "", - "compute_extension:v3:os-keypairs:discoverable": "", - "compute_extension:v3:os-keypairs": "", - "compute_extension:v3:os-keypairs:index": "", - "compute_extension:v3:os-keypairs:show": "", - "compute_extension:v3:os-keypairs:create": "", - "compute_extension:v3:os-keypairs:delete": "", "compute_extension:multinic": "", "compute_extension:v3:os-multinic": "", "compute_extension:v3:os-multinic:discoverable": "", diff --git a/nova/api/openstack/__init__.py b/nova/api/openstack/__init__.py index a12867aaf87f..cba4ca5c8290 100644 --- a/nova/api/openstack/__init__.py +++ b/nova/api/openstack/__init__.py @@ -61,7 +61,8 @@ CONF.register_opts(api_opts, api_opts_group) # the core API and so must be present # TODO(cyeoh): Expand this list as the core APIs are ported to V3 API_V3_CORE_EXTENSIONS = set(['consoles', 'extensions', 'flavors', 'ips', - 'limits', 'servers', 'server-metadata']) + 'limits', 'servers', 'server-metadata', + 'keypairs']) class FaultWrapper(base_wsgi.Middleware): diff --git a/nova/api/openstack/compute/plugins/v3/keypairs.py b/nova/api/openstack/compute/plugins/v3/keypairs.py index 5d824e4587f7..4fef7bd19b94 100644 --- a/nova/api/openstack/compute/plugins/v3/keypairs.py +++ b/nova/api/openstack/compute/plugins/v3/keypairs.py @@ -28,7 +28,7 @@ from nova import exception from nova.openstack.common.gettextutils import _ -ALIAS = 'os-keypairs' +ALIAS = 'keypairs' authorize = extensions.extension_authorizer('compute', 'v3:' + ALIAS) soft_authorize = extensions.soft_extension_authorizer('compute', 'v3:' + ALIAS) @@ -207,12 +207,12 @@ class Keypairs(extensions.V3APIExtensionBase): name = "Keypairs" alias = ALIAS - namespace = "http://docs.openstack.org/compute/ext/keypairs/api/v3" + namespace = "http://docs.openstack.org/compute/core/keypairs/api/v3" version = 1 def get_resources(self): resources = [ - extensions.ResourceExtension('os-keypairs', + extensions.ResourceExtension('keypairs', KeypairController())] return resources diff --git a/nova/tests/api/openstack/compute/plugins/v3/test_keypairs.py b/nova/tests/api/openstack/compute/plugins/v3/test_keypairs.py index 96299a8a28ab..a73bde3e4703 100644 --- a/nova/tests/api/openstack/compute/plugins/v3/test_keypairs.py +++ b/nova/tests/api/openstack/compute/plugins/v3/test_keypairs.py @@ -79,10 +79,10 @@ class KeypairsTest(test.TestCase): osapi_compute_extension=[ 'nova.api.openstack.compute.contrib.select_extensions'], osapi_compute_ext_list=['Keypairs']) - self.app = fakes.wsgi_app_v3(init_only=('os-keypairs', 'servers')) + self.app = fakes.wsgi_app_v3(init_only=('keypairs', 'servers')) def test_keypair_list(self): - req = webob.Request.blank('/v3/os-keypairs') + req = webob.Request.blank('/v3/keypairs') res = req.get_response(self.app) self.assertEqual(res.status_int, 200) res_dict = jsonutils.loads(res.body) @@ -91,7 +91,7 @@ class KeypairsTest(test.TestCase): def test_keypair_create(self): body = {'keypair': {'name': 'create_test'}} - req = webob.Request.blank('/v3/os-keypairs') + req = webob.Request.blank('/v3/keypairs') req.method = 'POST' req.body = jsonutils.dumps(body) req.headers['Content-Type'] = 'application/json' @@ -103,7 +103,7 @@ class KeypairsTest(test.TestCase): def test_keypair_create_with_empty_name(self): body = {'keypair': {'name': ''}} - req = webob.Request.blank('/v3/os-keypairs') + req = webob.Request.blank('/v3/keypairs') req.method = 'POST' req.body = jsonutils.dumps(body) req.headers['Content-Type'] = 'application/json' @@ -120,7 +120,7 @@ class KeypairsTest(test.TestCase): 'name': 'a' * 256 } } - req = webob.Request.blank('/v3/os-keypairs') + req = webob.Request.blank('/v3/keypairs') req.method = 'POST' req.body = jsonutils.dumps(body) req.headers['Content-Type'] = 'application/json' @@ -137,7 +137,7 @@ class KeypairsTest(test.TestCase): 'name': 'test/keypair' } } - req = webob.Request.blank('/v3/os-keypairs') + req = webob.Request.blank('/v3/keypairs') req.method = 'POST' req.body = jsonutils.dumps(body) req.headers['Content-Type'] = 'application/json' @@ -165,7 +165,7 @@ class KeypairsTest(test.TestCase): }, } - req = webob.Request.blank('/v3/os-keypairs') + req = webob.Request.blank('/v3/keypairs') req.method = 'POST' req.body = jsonutils.dumps(body) req.headers['Content-Type'] = 'application/json' @@ -198,7 +198,7 @@ class KeypairsTest(test.TestCase): }, } - req = webob.Request.blank('/v3/os-keypairs') + req = webob.Request.blank('/v3/keypairs') req.method = 'POST' req.body = jsonutils.dumps(body) req.headers['Content-Type'] = 'application/json' @@ -222,7 +222,7 @@ class KeypairsTest(test.TestCase): }, } - req = webob.Request.blank('/v3/os-keypairs') + req = webob.Request.blank('/v3/keypairs') req.method = 'POST' req.body = jsonutils.dumps(body) req.headers['Content-Type'] = 'application/json' @@ -236,7 +236,7 @@ class KeypairsTest(test.TestCase): def test_keypair_create_duplicate(self): self.stubs.Set(db, "key_pair_create", db_key_pair_create_duplicate) body = {'keypair': {'name': 'create_duplicate'}} - req = webob.Request.blank('/v3/os-keypairs') + req = webob.Request.blank('/v3/keypairs') req.method = 'POST' req.body = jsonutils.dumps(body) req.headers['Content-Type'] = 'application/json' @@ -255,7 +255,7 @@ class KeypairsTest(test.TestCase): }, } - req = webob.Request.blank('/v3/os-keypairs') + req = webob.Request.blank('/v3/keypairs') req.method = 'POST' req.body = jsonutils.dumps(body) req.headers['Content-Type'] = 'application/json' @@ -266,14 +266,14 @@ class KeypairsTest(test.TestCase): res_dict['badRequest']['message']) def test_keypair_delete(self): - req = webob.Request.blank('/v3/os-keypairs/FAKE') + req = webob.Request.blank('/v3/keypairs/FAKE') req.method = 'DELETE' req.headers['Content-Type'] = 'application/json' res = req.get_response(self.app) self.assertEqual(res.status_int, 202) def test_keypair_get_keypair_not_found(self): - req = webob.Request.blank('/v3/os-keypairs/DOESNOTEXIST') + req = webob.Request.blank('/v3/keypairs/DOESNOTEXIST') res = req.get_response(self.app) self.assertEqual(res.status_int, 404) @@ -284,7 +284,7 @@ class KeypairsTest(test.TestCase): self.stubs.Set(db, "key_pair_get", db_key_pair_get_not_found) - req = webob.Request.blank('/v3/os-keypairs/WHAT') + req = webob.Request.blank('/v3/keypairs/WHAT') res = req.get_response(self.app) self.assertEqual(res.status_int, 404) @@ -296,7 +296,7 @@ class KeypairsTest(test.TestCase): self.stubs.Set(db, "key_pair_get", _db_key_pair_get) - req = webob.Request.blank('/v3/os-keypairs/FAKE') + req = webob.Request.blank('/v3/keypairs/FAKE') req.method = 'GET' req.headers['Content-Type'] = 'application/json' res = req.get_response(self.app) @@ -313,7 +313,7 @@ class KeypairsTest(test.TestCase): self.stubs.Set(db, "key_pair_get", _db_key_pair_get) - req = webob.Request.blank('/v3/os-keypairs/FAKE') + req = webob.Request.blank('/v3/keypairs/FAKE') req.method = 'GET' req.headers['Content-Type'] = 'application/json' res = req.get_response(self.app) @@ -347,7 +347,7 @@ class KeypairsTest(test.TestCase): def test_keypair_create_with_invalid_keypair_body(self): body = {'alpha': {'name': 'create_test'}} - req = webob.Request.blank('/v3/os-keypairs') + req = webob.Request.blank('/v3/keypairs') req.method = 'POST' req.body = jsonutils.dumps(body) req.headers['Content-Type'] = 'application/json' @@ -378,44 +378,44 @@ class KeypairPolicyTest(test.TestCase): db_key_pair_destroy) def test_keypair_list_fail_policy(self): - rules = policy.Rules({'compute_extension:v3:os-keypairs:index': + rules = policy.Rules({'compute_extension:v3:keypairs:index': policy.parse_rule('role:admin')}) policy.set_rules(rules) - req = fakes.HTTPRequest.blank('/v3/fake/os-keypairs') + req = fakes.HTTPRequest.blank('/v3/keypairs') self.assertRaises(exception.NotAuthorized, self.KeyPairController.index, req) def test_keypair_list_pass_policy(self): - rules = policy.Rules({'compute_extension:v3:os-keypairs:index': + rules = policy.Rules({'compute_extension:v3:keypairs:index': policy.parse_rule('')}) policy.set_rules(rules) - req = fakes.HTTPRequest.blank('/v3/fake/os-keypairs') + req = fakes.HTTPRequest.blank('/v3/keypairs') res = self.KeyPairController.index(req) self.assertTrue('keypairs' in res) def test_keypair_show_fail_policy(self): - rules = policy.Rules({'compute_extension:v3:os-keypairs:show': + rules = policy.Rules({'compute_extension:v3:keypairs:show': policy.parse_rule('role:admin')}) policy.set_rules(rules) - req = fakes.HTTPRequest.blank('/v3/fake/os-keypairs/FAKE') + req = fakes.HTTPRequest.blank('/v3/keypairs/FAKE') self.assertRaises(exception.NotAuthorized, self.KeyPairController.show, req, 'FAKE') def test_keypair_show_pass_policy(self): - rules = policy.Rules({'compute_extension:v3:os-keypairs:show': + rules = policy.Rules({'compute_extension:v3:keypairs:show': policy.parse_rule('')}) policy.set_rules(rules) - req = fakes.HTTPRequest.blank('/v3/fake/os-keypairs/FAKE') + req = fakes.HTTPRequest.blank('/v3/keypairs/FAKE') res = self.KeyPairController.show(req, 'FAKE') self.assertTrue('keypair' in res) def test_keypair_create_fail_policy(self): - rules = policy.Rules({'compute_extension:v3:os-keypairs:create': + rules = policy.Rules({'compute_extension:v3:keypairs:create': policy.parse_rule('role:admin')}) policy.set_rules(rules) - req = fakes.HTTPRequest.blank('/v3/fake/os-keypairs') + req = fakes.HTTPRequest.blank('/v3/keypairs') req.method = 'POST' self.assertRaises(exception.NotAuthorized, self.KeyPairController.create, @@ -423,29 +423,29 @@ class KeypairPolicyTest(test.TestCase): def test_keypair_create_pass_policy(self): body = {'keypair': {'name': 'create_test'}} - rules = policy.Rules({'compute_extension:v3:os-keypairs:create': + rules = policy.Rules({'compute_extension:v3:keypairs:create': policy.parse_rule('')}) policy.set_rules(rules) - req = fakes.HTTPRequest.blank('/v3/fake/os-keypairs') + req = fakes.HTTPRequest.blank('/v3/keypairs') req.method = 'POST' res = self.KeyPairController.create(req, body) self.assertTrue('keypair' in res) def test_keypair_delete_fail_policy(self): - rules = policy.Rules({'compute_extension:v3:os-keypairs:delete': + rules = policy.Rules({'compute_extension:v3:keypairs:delete': policy.parse_rule('role:admin')}) policy.set_rules(rules) - req = fakes.HTTPRequest.blank('/v3/fake/os-keypairs/FAKE') + req = fakes.HTTPRequest.blank('/v3/keypairs/FAKE') req.method = 'DELETE' self.assertRaises(exception.NotAuthorized, self.KeyPairController.delete, req, 'FAKE') def test_keypair_delete_pass_policy(self): - rules = policy.Rules({'compute_extension:v3:os-keypairs:delete': + rules = policy.Rules({'compute_extension:v3:keypairs:delete': policy.parse_rule('')}) policy.set_rules(rules) - req = fakes.HTTPRequest.blank('/v3/fake/os-keypairs/FAKE') + req = fakes.HTTPRequest.blank('/v3/keypairs/FAKE') req.method = 'DELETE' res = self.KeyPairController.delete(req, 'FAKE') self.assertEqual(res.status_int, 202) diff --git a/nova/tests/fake_policy.py b/nova/tests/fake_policy.py index afada9433c13..4f7657e2798a 100644 --- a/nova/tests/fake_policy.py +++ b/nova/tests/fake_policy.py @@ -216,11 +216,11 @@ policy_data = """ "compute_extension:keypairs:create": "", "compute_extension:keypairs:delete": "", - "compute_extension:v3:os-keypairs": "", - "compute_extension:v3:os-keypairs:index": "", - "compute_extension:v3:os-keypairs:show": "", - "compute_extension:v3:os-keypairs:create": "", - "compute_extension:v3:os-keypairs:delete": "", + "compute_extension:v3:keypairs": "", + "compute_extension:v3:keypairs:index": "", + "compute_extension:v3:keypairs:show": "", + "compute_extension:v3:keypairs:create": "", + "compute_extension:v3:keypairs:delete": "", "compute_extension:multinic": "", "compute_extension:v3:os-multinic": "", "compute_extension:networks": "", diff --git a/nova/tests/integrated/v3/api_samples/servers/server-get-resp.json.tpl b/nova/tests/integrated/v3/api_samples/servers/server-get-resp.json.tpl index 6e31aae6f67c..afb281c5bd2a 100644 --- a/nova/tests/integrated/v3/api_samples/servers/server-get-resp.json.tpl +++ b/nova/tests/integrated/v3/api_samples/servers/server-get-resp.json.tpl @@ -33,6 +33,7 @@ } ] }, + "key_name": null, "links": [ { "href": "%(host)s/v3/servers/%(uuid)s", diff --git a/nova/tests/integrated/v3/api_samples/servers/server-get-resp.xml.tpl b/nova/tests/integrated/v3/api_samples/servers/server-get-resp.xml.tpl index 5cfb01fa5211..8286f6cedad1 100644 --- a/nova/tests/integrated/v3/api_samples/servers/server-get-resp.xml.tpl +++ b/nova/tests/integrated/v3/api_samples/servers/server-get-resp.xml.tpl @@ -1,5 +1,5 @@ - + diff --git a/nova/tests/integrated/v3/api_samples/servers/servers-details-resp.json.tpl b/nova/tests/integrated/v3/api_samples/servers/servers-details-resp.json.tpl index dce3ded800cb..cbbb57bc7d38 100644 --- a/nova/tests/integrated/v3/api_samples/servers/servers-details-resp.json.tpl +++ b/nova/tests/integrated/v3/api_samples/servers/servers-details-resp.json.tpl @@ -34,6 +34,7 @@ } ] }, + "key_name": null, "links": [ { "href": "%(host)s/v3/servers/%(uuid)s", diff --git a/nova/tests/integrated/v3/api_samples/servers/servers-details-resp.xml.tpl b/nova/tests/integrated/v3/api_samples/servers/servers-details-resp.xml.tpl index d9e0234e789f..f7b5006ba652 100644 --- a/nova/tests/integrated/v3/api_samples/servers/servers-details-resp.xml.tpl +++ b/nova/tests/integrated/v3/api_samples/servers/servers-details-resp.xml.tpl @@ -1,6 +1,6 @@ - +