Makes v3 API keypairs extension core

Adds os-keypairs to the core list for the V3 API.

Rename os-keypairs to keypairs as part of this change.

Fixes some incorrect urls in test_keypairs which still included
the tenant id

Updates api samples for servers since keypairs is now core and forms
part of the response by default

+DocImpact

Partially implements blueprint nova-v3-api

Change-Id: I8cdf52be0c8b19f7704848029a78373da8018cab
This commit is contained in:
Chris Yeoh
2013-08-22 18:32:53 +09:30
parent 8b5f0c9bee
commit 350d6f5337
17 changed files with 86 additions and 81 deletions

View File

@@ -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"
}
}

View File

@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='UTF-8'?>
<server xmlns:atom="http://www.w3.org/2005/Atom" xmlns="http://docs.openstack.org/compute/api/v1.1" status="ACTIVE" updated="2013-08-27T00:27:57Z" user_id="fake" name="new-server-test" created="2013-08-27T00:27:57Z" tenant_id="openstack" access_ip_v4="" progress="0" host_id="043dfed1b17e67d9eacf15337bb912cea5d1bda2dc3af0edda9fd1a3" id="3a39932d-11e8-485d-8bb5-5e41b87a4e64" access_ip_v6="">
<server xmlns:atom="http://www.w3.org/2005/Atom" xmlns="http://docs.openstack.org/compute/api/v1.1" status="ACTIVE" updated="2013-09-03T04:01:33Z" user_id="fake" name="new-server-test" created="2013-09-03T04:01:33Z" tenant_id="openstack" access_ip_v4="" progress="0" host_id="4fc6224a1e5d689f858d087c5ff6d24def5eab35646b53c3454d1234" id="f07e01fa-ed8f-4084-99b6-9311e6956e70" access_ip_v6="" key_name="None">
<image id="70a599e0-31e7-49b7-b260-868f441e862b">
<atom:link href="http://glance.openstack.example.com/images/70a599e0-31e7-49b7-b260-868f441e862b" rel="bookmark"/>
</image>
@@ -14,6 +14,6 @@
<ip version="4" type="fixed" addr="192.168.0.3" mac_addr="aa:bb:cc:dd:ee:ff"/>
</network>
</addresses>
<atom:link href="http://openstack.example.com/v3/servers/3a39932d-11e8-485d-8bb5-5e41b87a4e64" rel="self"/>
<atom:link href="http://openstack.example.com/servers/3a39932d-11e8-485d-8bb5-5e41b87a4e64" rel="bookmark"/>
<atom:link href="http://openstack.example.com/v3/servers/f07e01fa-ed8f-4084-99b6-9311e6956e70" rel="self"/>
<atom:link href="http://openstack.example.com/servers/f07e01fa-ed8f-4084-99b6-9311e6956e70" rel="bookmark"/>
</server>

View File

@@ -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"
}
]

View File

@@ -1,6 +1,6 @@
<?xml version='1.0' encoding='UTF-8'?>
<server xmlns:atom="http://www.w3.org/2005/Atom" xmlns="http://docs.openstack.org/compute/api/v1.1" id="6d896124-8af0-4f2b-a033-e8ca22f83810" admin_pass="JqCn8mtbDnj3">
<server xmlns:atom="http://www.w3.org/2005/Atom" xmlns="http://docs.openstack.org/compute/api/v1.1" id="b7244821-09f6-4931-a59f-433bc9a00edc" admin_pass="qvVB4ayUcia8">
<metadata/>
<atom:link href="http://openstack.example.com/v3/servers/6d896124-8af0-4f2b-a033-e8ca22f83810" rel="self"/>
<atom:link href="http://openstack.example.com/servers/6d896124-8af0-4f2b-a033-e8ca22f83810" rel="bookmark"/>
<atom:link href="http://openstack.example.com/v3/servers/b7244821-09f6-4931-a59f-433bc9a00edc" rel="self"/>
<atom:link href="http://openstack.example.com/servers/b7244821-09f6-4931-a59f-433bc9a00edc" rel="bookmark"/>
</server>

View File

@@ -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"
}
]

View File

