summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Meade <alex.meade@rackspace.com>2011-07-13 15:59:05 -0400
committerAlex Meade <alex.meade@rackspace.com>2011-07-13 15:59:05 -0400
commite1eca2190b66c745b425579affd2407e0ffd11c6 (patch)
tree5b8d4324c2ac82a62c664d570544111e2eb0d222
parentce146a76437401882e04305cc8ea64b3c638135e (diff)
beginning server detail spec 1.1 fixup
-rw-r--r--nova/api/openstack/common.py23
-rw-r--r--nova/api/openstack/views/servers.py27
-rw-r--r--nova/tests/api/openstack/test_common.py12
-rw-r--r--nova/tests/api/openstack/test_servers.py103
4 files changed, 143 insertions, 22 deletions
diff --git a/nova/api/openstack/common.py b/nova/api/openstack/common.py
index 79969d393..26b8c1946 100644
--- a/nova/api/openstack/common.py
+++ b/nova/api/openstack/common.py
@@ -136,6 +136,29 @@ def get_id_from_href(href):
raise ValueError(_('could not parse id from href'))
+def get_uuid_from_href(href):
+ """Return the uuid portion of a url.
+
+ Given: 'http://www.foo.com/bar/123?q=4'
+ Returns: '123'
+
+ In order to support local hrefs, the href argument can be just an id:
+ Given: '123'
+ Returns: '123'
+
+ """
+ if not '/' in href:
+ return href
+ try:
+ href = urlparse(href).path.split('/')[-1]
+ if href == '':
+ raise Exception
+ return href
+ except:
+ LOG.debug(_("Error extracting uuid from href: %s") % href)
+ raise ValueError(_('could not parse uuid from href'))
+
+
def remove_version_from_href(href):
"""Removes the api version from the href.
diff --git a/nova/api/openstack/views/servers.py b/nova/api/openstack/views/servers.py
index 67fb6a84e..7fb180246 100644
--- a/nova/api/openstack/views/servers.py
+++ b/nova/api/openstack/views/servers.py
@@ -50,7 +50,7 @@ class ViewBuilder(object):
else:
server = self._build_simple(inst)
- self._build_extra(server, inst)
+ self._build_extra(server['server'], inst)
return server
@@ -99,7 +99,6 @@ class ViewBuilder(object):
self._build_image(inst_dict, inst)
self._build_flavor(inst_dict, inst)
- inst_dict['uuid'] = inst['uuid']
return dict(server=inst_dict)
def _build_image(self, response, inst):
@@ -117,6 +116,9 @@ class ViewBuilder(object):
class ViewBuilderV10(ViewBuilder):
"""Model an Openstack API V1.0 server response."""
+ def _build_extra(self, response, inst):
+ response['uuid'] = inst['uuid']
+
def _build_image(self, response, inst):
if 'image_ref' in dict(inst):
image_ref = inst['image_ref']
@@ -143,16 +145,31 @@ class ViewBuilderV11(ViewBuilder):
image_href = inst['image_ref']
if str(image_href).isdigit():
image_href = int(image_href)
- response['imageRef'] = image_href
+ response['image'] = {
+ "id": common.get_uuid_from_href(image_href),
+ "links": [
+ {
+ "rel": "self",
+ "href": image_href,
+ },
+ {
+ "rel": "bookmark",
+ "href": common.remove_version_from_href(image_href),
+ },
+ ]
+ }
def _build_flavor(self, response, inst):
if "instance_type" in dict(inst):
flavor_id = inst["instance_type"]['flavorid']
flavor_ref = self.flavor_builder.generate_href(flavor_id)
- response["flavorRef"] = flavor_ref
+ response["flavor"] = {
+ "id": common.get_uuid_from_href(flavor_ref),
+ }
def _build_extra(self, response, inst):
self._build_links(response, inst)
+ response['id'] = inst['uuid']
def _build_links(self, response, inst):
href = self.generate_href(inst["id"])
@@ -169,7 +186,7 @@ class ViewBuilderV11(ViewBuilder):
},
]
- response["server"]["links"] = links
+ response["links"] = links
def generate_href(self, server_id):
"""Create an url that refers to a specific server id."""
diff --git a/nova/tests/api/openstack/test_common.py b/nova/tests/api/openstack/test_common.py
index 7440bccfb..864bbd8cc 100644
--- a/nova/tests/api/openstack/test_common.py
+++ b/nova/tests/api/openstack/test_common.py
@@ -223,3 +223,15 @@ class MiscFunctionsTest(test.TestCase):
self.assertRaises(ValueError,
common.get_id_from_href,
fixture)
+
+ def test_get_uuid_from_href(self):
+ fixture = 'http://www.testsite.com/dir/45'
+ actual = common.get_uuid_from_href(fixture)
+ expected = '45'
+ self.assertEqual(actual, expected)
+
+ def test_get_uuid_from_href_bad_request(self):
+ fixture = 'http://'
+ self.assertRaises(ValueError,
+ common.get_uuid_from_href,
+ fixture)
diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py
index 775f66ad0..0d122762b 100644
--- a/nova/tests/api/openstack/test_servers.py
+++ b/nova/tests/api/openstack/test_servers.py
@@ -124,11 +124,11 @@ def instance_addresses(context, instance_id):
def stub_instance(id, user_id=1, private_address=None, public_addresses=None,
host=None, power_state=0, reservation_id="",
- uuid=FAKE_UUID):
+ uuid=FAKE_UUID, image_ref="10", flavor_ref="1"):
metadata = []
metadata.append(InstanceMetadata(key='seq', value=id))
- inst_type = instance_types.get_instance_type_by_flavor_id(1)
+ inst_type = instance_types.get_instance_type_by_flavor_id(int(flavor_ref))
if public_addresses is None:
public_addresses = list()
@@ -146,7 +146,7 @@ def stub_instance(id, user_id=1, private_address=None, public_addresses=None,
"admin_pass": "",
"user_id": user_id,
"project_id": "",
- "image_ref": "10",
+ "image_ref": image_ref,
"kernel_id": "",
"ramdisk_id": "",
"launch_index": 0,
@@ -277,24 +277,93 @@ class ServersTest(test.TestCase):
self.assertEqual(res_dict['server']['name'], 'server1')
def test_get_server_by_id_v1_1(self):
+ self.maxDiff = None
+ image_ref = "http://localhost/v1.1/images/10"
+ image_bookmark = "http://localhost/images/10"
+ #flavor_ref = "http://localhost/v1.1/flavors/1"
+ flavor_ref = "1"
+ flavor_bookmark = "http://localhost/flavors/1"
+ private = "192.168.0.3"
+ public = ["1.2.3.4"]
+ def _return_server(context, id):
+
+ return stub_instance(1,
+ private_address=private,
+ public_addresses=public,
+ power_state=0,
+ image_ref=image_ref,
+ flavor_ref=flavor_ref,
+ )
+ self.stubs.Set(nova.db.api, 'instance_get', _return_server)
+
req = webob.Request.blank('/v1.1/servers/1')
res = req.get_response(fakes.wsgi_app())
res_dict = json.loads(res.body)
- self.assertEqual(res_dict['server']['id'], 1)
- self.assertEqual(res_dict['server']['name'], 'server1')
-
- expected_links = [
- {
- "rel": "self",
- "href": "http://localhost/v1.1/servers/1",
- },
- {
- "rel": "bookmark",
- "href": "http://localhost/servers/1",
- },
- ]
+ expected_server = {
+ "server": {
+ "id": FAKE_UUID,
+ #"updated": "FIXME",
+ #"created": "FIXME",
+ "name": "server1",
+ "status": "BUILD",
+ "hostId": '',
+ "image": {
+ "id": "10",
+ "links": [
+ {
+ "rel": "self",
+ "href": image_ref,
+ },
+ {
+ "rel": "bookmark",
+ "href": image_bookmark,
+ },
+ ],
+ },
+ "flavor": {
+ "id": "1",
+ #"links": [
+ #{
+ #"rel": "self",
+ #"href": flavor_ref,
+ #},
+ #{
+ #"rel": "bookmark",
+ #"href": flavor_bookmark,
+ #},
+ #],
+ },
+ "addresses": {
+ "public": [
+ {
+ "version": 4,
+ "addr": public[0],
+ },
+ ],
+ "private":[
+ {
+ "version": 4,
+ "addr": private,
+ },
+ ],
+ },
+ "metadata": {
+ "seq": "1",
+ },
+ "links": [
+ {
+ "rel": "self",
+ "href": "http://localhost/v1.1/servers/1",
+ },
+ {
+ "rel": "bookmark",
+ "href": "http://localhost/servers/1",
+ },
+ ],
+ }
+ }
- self.assertEqual(res_dict['server']['links'], expected_links)
+ self.assertDictEqual(res_dict, expected_server)
def test_get_server_by_id_with_addresses_xml(self):
private = "192.168.0.3"