From 3a65ea2f29ca169779cbd09acf4f7ac50314c969 Mon Sep 17 00:00:00 2001 From: Kevin Bringard Date: Fri, 1 Jul 2011 11:14:30 -0600 Subject: Changed fixed_ip.network to be fixed_ips.network, which is the correct DB field --- nova/db/sqlalchemy/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index ffd009513..7278ad1f5 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -1237,7 +1237,7 @@ def instance_get_project_vpn(context, project_id): options(joinedload_all('fixed_ips.floating_ips')).\ options(joinedload('virtual_interfaces')).\ options(joinedload('security_groups')).\ - options(joinedload_all('fixed_ip.network')).\ + options(joinedload_all('fixed_ips.network')).\ options(joinedload('metadata')).\ options(joinedload('instance_type')).\ filter_by(project_id=project_id).\ -- cgit From 42ef4e0adb7b0ec939f40d5356d4a3d2d03dec9f Mon Sep 17 00:00:00 2001 From: Kevin Bringard Date: Fri, 1 Jul 2011 12:32:26 -0600 Subject: Found some additional fixed_ip. entries in the Intance model contest that needed to be updated --- nova/db/sqlalchemy/api.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 7278ad1f5..fd7ace4c7 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -1141,9 +1141,9 @@ def instance_get_active_by_window(context, begin, end=None): """Return instances that were continuously active over the given window""" session = get_session() query = session.query(models.Instance).\ - options(joinedload_all('fixed_ip.floating_ips')).\ + options(joinedload_all('fixed_ips.floating_ips')).\ options(joinedload('security_groups')).\ - options(joinedload_all('fixed_ip.network')).\ + options(joinedload_all('fixed_ips.network')).\ options(joinedload('instance_type')).\ filter(models.Instance.launched_at < begin) if end: -- cgit From e1eca2190b66c745b425579affd2407e0ffd11c6 Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Wed, 13 Jul 2011 15:59:05 -0400 Subject: beginning server detail spec 1.1 fixup --- nova/api/openstack/common.py | 23 +++++++ nova/api/openstack/views/servers.py | 27 ++++++-- nova/tests/api/openstack/test_common.py | 12 ++++ nova/tests/api/openstack/test_servers.py | 103 ++++++++++++++++++++++++++----- 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" -- cgit From 38f949608fc3faaae855bf91719a074c1c545a1d Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Wed, 13 Jul 2011 16:22:55 -0400 Subject: updated to support and check for flavor links in server detail response --- nova/api/openstack/views/servers.py | 11 +++++++++++ nova/tests/api/openstack/test_servers.py | 31 ++++++++++++++++--------------- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/nova/api/openstack/views/servers.py b/nova/api/openstack/views/servers.py index 7fb180246..e17edd6b6 100644 --- a/nova/api/openstack/views/servers.py +++ b/nova/api/openstack/views/servers.py @@ -163,8 +163,19 @@ class ViewBuilderV11(ViewBuilder): if "instance_type" in dict(inst): flavor_id = inst["instance_type"]['flavorid'] flavor_ref = self.flavor_builder.generate_href(flavor_id) + flavor_bookmark = self.flavor_builder.generate_bookmark(flavor_id) response["flavor"] = { "id": common.get_uuid_from_href(flavor_ref), + "links": [ + { + "rel": "self", + "href": flavor_ref, + }, + { + "rel": "bookmark", + "href": flavor_bookmark, + }, + ] } def _build_extra(self, response, inst): diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index 0d122762b..ab24b328a 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -124,11 +124,12 @@ 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, image_ref="10", flavor_ref="1"): + uuid=FAKE_UUID, image_ref="10", flavor_id="1"): metadata = [] metadata.append(InstanceMetadata(key='seq', value=id)) - inst_type = instance_types.get_instance_type_by_flavor_id(int(flavor_ref)) + + inst_type = instance_types.get_instance_type_by_flavor_id(int(flavor_id)) if public_addresses is None: public_addresses = list() @@ -280,8 +281,8 @@ class ServersTest(test.TestCase): 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_ref = "http://localhost/v1.1/flavors/1" + flavor_id = "1" flavor_bookmark = "http://localhost/flavors/1" private = "192.168.0.3" public = ["1.2.3.4"] @@ -292,7 +293,7 @@ class ServersTest(test.TestCase): public_addresses=public, power_state=0, image_ref=image_ref, - flavor_ref=flavor_ref, + flavor_id=flavor_id, ) self.stubs.Set(nova.db.api, 'instance_get', _return_server) @@ -322,16 +323,16 @@ class ServersTest(test.TestCase): }, "flavor": { "id": "1", - #"links": [ - #{ - #"rel": "self", - #"href": flavor_ref, - #}, - #{ - #"rel": "bookmark", - #"href": flavor_bookmark, - #}, - #], + "links": [ + { + "rel": "self", + "href": flavor_ref, + }, + { + "rel": "bookmark", + "href": flavor_bookmark, + }, + ], }, "addresses": { "public": [ -- cgit From 11f05e040ad50c64e4de46dc8f8e6246956f774b Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Thu, 14 Jul 2011 10:31:42 -0400 Subject: add updated and created to servers detail test, and make it work --- nova/api/openstack/views/servers.py | 2 ++ nova/tests/api/openstack/test_servers.py | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/nova/api/openstack/views/servers.py b/nova/api/openstack/views/servers.py index e17edd6b6..5d906f3df 100644 --- a/nova/api/openstack/views/servers.py +++ b/nova/api/openstack/views/servers.py @@ -181,6 +181,8 @@ class ViewBuilderV11(ViewBuilder): def _build_extra(self, response, inst): self._build_links(response, inst) response['id'] = inst['uuid'] + response['created'] = inst['created_at'] + response['updated'] = inst['updated_at'] def _build_links(self, response, inst): href = self.generate_href(inst["id"]) diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index ab24b328a..4385e1c14 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -144,6 +144,8 @@ def stub_instance(id, user_id=1, private_address=None, public_addresses=None, instance = { "id": int(id), + "created_at": "2010-10-10T12:00:00Z", + "updated_at": "2010-11-11T11:00:00Z", "admin_pass": "", "user_id": user_id, "project_id": "", @@ -303,8 +305,8 @@ class ServersTest(test.TestCase): expected_server = { "server": { "id": FAKE_UUID, - #"updated": "FIXME", - #"created": "FIXME", + "updated": "2010-11-11T11:00:00Z", + "created": "2010-10-10T12:00:00Z", "name": "server1", "status": "BUILD", "hostId": '', -- cgit From 3041f2e9eb90e447adbb48827c2c85ca27d436e6 Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Thu, 14 Jul 2011 13:25:40 -0400 Subject: Added progress attribute to servers responses --- nova/api/openstack/views/servers.py | 4 ++ nova/tests/api/openstack/test_servers.py | 99 +++++++++++++++++++++++++++++++- 2 files changed, 101 insertions(+), 2 deletions(-) diff --git a/nova/api/openstack/views/servers.py b/nova/api/openstack/views/servers.py index 5d906f3df..3f13e469a 100644 --- a/nova/api/openstack/views/servers.py +++ b/nova/api/openstack/views/servers.py @@ -183,6 +183,10 @@ class ViewBuilderV11(ViewBuilder): response['id'] = inst['uuid'] response['created'] = inst['created_at'] response['updated'] = inst['updated_at'] + if response['status'] == "ACTIVE": + response['progress'] = 100 + elif response['status'] == "BUILD": + response['progress'] = 0 def _build_links(self, response, inst): href = self.generate_href(inst["id"]) diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index 4385e1c14..e00dd825e 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -307,22 +307,117 @@ class ServersTest(test.TestCase): "id": FAKE_UUID, "updated": "2010-11-11T11:00:00Z", "created": "2010-10-10T12:00:00Z", + "progress": 0, "name": "server1", "status": "BUILD", "hostId": '', + #"accessIPv4" : "67.23.10.132", + #"accessIPv6" : "::babe:67.23.10.132", "image": { "id": "10", + "links": [ + { + "rel": "self", + "href": image_ref, + }, + { + "rel": "bookmark", + "href": image_bookmark, + }, + ], + }, + "flavor": { + "id": "1", "links": [ { "rel": "self", - "href": image_ref, + "href": flavor_ref, }, { "rel": "bookmark", - "href": image_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.assertDictEqual(res_dict, expected_server) + + def test_get_server_with_active_status_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_id = "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=1, + image_ref=image_ref, + flavor_id=flavor_id, + ) + 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) + expected_server = { + "server": { + "id": FAKE_UUID, + "updated": "2010-11-11T11:00:00Z", + "created": "2010-10-10T12:00:00Z", + "progress": 100, + "name": "server1", + "status": "ACTIVE", + "hostId": '', + #"accessIPv4" : "67.23.10.132", + #"accessIPv6" : "::babe:67.23.10.132", + "image": { + "id": "10", + "links": [ + { + "rel": "self", + "href": image_ref, + }, + { + "rel": "bookmark", + "href": image_bookmark, + }, + ], + }, "flavor": { "id": "1", "links": [ -- cgit From 7044080daf2e487a92bba2a9f9b99e3cdb874e88 Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Thu, 14 Jul 2011 14:01:04 -0400 Subject: updated image entity for servers requests --- nova/api/openstack/views/servers.py | 37 +++++++----- nova/tests/api/openstack/test_servers.py | 98 ++++++++++++++++++++++++++++---- 2 files changed, 109 insertions(+), 26 deletions(-) diff --git a/nova/api/openstack/views/servers.py b/nova/api/openstack/views/servers.py index 3f13e469a..968a904d9 100644 --- a/nova/api/openstack/views/servers.py +++ b/nova/api/openstack/views/servers.py @@ -143,21 +143,28 @@ class ViewBuilderV11(ViewBuilder): def _build_image(self, response, inst): if 'image_ref' in dict(inst): image_href = inst['image_ref'] - if str(image_href).isdigit(): - image_href = int(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), - }, - ] - } + #if id is a uuid do: + if image_href == common.get_uuid_from_href(image_href): + image_id = image_href + _bookmark = self.image_builder.generate_bookmark(image_href) + response['image'] = { + "id": image_id, + "links": [ + { + "rel": "bookmark", + "href": _bookmark, + }, + ] + } + else: + response['image'] = { + "links": [ + { + "rel": "bookmark", + "href": image_href, + }, + ] + } def _build_flavor(self, response, inst): if "instance_type" in dict(inst): diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index e00dd825e..2fe236291 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -281,7 +281,6 @@ class ServersTest(test.TestCase): 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_id = "1" @@ -294,7 +293,7 @@ class ServersTest(test.TestCase): private_address=private, public_addresses=public, power_state=0, - image_ref=image_ref, + image_ref=image_bookmark, flavor_id=flavor_id, ) self.stubs.Set(nova.db.api, 'instance_get', _return_server) @@ -314,12 +313,93 @@ class ServersTest(test.TestCase): #"accessIPv4" : "67.23.10.132", #"accessIPv6" : "::babe:67.23.10.132", "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.assertDictEqual(res_dict, expected_server) + + def test_get_server_with_active_status_by_id_v1_1(self): + self.maxDiff = None + image_bookmark = "http://localhost/images/10" + flavor_ref = "http://localhost/v1.1/flavors/1" + flavor_id = "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=1, + image_ref=image_bookmark, + flavor_id=flavor_id, + ) + 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) + expected_server = { + "server": { + "id": FAKE_UUID, + "updated": "2010-11-11T11:00:00Z", + "created": "2010-10-10T12:00:00Z", + "progress": 100, + "name": "server1", + "status": "ACTIVE", + "hostId": '', + #"accessIPv4" : "67.23.10.132", + #"accessIPv6" : "::babe:67.23.10.132", + "image": { + "links": [ { "rel": "bookmark", "href": image_bookmark, @@ -371,9 +451,9 @@ class ServersTest(test.TestCase): self.assertDictEqual(res_dict, expected_server) - def test_get_server_with_active_status_by_id_v1_1(self): + def test_get_server_with_id_image_ref_by_id_v1_1(self): self.maxDiff = None - image_ref = "http://localhost/v1.1/images/10" + image_ref = "10" image_bookmark = "http://localhost/images/10" flavor_ref = "http://localhost/v1.1/flavors/1" flavor_id = "1" @@ -408,10 +488,6 @@ class ServersTest(test.TestCase): "image": { "id": "10", "links": [ - { - "rel": "self", - "href": image_ref, - }, { "rel": "bookmark", "href": image_bookmark, -- cgit From 11e76f0e36f9da1840a9356b2e0a0dba87df3040 Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Thu, 14 Jul 2011 14:35:11 -0400 Subject: removed self links from flavors --- nova/api/openstack/views/servers.py | 13 +++++-------- nova/tests/api/openstack/test_servers.py | 14 +------------- 2 files changed, 6 insertions(+), 21 deletions(-) diff --git a/nova/api/openstack/views/servers.py b/nova/api/openstack/views/servers.py index 968a904d9..9d6699ed0 100644 --- a/nova/api/openstack/views/servers.py +++ b/nova/api/openstack/views/servers.py @@ -174,10 +174,6 @@ class ViewBuilderV11(ViewBuilder): response["flavor"] = { "id": common.get_uuid_from_href(flavor_ref), "links": [ - { - "rel": "self", - "href": flavor_ref, - }, { "rel": "bookmark", "href": flavor_bookmark, @@ -190,10 +186,11 @@ class ViewBuilderV11(ViewBuilder): response['id'] = inst['uuid'] response['created'] = inst['created_at'] response['updated'] = inst['updated_at'] - if response['status'] == "ACTIVE": - response['progress'] = 100 - elif response['status'] == "BUILD": - response['progress'] = 0 + if 'status' in response: + if response['status'] == "ACTIVE": + response['progress'] = 100 + elif response['status'] == "BUILD": + response['progress'] = 0 def _build_links(self, response, inst): href = self.generate_href(inst["id"]) diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index 2fe236291..c925514a6 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -323,11 +323,7 @@ class ServersTest(test.TestCase): "flavor": { "id": "1", "links": [ - { - "rel": "self", - "href": flavor_ref, - }, - { + { "rel": "bookmark", "href": flavor_bookmark, }, @@ -409,10 +405,6 @@ class ServersTest(test.TestCase): "flavor": { "id": "1", "links": [ - { - "rel": "self", - "href": flavor_ref, - }, { "rel": "bookmark", "href": flavor_bookmark, @@ -497,10 +489,6 @@ class ServersTest(test.TestCase): "flavor": { "id": "1", "links": [ - { - "rel": "self", - "href": flavor_ref, - }, { "rel": "bookmark", "href": flavor_bookmark, -- cgit From 8435ffcaa7c154809c2687e011911cf1507497f2 Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Thu, 14 Jul 2011 15:55:47 -0400 Subject: Updated old tests --- nova/tests/api/openstack/test_servers.py | 99 +++++++++++++++++++++++++------- 1 file changed, 79 insertions(+), 20 deletions(-) diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index c925514a6..279a149d3 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -649,7 +649,7 @@ class ServersTest(test.TestCase): 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']['id'], FAKE_UUID) self.assertEqual(res_dict['server']['name'], 'server1') addresses = res_dict['server']['addresses'] # RM(4047): Figure otu what is up with the 1.1 api and multi-nic @@ -729,9 +729,9 @@ class ServersTest(test.TestCase): res_dict = json.loads(res.body) for i, s in enumerate(res_dict['servers']): - self.assertEqual(s['id'], i) + self.assertEqual(s['id'], FAKE_UUID) self.assertEqual(s['name'], 'server%d' % i) - self.assertEqual(s.get('imageId', None), None) + self.assertEqual(s.get('image', None), None) expected_links = [ { @@ -790,13 +790,13 @@ class ServersTest(test.TestCase): req = webob.Request.blank('/v1.1/servers?marker=2') res = req.get_response(fakes.wsgi_app()) servers = json.loads(res.body)['servers'] - self.assertEqual([s['id'] for s in servers], [3, 4]) + self.assertEqual([s['name'] for s in servers], ["server3", "server4"]) def test_get_servers_with_limit_and_marker(self): req = webob.Request.blank('/v1.1/servers?limit=2&marker=1') res = req.get_response(fakes.wsgi_app()) servers = json.loads(res.body)['servers'] - self.assertEqual([s['id'] for s in servers], [2, 3]) + self.assertEqual([s['name'] for s in servers], ['server2', 'server3']) def test_get_servers_with_bad_marker(self): req = webob.Request.blank('/v1.1/servers?limit=2&marker=asdf') @@ -807,8 +807,16 @@ class ServersTest(test.TestCase): def _setup_for_create_instance(self): """Shared implementation for tests below that create instance""" def instance_create(context, inst): - return {'id': 1, 'display_name': 'server_test', - 'uuid': FAKE_UUID} + inst_type = instance_types.get_instance_type_by_flavor_id(3) + image_ref = 'http://localhost/images/2' + return {'id': 1, + 'display_name': 'server_test', + 'uuid': FAKE_UUID, + 'instance_type': dict(inst_type), + 'image_ref': image_ref, + 'created_at': '2010-10-10T12:00:00Z', + 'updated_at': '2010-11-11T11:00:00Z', + } def server_update(context, id, params): return instance_create(context, id) @@ -996,8 +1004,25 @@ class ServersTest(test.TestCase): def test_create_instance_v1_1(self): self._setup_for_create_instance() - image_href = 'http://localhost/v1.1/images/2' - flavor_ref = 'http://localhost/v1.1/flavors/3' + image_href = 'http://localhost/images/2' + flavor_ref = 'http://localhost/flavors/3' + expected_flavor = { + "id": "3", + "links": [ + { + "rel": "bookmark", + "href": 'http://localhost/flavors/3', + }, + ], + } + expected_image = { + "links": [ + { + "rel": "bookmark", + "href": 'http://localhost/images/2', + }, + ], + } body = { 'server': { 'name': 'server_test', @@ -1021,9 +1046,8 @@ class ServersTest(test.TestCase): server = json.loads(res.body)['server'] self.assertEqual(16, len(server['adminPass'])) self.assertEqual('server_test', server['name']) - self.assertEqual(1, server['id']) - self.assertEqual(flavor_ref, server['flavorRef']) - self.assertEqual(image_href, server['imageRef']) + self.assertEqual(expected_flavor, server['flavor']) + self.assertEqual(expected_image, server['image']) self.assertEqual(res.status_int, 200) def test_create_instance_v1_1_bad_href(self): @@ -1045,8 +1069,26 @@ class ServersTest(test.TestCase): def test_create_instance_v1_1_local_href(self): self._setup_for_create_instance() - image_id = 2 - flavor_ref = 'http://localhost/v1.1/flavors/3' + image_id = "2" + flavor_ref = 'http://localhost/flavors/3' + expected_flavor = { + "id": "3", + "links": [ + { + "rel": "bookmark", + "href": 'http://localhost/flavors/3', + }, + ], + } + expected_image = { + "id": "2", + "links": [ + { + "rel": "bookmark", + "href": 'http://localhost/images/2', + }, + ], + } body = { 'server': { 'name': 'server_test', @@ -1063,9 +1105,8 @@ class ServersTest(test.TestCase): res = req.get_response(fakes.wsgi_app()) server = json.loads(res.body)['server'] - self.assertEqual(1, server['id']) - self.assertEqual(flavor_ref, server['flavorRef']) - self.assertEqual(image_id, server['imageRef']) + self.assertEqual(expected_flavor, server['flavor']) + self.assertEqual(expected_image, server['image']) self.assertEqual(res.status_int, 200) def test_create_instance_with_admin_pass_v1_0(self): @@ -1274,16 +1315,34 @@ class ServersTest(test.TestCase): self.assertEqual(s['metadata']['seq'], str(i)) def test_get_all_server_details_v1_1(self): + expected_flavor = { + "id": "1", + "links": [ + { + "rel": "bookmark", + "href": 'http://localhost/flavors/1', + }, + ], + } + expected_image = { + "id": "10", + "links": [ + { + "rel": "bookmark", + "href": 'http://localhost/images/10', + }, + ], + } req = webob.Request.blank('/v1.1/servers/detail') res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) for i, s in enumerate(res_dict['servers']): - self.assertEqual(s['id'], i) + self.assertEqual(s['id'], FAKE_UUID) self.assertEqual(s['hostId'], '') self.assertEqual(s['name'], 'server%d' % i) - self.assertEqual(s['imageRef'], 10) - self.assertEqual(s['flavorRef'], 'http://localhost/v1.1/flavors/1') + self.assertEqual(s['image'], expected_image) + self.assertEqual(s['flavor'], expected_flavor) self.assertEqual(s['status'], 'BUILD') self.assertEqual(s['metadata']['seq'], str(i)) -- cgit From c7f8807ab545362c31be91a0f4081c7ef412f1e8 Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Thu, 14 Jul 2011 16:02:52 -0400 Subject: pep8 --- nova/tests/api/openstack/test_servers.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index 279a149d3..6c6e3f042 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -128,7 +128,6 @@ def stub_instance(id, user_id=1, private_address=None, public_addresses=None, metadata = [] metadata.append(InstanceMetadata(key='seq', value=id)) - inst_type = instance_types.get_instance_type_by_flavor_id(int(flavor_id)) if public_addresses is None: @@ -287,11 +286,12 @@ class ServersTest(test.TestCase): 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, + private_address=private, + public_addresses=public, power_state=0, image_ref=image_bookmark, flavor_id=flavor_id, @@ -336,7 +336,7 @@ class ServersTest(test.TestCase): "addr": public[0], }, ], - "private":[ + "private": [ { "version": 4, "addr": private, @@ -369,11 +369,12 @@ class ServersTest(test.TestCase): 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, + private_address=private, + public_addresses=public, power_state=1, image_ref=image_bookmark, flavor_id=flavor_id, @@ -418,7 +419,7 @@ class ServersTest(test.TestCase): "addr": public[0], }, ], - "private":[ + "private": [ { "version": 4, "addr": private, @@ -452,11 +453,12 @@ class ServersTest(test.TestCase): 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, + private_address=private, + public_addresses=public, power_state=1, image_ref=image_ref, flavor_id=flavor_id, @@ -502,7 +504,7 @@ class ServersTest(test.TestCase): "addr": public[0], }, ], - "private":[ + "private": [ { "version": 4, "addr": private, -- cgit From 6cbce0442cf15d31e7ab05b808939bdc3a244f1b Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Thu, 14 Jul 2011 17:35:10 -0400 Subject: Added ServersTestv1_1 test case Changed servers links to use uuid instead of id --- nova/api/openstack/views/servers.py | 4 +- nova/tests/api/openstack/test_servers.py | 129 +++++++++++++++++++++++++++++++ 2 files changed, 131 insertions(+), 2 deletions(-) diff --git a/nova/api/openstack/views/servers.py b/nova/api/openstack/views/servers.py index 9d6699ed0..45209d9e2 100644 --- a/nova/api/openstack/views/servers.py +++ b/nova/api/openstack/views/servers.py @@ -193,8 +193,8 @@ class ViewBuilderV11(ViewBuilder): response['progress'] = 0 def _build_links(self, response, inst): - href = self.generate_href(inst["id"]) - bookmark = self.generate_bookmark(inst["id"]) + href = self.generate_href(inst["uuid"]) + bookmark = self.generate_bookmark(inst["uuid"]) links = [ { diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index 6c6e3f042..01dec3f5f 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -2532,3 +2532,132 @@ class TestGetKernelRamdiskFromImage(test.TestCase): kernel_id, ramdisk_id = create_instance_helper.CreateInstanceHelper. \ _do_get_kernel_ramdisk_from_image(image_meta) return kernel_id, ramdisk_id + + +class ServersTestv1_1(test.TestCase): + + def setUp(self): + super(ServersTestv1_1, self).setUp() + self.stubs = stubout.StubOutForTesting() + + fakes.FakeAuthManager.reset_fake_data() + fakes.FakeAuthDatabase.data = {} + fakes.stub_out_networking(self.stubs) + fakes.stub_out_rate_limiting(self.stubs) + fakes.stub_out_auth(self.stubs) + fakes.stub_out_key_pair_funcs(self.stubs) + fakes.stub_out_image_service(self.stubs) + + self.stubs.Set(nova.db.api, 'instance_get', self._return_server) + + def tearDown(self): + self.stubs.UnsetAll() + super(ServersTestv1_1, self).tearDown() + + def _return_server(self, context, id): + return self._stub_instance_v1_1() + + def _stub_instance_v1_1(self): + instance = { + "id": 1, + "created_at": "2010-10-10T12:00:00Z", + "updated_at": "2010-11-11T11:00:00Z", + "admin_pass": "", + "user_id": "", + "project_id": "", + "image_ref": "5", + "kernel_id": "", + "ramdisk_id": "", + "launch_index": 0, + "key_name": "", + "key_data": "", + "state": 0, + "state_description": "", + "memory_mb": 0, + "vcpus": 0, + "local_gb": 0, + "hostname": "", + "host": "", + "instance_type": { + "flavorid": 1, + }, + "user_data": "", + "reservation_id": "", + "mac_address": "", + "scheduled_at": utils.utcnow(), + "launched_at": utils.utcnow(), + "terminated_at": utils.utcnow(), + "availability_zone": "", + "display_name": "test_server", + "display_description": "", + "locked": False, + "metadata": {}, + #"address": , + #"floating_ips": [{"address":ip} for ip in public_addresses]} + "uuid": "deadbeef-feed-edee-beef-d0ea7beefedd"} + + return instance + + def test_get_server(self): + self.maxDiff = None + instance = self._stub_instance_v1_1() + req = webob.Request.blank('/v1.1/servers/1') + res = req.get_response(fakes.wsgi_app()) + res_dict = json.loads(res.body) + + image_bookmark = "http://localhost/images/5" + flavor_bookmark = "http://localhost/flavors/1" + expected_server = { + "server": { + "id": instance['uuid'], + "updated": "2010-11-11T11:00:00Z", + "created": "2010-10-10T12:00:00Z", + "progress": 0, + "name": "test_server", + "status": "BUILD", + "hostId": '', + #"accessIPv4" : "67.23.10.132", + #"accessIPv6" : "::babe:67.23.10.132", + "image": { + "id": "5", + "links": [ + { + "rel": "bookmark", + "href": image_bookmark, + }, + ], + }, + "flavor": { + "id": "1", + "links": [ + { + "rel": "bookmark", + "href": flavor_bookmark, + }, + ], + }, + "addresses": { + "public": [], + "private": [], + }, + "metadata": {}, + "links": [ + { + "rel": "self", + "href": "http://localhost/v1.1/servers/%s" % + instance['uuid'], + }, + { + "rel": "bookmark", + "href": "http://localhost/servers/%s" % + instance['uuid'], + }, + ], + } + } + + import pprint + pp = pprint.PrettyPrinter() + pp.pprint(res_dict) + pp.pprint(expected_server) + self.assertDictEqual(res_dict, expected_server) -- cgit From 8d0ab9a9e927a82160f668ead2bd4daff481796c Mon Sep 17 00:00:00 2001 From: William Wolf Date: Fri, 15 Jul 2011 09:57:28 -0400 Subject: fix issues with uuid and old tests --- nova/tests/api/openstack/test_servers.py | 44 +++++++++++++++----------------- 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index 01dec3f5f..87f5e8e6b 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -349,17 +349,17 @@ class ServersTest(test.TestCase): "links": [ { "rel": "self", - "href": "http://localhost/v1.1/servers/1", + "href": "http://localhost/v1.1/servers/%s" % (FAKE_UUID), }, { "rel": "bookmark", - "href": "http://localhost/servers/1", + "href": "http://localhost/servers/%s" % (FAKE_UUID), }, ], } } - self.assertDictEqual(res_dict, expected_server) + self.assertDictMatch(res_dict, expected_server) def test_get_server_with_active_status_by_id_v1_1(self): self.maxDiff = None @@ -432,17 +432,17 @@ class ServersTest(test.TestCase): "links": [ { "rel": "self", - "href": "http://localhost/v1.1/servers/1", + "href": "http://localhost/v1.1/servers/%s" % (FAKE_UUID), }, { "rel": "bookmark", - "href": "http://localhost/servers/1", + "href": "http://localhost/servers/%s" % (FAKE_UUID), }, ], } } - self.assertDictEqual(res_dict, expected_server) + self.assertDictMatch(res_dict, expected_server) def test_get_server_with_id_image_ref_by_id_v1_1(self): self.maxDiff = None @@ -517,17 +517,17 @@ class ServersTest(test.TestCase): "links": [ { "rel": "self", - "href": "http://localhost/v1.1/servers/1", + "href": "http://localhost/v1.1/servers/%s" % (FAKE_UUID), }, { "rel": "bookmark", - "href": "http://localhost/servers/1", + "href": "http://localhost/servers/%s" % (FAKE_UUID), }, ], } } - self.assertDictEqual(res_dict, expected_server) + self.assertDictMatch(res_dict, expected_server) def test_get_server_by_id_with_addresses_xml(self): private = "192.168.0.3" @@ -736,17 +736,17 @@ class ServersTest(test.TestCase): self.assertEqual(s.get('image', None), None) expected_links = [ - { - "rel": "self", - "href": "http://localhost/v1.1/servers/%d" % (i,), - }, - { - "rel": "bookmark", - "href": "http://localhost/servers/%d" % (i,), - }, - ] + { + "rel": "self", + "href": "http://localhost/v1.1/servers/%s" % (FAKE_UUID), + }, + { + "rel": "bookmark", + "href": "http://localhost/servers/%s" % (FAKE_UUID), + }, + ] - self.assertEqual(s['links'], expected_links) + self.assertEqual(s['links'], expected_links) def test_get_servers_with_limit(self): req = webob.Request.blank('/v1.0/servers?limit=3') @@ -2656,8 +2656,4 @@ class ServersTestv1_1(test.TestCase): } } - import pprint - pp = pprint.PrettyPrinter() - pp.pprint(res_dict) - pp.pprint(expected_server) - self.assertDictEqual(res_dict, expected_server) + self.assertDictMatch(res_dict, expected_server) -- cgit From a36d93372db8556b70d28cf52644da38c7f9a02f Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Fri, 15 Jul 2011 10:29:06 -0400 Subject: Added ViewBuilderV11 tests Fixed bug with build detail --- nova/api/openstack/views/servers.py | 19 ++++--- nova/tests/api/openstack/test_servers.py | 85 +++++++++++++++++++------------- 2 files changed, 64 insertions(+), 40 deletions(-) diff --git a/nova/api/openstack/views/servers.py b/nova/api/openstack/views/servers.py index 45209d9e2..570488cfa 100644 --- a/nova/api/openstack/views/servers.py +++ b/nova/api/openstack/views/servers.py @@ -140,6 +140,18 @@ class ViewBuilderV11(ViewBuilder): self.image_builder = image_builder self.base_url = base_url + def _build_detail(self, inst): + response = super(ViewBuilderV11, self)._build_detail(inst) + response['server']['created'] = inst['created_at'] + response['server']['updated'] = inst['updated_at'] + if 'status' in response['server']: + if response['server']['status'] == "ACTIVE": + response['server']['progress'] = 100 + elif response['server']['status'] == "BUILD": + response['server']['progress'] = 0 + return response + + def _build_image(self, response, inst): if 'image_ref' in dict(inst): image_href = inst['image_ref'] @@ -184,13 +196,6 @@ class ViewBuilderV11(ViewBuilder): def _build_extra(self, response, inst): self._build_links(response, inst) response['id'] = inst['uuid'] - response['created'] = inst['created_at'] - response['updated'] = inst['updated_at'] - if 'status' in response: - if response['status'] == "ACTIVE": - response['progress'] = 100 - elif response['status'] == "BUILD": - response['progress'] = 0 def _build_links(self, response, inst): href = self.generate_href(inst["uuid"]) diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index 01dec3f5f..70e99daa5 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -32,6 +32,7 @@ from nova import utils import nova.api.openstack from nova.api.openstack import servers from nova.api.openstack import create_instance_helper +from nova.api.openstack import wsgi import nova.compute.api from nova.compute import instance_types from nova.compute import power_state @@ -2534,30 +2535,16 @@ class TestGetKernelRamdiskFromImage(test.TestCase): return kernel_id, ramdisk_id -class ServersTestv1_1(test.TestCase): +class ServersViewBuilderV11Test(test.TestCase): def setUp(self): - super(ServersTestv1_1, self).setUp() - self.stubs = stubout.StubOutForTesting() - - fakes.FakeAuthManager.reset_fake_data() - fakes.FakeAuthDatabase.data = {} - fakes.stub_out_networking(self.stubs) - fakes.stub_out_rate_limiting(self.stubs) - fakes.stub_out_auth(self.stubs) - fakes.stub_out_key_pair_funcs(self.stubs) - fakes.stub_out_image_service(self.stubs) - - self.stubs.Set(nova.db.api, 'instance_get', self._return_server) + self.instance = self._get_instance() + self.view_builder = self._get_view_builder() def tearDown(self): - self.stubs.UnsetAll() - super(ServersTestv1_1, self).tearDown() - - def _return_server(self, context, id): - return self._stub_instance_v1_1() - - def _stub_instance_v1_1(self): + pass + + def _get_instance(self): instance = { "id": 1, "created_at": "2010-10-10T12:00:00Z", @@ -2598,18 +2585,53 @@ class ServersTestv1_1(test.TestCase): return instance - def test_get_server(self): + def _get_view_builder(self): + base_url = "http://localhost/v1.1" + views = nova.api.openstack.views + address_builder = views.addresses.ViewBuilderV11() + flavor_builder = views.flavors.ViewBuilderV11(base_url) + image_builder = views.images.ViewBuilderV11(base_url) + + view_builder = nova.api.openstack.views.servers.ViewBuilderV11( + address_builder, + flavor_builder, + image_builder, + base_url + ) + return view_builder + + def test_build_server(self): self.maxDiff = None - instance = self._stub_instance_v1_1() - req = webob.Request.blank('/v1.1/servers/1') - res = req.get_response(fakes.wsgi_app()) - res_dict = json.loads(res.body) + expected_server = { + "server": { + "id": self.instance['uuid'], + "name": "test_server", + "links": [ + { + "rel": "self", + "href": "http://localhost/v1.1/servers/%s" % + self.instance['uuid'], + }, + { + "rel": "bookmark", + "href": "http://localhost/servers/%s" % + self.instance['uuid'], + }, + ], + } + } + + output = self.view_builder.build(self.instance, False) + print output + self.assertDictEqual(output, expected_server) + def test_build_server_detail(self): + self.maxDiff = None image_bookmark = "http://localhost/images/5" flavor_bookmark = "http://localhost/flavors/1" expected_server = { "server": { - "id": instance['uuid'], + "id": self.instance['uuid'], "updated": "2010-11-11T11:00:00Z", "created": "2010-10-10T12:00:00Z", "progress": 0, @@ -2645,19 +2667,16 @@ class ServersTestv1_1(test.TestCase): { "rel": "self", "href": "http://localhost/v1.1/servers/%s" % - instance['uuid'], + self.instance['uuid'], }, { "rel": "bookmark", "href": "http://localhost/servers/%s" % - instance['uuid'], + self.instance['uuid'], }, ], } } - import pprint - pp = pprint.PrettyPrinter() - pp.pprint(res_dict) - pp.pprint(expected_server) - self.assertDictEqual(res_dict, expected_server) + output = self.view_builder.build(self.instance, True) + self.assertDictEqual(output, expected_server) -- cgit From 70e4516173ed0e3efa5a4a6c88dafe8869530e06 Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Fri, 15 Jul 2011 10:48:09 -0400 Subject: Added more view builder tests --- nova/tests/api/openstack/test_servers.py | 124 ++++++++++++++++++++++++++++++- 1 file changed, 123 insertions(+), 1 deletion(-) diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index 559e4d316..3389b378a 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -2578,7 +2578,7 @@ class ServersViewBuilderV11Test(test.TestCase): "display_name": "test_server", "display_description": "", "locked": False, - "metadata": {}, + "metadata": [], #"address": , #"floating_ips": [{"address":ip} for ip in public_addresses]} "uuid": "deadbeef-feed-edee-beef-d0ea7beefedd"} @@ -2680,3 +2680,125 @@ class ServersViewBuilderV11Test(test.TestCase): output = self.view_builder.build(self.instance, True) self.assertDictEqual(output, expected_server) + + def test_build_server_detail_active_status(self): + #set the power state of the instance to running + self.instance['state'] = 1 + image_bookmark = "http://localhost/images/5" + flavor_bookmark = "http://localhost/flavors/1" + expected_server = { + "server": { + "id": self.instance['uuid'], + "updated": "2010-11-11T11:00:00Z", + "created": "2010-10-10T12:00:00Z", + "progress": 100, + "name": "test_server", + "status": "ACTIVE", + "hostId": '', + #"accessIPv4" : "67.23.10.132", + #"accessIPv6" : "::babe:67.23.10.132", + "image": { + "id": "5", + "links": [ + { + "rel": "bookmark", + "href": image_bookmark, + }, + ], + }, + "flavor": { + "id": "1", + "links": [ + { + "rel": "bookmark", + "href": flavor_bookmark, + }, + ], + }, + "addresses": { + "public": [], + "private": [], + }, + "metadata": {}, + "links": [ + { + "rel": "self", + "href": "http://localhost/v1.1/servers/%s" % + self.instance['uuid'], + }, + { + "rel": "bookmark", + "href": "http://localhost/servers/%s" % + self.instance['uuid'], + }, + ], + } + } + + output = self.view_builder.build(self.instance, True) + self.assertDictEqual(output, expected_server) + + def test_build_server_detail_with_metadata(self): + self.maxDiff = None + + metadata = [] + metadata.append(InstanceMetadata(key="Open", value="Stack")) + metadata.append(InstanceMetadata(key="Number", value=1)) + self.instance['metadata'] = metadata + + image_bookmark = "http://localhost/images/5" + flavor_bookmark = "http://localhost/flavors/1" + expected_server = { + "server": { + "id": self.instance['uuid'], + "updated": "2010-11-11T11:00:00Z", + "created": "2010-10-10T12:00:00Z", + "progress": 0, + "name": "test_server", + "status": "BUILD", + "hostId": '', + #"accessIPv4" : "67.23.10.132", + #"accessIPv6" : "::babe:67.23.10.132", + "image": { + "id": "5", + "links": [ + { + "rel": "bookmark", + "href": image_bookmark, + }, + ], + }, + "flavor": { + "id": "1", + "links": [ + { + "rel": "bookmark", + "href": flavor_bookmark, + }, + ], + }, + "addresses": { + "public": [], + "private": [], + }, + "metadata": { + "Open": "Stack", + "Number": "1", + }, + "links": [ + { + "rel": "self", + "href": "http://localhost/v1.1/servers/%s" % + self.instance['uuid'], + }, + { + "rel": "bookmark", + "href": "http://localhost/servers/%s" % + self.instance['uuid'], + }, + ], + } + } + + output = self.view_builder.build(self.instance, True) + self.assertDictEqual(output, expected_server) -- cgit From 1e7b21452a2e622b94531bea59c68e6abcded40a Mon Sep 17 00:00:00 2001 From: William Wolf Date: Fri, 15 Jul 2011 12:44:40 -0400 Subject: return id and uuid for now --- nova/api/openstack/views/servers.py | 3 ++- nova/tests/api/openstack/test_servers.py | 16 ++++++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/nova/api/openstack/views/servers.py b/nova/api/openstack/views/servers.py index a4c9dd95a..53ded4312 100644 --- a/nova/api/openstack/views/servers.py +++ b/nova/api/openstack/views/servers.py @@ -206,7 +206,8 @@ class ViewBuilderV11(ViewBuilder): def _build_extra(self, response, inst): self._build_links(response, inst) - response['id'] = inst['uuid'] + response['id'] = inst['id'] + response['uuid'] = inst['uuid'] def _build_links(self, response, inst): href = self.generate_href(inst["uuid"]) diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index bca3dad1d..bb650ca62 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -332,7 +332,8 @@ class ServersTest(test.TestCase): res_dict = json.loads(res.body) expected_server = { "server": { - "id": FAKE_UUID, + "id": 1, + "uuid": FAKE_UUID, "updated": "2010-11-11T11:00:00Z", "created": "2010-10-10T12:00:00Z", "progress": 0, @@ -377,6 +378,7 @@ class ServersTest(test.TestCase): "links": [ { "rel": "self", + #FIXME(wwolf) Do we want the links to be id or uuid? "href": "http://localhost/v1.1/servers/%s" % (FAKE_UUID), }, { @@ -421,7 +423,8 @@ class ServersTest(test.TestCase): res_dict = json.loads(res.body) expected_server = { "server": { - "id": FAKE_UUID, + "id": 1, + "uuid": FAKE_UUID, "updated": "2010-11-11T11:00:00Z", "created": "2010-10-10T12:00:00Z", "progress": 100, @@ -515,7 +518,8 @@ class ServersTest(test.TestCase): res_dict = json.loads(res.body) expected_server = { "server": { - "id": FAKE_UUID, + "id": 1, + "uuid": FAKE_UUID, "updated": "2010-11-11T11:00:00Z", "created": "2010-10-10T12:00:00Z", "progress": 100, @@ -712,7 +716,7 @@ class ServersTest(test.TestCase): res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) - self.assertEqual(res_dict['server']['id'], FAKE_UUID) + self.assertEqual(res_dict['server']['id'], 1) self.assertEqual(res_dict['server']['name'], 'server1') addresses = res_dict['server']['addresses'] expected = { @@ -905,7 +909,7 @@ class ServersTest(test.TestCase): res_dict = json.loads(res.body) for i, s in enumerate(res_dict['servers']): - self.assertEqual(s['id'], FAKE_UUID) + self.assertEqual(s['id'], i) self.assertEqual(s['name'], 'server%d' % i) self.assertEqual(s.get('image', None), None) @@ -1516,7 +1520,7 @@ class ServersTest(test.TestCase): res_dict = json.loads(res.body) for i, s in enumerate(res_dict['servers']): - self.assertEqual(s['id'], FAKE_UUID) + self.assertEqual(s['id'], i) self.assertEqual(s['hostId'], '') self.assertEqual(s['name'], 'server%d' % i) self.assertEqual(s['image'], expected_image) -- cgit From 14b5361d975ee017d95c159a9249d7e6dac662d9 Mon Sep 17 00:00:00 2001 From: William Wolf Date: Fri, 15 Jul 2011 13:45:56 -0400 Subject: fix ServersViewBuilderV11Tests --- nova/tests/api/openstack/test_servers.py | 45 +++++++++++--------------------- 1 file changed, 15 insertions(+), 30 deletions(-) diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index bb650ca62..cb2bfc8f4 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -431,8 +431,6 @@ class ServersTest(test.TestCase): "name": "server1", "status": "ACTIVE", "hostId": '', - #"accessIPv4" : "67.23.10.132", - #"accessIPv6" : "::babe:67.23.10.132", "image": { "id" : "10", "links": [ @@ -526,8 +524,6 @@ class ServersTest(test.TestCase): "name": "server1", "status": "ACTIVE", "hostId": '', - #"accessIPv4" : "67.23.10.132", - #"accessIPv6" : "::babe:67.23.10.132", "image": { "id": "10", "links": [ @@ -2783,7 +2779,8 @@ class ServersViewBuilderV11Test(test.TestCase): self.maxDiff = None expected_server = { "server": { - "id": self.instance['uuid'], + "id": 1, + "uuid": self.instance['uuid'], "name": "test_server", "links": [ { @@ -2801,7 +2798,7 @@ class ServersViewBuilderV11Test(test.TestCase): } output = self.view_builder.build(self.instance, False) - self.assertDictEqual(output, expected_server) + self.assertDictMatch(output, expected_server) def test_build_server_detail(self): self.maxDiff = None @@ -2809,15 +2806,14 @@ class ServersViewBuilderV11Test(test.TestCase): flavor_bookmark = "http://localhost/flavors/1" expected_server = { "server": { - "id": self.instance['uuid'], + "id": 1, + "uuid": self.instance['uuid'], "updated": "2010-11-11T11:00:00Z", "created": "2010-10-10T12:00:00Z", "progress": 0, "name": "test_server", "status": "BUILD", "hostId": '', - #"accessIPv4" : "67.23.10.132", - #"accessIPv6" : "::babe:67.23.10.132", "image": { "id": "5", "links": [ @@ -2836,10 +2832,7 @@ class ServersViewBuilderV11Test(test.TestCase): }, ], }, - "addresses": { - "public": [], - "private": [], - }, + "addresses": { }, "metadata": {}, "links": [ { @@ -2857,7 +2850,7 @@ class ServersViewBuilderV11Test(test.TestCase): } output = self.view_builder.build(self.instance, True) - self.assertDictEqual(output, expected_server) + self.assertDictMatch(output, expected_server) def test_build_server_detail_active_status(self): #set the power state of the instance to running @@ -2866,15 +2859,14 @@ class ServersViewBuilderV11Test(test.TestCase): flavor_bookmark = "http://localhost/flavors/1" expected_server = { "server": { - "id": self.instance['uuid'], + "id": 1, + "uuid": self.instance['uuid'], "updated": "2010-11-11T11:00:00Z", "created": "2010-10-10T12:00:00Z", "progress": 100, "name": "test_server", "status": "ACTIVE", "hostId": '', - #"accessIPv4" : "67.23.10.132", - #"accessIPv6" : "::babe:67.23.10.132", "image": { "id": "5", "links": [ @@ -2893,10 +2885,7 @@ class ServersViewBuilderV11Test(test.TestCase): }, ], }, - "addresses": { - "public": [], - "private": [], - }, + "addresses": { }, "metadata": {}, "links": [ { @@ -2914,7 +2903,7 @@ class ServersViewBuilderV11Test(test.TestCase): } output = self.view_builder.build(self.instance, True) - self.assertDictEqual(output, expected_server) + self.assertDictMatch(output, expected_server) def test_build_server_detail_with_metadata(self): self.maxDiff = None @@ -2928,15 +2917,14 @@ class ServersViewBuilderV11Test(test.TestCase): flavor_bookmark = "http://localhost/flavors/1" expected_server = { "server": { - "id": self.instance['uuid'], + "id": 1, + "uuid": self.instance['uuid'], "updated": "2010-11-11T11:00:00Z", "created": "2010-10-10T12:00:00Z", "progress": 0, "name": "test_server", "status": "BUILD", "hostId": '', - #"accessIPv4" : "67.23.10.132", - #"accessIPv6" : "::babe:67.23.10.132", "image": { "id": "5", "links": [ @@ -2955,10 +2943,7 @@ class ServersViewBuilderV11Test(test.TestCase): }, ], }, - "addresses": { - "public": [], - "private": [], - }, + "addresses": { }, "metadata": { "Open": "Stack", "Number": "1", @@ -2979,4 +2964,4 @@ class ServersViewBuilderV11Test(test.TestCase): } output = self.view_builder.build(self.instance, True) - self.assertDictEqual(output, expected_server) + self.assertDictMatch(output, expected_server) -- cgit From 054f828d341b6cc576e30744a39d443af7784fd9 Mon Sep 17 00:00:00 2001 From: William Wolf Date: Fri, 15 Jul 2011 14:05:26 -0400 Subject: pep8 fixes --- nova/api/openstack/views/servers.py | 1 - nova/tests/api/openstack/test_servers.py | 35 ++++++++++++++++---------------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/nova/api/openstack/views/servers.py b/nova/api/openstack/views/servers.py index 53ded4312..a1aba20fc 100644 --- a/nova/api/openstack/views/servers.py +++ b/nova/api/openstack/views/servers.py @@ -158,7 +158,6 @@ class ViewBuilderV11(ViewBuilder): response['server']['progress'] = 0 return response - def _build_image(self, response, inst): if 'image_ref' in dict(inst): image_href = inst['image_ref'] diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index cb2bfc8f4..38c4e6be3 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -143,7 +143,8 @@ 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, image_ref="10", flavor_id="1", interfaces=None): + uuid=FAKE_UUID, image_ref="10", flavor_id="1", + interfaces=None): metadata = [] metadata.append(InstanceMetadata(key='seq', value=id)) @@ -341,7 +342,7 @@ class ServersTest(test.TestCase): "status": "BUILD", "hostId": '', "image": { - "id":"10", + "id": "10", "links": [ { "rel": "bookmark", @@ -379,11 +380,11 @@ class ServersTest(test.TestCase): { "rel": "self", #FIXME(wwolf) Do we want the links to be id or uuid? - "href": "http://localhost/v1.1/servers/%s" % (FAKE_UUID), + "href": "http://localhost/v1.1/servers/%s" % FAKE_UUID, }, { "rel": "bookmark", - "href": "http://localhost/servers/%s" % (FAKE_UUID), + "href": "http://localhost/servers/%s" % FAKE_UUID, }, ], } @@ -432,7 +433,7 @@ class ServersTest(test.TestCase): "status": "ACTIVE", "hostId": '', "image": { - "id" : "10", + "id": "10", "links": [ { "rel": "bookmark", @@ -469,11 +470,11 @@ class ServersTest(test.TestCase): "links": [ { "rel": "self", - "href": "http://localhost/v1.1/servers/%s" % (FAKE_UUID), + "href": "http://localhost/v1.1/servers/%s" % FAKE_UUID, }, { "rel": "bookmark", - "href": "http://localhost/servers/%s" % (FAKE_UUID), + "href": "http://localhost/servers/%s" % FAKE_UUID, }, ], } @@ -562,11 +563,11 @@ class ServersTest(test.TestCase): "links": [ { "rel": "self", - "href": "http://localhost/v1.1/servers/%s" % (FAKE_UUID), + "href": "http://localhost/v1.1/servers/%s" % FAKE_UUID, }, { "rel": "bookmark", - "href": "http://localhost/servers/%s" % (FAKE_UUID), + "href": "http://localhost/servers/%s" % FAKE_UUID, }, ], } @@ -912,11 +913,11 @@ class ServersTest(test.TestCase): expected_links = [ { "rel": "self", - "href": "http://localhost/v1.1/servers/%s" % (FAKE_UUID), + "href": "http://localhost/v1.1/servers/%s" % FAKE_UUID, }, { "rel": "bookmark", - "href": "http://localhost/servers/%s" % (FAKE_UUID), + "href": "http://localhost/servers/%s" % FAKE_UUID, }, ] @@ -2718,7 +2719,7 @@ class ServersViewBuilderV11Test(test.TestCase): def tearDown(self): pass - + def _get_instance(self): instance = { "id": 1, @@ -2741,7 +2742,7 @@ class ServersViewBuilderV11Test(test.TestCase): "hostname": "", "host": "", "instance_type": { - "flavorid": 1, + "flavorid": 1, }, "user_data": "", "reservation_id": "", @@ -2757,7 +2758,7 @@ class ServersViewBuilderV11Test(test.TestCase): #"address": , #"floating_ips": [{"address":ip} for ip in public_addresses]} "uuid": "deadbeef-feed-edee-beef-d0ea7beefedd"} - + return instance def _get_view_builder(self): @@ -2832,7 +2833,7 @@ class ServersViewBuilderV11Test(test.TestCase): }, ], }, - "addresses": { }, + "addresses": {}, "metadata": {}, "links": [ { @@ -2885,7 +2886,7 @@ class ServersViewBuilderV11Test(test.TestCase): }, ], }, - "addresses": { }, + "addresses": {}, "metadata": {}, "links": [ { @@ -2943,7 +2944,7 @@ class ServersViewBuilderV11Test(test.TestCase): }, ], }, - "addresses": { }, + "addresses": {}, "metadata": { "Open": "Stack", "Number": "1", -- cgit From 1c6837c7940ed979a05a063595f4d7e7a2154ee9 Mon Sep 17 00:00:00 2001 From: William Wolf Date: Fri, 15 Jul 2011 14:43:33 -0400 Subject: use id in links instead of uuid --- nova/api/openstack/views/servers.py | 4 ++-- nova/tests/api/openstack/test_servers.py | 40 +++++++++++++------------------- 2 files changed, 18 insertions(+), 26 deletions(-) diff --git a/nova/api/openstack/views/servers.py b/nova/api/openstack/views/servers.py index a1aba20fc..71d685171 100644 --- a/nova/api/openstack/views/servers.py +++ b/nova/api/openstack/views/servers.py @@ -209,8 +209,8 @@ class ViewBuilderV11(ViewBuilder): response['uuid'] = inst['uuid'] def _build_links(self, response, inst): - href = self.generate_href(inst["uuid"]) - bookmark = self.generate_bookmark(inst["uuid"]) + href = self.generate_href(inst["id"]) + bookmark = self.generate_bookmark(inst["id"]) links = [ { diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index 38c4e6be3..ee5ebc948 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -380,11 +380,11 @@ class ServersTest(test.TestCase): { "rel": "self", #FIXME(wwolf) Do we want the links to be id or uuid? - "href": "http://localhost/v1.1/servers/%s" % FAKE_UUID, + "href": "http://localhost/v1.1/servers/1", }, { "rel": "bookmark", - "href": "http://localhost/servers/%s" % FAKE_UUID, + "href": "http://localhost/servers/1", }, ], } @@ -470,11 +470,11 @@ class ServersTest(test.TestCase): "links": [ { "rel": "self", - "href": "http://localhost/v1.1/servers/%s" % FAKE_UUID, + "href": "http://localhost/v1.1/servers/1", }, { "rel": "bookmark", - "href": "http://localhost/servers/%s" % FAKE_UUID, + "href": "http://localhost/servers/1", }, ], } @@ -563,11 +563,11 @@ class ServersTest(test.TestCase): "links": [ { "rel": "self", - "href": "http://localhost/v1.1/servers/%s" % FAKE_UUID, + "href": "http://localhost/v1.1/servers/1", }, { "rel": "bookmark", - "href": "http://localhost/servers/%s" % FAKE_UUID, + "href": "http://localhost/servers/1", }, ], } @@ -913,11 +913,11 @@ class ServersTest(test.TestCase): expected_links = [ { "rel": "self", - "href": "http://localhost/v1.1/servers/%s" % FAKE_UUID, + "href": "http://localhost/v1.1/servers/%s" % s['id'], }, { "rel": "bookmark", - "href": "http://localhost/servers/%s" % FAKE_UUID, + "href": "http://localhost/servers/%s" % s['id'], }, ] @@ -2786,13 +2786,11 @@ class ServersViewBuilderV11Test(test.TestCase): "links": [ { "rel": "self", - "href": "http://localhost/v1.1/servers/%s" % - self.instance['uuid'], + "href": "http://localhost/v1.1/servers/1", }, { "rel": "bookmark", - "href": "http://localhost/servers/%s" % - self.instance['uuid'], + "href": "http://localhost/servers/1", }, ], } @@ -2838,13 +2836,11 @@ class ServersViewBuilderV11Test(test.TestCase): "links": [ { "rel": "self", - "href": "http://localhost/v1.1/servers/%s" % - self.instance['uuid'], + "href": "http://localhost/v1.1/servers/1", }, { "rel": "bookmark", - "href": "http://localhost/servers/%s" % - self.instance['uuid'], + "href": "http://localhost/servers/1", }, ], } @@ -2891,13 +2887,11 @@ class ServersViewBuilderV11Test(test.TestCase): "links": [ { "rel": "self", - "href": "http://localhost/v1.1/servers/%s" % - self.instance['uuid'], + "href": "http://localhost/v1.1/servers/1", }, { "rel": "bookmark", - "href": "http://localhost/servers/%s" % - self.instance['uuid'], + "href": "http://localhost/servers/1", }, ], } @@ -2952,13 +2946,11 @@ class ServersViewBuilderV11Test(test.TestCase): "links": [ { "rel": "self", - "href": "http://localhost/v1.1/servers/%s" % - self.instance['uuid'], + "href": "http://localhost/v1.1/servers/1", }, { "rel": "bookmark", - "href": "http://localhost/servers/%s" % - self.instance['uuid'], + "href": "http://localhost/servers/1", }, ], } -- cgit From 63d9a592823cdb2e120514137a1d71d838b336d7 Mon Sep 17 00:00:00 2001 From: William Wolf Date: Fri, 15 Jul 2011 15:08:31 -0400 Subject: stop using get_uuid_from_href for now --- nova/api/openstack/views/servers.py | 36 ++++++++++++-------------------- nova/tests/api/openstack/test_servers.py | 1 + 2 files changed, 14 insertions(+), 23 deletions(-) diff --git a/nova/api/openstack/views/servers.py b/nova/api/openstack/views/servers.py index 71d685171..a9db8357e 100644 --- a/nova/api/openstack/views/servers.py +++ b/nova/api/openstack/views/servers.py @@ -161,28 +161,18 @@ class ViewBuilderV11(ViewBuilder): def _build_image(self, response, inst): if 'image_ref' in dict(inst): image_href = inst['image_ref'] - #if id is a uuid do: - if image_href == common.get_uuid_from_href(image_href): - image_id = image_href - _bookmark = self.image_builder.generate_bookmark(image_href) - response['image'] = { - "id": image_id, - "links": [ - { - "rel": "bookmark", - "href": _bookmark, - }, - ] - } - else: - response['image'] = { - "links": [ - { - "rel": "bookmark", - "href": image_href, - }, - ] - } + image_id = str(common.get_id_from_href(image_href)) + print "IMAGE ID:", image_id + _bookmark = self.image_builder.generate_bookmark(image_id) + response['image'] = { + "id": image_id, + "links": [ + { + "rel": "bookmark", + "href": _bookmark, + }, + ] + } def _build_flavor(self, response, inst): if "instance_type" in dict(inst): @@ -190,7 +180,7 @@ class ViewBuilderV11(ViewBuilder): flavor_ref = self.flavor_builder.generate_href(flavor_id) flavor_bookmark = self.flavor_builder.generate_bookmark(flavor_id) response["flavor"] = { - "id": common.get_uuid_from_href(flavor_ref), + "id": str(common.get_id_from_href(flavor_ref)), "links": [ { "rel": "bookmark", diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index ee5ebc948..f0f6c045f 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -1193,6 +1193,7 @@ class ServersTest(test.TestCase): ], } expected_image = { + "id": "2", "links": [ { "rel": "bookmark", -- cgit From 1e16da70134537ae53d0c79214e70f0f06b14dd2 Mon Sep 17 00:00:00 2001 From: William Wolf Date: Fri, 15 Jul 2011 15:10:15 -0400 Subject: remove get_uuid_from_href and tests --- nova/api/openstack/common.py | 23 ----------------------- nova/api/openstack/views/servers.py | 1 - nova/tests/api/openstack/test_common.py | 12 ------------ 3 files changed, 36 deletions(-) diff --git a/nova/api/openstack/common.py b/nova/api/openstack/common.py index e7aa7d693..8e12ce0c0 100644 --- a/nova/api/openstack/common.py +++ b/nova/api/openstack/common.py @@ -136,29 +136,6 @@ 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 first api version from the href. diff --git a/nova/api/openstack/views/servers.py b/nova/api/openstack/views/servers.py index a9db8357e..6d6ebbafd 100644 --- a/nova/api/openstack/views/servers.py +++ b/nova/api/openstack/views/servers.py @@ -195,7 +195,6 @@ class ViewBuilderV11(ViewBuilder): def _build_extra(self, response, inst): self._build_links(response, inst) - response['id'] = inst['id'] response['uuid'] = inst['uuid'] def _build_links(self, response, inst): diff --git a/nova/tests/api/openstack/test_common.py b/nova/tests/api/openstack/test_common.py index 7a5beb006..4c4d03995 100644 --- a/nova/tests/api/openstack/test_common.py +++ b/nova/tests/api/openstack/test_common.py @@ -247,15 +247,3 @@ 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) -- cgit From 86ff6760b33671bd8bd9ddf808c7252f434d0931 Mon Sep 17 00:00:00 2001 From: William Wolf Date: Fri, 15 Jul 2011 15:14:58 -0400 Subject: put maxDiff in setUp --- nova/tests/api/openstack/test_servers.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index f0f6c045f..c0ccb3ef2 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -227,6 +227,7 @@ class MockSetAdminPassword(object): class ServersTest(test.TestCase): def setUp(self): + self.maxDiff = None super(ServersTest, self).setUp() self.stubs = stubout.StubOutForTesting() fakes.FakeAuthManager.reset_fake_data() @@ -303,7 +304,6 @@ class ServersTest(test.TestCase): self.assertEqual(res_dict['server']['name'], 'server1') def test_get_server_by_id_v1_1(self): - self.maxDiff = None image_bookmark = "http://localhost/images/10" flavor_ref = "http://localhost/v1.1/flavors/1" flavor_id = "1" @@ -393,7 +393,6 @@ class ServersTest(test.TestCase): self.assertDictMatch(res_dict, expected_server) def test_get_server_with_active_status_by_id_v1_1(self): - self.maxDiff = None image_bookmark = "http://localhost/images/10" flavor_ref = "http://localhost/v1.1/flavors/1" flavor_id = "1" @@ -483,7 +482,6 @@ class ServersTest(test.TestCase): self.assertDictMatch(res_dict, expected_server) def test_get_server_with_id_image_ref_by_id_v1_1(self): - self.maxDiff = None image_ref = "10" image_bookmark = "http://localhost/images/10" flavor_ref = "http://localhost/v1.1/flavors/1" @@ -2778,7 +2776,6 @@ class ServersViewBuilderV11Test(test.TestCase): return view_builder def test_build_server(self): - self.maxDiff = None expected_server = { "server": { "id": 1, @@ -2801,7 +2798,6 @@ class ServersViewBuilderV11Test(test.TestCase): self.assertDictMatch(output, expected_server) def test_build_server_detail(self): - self.maxDiff = None image_bookmark = "http://localhost/images/5" flavor_bookmark = "http://localhost/flavors/1" expected_server = { @@ -2902,7 +2898,6 @@ class ServersViewBuilderV11Test(test.TestCase): self.assertDictMatch(output, expected_server) def test_build_server_detail_with_metadata(self): - self.maxDiff = None metadata = [] metadata.append(InstanceMetadata(key="Open", value="Stack")) -- cgit From 910dd2124123d8e1989ce85d57bcc2a245e39683 Mon Sep 17 00:00:00 2001 From: William Wolf Date: Fri, 15 Jul 2011 16:04:41 -0400 Subject: take out print statements --- nova/api/openstack/views/servers.py | 1 - 1 file changed, 1 deletion(-) diff --git a/nova/api/openstack/views/servers.py b/nova/api/openstack/views/servers.py index 6d6ebbafd..817e6ddfc 100644 --- a/nova/api/openstack/views/servers.py +++ b/nova/api/openstack/views/servers.py @@ -162,7 +162,6 @@ class ViewBuilderV11(ViewBuilder): if 'image_ref' in dict(inst): image_href = inst['image_ref'] image_id = str(common.get_id_from_href(image_href)) - print "IMAGE ID:", image_id _bookmark = self.image_builder.generate_bookmark(image_id) response['image'] = { "id": image_id, -- cgit From ae7bd07b67b8d7feedbe01a62ebabca217473f13 Mon Sep 17 00:00:00 2001 From: William Wolf Date: Fri, 15 Jul 2011 16:37:20 -0400 Subject: got rid of return_server_with_interfaces and added return_server_with_attributes --- nova/tests/api/openstack/test_servers.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index c0ccb3ef2..eee0cbba0 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -78,16 +78,16 @@ def return_virtual_interface_instance_nonexistant(interfaces): return _return_virtual_interface_by_instance -def return_server_with_addresses(private, public): +def return_server_with_attributes(**kwargs): def _return_server(context, id): - return stub_instance(id, private_address=private, - public_addresses=public) + return stub_instance(id, **kwargs) return _return_server -def return_server_with_interfaces(interfaces, **kwargs): +def return_server_with_addresses(private, public): def _return_server(context, id): - return stub_instance(id, interfaces=interfaces, **kwargs) + return stub_instance(id, private_address=private, + public_addresses=public) return _return_server @@ -325,7 +325,7 @@ class ServersTest(test.TestCase): ], }, ] - new_return_server = return_server_with_interfaces(interfaces) + new_return_server = return_server_with_attributes(interfaces=interfaces) self.stubs.Set(nova.db.api, 'instance_get', new_return_server) req = webob.Request.blank('/v1.1/servers/1') @@ -414,7 +414,7 @@ class ServersTest(test.TestCase): ], }, ] - new_return_server = return_server_with_interfaces(interfaces, + new_return_server = return_server_with_attributes(interfaces=interfaces, power_state=1) self.stubs.Set(nova.db.api, 'instance_get', new_return_server) @@ -504,7 +504,7 @@ class ServersTest(test.TestCase): ], }, ] - new_return_server = return_server_with_interfaces(interfaces, + new_return_server = return_server_with_attributes(interfaces=interfaces, power_state=1, image_ref=image_ref, flavor_id=flavor_id) @@ -704,7 +704,7 @@ class ServersTest(test.TestCase): ], }, ] - new_return_server = return_server_with_interfaces(interfaces) + new_return_server = return_server_with_attributes(interfaces=interfaces) self.stubs.Set(nova.db.api, 'instance_get', new_return_server) req = webob.Request.blank('/v1.1/servers/1') -- cgit From 4b4bebad3b44e7b55e55a005a3629aebf50ecfa2 Mon Sep 17 00:00:00 2001 From: Dan Prince Date: Tue, 19 Jul 2011 15:51:45 -0400 Subject: Updates to the compute API and manager so that rebuild, reboot, snapshots, and password resets work with the most recent versions of novaclient. --- nova/api/openstack/servers.py | 4 ++-- nova/compute/api.py | 6 ++++++ nova/compute/manager.py | 5 ++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py index 93f8e832c..e16221fd8 100644 --- a/nova/api/openstack/servers.py +++ b/nova/api/openstack/servers.py @@ -454,7 +454,7 @@ class ControllerV10(Controller): def _action_rebuild(self, info, request, instance_id): context = request.environ['nova.context'] - instance_id = int(instance_id) + instance_id = instance_id try: image_id = info["rebuild"]["imageId"] @@ -569,7 +569,7 @@ class ControllerV11(Controller): def _action_rebuild(self, info, request, instance_id): context = request.environ['nova.context'] - instance_id = int(instance_id) + instance_id = instance_id try: image_href = info["rebuild"]["imageRef"] diff --git a/nova/compute/api.py b/nova/compute/api.py index acafc7760..b13bd5013 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -561,6 +561,7 @@ class API(base.Base): self.db.queue_get_for(context, FLAGS.compute_topic, host), {'method': 'refresh_provider_fw_rules', 'args': {}}) + @scheduler_api.reroute_compute("update") def update(self, context, instance_id, **kwargs): """Updates the instance in the datastore. @@ -776,6 +777,7 @@ class API(base.Base): raise exception.Error(_("Unable to find host for Instance %s") % instance_id) + @scheduler_api.reroute_compute("backup") def backup(self, context, instance_id, name, backup_type, rotation, extra_properties=None): """Backup the given instance @@ -792,6 +794,7 @@ class API(base.Base): extra_properties=extra_properties) return recv_meta + @scheduler_api.reroute_compute("snapshot") def snapshot(self, context, instance_id, name, extra_properties=None): """Snapshot the given instance. @@ -834,10 +837,12 @@ class API(base.Base): params=params) return recv_meta + @scheduler_api.reroute_compute("reboot") def reboot(self, context, instance_id): """Reboot the given instance.""" self._cast_compute_message('reboot_instance', context, instance_id) + @scheduler_api.reroute_compute("rebuild") def rebuild(self, context, instance_id, image_href, name=None, metadata=None, files_to_inject=None): """Rebuild the given instance with the provided metadata.""" @@ -1012,6 +1017,7 @@ class API(base.Base): """Unrescue the given instance.""" self._cast_compute_message('unrescue_instance', context, instance_id) + @scheduler_api.reroute_compute("set_admin_password") def set_admin_password(self, context, instance_id, password=None): """Set the root/admin password for the given instance.""" host = self._find_host(context, instance_id) diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 47becdcc6..04609d7c5 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -415,7 +415,10 @@ class ComputeManager(manager.SchedulerDependentManager): image_ref = kwargs.get('image_ref') instance_ref.image_ref = image_ref instance_ref.injected_files = kwargs.get('injected_files', []) - self.driver.spawn(instance_ref) + network_info = self.network_api.get_instance_nw_info(context, + instance_ref) + bd_mapping = self._setup_block_device_mapping(context, instance_id) + self.driver.spawn(instance_ref, network_info, bd_mapping) self._update_image_ref(context, instance_id, image_ref) self._update_launched_at(context, instance_id) -- cgit From 1ba04869623a0152a487a50e25bfce0ee6a65f53 Mon Sep 17 00:00:00 2001 From: Dan Prince Date: Wed, 20 Jul 2011 10:30:03 -0400 Subject: Ya! Apparently sleep helps me fix failing tests. --- nova/api/openstack/servers.py | 4 ++-- nova/tests/api/openstack/test_servers.py | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py index e16221fd8..1e09b6ea0 100644 --- a/nova/api/openstack/servers.py +++ b/nova/api/openstack/servers.py @@ -466,7 +466,7 @@ class ControllerV10(Controller): try: self.compute_api.rebuild(context, instance_id, image_id) except exception.BuildInProgress: - msg = _("Instance %d is currently being rebuilt.") % instance_id + msg = _("Instance %s is currently being rebuilt.") % instance_id LOG.debug(msg) return faults.Fault(exc.HTTPConflict(explanation=msg)) @@ -590,7 +590,7 @@ class ControllerV11(Controller): self.compute_api.rebuild(context, instance_id, image_href, name, metadata, personalities) except exception.BuildInProgress: - msg = _("Instance %d is currently being rebuilt.") % instance_id + msg = _("Instance %s is currently being rebuilt.") % instance_id LOG.debug(msg) return faults.Fault(exc.HTTPConflict(explanation=msg)) diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index 1577c922b..7b048507e 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -96,6 +96,12 @@ def return_server_with_power_state(power_state): return _return_server +def return_server_with_uuid_and_power_state(power_state): + def _return_server(context, id): + return stub_instance(id, uuid=FAKE_UUID, power_state=power_state) + return _return_server + + def return_servers(context, user_id=1): return [stub_instance(i, user_id) for i in xrange(5)] @@ -1440,6 +1446,8 @@ class ServersTest(test.TestCase): state = power_state.BUILDING new_return_server = return_server_with_power_state(state) self.stubs.Set(nova.db.api, 'instance_get', new_return_server) + self.stubs.Set(nova.db, 'instance_get_by_uuid', + return_server_with_uuid_and_power_state(state)) req = webob.Request.blank('/v1.0/servers/1/action') req.method = 'POST' @@ -1488,6 +1496,8 @@ class ServersTest(test.TestCase): state = power_state.BUILDING new_return_server = return_server_with_power_state(state) self.stubs.Set(nova.db.api, 'instance_get', new_return_server) + self.stubs.Set(nova.db, 'instance_get_by_uuid', + return_server_with_uuid_and_power_state(state)) req = webob.Request.blank('/v1.1/servers/1/action') req.method = 'POST' -- cgit From 97503418bea47ca38d2181e5dc5fa710d6e15df3 Mon Sep 17 00:00:00 2001 From: Yoshiaki Tamura Date: Thu, 21 Jul 2011 21:44:12 +0900 Subject: Add OpenStack API support for block_device_mapping. This patch enables boot from volume feature already implemented in EC2 API, as an OpenStack API extension. --- nova/api/openstack/contrib/volumes.py | 53 +++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/nova/api/openstack/contrib/volumes.py b/nova/api/openstack/contrib/volumes.py index e5e2c5b50..43e6a8cd9 100644 --- a/nova/api/openstack/contrib/volumes.py +++ b/nova/api/openstack/contrib/volumes.py @@ -21,10 +21,12 @@ from nova import compute from nova import exception from nova import flags from nova import log as logging +from nova import quota from nova import volume from nova.api.openstack import common from nova.api.openstack import extensions from nova.api.openstack import faults +from nova.api.openstack import servers LOG = logging.getLogger("nova.api.volumes") @@ -296,6 +298,53 @@ class VolumeAttachmentController(object): return {'volumeAttachments': res} +class BootFromVolumeController(servers.ControllerV11): + """The boot from volume API controller for the Openstack API.""" + + def _create_instance(self, context, instance_type, image_href, **kwargs): + try: + return self.compute_api.create(context, instance_type, + image_href, **kwargs) + except quota.QuotaError as error: + self.helper._handle_quota_error(error) + except exception.ImageNotFound as error: + msg = _("Can not find requested image") + raise faults.Fault(exc.HTTPBadRequest(explanation=msg)) + + def create(self, req, body): + """ Creates a new server for a given user """ + extra_values = None + try: + + def get_kwargs(context, instance_type, image_href, **kwargs): + kwargs['context'] = context + kwargs['instance_type'] = instance_type + kwargs['image_href'] = image_href + return kwargs + + extra_values, kwargs = self.helper.create_instance(req, body, + get_kwargs) + + block_device_mapping = body['server'].get('block_device_mapping') + kwargs['block_device_mapping'] = block_device_mapping + + instances = self._create_instance(**kwargs) + except faults.Fault, f: + return f + + # We can only return 1 instance via the API, if we happen to + # build more than one... instances is a list, so we'll just + # use the first one.. + inst = instances[0] + for key in ['instance_type', 'image_ref']: + inst[key] = extra_values[key] + + builder = self._get_view_builder(req) + server = builder.build(inst, is_detail=True) + server['server']['adminPass'] = extra_values['password'] + return server + + class Volumes(extensions.ExtensionDescriptor): def get_name(self): return "Volumes" @@ -329,4 +378,8 @@ class Volumes(extensions.ExtensionDescriptor): collection_name='servers')) resources.append(res) + res = extensions.ResourceExtension('os-volumes_boot', + BootFromVolumeController()) + resources.append(res) + return resources -- cgit From 8501cc95aa60a0a5759cf911e8adaf624fa9e547 Mon Sep 17 00:00:00 2001 From: Brian Waldon Date: Mon, 25 Jul 2011 12:02:26 -0400 Subject: removing unnecessary assignments --- nova/api/openstack/servers.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py index 1e09b6ea0..131937422 100644 --- a/nova/api/openstack/servers.py +++ b/nova/api/openstack/servers.py @@ -454,7 +454,6 @@ class ControllerV10(Controller): def _action_rebuild(self, info, request, instance_id): context = request.environ['nova.context'] - instance_id = instance_id try: image_id = info["rebuild"]["imageId"] @@ -569,7 +568,6 @@ class ControllerV11(Controller): def _action_rebuild(self, info, request, instance_id): context = request.environ['nova.context'] - instance_id = instance_id try: image_href = info["rebuild"]["imageRef"] -- cgit From 22d9e52eaebb6c6c870c4eaf73da5fd42dadefa9 Mon Sep 17 00:00:00 2001 From: Kevin Bringard Date: Mon, 25 Jul 2011 10:10:27 -0600 Subject: Floating IP DB tests --- nova/tests/test_db_api.py | 86 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 nova/tests/test_db_api.py diff --git a/nova/tests/test_db_api.py b/nova/tests/test_db_api.py new file mode 100644 index 000000000..107fd03e3 --- /dev/null +++ b/nova/tests/test_db_api.py @@ -0,0 +1,86 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""Unit tests for the DB API""" + +from nova import test +from nova import context +from nova import db +from nova import flags +from nova.auth import manager + +FLAGS = flags.FLAGS + + +def _setup_networking(instance_id, ip='1.2.3.4', flo_addr='1.2.1.2'): + ctxt = context.get_admin_context() + network_ref = db.project_get_networks(ctxt, + 'fake', + associate=True)[0] + vif = {'address': '56:12:12:12:12:12', + 'network_id': network_ref['id'], + 'instance_id': instance_id} + vif_ref = db.virtual_interface_create(ctxt, vif) + + fixed_ip = {'address': ip, + 'network_id': network_ref['id'], + 'virtual_interface_id': vif_ref['id'], + 'allocated': True, + 'instance_id': instance_id} + db.fixed_ip_create(ctxt, fixed_ip) + fix_ref = db.fixed_ip_get_by_address(ctxt, ip) + db.floating_ip_create(ctxt, {'address': flo_addr, + 'fixed_ip_id': fix_ref.id}) + + +class DbApiTestCase(test.TestCase): + def setUp(self): + super(DbApiTestCase, self).setUp() + self.manager = manager.AuthManager() + self.user = self.manager.create_user('admin', 'admin', 'admin', True) + self.project = self.manager.create_project('proj', 'admin', 'proj') + self.context = context.RequestContext(user=self.user, + project=self.project) + + def tearDown(self): + self.manager.delete_project(self.project) + self.manager.delete_user(self.user) + super(DbApiTestCase, self).tearDown() + + def test_instance_get_project_vpn(self): + result = db.fixed_ip_get_all(self.context) + values = {'instance_type_id': FLAGS.default_instance_type, + 'image_ref': FLAGS.vpn_image_id, + 'project_id': self.project.id + } + instance = db.instance_create(self.context, values) + result = db.instance_get_project_vpn(self.context, self.project.id) + self.assertEqual(instance.id, result.id) + + def test_instance_get_project_vpn_joins(self): + result = db.fixed_ip_get_all(self.context) + values = {'instance_type_id': FLAGS.default_instance_type, + 'image_ref': FLAGS.vpn_image_id, + 'project_id': self.project.id + } + instance = db.instance_create(self.context, values) + _setup_networking(instance.id) + result = db.instance_get_project_vpn(self.context, self.project.id) + self.assertEqual(instance.id, result.id) + self.assertEqual(result['fixed_ips'][0]['floating_ips'][0].address, + '1.2.1.2') -- cgit From bdc31739b24fbcb07d05f413c2ba6554046a6b0e Mon Sep 17 00:00:00 2001 From: William Wolf Date: Tue, 26 Jul 2011 09:25:34 -0400 Subject: fix issue with failing test --- nova/tests/api/openstack/test_servers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index 54d86e0bb..31045e454 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -706,7 +706,7 @@ class ServersTest(test.TestCase): 'fixed_ipv6': '2001:4860::12', }, ] - new_return_server = return_server_with_interfaces(interfaces) + new_return_server = return_server_with_attributes(interfaces=interfaces) self.stubs.Set(nova.db.api, 'instance_get', new_return_server) req = webob.Request.blank('/v1.1/servers/1') -- cgit From ff5aa1a167459b922cc8195c1e6e1368a442610d Mon Sep 17 00:00:00 2001 From: William Wolf Date: Tue, 26 Jul 2011 09:29:50 -0400 Subject: fix pep8 issues --- nova/tests/api/openstack/test_servers.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index 31045e454..fa7fbab20 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -325,7 +325,8 @@ class ServersTest(test.TestCase): ], }, ] - new_return_server = return_server_with_attributes(interfaces=interfaces) + new_return_server = return_server_with_attributes( + interfaces=interfaces) self.stubs.Set(nova.db.api, 'instance_get', new_return_server) req = webob.Request.blank('/v1.1/servers/1') @@ -414,8 +415,8 @@ class ServersTest(test.TestCase): ], }, ] - new_return_server = return_server_with_attributes(interfaces=interfaces, - power_state=1) + new_return_server = return_server_with_attributes( + interfaces=interfaces, power_state=1) self.stubs.Set(nova.db.api, 'instance_get', new_return_server) req = webob.Request.blank('/v1.1/servers/1') @@ -504,10 +505,9 @@ class ServersTest(test.TestCase): ], }, ] - new_return_server = return_server_with_attributes(interfaces=interfaces, - power_state=1, - image_ref=image_ref, - flavor_id=flavor_id) + new_return_server = return_server_with_attributes( + interfaces=interfaces, power_state=1, image_ref=image_ref, + flavor_id=flavor_id) self.stubs.Set(nova.db.api, 'instance_get', new_return_server) req = webob.Request.blank('/v1.1/servers/1') @@ -706,7 +706,8 @@ class ServersTest(test.TestCase): 'fixed_ipv6': '2001:4860::12', }, ] - new_return_server = return_server_with_attributes(interfaces=interfaces) + new_return_server = return_server_with_attributes( + interfaces=interfaces) self.stubs.Set(nova.db.api, 'instance_get', new_return_server) req = webob.Request.blank('/v1.1/servers/1') @@ -749,7 +750,8 @@ class ServersTest(test.TestCase): 'fixed_ipv6': '2001:4860::12', }, ] - new_return_server = return_server_with_attributes(interfaces=interfaces) + new_return_server = return_server_with_attributes( + interfaces=interfaces) self.stubs.Set(nova.db.api, 'instance_get', new_return_server) req = webob.Request.blank('/v1.1/servers/1') -- cgit From 79c06e6f9597a83ec172451eb2622927f5b9accd Mon Sep 17 00:00:00 2001 From: Trey Morris Date: Tue, 26 Jul 2011 14:42:56 -0500 Subject: passing host from the compute manager for add_fixed_ip_to_instance() --- nova/compute/manager.py | 2 +- nova/network/api.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/nova/compute/manager.py b/nova/compute/manager.py index c79abd696..173469bc3 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -871,7 +871,7 @@ class ComputeManager(manager.SchedulerDependentManager): """ self.network_api.add_fixed_ip_to_instance(context, instance_id, - network_id) + self.host, network_id) self.inject_network_info(context, instance_id) self.reset_network(context, instance_id) diff --git a/nova/network/api.py b/nova/network/api.py index 33a9fe239..247768722 100644 --- a/nova/network/api.py +++ b/nova/network/api.py @@ -164,9 +164,10 @@ class API(base.Base): {'method': 'deallocate_for_instance', 'args': args}) - def add_fixed_ip_to_instance(self, context, instance_id, network_id): + def add_fixed_ip_to_instance(self, context, instance_id, host, network_id): """Adds a fixed ip to instance from specified network.""" args = {'instance_id': instance_id, + 'host': host, 'network_id': network_id} rpc.cast(context, FLAGS.network_topic, {'method': 'add_fixed_ip_to_instance', -- cgit From e4e9d7550c2eb29c5d8fed3af0b9112976d262de Mon Sep 17 00:00:00 2001 From: Vishvananda Ishaya Date: Tue, 26 Jul 2011 20:44:29 +0000 Subject: Update security gropu rules to properly support new format and boto 2.0 --- nova/api/ec2/cloud.py | 53 +++++++++++++++++++++++++++++++----------------- nova/tests/test_api.py | 8 +++++++- nova/tests/test_cloud.py | 19 ++++++++++++++++- 3 files changed, 59 insertions(+), 21 deletions(-) diff --git a/nova/api/ec2/cloud.py b/nova/api/ec2/cloud.py index 10720a804..4b8c4cf80 100644 --- a/nova/api/ec2/cloud.py +++ b/nova/api/ec2/cloud.py @@ -539,15 +539,20 @@ class CloudController(object): return rules if 'ip_ranges' in kwargs: rules = self._cidr_args_split(kwargs) + else: + rules = [kwargs] finalset = [] for rule in rules: if 'groups' in rule: groups_values = self._groups_args_split(rule) for groups_value in groups_values: - finalset.append(groups_value) + final = self._rule_dict_last_step(context, **groups_value) + finalset.append(final) else: if rule: - finalset.append(rule) + final = self._rule_dict_last_step(context, **rule) + finalset.append(final) + LOG.warn(finalset) return finalset def _cidr_args_split(self, kwargs): @@ -590,6 +595,9 @@ class CloudController(object): db.security_group_get_by_name(context.elevated(), source_project_id, source_security_group_name) + notfound = exception.SecurityGroupNotFound + if not source_security_group: + raise notfound(security_group_id=source_security_group_name) values['group_id'] = source_security_group['id'] elif cidr_ip: # If this fails, it throws an exception. This is what we want. @@ -628,7 +636,7 @@ class CloudController(object): for rule in security_group.rules: if 'group_id' in values: if rule['group_id'] == values['group_id']: - return True + return rule['id'] else: is_duplicate = True for key in ('cidr', 'from_port', 'to_port', 'protocol'): @@ -636,7 +644,7 @@ class CloudController(object): is_duplicate = False break if is_duplicate: - return True + return rule['id'] return False def revoke_security_group_ingress(self, context, group_name=None, @@ -659,23 +667,30 @@ class CloudController(object): msg = "Revoke security group ingress %s" LOG.audit(_(msg), security_group['name'], context=context) + prevalues = [] + try: + prevalues = kwargs['ip_permissions'] + except KeyError: + prevalues.append(kwargs) + postvalues = [] + for values in prevalues: + rulesvalues = self._rule_args_to_dict(context, values) + if not rulesvalues: + err = "%s Not enough parameters to build a valid rule" + raise exception.ApiError(_(err % rulesvalues)) - criteria = self._rule_args_to_dict(context, kwargs)[0] - if criteria is None: - raise exception.ApiError(_("Not enough parameters to build a " - "valid rule.")) - - for rule in security_group.rules: - match = True - for (k, v) in criteria.iteritems(): - if getattr(rule, k, False) != v: - match = False - if match: - db.security_group_rule_destroy(context, rule['id']) - self.compute_api.trigger_security_group_rules_refresh(context, - security_group_id=security_group['id']) + rule_id = None + for values_for_rule in rulesvalues: + values_for_rule['parent_group_id'] = security_group.id + rule_id = self._security_group_rule_exists(security_group, + values_for_rule) + if rule_id: + db.security_group_rule_destroy(context, rule_id) + self.compute_api.trigger_security_group_rules_refresh(context, + security_group_id=security_group['id']) + if rule_id: return True - raise exception.ApiError(_("No rule for the specified parameters.")) + raise exception.ApiError(_("No rule for the specified parameters.")) # TODO(soren): This has only been tested with Boto as the client. # Unfortunately, it seems Boto is using an old API diff --git a/nova/tests/test_api.py b/nova/tests/test_api.py index 26ac5ff24..cd5609834 100644 --- a/nova/tests/test_api.py +++ b/nova/tests/test_api.py @@ -213,7 +213,11 @@ class ApiEc2TestCase(test.TestCase): self.http = FakeHttplibConnection( self.app, '%s:8773' % (self.host), False) # pylint: disable=E1103 - self.ec2.new_http_connection(host, is_secure).AndReturn(self.http) + if boto.Version >= '2': + self.ec2.new_http_connection(host or '%s:8773' % (self.host), + is_secure).AndReturn(self.http) + else: + self.ec2.new_http_connection(host, is_secure).AndReturn(self.http) return self.http def test_return_valid_isoformat(self): @@ -400,6 +404,8 @@ class ApiEc2TestCase(test.TestCase): self.assertEquals(int(group.rules[0].from_port), 80) self.assertEquals(int(group.rules[0].to_port), 81) self.assertEquals(len(group.rules[0].grants), 1) + from nova import log + log.warn(group.rules[0].grants[0].__dict__) self.assertEquals(str(group.rules[0].grants[0]), '0.0.0.0/0') self.expect_http() diff --git a/nova/tests/test_cloud.py b/nova/tests/test_cloud.py index 136082cc1..f87edc407 100644 --- a/nova/tests/test_cloud.py +++ b/nova/tests/test_cloud.py @@ -287,13 +287,30 @@ class CloudTestCase(test.TestCase): 'ip_protocol': u'tcp'}]} self.assertTrue(authz(self.context, group_name=sec['name'], **kwargs)) - def test_authorize_security_group_ingress_ip_permissions_groups(self): + def test_authorize_security_group_fail_missing_source_group(self): kwargs = {'project_id': self.context.project_id, 'name': 'test'} sec = db.security_group_create(self.context, kwargs) authz = self.cloud.authorize_security_group_ingress kwargs = {'ip_permissions': [{'to_port': 81, 'from_port': 81, 'ip_ranges':{'1': {'cidr_ip': u'0.0.0.0/0'}, '2': {'cidr_ip': u'10.10.10.10/32'}}, + 'groups': {'1': {'user_id': u'someuser', + 'group_name': u'somegroup1'}}, + 'ip_protocol': u'tcp'}]} + self.assertRaises(exception.SecurityGroupNotFound, authz, + self.context, group_name=sec['name'], **kwargs) + + def test_authorize_security_group_ingress_ip_permissions_groups(self): + kwargs = {'project_id': self.context.project_id, 'name': 'test'} + sec = db.security_group_create(self.context, + {'project_id': 'someuser', + 'name': 'somegroup1'}) + sec = db.security_group_create(self.context, + {'project_id': 'someuser', + 'name': 'othergroup2'}) + sec = db.security_group_create(self.context, kwargs) + authz = self.cloud.authorize_security_group_ingress + kwargs = {'ip_permissions': [{'to_port': 81, 'from_port': 81, 'groups': {'1': {'user_id': u'someuser', 'group_name': u'somegroup1'}, '2': {'user_id': u'someuser', -- cgit From 5bd11c44f791cfe4c371b33cd1b1253013a8f836 Mon Sep 17 00:00:00 2001 From: Vishvananda Ishaya Date: Tue, 26 Jul 2011 20:49:46 +0000 Subject: remove some logging, remove extra if --- nova/api/ec2/cloud.py | 6 ++---- nova/tests/test_api.py | 2 -- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/nova/api/ec2/cloud.py b/nova/api/ec2/cloud.py index 4b8c4cf80..4045dfc61 100644 --- a/nova/api/ec2/cloud.py +++ b/nova/api/ec2/cloud.py @@ -549,10 +549,8 @@ class CloudController(object): final = self._rule_dict_last_step(context, **groups_value) finalset.append(final) else: - if rule: - final = self._rule_dict_last_step(context, **rule) - finalset.append(final) - LOG.warn(finalset) + final = self._rule_dict_last_step(context, **rule) + finalset.append(final) return finalset def _cidr_args_split(self, kwargs): diff --git a/nova/tests/test_api.py b/nova/tests/test_api.py index cd5609834..fe7fd8402 100644 --- a/nova/tests/test_api.py +++ b/nova/tests/test_api.py @@ -404,8 +404,6 @@ class ApiEc2TestCase(test.TestCase): self.assertEquals(int(group.rules[0].from_port), 80) self.assertEquals(int(group.rules[0].to_port), 81) self.assertEquals(len(group.rules[0].grants), 1) - from nova import log - log.warn(group.rules[0].grants[0].__dict__) self.assertEquals(str(group.rules[0].grants[0]), '0.0.0.0/0') self.expect_http() -- cgit From d4b2a2b3d552103414e4052773ac97939c66fa53 Mon Sep 17 00:00:00 2001 From: Vishvananda Ishaya Date: Tue, 26 Jul 2011 20:58:02 +0000 Subject: pep8 and simplify rule refresh logic --- nova/api/ec2/cloud.py | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/nova/api/ec2/cloud.py b/nova/api/ec2/cloud.py index 4045dfc61..0294c09c5 100644 --- a/nova/api/ec2/cloud.py +++ b/nova/api/ec2/cloud.py @@ -670,25 +670,26 @@ class CloudController(object): prevalues = kwargs['ip_permissions'] except KeyError: prevalues.append(kwargs) - postvalues = [] + rule_id = None for values in prevalues: rulesvalues = self._rule_args_to_dict(context, values) if not rulesvalues: err = "%s Not enough parameters to build a valid rule" raise exception.ApiError(_(err % rulesvalues)) - rule_id = None for values_for_rule in rulesvalues: values_for_rule['parent_group_id'] = security_group.id rule_id = self._security_group_rule_exists(security_group, values_for_rule) if rule_id: db.security_group_rule_destroy(context, rule_id) - self.compute_api.trigger_security_group_rules_refresh(context, - security_group_id=security_group['id']) - if rule_id: - return True - raise exception.ApiError(_("No rule for the specified parameters.")) + if rule_id: + # NOTE(vish): we removed a rule, so refresh + self.compute_api.trigger_security_group_rules_refresh( + context, + security_group_id=security_group['id']) + return True + raise exception.ApiError(_("No rule for the specified parameters.")) # TODO(soren): This has only been tested with Boto as the client. # Unfortunately, it seems Boto is using an old API @@ -734,15 +735,17 @@ class CloudController(object): postvalues.append(values_for_rule) for values_for_rule in postvalues: - security_group_rule = db.security_group_rule_create(context, - values_for_rule) + security_group_rule = db.security_group_rule_create( + context, + values_for_rule) - self.compute_api.trigger_security_group_rules_refresh(context, - security_group_id=security_group['id']) + if postvalues: + self.compute_api.trigger_security_group_rules_refresh( + context, + security_group_id=security_group['id']) + return True - group = db.security_group_get_by_name(context, context.project_id, - security_group['name']) - return True + raise exception.ApiError(_("No rule for the specified parameters.")) def _get_source_project_id(self, context, source_security_group_owner_id): if source_security_group_owner_id: -- cgit