@@ -1,6 +1,6 @@
<?xml version='1.0' encoding='UTF-8'?>
<servers xmlns:atom="http://www.w3.org/2005/Atom" xmlns="http://docs.openstack.org/compute/api/v1.1">
<server status="ACTIVE" updated="2013-08-27T00:34:16Z" user_id="fake" name="new-server-test" created="2013-08-27T00:34:16Z" tenant_id="openstack" access_ip_v4="" progress="0" host_id="cf19fcc5d5d7a9ff7fb80da2db424218bc28b5b360705b97b8afaef3" id="43980ac6-fa88-44fc-b65d-87da4fa6f800" access_ip_v6="">
<server status="ACTIVE" updated="2013-09-03T04:01:34Z" user_id="fake" name="new-server-test" created="2013-09-03T04:01:33Z" tenant_id="openstack" access_ip_v4="" progress="0" host_id="9afcaa50605be561503e2d707aed0c219081dc8a87d7f67a965512c8" id="3af51aa7-a2aa-477b-9499-e5528bcf32a5" access_ip_v6="" key_name="None">
<image id="70a599e0-31e7-49b7-b260-868f441e862b">
<atom:link href="http://glance.openstack.example.com/images/70a599e0-31e7-49b7-b260-868f441e862b" rel="bookmark"/>
</image>
@@ -15,7 +15,7 @@
<ip version="4" type="fixed" addr="192.168.0.3" mac_addr="aa:bb:cc:dd:ee:ff"/>
</network>
</addresses>
<atom:link href="http://openstack.example.com/v3/servers/43980ac6-fa88-44fc-b65d-87da4fa6f800" rel="self"/>
<atom:link href="http://openstack.example.com/servers/43980ac6-fa88-44fc-b65d-87da4fa6f800" rel="bookmark"/>
<atom:link href="http://openstack.example.com/v3/servers/3af51aa7-a2aa-477b-9499-e5528bcf32a5" rel="self"/>
<atom:link href="http://openstack.example.com/servers/3af51aa7-a2aa-477b-9499-e5528bcf32a5" rel="bookmark"/>
</server>
</servers>

View File

@@ -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"
}
],

View File

@@ -1,7 +1,7 @@
<?xml version='1.0' encoding='UTF-8'?>
<servers xmlns:atom="http://www.w3.org/2005/Atom" xmlns="http://docs.openstack.org/compute/api/v1.1">
<server name="new-server-test" id="6d896124-8af0-4f2b-a033-e8ca22f83810">
<atom:link href="http://openstack.example.com/v3/servers/6d896124-8af0-4f2b-a033-e8ca22f83810" rel="self"/>
<atom:link href="http://openstack.example.com/servers/6d896124-8af0-4f2b-a033-e8ca22f83810" rel="bookmark"/>
<server name="new-server-test" id="b7244821-09f6-4931-a59f-433bc9a00edc">
<atom:link href="http://openstack.example.com/v3/servers/b7244821-09f6-4931-a59f-433bc9a00edc" rel="self"/>
<atom:link href="http://openstack.example.com/servers/b7244821-09f6-4931-a59f-433bc9a00edc" rel="bookmark"/>
</server>
</servers>

View File

@@ -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": "",

View File

@@ -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):

View File

@@ -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

View File

@@ -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)

View File

@@ -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": "",

View File

@@ -33,6 +33,7 @@
}
]
},
"key_name": null,
"links": [
{
"href": "%(host)s/v3/servers/%(uuid)s",

View File

@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='UTF-8'?>
<server xmlns:atom="http://www.w3.org/2005/Atom" xmlns="http://docs.openstack.org/compute/api/v1.1" status="ACTIVE" updated="%(timestamp)s" user_id="fake" name="new-server-test" created="%(timestamp)s" tenant_id="openstack" access_ip_v4="" progress="0" host_id="%(hostid)s" id="%(id)s" access_ip_v6="">
<server xmlns:atom="http://www.w3.org/2005/Atom" xmlns="http://docs.openstack.org/compute/api/v1.1" status="ACTIVE" updated="%(timestamp)s" user_id="fake" name="new-server-test" created="%(timestamp)s" tenant_id="openstack" access_ip_v4="" progress="0" host_id="%(hostid)s" id="%(id)s" access_ip_v6="" key_name="None">
<image id="%(uuid)s">
<atom:link href="%(glance_host)s/images/%(uuid)s" rel="bookmark"/>
</image>

View File

@@ -34,6 +34,7 @@
}
]
},
"key_name": null,
"links": [
{
"href": "%(host)s/v3/servers/%(uuid)s",

View File

@@ -1,6 +1,6 @@
<?xml version='1.0' encoding='UTF-8'?>
<servers xmlns:atom="http://www.w3.org/2005/Atom" xmlns="http://docs.openstack.org/compute/api/v1.1">
<server status="ACTIVE" updated="%(timestamp)s" host_id="%(hostid)s" name="new-server-test" created="%(timestamp)s" user_id="fake" tenant_id="openstack" access_ip_v4="" access_ip_v6="" progress="0" id="%(id)s">
<server status="ACTIVE" updated="%(timestamp)s" host_id="%(hostid)s" name="new-server-test" created="%(timestamp)s" user_id="fake" tenant_id="openstack" access_ip_v4="" access_ip_v6="" key_name="None" progress="0" id="%(id)s">
<image id="%(uuid)s">
<atom:link href="%(glance_host)s/images/%(uuid)s" rel="bookmark"/>
</image>