[openstack-nova] Fix tenant bypass by authenticated API users (#772202, CVE-2012-0030)
Pádraig Brady
pbrady at fedoraproject.org
Wed Jan 11 17:38:31 UTC 2012
commit 2681d005c69373efe0a4a72bbce3deced4484f1b
Author: Pádraig Brady <P at draigBrady.com>
Date: Wed Jan 11 17:25:05 2012 +0000
Fix tenant bypass by authenticated API users (#772202, CVE-2012-0030)
...-overwrite-project_id-from-request-params.patch | 1505 ++++++++++++++++++++
openstack-nova.spec | 3 +
2 files changed, 1508 insertions(+), 0 deletions(-)
---
diff --git a/0097-Do-not-overwrite-project_id-from-request-params.patch b/0097-Do-not-overwrite-project_id-from-request-params.patch
new file mode 100644
index 0000000..82771f4
--- /dev/null
+++ b/0097-Do-not-overwrite-project_id-from-request-params.patch
@@ -0,0 +1,1505 @@
+From 3d4ffb64f1e18117240c26809788528979e3bd15 Mon Sep 17 00:00:00 2001
+From: Thierry Carrez <thierry at openstack.org>
+Date: Wed, 11 Jan 2012 13:48:29 +0100
+Subject: [PATCH] Do not overwrite project_id from request params
+
+Prevent project_id overwriting from OSAPI request parameters.
+The patch is actually very simple (nova/api/openstack/wsgi.py) but
+needs significant test adjustments (nova/tests/*) to pass.
+
+Fixes bug 904072. Patch from Vish Ishaya and Mark McLoughlin.
+
+(cherry picked from commit c9c09bd60e7a0e0258d218a31d7878755bea1395)
+
+Change-Id: I66ea0f178ce6271ec1020e9f1a73bd4e8c83ddab
+---
+ nova/api/openstack/wsgi.py | 6 +-
+ .../api/openstack/contrib/test_createserverext.py | 8 +-
+ .../api/openstack/contrib/test_floating_ips.py | 38 ++++++------
+ nova/tests/api/openstack/contrib/test_keypairs.py | 8 +-
+ .../api/openstack/contrib/test_multinic_xs.py | 8 +-
+ nova/tests/api/openstack/contrib/test_quotas.py | 8 +-
+ nova/tests/api/openstack/contrib/test_rescue.py | 4 +-
+ .../api/openstack/contrib/test_security_groups.py | 68 ++++++++++----------
+ .../openstack/contrib/test_simple_tenant_usage.py | 11 ++--
+ .../openstack/contrib/test_virtual_interfaces.py | 2 +-
+ nova/tests/api/openstack/contrib/test_vsa.py | 41 ++++++------
+ nova/tests/api/openstack/test_extensions.py | 28 ++++----
+ .../api/openstack/test_flavors_extra_specs.py | 22 +++---
+ nova/tests/api/openstack/test_image_metadata.py | 2 +-
+ nova/tests/api/openstack/test_servers.py | 61 +++++++++---------
+ nova/tests/api/openstack/test_volume_types.py | 16 ++--
+ .../api/openstack/test_volume_types_extra_specs.py | 2 +-
+ 17 files changed, 170 insertions(+), 163 deletions(-)
+
+diff --git a/nova/api/openstack/wsgi.py b/nova/api/openstack/wsgi.py
+index 72e8f1b..f895b0d 100644
+--- a/nova/api/openstack/wsgi.py
++++ b/nova/api/openstack/wsgi.py
+@@ -487,8 +487,10 @@ class Resource(wsgi.Application):
+ return faults.Fault(webob.exc.HTTPBadRequest(explanation=msg))
+
+ project_id = args.pop("project_id", None)
+- if 'nova.context' in request.environ and project_id:
+- request.environ['nova.context'].project_id = project_id
++ if ('nova.context' in request.environ and project_id
++ and project_id != request.environ['nova.context'].project_id):
++ msg = _("Malformed request url")
++ return faults.Fault(webob.exc.HTTPBadRequest(explanation=msg))
+
+ try:
+ action_result = self.dispatch(request, action, args)
+diff --git a/nova/tests/api/openstack/contrib/test_createserverext.py b/nova/tests/api/openstack/contrib/test_createserverext.py
+index 078b72d..5b220ce 100644
+--- a/nova/tests/api/openstack/contrib/test_createserverext.py
++++ b/nova/tests/api/openstack/contrib/test_createserverext.py
+@@ -165,7 +165,7 @@ class CreateserverextTest(test.TestCase):
+ return {'server': server}
+
+ def _get_create_request_json(self, body_dict):
+- req = webob.Request.blank('/v1.1/123/os-create-server-ext')
++ req = webob.Request.blank('/v1.1/fake/os-create-server-ext')
+ req.headers['Content-Type'] = 'application/json'
+ req.method = 'POST'
+ req.body = json.dumps(body_dict)
+@@ -209,7 +209,7 @@ class CreateserverextTest(test.TestCase):
+ return ''.join(body_parts)
+
+ def _get_create_request_xml(self, body_dict):
+- req = webob.Request.blank('/v1.1/123/os-create-server-ext')
++ req = webob.Request.blank('/v1.1/fake/os-create-server-ext')
+ req.content_type = 'application/xml'
+ req.accept = 'application/xml'
+ req.method = 'POST'
+@@ -392,7 +392,7 @@ class CreateserverextTest(test.TestCase):
+
+ def test_get_server_by_id_verify_security_groups_json(self):
+ self.stubs.Set(nova.db.api, 'instance_get', return_server_by_id)
+- req = webob.Request.blank('/v1.1/123/os-create-server-ext/1')
++ req = webob.Request.blank('/v1.1/fake/os-create-server-ext/1')
+ req.headers['Content-Type'] = 'application/json'
+ response = req.get_response(fakes.wsgi_app())
+ self.assertEquals(response.status_int, 200)
+@@ -403,7 +403,7 @@ class CreateserverextTest(test.TestCase):
+
+ def test_get_server_by_id_verify_security_groups_xml(self):
+ self.stubs.Set(nova.db.api, 'instance_get', return_server_by_id)
+- req = webob.Request.blank('/v1.1/123/os-create-server-ext/1')
++ req = webob.Request.blank('/v1.1/fake/os-create-server-ext/1')
+ req.headers['Accept'] = 'application/xml'
+ response = req.get_response(fakes.wsgi_app())
+ self.assertEquals(response.status_int, 200)
+diff --git a/nova/tests/api/openstack/contrib/test_floating_ips.py b/nova/tests/api/openstack/contrib/test_floating_ips.py
+index d4e08b3..aae71c3 100644
+--- a/nova/tests/api/openstack/contrib/test_floating_ips.py
++++ b/nova/tests/api/openstack/contrib/test_floating_ips.py
+@@ -147,7 +147,7 @@ class FloatingIpTest(test.TestCase):
+ self.assertTrue('floating_ip' in view)
+
+ def test_floating_ips_list(self):
+- req = webob.Request.blank('/v1.1/123/os-floating-ips')
++ req = webob.Request.blank('/v1.1/fake/os-floating-ips')
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(res.status_int, 200)
+ res_dict = json.loads(res.body)
+@@ -162,7 +162,7 @@ class FloatingIpTest(test.TestCase):
+ self.assertEqual(res_dict, response)
+
+ def test_floating_ip_show(self):
+- req = webob.Request.blank('/v1.1/123/os-floating-ips/1')
++ req = webob.Request.blank('/v1.1/fake/os-floating-ips/1')
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(res.status_int, 200)
+ res_dict = json.loads(res.body)
+@@ -176,7 +176,7 @@ class FloatingIpTest(test.TestCase):
+ 'fixed_ip': {'address': '10.0.0.1', 'instance_id': 1}}
+ self.stubs.Set(network.api.API, "get_floating_ip", get_floating_ip)
+
+- req = webob.Request.blank('/v1.1/123/os-floating-ips/1')
++ req = webob.Request.blank('/v1.1/fake/os-floating-ips/1')
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(res.status_int, 200)
+ res_dict = json.loads(res.body)
+@@ -189,7 +189,7 @@ class FloatingIpTest(test.TestCase):
+ raise(rpc.RemoteError('NoMoreFloatingIps', '', ''))
+
+ self.stubs.Set(rpc, "call", fake_call)
+- req = webob.Request.blank('/v1.1/123/os-floating-ips')
++ req = webob.Request.blank('/v1.1/fake/os-floating-ips')
+ req.method = 'POST'
+ req.headers['Content-Type'] = 'application/json'
+ res = req.get_response(fakes.wsgi_app())
+@@ -198,7 +198,7 @@ class FloatingIpTest(test.TestCase):
+ def test_floating_ip_allocate(self):
+ self.stubs.Set(network.api.API, "allocate_floating_ip",
+ network_api_allocate)
+- req = webob.Request.blank('/v1.1/123/os-floating-ips')
++ req = webob.Request.blank('/v1.1/fake/os-floating-ips')
+ req.method = 'POST'
+ req.headers['Content-Type'] = 'application/json'
+ res = req.get_response(fakes.wsgi_app())
+@@ -226,7 +226,7 @@ class FloatingIpTest(test.TestCase):
+ get_floating_ip)
+ self.stubs.Set(network.api.API, "disassociate_floating_ip",
+ disassociate)
+- req = webob.Request.blank('/v1.1/123/os-floating-ips/1')
++ req = webob.Request.blank('/v1.1/fake/os-floating-ips/1')
+ req.method = 'DELETE'
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(res.status_int, 202)
+@@ -246,7 +246,7 @@ class FloatingIpTest(test.TestCase):
+ fake_get_floating_ip)
+ self.stubs.Set(network.api.API, "disassociate_floating_ip",
+ fake_disassociate)
+- req = webob.Request.blank('/v1.1/123/os-floating-ips/1')
++ req = webob.Request.blank('/v1.1/fake/os-floating-ips/1')
+ req.method = 'DELETE'
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(res.status_int, 202)
+@@ -256,7 +256,7 @@ class FloatingIpTest(test.TestCase):
+ self.stubs.Set(network.api.API, "associate_floating_ip",
+ network_api_associate)
+ body = dict(addFloatingIp=dict(address='11.0.0.1'))
+- req = webob.Request.blank('/v1.1/123/servers/test_inst/action')
++ req = webob.Request.blank('/v1.1/fake/servers/test_inst/action')
+ req.method = "POST"
+ req.body = json.dumps(body)
+ req.headers["content-type"] = "application/json"
+@@ -273,7 +273,7 @@ class FloatingIpTest(test.TestCase):
+ db.floating_ip_update(self.context, self.address, {'project_id': 'bad',
+ 'fixed_ip_id': 1})
+ body = dict(addFloatingIp=dict(address=self.address))
+- req = webob.Request.blank('/v1.1/123/servers/test_inst/action')
++ req = webob.Request.blank('/v1.1/fake/servers/test_inst/action')
+ req.method = "POST"
+ req.body = json.dumps(body)
+ req.headers["content-type"] = "application/json"
+@@ -289,7 +289,7 @@ class FloatingIpTest(test.TestCase):
+ db.floating_ip_update(self.context, self.address, {'project_id': None,
+ 'fixed_ip_id': 1})
+ body = dict(addFloatingIp=dict(address=self.address))
+- req = webob.Request.blank('/v1.1/123/servers/test_inst/action')
++ req = webob.Request.blank('/v1.1/fake/servers/test_inst/action')
+ req.method = "POST"
+ req.body = json.dumps(body)
+ req.headers["content-type"] = "application/json"
+@@ -306,15 +306,15 @@ class FloatingIpTest(test.TestCase):
+ def fake_network_api_disassociate(local_self, ctx, floating_address):
+ self.disassociated = True
+
+- db.floating_ip_update(self.context, self.address, {'project_id': '123',
+- 'fixed_ip_id': 1})
++ db.floating_ip_update(self.context, self.address,
++ {'project_id': 'fake', 'fixed_ip_id': 1})
+ self.stubs.Set(network.api.API, "disassociate_floating_ip",
+ fake_network_api_disassociate)
+ self.stubs.Set(db.api, "fixed_ip_get_by_address",
+ fake_fixed_ip_get_by_address)
+
+ body = dict(addFloatingIp=dict(address=self.address))
+- req = webob.Request.blank('/v1.1/123/servers/test_inst/action')
++ req = webob.Request.blank('/v1.1/fake/servers/test_inst/action')
+ req.method = "POST"
+ req.body = json.dumps(body)
+ req.headers["content-type"] = "application/json"
+@@ -338,7 +338,7 @@ class FloatingIpTest(test.TestCase):
+ self.stubs.Set(network.api.API, "disassociate_floating_ip",
+ fake_disassociate)
+ body = dict(removeFloatingIp=dict(address='10.10.10.10'))
+- req = webob.Request.blank('/v1.1/123/servers/test_inst/action')
++ req = webob.Request.blank('/v1.1/fake/servers/test_inst/action')
+ req.method = "POST"
+ req.body = json.dumps(body)
+ req.headers["content-type"] = "application/json"
+@@ -362,7 +362,7 @@ class FloatingIpTest(test.TestCase):
+ self.stubs.Set(network.api.API, "disassociate_floating_ip",
+ fake_disassociate)
+ body = dict(removeFloatingIp=dict(address='10.10.10.10'))
+- req = webob.Request.blank('/v1.1/123/servers/test_inst/action')
++ req = webob.Request.blank('/v1.1/fake/servers/test_inst/action')
+ req.method = "POST"
+ req.body = json.dumps(body)
+ req.headers["content-type"] = "application/json"
+@@ -373,7 +373,7 @@ class FloatingIpTest(test.TestCase):
+
+ def test_bad_address_param_in_remove_floating_ip(self):
+ body = dict(removeFloatingIp=dict(badparam='11.0.0.1'))
+- req = webob.Request.blank('/v1.1/123/servers/test_inst/action')
++ req = webob.Request.blank('/v1.1/fake/servers/test_inst/action')
+ req.method = "POST"
+ req.body = json.dumps(body)
+ req.headers["content-type"] = "application/json"
+@@ -383,7 +383,7 @@ class FloatingIpTest(test.TestCase):
+
+ def test_missing_dict_param_in_remove_floating_ip(self):
+ body = dict(removeFloatingIp='11.0.0.1')
+- req = webob.Request.blank('/v1.1/123/servers/test_inst/action')
++ req = webob.Request.blank('/v1.1/fake/servers/test_inst/action')
+ req.method = "POST"
+ req.body = json.dumps(body)
+ req.headers["content-type"] = "application/json"
+@@ -393,7 +393,7 @@ class FloatingIpTest(test.TestCase):
+
+ def test_bad_address_param_in_add_floating_ip(self):
+ body = dict(addFloatingIp=dict(badparam='11.0.0.1'))
+- req = webob.Request.blank('/v1.1/123/servers/test_inst/action')
++ req = webob.Request.blank('/v1.1/fake/servers/test_inst/action')
+ req.method = "POST"
+ req.body = json.dumps(body)
+ req.headers["content-type"] = "application/json"
+@@ -403,7 +403,7 @@ class FloatingIpTest(test.TestCase):
+
+ def test_missing_dict_param_in_add_floating_ip(self):
+ body = dict(addFloatingIp='11.0.0.1')
+- req = webob.Request.blank('/v1.1/123/servers/test_inst/action')
++ req = webob.Request.blank('/v1.1/fake/servers/test_inst/action')
+ req.method = "POST"
+ req.body = json.dumps(body)
+ req.headers["content-type"] = "application/json"
+diff --git a/nova/tests/api/openstack/contrib/test_keypairs.py b/nova/tests/api/openstack/contrib/test_keypairs.py
+index 92e401a..4ab0777 100644
+--- a/nova/tests/api/openstack/contrib/test_keypairs.py
++++ b/nova/tests/api/openstack/contrib/test_keypairs.py
+@@ -58,7 +58,7 @@ class KeypairsTest(test.TestCase):
+ self.context = context.get_admin_context()
+
+ def test_keypair_list(self):
+- req = webob.Request.blank('/v1.1/123/os-keypairs')
++ req = webob.Request.blank('/v1.1/fake/os-keypairs')
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(res.status_int, 200)
+ res_dict = json.loads(res.body)
+@@ -67,7 +67,7 @@ class KeypairsTest(test.TestCase):
+
+ def test_keypair_create(self):
+ body = {'keypair': {'name': 'create_test'}}
+- req = webob.Request.blank('/v1.1/123/os-keypairs')
++ req = webob.Request.blank('/v1.1/fake/os-keypairs')
+ req.method = 'POST'
+ req.body = json.dumps(body)
+ req.headers['Content-Type'] = 'application/json'
+@@ -93,7 +93,7 @@ class KeypairsTest(test.TestCase):
+ },
+ }
+
+- req = webob.Request.blank('/v1.1/123/os-keypairs')
++ req = webob.Request.blank('/v1.1/fake/os-keypairs')
+ req.method = 'POST'
+ req.body = json.dumps(body)
+ req.headers['Content-Type'] = 'application/json'
+@@ -105,7 +105,7 @@ class KeypairsTest(test.TestCase):
+ self.assertFalse('private_key' in res_dict['keypair'])
+
+ def test_keypair_delete(self):
+- req = webob.Request.blank('/v1.1/123/os-keypairs/FAKE')
++ req = webob.Request.blank('/v1.1/fake/os-keypairs/FAKE')
+ req.method = 'DELETE'
+ req.headers['Content-Type'] = 'application/json'
+ res = req.get_response(fakes.wsgi_app())
+diff --git a/nova/tests/api/openstack/contrib/test_multinic_xs.py b/nova/tests/api/openstack/contrib/test_multinic_xs.py
+index cecc4af..f659852 100644
+--- a/nova/tests/api/openstack/contrib/test_multinic_xs.py
++++ b/nova/tests/api/openstack/contrib/test_multinic_xs.py
+@@ -55,7 +55,7 @@ class FixedIpTest(test.TestCase):
+ last_add_fixed_ip = (None, None)
+
+ body = dict(addFixedIp=dict(networkId='test_net'))
+- req = webob.Request.blank('/v1.1/123/servers/test_inst/action')
++ req = webob.Request.blank('/v1.1/fake/servers/test_inst/action')
+ req.method = 'POST'
+ req.body = json.dumps(body)
+ req.headers['content-type'] = 'application/json'
+@@ -69,7 +69,7 @@ class FixedIpTest(test.TestCase):
+ last_add_fixed_ip = (None, None)
+
+ body = dict(addFixedIp=dict())
+- req = webob.Request.blank('/v1.1/123/servers/test_inst/action')
++ req = webob.Request.blank('/v1.1/fake/servers/test_inst/action')
+ req.method = 'POST'
+ req.body = json.dumps(body)
+ req.headers['content-type'] = 'application/json'
+@@ -83,7 +83,7 @@ class FixedIpTest(test.TestCase):
+ last_remove_fixed_ip = (None, None)
+
+ body = dict(removeFixedIp=dict(address='10.10.10.1'))
+- req = webob.Request.blank('/v1.1/123/servers/test_inst/action')
++ req = webob.Request.blank('/v1.1/fake/servers/test_inst/action')
+ req.method = 'POST'
+ req.body = json.dumps(body)
+ req.headers['content-type'] = 'application/json'
+@@ -97,7 +97,7 @@ class FixedIpTest(test.TestCase):
+ last_remove_fixed_ip = (None, None)
+
+ body = dict(removeFixedIp=dict())
+- req = webob.Request.blank('/v1.1/123/servers/test_inst/action')
++ req = webob.Request.blank('/v1.1/fake/servers/test_inst/action')
+ req.method = 'POST'
+ req.body = json.dumps(body)
+ req.headers['content-type'] = 'application/json'
+diff --git a/nova/tests/api/openstack/contrib/test_quotas.py b/nova/tests/api/openstack/contrib/test_quotas.py
+index 7faef08..e391e5f 100644
+--- a/nova/tests/api/openstack/contrib/test_quotas.py
++++ b/nova/tests/api/openstack/contrib/test_quotas.py
+@@ -78,7 +78,7 @@ class QuotaSetsTest(test.TestCase):
+ self.assertEqual(qs['injected_file_content_bytes'], 10240)
+
+ def test_quotas_defaults(self):
+- uri = '/v1.1/fake_tenant/os-quota-sets/fake_tenant/defaults'
++ uri = '/v1.1/fake/os-quota-sets/fake_tenant/defaults'
+ req = webob.Request.blank(uri)
+ req.method = 'GET'
+ req.headers['Content-Type'] = 'application/json'
+@@ -100,7 +100,7 @@ class QuotaSetsTest(test.TestCase):
+ self.assertEqual(json.loads(res.body), expected)
+
+ def test_quotas_show_as_admin(self):
+- req = webob.Request.blank('/v1.1/1234/os-quota-sets/1234')
++ req = webob.Request.blank('/v1.1/fake/os-quota-sets/1234')
+ req.method = 'GET'
+ req.headers['Content-Type'] = 'application/json'
+ res = req.get_response(fakes.wsgi_app(
+@@ -125,7 +125,7 @@ class QuotaSetsTest(test.TestCase):
+ 'metadata_items': 128, 'injected_files': 5,
+ 'injected_file_content_bytes': 10240}}
+
+- req = webob.Request.blank('/v1.1/1234/os-quota-sets/update_me')
++ req = webob.Request.blank('/v1.1/fake/os-quota-sets/update_me')
+ req.method = 'PUT'
+ req.body = json.dumps(updated_quota_set)
+ req.headers['Content-Type'] = 'application/json'
+@@ -142,7 +142,7 @@ class QuotaSetsTest(test.TestCase):
+ 'metadata_items': 128, 'injected_files': 5,
+ 'injected_file_content_bytes': 10240}}
+
+- req = webob.Request.blank('/v1.1/1234/os-quota-sets/update_me')
++ req = webob.Request.blank('/v1.1/fake/os-quota-sets/update_me')
+ req.method = 'PUT'
+ req.body = json.dumps(updated_quota_set)
+ req.headers['Content-Type'] = 'application/json'
+diff --git a/nova/tests/api/openstack/contrib/test_rescue.py b/nova/tests/api/openstack/contrib/test_rescue.py
+index f8126d4..deac16b 100644
+--- a/nova/tests/api/openstack/contrib/test_rescue.py
++++ b/nova/tests/api/openstack/contrib/test_rescue.py
+@@ -36,7 +36,7 @@ class RescueTest(test.TestCase):
+
+ def test_rescue(self):
+ body = dict(rescue=None)
+- req = webob.Request.blank('/v1.1/123/servers/test_inst/action')
++ req = webob.Request.blank('/v1.1/fake/servers/test_inst/action')
+ req.method = "POST"
+ req.body = json.dumps(body)
+ req.headers["content-type"] = "application/json"
+@@ -46,7 +46,7 @@ class RescueTest(test.TestCase):
+
+ def test_unrescue(self):
+ body = dict(unrescue=None)
+- req = webob.Request.blank('/v1.1/123/servers/test_inst/action')
++ req = webob.Request.blank('/v1.1/fake/servers/test_inst/action')
+ req.method = "POST"
+ req.body = json.dumps(body)
+ req.headers["content-type"] = "application/json"
+diff --git a/nova/tests/api/openstack/contrib/test_security_groups.py b/nova/tests/api/openstack/contrib/test_security_groups.py
+index 0816a63..d0b25e0 100644
+--- a/nova/tests/api/openstack/contrib/test_security_groups.py
++++ b/nova/tests/api/openstack/contrib/test_security_groups.py
+@@ -28,7 +28,7 @@ from nova.tests.api.openstack import fakes
+
+
+ def _get_create_request_json(body_dict):
+- req = webob.Request.blank('/v1.1/123/os-security-groups')
++ req = webob.Request.blank('/v1.1/fake/os-security-groups')
+ req.headers['Content-Type'] = 'application/json'
+ req.method = 'POST'
+ req.body = json.dumps(body_dict)
+@@ -109,7 +109,7 @@ class TestSecurityGroups(test.TestCase):
+ return ''.join(body_parts)
+
+ def _get_create_request_xml(self, body_dict):
+- req = webob.Request.blank('/v1.1/123/os-security-groups')
++ req = webob.Request.blank('/v1.1/fake/os-security-groups')
+ req.headers['Content-Type'] = 'application/xml'
+ req.content_type = 'application/xml'
+ req.accept = 'application/xml'
+@@ -124,7 +124,7 @@ class TestSecurityGroups(test.TestCase):
+ return response
+
+ def _delete_security_group(self, id):
+- request = webob.Request.blank('/v1.1/123/os-security-groups/%s'
++ request = webob.Request.blank('/v1.1/fake/os-security-groups/%s'
+ % id)
+ request.method = 'DELETE'
+ response = request.get_response(fakes.wsgi_app())
+@@ -263,7 +263,7 @@ class TestSecurityGroups(test.TestCase):
+ security_group['description'] = "group-description"
+ response = _create_security_group_json(security_group)
+
+- req = webob.Request.blank('/v1.1/123/os-security-groups')
++ req = webob.Request.blank('/v1.1/fake/os-security-groups')
+ req.headers['Content-Type'] = 'application/json'
+ req.method = 'GET'
+ response = req.get_response(fakes.wsgi_app())
+@@ -272,7 +272,7 @@ class TestSecurityGroups(test.TestCase):
+ expected = {'security_groups': [
+ {'id': 1,
+ 'name':"default",
+- 'tenant_id': "123",
++ 'tenant_id': "fake",
+ "description":"default",
+ "rules": []
+ },
+@@ -282,7 +282,7 @@ class TestSecurityGroups(test.TestCase):
+ {
+ 'id': 2,
+ 'name': "test",
+- 'tenant_id': "123",
++ 'tenant_id': "fake",
+ "description": "group-description",
+ "rules": []
+ }
+@@ -297,7 +297,7 @@ class TestSecurityGroups(test.TestCase):
+ response = _create_security_group_json(security_group)
+
+ res_dict = json.loads(response.body)
+- req = webob.Request.blank('/v1.1/123/os-security-groups/%s' %
++ req = webob.Request.blank('/v1.1/fake/os-security-groups/%s' %
+ res_dict['security_group']['id'])
+ req.headers['Content-Type'] = 'application/json'
+ req.method = 'GET'
+@@ -308,7 +308,7 @@ class TestSecurityGroups(test.TestCase):
+ 'security_group': {
+ 'id': 2,
+ 'name': "test",
+- 'tenant_id': "123",
++ 'tenant_id': "fake",
+ 'description': "group-description",
+ 'rules': []
+ }
+@@ -316,14 +316,14 @@ class TestSecurityGroups(test.TestCase):
+ self.assertEquals(res_dict, expected)
+
+ def test_get_security_group_by_invalid_id(self):
+- req = webob.Request.blank('/v1.1/123/os-security-groups/invalid')
++ req = webob.Request.blank('/v1.1/fake/os-security-groups/invalid')
+ req.headers['Content-Type'] = 'application/json'
+ req.method = 'GET'
+ response = req.get_response(fakes.wsgi_app())
+ self.assertEquals(response.status_int, 400)
+
+ def test_get_security_group_by_non_existing_id(self):
+- req = webob.Request.blank('/v1.1/123/os-security-groups/111111111')
++ req = webob.Request.blank('/v1.1/fake/os-security-groups/111111111')
+ req.headers['Content-Type'] = 'application/json'
+ req.method = 'GET'
+ response = req.get_response(fakes.wsgi_app())
+@@ -351,7 +351,7 @@ class TestSecurityGroups(test.TestCase):
+
+ def test_associate_by_non_existing_security_group_name(self):
+ body = dict(addSecurityGroup=dict(name='non-existing'))
+- req = webob.Request.blank('/v1.1/123/servers/1/action')
++ req = webob.Request.blank('/v1.1/fake/servers/1/action')
+ req.headers['Content-Type'] = 'application/json'
+ req.method = 'POST'
+ req.body = json.dumps(body)
+@@ -362,7 +362,7 @@ class TestSecurityGroups(test.TestCase):
+ body = dict(addSecurityGroup=dict(name='test'))
+ self.stubs.Set(nova.db.api, 'security_group_get_by_name',
+ return_security_group)
+- req = webob.Request.blank('/v1.1/123/servers/invalid/action')
++ req = webob.Request.blank('/v1.1/fake/servers/invalid/action')
+ req.headers['Content-Type'] = 'application/json'
+ req.method = 'POST'
+ req.body = json.dumps(body)
+@@ -370,7 +370,7 @@ class TestSecurityGroups(test.TestCase):
+ self.assertEquals(response.status_int, 400)
+
+ def test_associate_without_body(self):
+- req = webob.Request.blank('/v1.1/123/servers/1/action')
++ req = webob.Request.blank('/v1.1/fake/servers/1/action')
+ body = dict(addSecurityGroup=None)
+ self.stubs.Set(nova.db.api, 'instance_get', return_server)
+ req.headers['Content-Type'] = 'application/json'
+@@ -380,7 +380,7 @@ class TestSecurityGroups(test.TestCase):
+ self.assertEquals(response.status_int, 400)
+
+ def test_associate_no_security_group_name(self):
+- req = webob.Request.blank('/v1.1/123/servers/1/action')
++ req = webob.Request.blank('/v1.1/fake/servers/1/action')
+ body = dict(addSecurityGroup=dict())
+ self.stubs.Set(nova.db.api, 'instance_get', return_server)
+ req.headers['Content-Type'] = 'application/json'
+@@ -390,7 +390,7 @@ class TestSecurityGroups(test.TestCase):
+ self.assertEquals(response.status_int, 400)
+
+ def test_associate_security_group_name_with_whitespaces(self):
+- req = webob.Request.blank('/v1.1/123/servers/1/action')
++ req = webob.Request.blank('/v1.1/fake/servers/1/action')
+ body = dict(addSecurityGroup=dict(name=" "))
+ self.stubs.Set(nova.db.api, 'instance_get', return_server)
+ req.headers['Content-Type'] = 'application/json'
+@@ -404,7 +404,7 @@ class TestSecurityGroups(test.TestCase):
+ body = dict(addSecurityGroup=dict(name="test"))
+ self.stubs.Set(nova.db.api, 'security_group_get_by_name',
+ return_security_group)
+- req = webob.Request.blank('/v1.1/123/servers/10000/action')
++ req = webob.Request.blank('/v1.1/fake/servers/10000/action')
+ req.headers['Content-Type'] = 'application/json'
+ req.method = 'POST'
+ req.body = json.dumps(body)
+@@ -416,7 +416,7 @@ class TestSecurityGroups(test.TestCase):
+ self.stubs.Set(nova.db.api, 'security_group_get_by_name',
+ return_security_group_without_instances)
+ body = dict(addSecurityGroup=dict(name="test"))
+- req = webob.Request.blank('/v1.1/123/servers/1/action')
++ req = webob.Request.blank('/v1.1/fake/servers/1/action')
+ req.headers['Content-Type'] = 'application/json'
+ req.method = 'POST'
+ req.body = json.dumps(body)
+@@ -428,7 +428,7 @@ class TestSecurityGroups(test.TestCase):
+ self.stubs.Set(nova.db.api, 'security_group_get_by_name',
+ return_security_group)
+ body = dict(addSecurityGroup=dict(name="test"))
+- req = webob.Request.blank('/v1.1/123/servers/1/action')
++ req = webob.Request.blank('/v1.1/fake/servers/1/action')
+ req.headers['Content-Type'] = 'application/json'
+ req.method = 'POST'
+ req.body = json.dumps(body)
+@@ -446,7 +446,7 @@ class TestSecurityGroups(test.TestCase):
+ self.mox.ReplayAll()
+
+ body = dict(addSecurityGroup=dict(name="test"))
+- req = webob.Request.blank('/v1.1/123/servers/1/action')
++ req = webob.Request.blank('/v1.1/fake/servers/1/action')
+ req.headers['Content-Type'] = 'application/json'
+ req.method = 'POST'
+ req.body = json.dumps(body)
+@@ -463,7 +463,7 @@ class TestSecurityGroups(test.TestCase):
+ return_security_group_without_instances)
+ self.mox.ReplayAll()
+
+- req = webob.Request.blank('/v1.1/123/servers/1/action')
++ req = webob.Request.blank('/v1.1/fake/servers/1/action')
+ req.headers['Content-Type'] = 'application/xml'
+ req.method = 'POST'
+ req.body = """<addSecurityGroup>
+@@ -474,7 +474,7 @@ class TestSecurityGroups(test.TestCase):
+
+ def test_disassociate_by_non_existing_security_group_name(self):
+ body = dict(removeSecurityGroup=dict(name='non-existing'))
+- req = webob.Request.blank('/v1.1/123/servers/1/action')
++ req = webob.Request.blank('/v1.1/fake/servers/1/action')
+ req.headers['Content-Type'] = 'application/json'
+ req.method = 'POST'
+ req.body = json.dumps(body)
+@@ -485,7 +485,7 @@ class TestSecurityGroups(test.TestCase):
+ body = dict(removeSecurityGroup=dict(name='test'))
+ self.stubs.Set(nova.db.api, 'security_group_get_by_name',
+ return_security_group)
+- req = webob.Request.blank('/v1.1/123/servers/invalid/action')
++ req = webob.Request.blank('/v1.1/fake/servers/invalid/action')
+ req.headers['Content-Type'] = 'application/json'
+ req.method = 'POST'
+ req.body = json.dumps(body)
+@@ -493,7 +493,7 @@ class TestSecurityGroups(test.TestCase):
+ self.assertEquals(response.status_int, 400)
+
+ def test_disassociate_without_body(self):
+- req = webob.Request.blank('/v1.1/123/servers/1/action')
++ req = webob.Request.blank('/v1.1/fake/servers/1/action')
+ body = dict(removeSecurityGroup=None)
+ self.stubs.Set(nova.db.api, 'instance_get', return_server)
+ req.headers['Content-Type'] = 'application/json'
+@@ -503,7 +503,7 @@ class TestSecurityGroups(test.TestCase):
+ self.assertEquals(response.status_int, 400)
+
+ def test_disassociate_no_security_group_name(self):
+- req = webob.Request.blank('/v1.1/123/servers/1/action')
++ req = webob.Request.blank('/v1.1/fake/servers/1/action')
+ body = dict(removeSecurityGroup=dict())
+ self.stubs.Set(nova.db.api, 'instance_get', return_server)
+ req.headers['Content-Type'] = 'application/json'
+@@ -513,7 +513,7 @@ class TestSecurityGroups(test.TestCase):
+ self.assertEquals(response.status_int, 400)
+
+ def test_disassociate_security_group_name_with_whitespaces(self):
+- req = webob.Request.blank('/v1.1/123/servers/1/action')
++ req = webob.Request.blank('/v1.1/fake/servers/1/action')
+ body = dict(removeSecurityGroup=dict(name=" "))
+ self.stubs.Set(nova.db.api, 'instance_get', return_server)
+ req.headers['Content-Type'] = 'application/json'
+@@ -527,7 +527,7 @@ class TestSecurityGroups(test.TestCase):
+ body = dict(removeSecurityGroup=dict(name="test"))
+ self.stubs.Set(nova.db.api, 'security_group_get_by_name',
+ return_security_group)
+- req = webob.Request.blank('/v1.1/123/servers/10000/action')
++ req = webob.Request.blank('/v1.1/fake/servers/10000/action')
+ req.headers['Content-Type'] = 'application/json'
+ req.method = 'POST'
+ req.body = json.dumps(body)
+@@ -539,7 +539,7 @@ class TestSecurityGroups(test.TestCase):
+ self.stubs.Set(nova.db.api, 'security_group_get_by_name',
+ return_security_group)
+ body = dict(removeSecurityGroup=dict(name="test"))
+- req = webob.Request.blank('/v1.1/123/servers/1/action')
++ req = webob.Request.blank('/v1.1/fake/servers/1/action')
+ req.headers['Content-Type'] = 'application/json'
+ req.method = 'POST'
+ req.body = json.dumps(body)
+@@ -551,7 +551,7 @@ class TestSecurityGroups(test.TestCase):
+ self.stubs.Set(nova.db.api, 'security_group_get_by_name',
+ return_security_group_without_instances)
+ body = dict(removeSecurityGroup=dict(name="test"))
+- req = webob.Request.blank('/v1.1/123/servers/1/action')
++ req = webob.Request.blank('/v1.1/fake/servers/1/action')
+ req.headers['Content-Type'] = 'application/json'
+ req.method = 'POST'
+ req.body = json.dumps(body)
+@@ -569,7 +569,7 @@ class TestSecurityGroups(test.TestCase):
+ self.mox.ReplayAll()
+
+ body = dict(removeSecurityGroup=dict(name="test"))
+- req = webob.Request.blank('/v1.1/123/servers/1/action')
++ req = webob.Request.blank('/v1.1/fake/servers/1/action')
+ req.headers['Content-Type'] = 'application/json'
+ req.method = 'POST'
+ req.body = json.dumps(body)
+@@ -586,7 +586,7 @@ class TestSecurityGroups(test.TestCase):
+ return_security_group)
+ self.mox.ReplayAll()
+
+- req = webob.Request.blank('/v1.1/123/servers/1/action')
++ req = webob.Request.blank('/v1.1/fake/servers/1/action')
+ req.headers['Content-Type'] = 'application/xml'
+ req.method = 'POST'
+ req.body = """<removeSecurityGroup>
+@@ -624,7 +624,7 @@ class TestSecurityGroupRules(test.TestCase):
+ super(TestSecurityGroupRules, self).tearDown()
+
+ def _create_security_group_rule_json(self, rules):
+- request = webob.Request.blank('/v1.1/123/os-security-group-rules')
++ request = webob.Request.blank('/v1.1/fake/os-security-group-rules')
+ request.headers['Content-Type'] = 'application/json'
+ request.method = 'POST'
+ request.body = json.dumps(rules)
+@@ -632,7 +632,7 @@ class TestSecurityGroupRules(test.TestCase):
+ return response
+
+ def _delete_security_group_rule(self, id):
+- request = webob.Request.blank('/v1.1/123/os-security-group-rules/%s'
++ request = webob.Request.blank('/v1.1/fake/os-security-group-rules/%s'
+ % id)
+ request.method = 'DELETE'
+ response = request.get_response(fakes.wsgi_app())
+@@ -690,7 +690,7 @@ class TestSecurityGroupRules(test.TestCase):
+ self.assertEquals(response.status_int, 400)
+
+ def test_create_with_no_body_json(self):
+- request = webob.Request.blank('/v1.1/123/os-security-group-rules')
++ request = webob.Request.blank('/v1.1/fake/os-security-group-rules')
+ request.headers['Content-Type'] = 'application/json'
+ request.method = 'POST'
+ request.body = json.dumps(None)
+@@ -698,7 +698,7 @@ class TestSecurityGroupRules(test.TestCase):
+ self.assertEquals(response.status_int, 422)
+
+ def test_create_with_no_security_group_rule_in_body_json(self):
+- request = webob.Request.blank('/v1.1/123/os-security-group-rules')
++ request = webob.Request.blank('/v1.1/fake/os-security-group-rules')
+ request.headers['Content-Type'] = 'application/json'
+ request.method = 'POST'
+ body_dict = {'test': "test"}
+diff --git a/nova/tests/api/openstack/contrib/test_simple_tenant_usage.py b/nova/tests/api/openstack/contrib/test_simple_tenant_usage.py
+index 2430b9d..0e13e36 100644
+--- a/nova/tests/api/openstack/contrib/test_simple_tenant_usage.py
++++ b/nova/tests/api/openstack/contrib/test_simple_tenant_usage.py
+@@ -87,8 +87,8 @@ class SimpleTenantUsageTest(test.TestCase):
+
+ def test_verify_index(self):
+ req = webob.Request.blank(
+- '/v1.1/123/os-simple-tenant-usage?start=%s&end=%s' %
+- (START.isoformat(), STOP.isoformat()))
++ '/v1.1/faketenant_0/os-simple-tenant-usage?start=%s&end=%s' %
++ (START.isoformat(), STOP.isoformat()))
+ req.method = "GET"
+ req.headers["content-type"] = "application/json"
+
+@@ -113,7 +113,7 @@ class SimpleTenantUsageTest(test.TestCase):
+
+ def test_verify_detailed_index(self):
+ req = webob.Request.blank(
+- '/v1.1/123/os-simple-tenant-usage?'
++ '/v1.1/faketenant_0/os-simple-tenant-usage?'
+ 'detailed=1&start=%s&end=%s' %
+ (START.isoformat(), STOP.isoformat()))
+ req.method = "GET"
+@@ -131,13 +131,14 @@ class SimpleTenantUsageTest(test.TestCase):
+
+ def test_verify_index_fails_for_nonadmin(self):
+ req = webob.Request.blank(
+- '/v1.1/123/os-simple-tenant-usage?'
++ '/v1.1/faketenant_0/os-simple-tenant-usage?'
+ 'detailed=1&start=%s&end=%s' %
+ (START.isoformat(), STOP.isoformat()))
+ req.method = "GET"
+ req.headers["content-type"] = "application/json"
+
+- res = req.get_response(fakes.wsgi_app())
++ res = req.get_response(fakes.wsgi_app(
++ fake_auth_context=self.user_context))
+ self.assertEqual(res.status_int, 403)
+
+ def test_verify_show(self):
+diff --git a/nova/tests/api/openstack/contrib/test_virtual_interfaces.py b/nova/tests/api/openstack/contrib/test_virtual_interfaces.py
+index 1db253b..e472407 100644
+--- a/nova/tests/api/openstack/contrib/test_virtual_interfaces.py
++++ b/nova/tests/api/openstack/contrib/test_virtual_interfaces.py
+@@ -43,7 +43,7 @@ class ServerVirtualInterfaceTest(test.TestCase):
+ super(ServerVirtualInterfaceTest, self).tearDown()
+
+ def test_get_virtual_interfaces_list(self):
+- req = webob.Request.blank('/v1.1/123/servers/1/os-virtual-interfaces')
++ req = webob.Request.blank('/v1.1/fake/servers/1/os-virtual-interfaces')
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(res.status_int, 200)
+ res_dict = json.loads(res.body)
+diff --git a/nova/tests/api/openstack/contrib/test_vsa.py b/nova/tests/api/openstack/contrib/test_vsa.py
+index 311b6cb..2e171bf 100644
+--- a/nova/tests/api/openstack/contrib/test_vsa.py
++++ b/nova/tests/api/openstack/contrib/test_vsa.py
+@@ -119,7 +119,7 @@ class VSAApiTest(test.TestCase):
+ vsa = {"displayName": "VSA Test Name",
+ "displayDescription": "VSA Test Desc"}
+ body = dict(vsa=vsa)
+- req = webob.Request.blank('/v1.1/777/zadr-vsa')
++ req = webob.Request.blank('/v1.1/fake/zadr-vsa')
+ req.method = 'POST'
+ req.body = json.dumps(body)
+ req.headers['content-type'] = 'application/json'
+@@ -138,7 +138,7 @@ class VSAApiTest(test.TestCase):
+ vsa['displayDescription'])
+
+ def test_vsa_create_no_body(self):
+- req = webob.Request.blank('/v1.1/777/zadr-vsa')
++ req = webob.Request.blank('/v1.1/fake/zadr-vsa')
+ req.method = 'POST'
+ req.body = json.dumps({})
+ req.headers['content-type'] = 'application/json'
+@@ -151,7 +151,7 @@ class VSAApiTest(test.TestCase):
+ last_param = {}
+
+ vsa_id = 123
+- req = webob.Request.blank('/v1.1/777/zadr-vsa/%d' % vsa_id)
++ req = webob.Request.blank('/v1.1/fake/zadr-vsa/%d' % vsa_id)
+ req.method = 'DELETE'
+
+ resp = req.get_response(fakes.wsgi_app())
+@@ -163,7 +163,7 @@ class VSAApiTest(test.TestCase):
+ last_param = {}
+
+ vsa_id = 234
+- req = webob.Request.blank('/v1.1/777/zadr-vsa/%d' % vsa_id)
++ req = webob.Request.blank('/v1.1/fake/zadr-vsa/%d' % vsa_id)
+ req.method = 'DELETE'
+
+ resp = req.get_response(fakes.wsgi_app())
+@@ -175,7 +175,7 @@ class VSAApiTest(test.TestCase):
+ last_param = {}
+
+ vsa_id = 123
+- req = webob.Request.blank('/v1.1/777/zadr-vsa/%d' % vsa_id)
++ req = webob.Request.blank('/v1.1/fake/zadr-vsa/%d' % vsa_id)
+ req.method = 'GET'
+ resp = req.get_response(fakes.wsgi_app())
+ self.assertEqual(resp.status_int, 200)
+@@ -190,14 +190,14 @@ class VSAApiTest(test.TestCase):
+ last_param = {}
+
+ vsa_id = 234
+- req = webob.Request.blank('/v1.1/777/zadr-vsa/%d' % vsa_id)
++ req = webob.Request.blank('/v1.1/fake/zadr-vsa/%d' % vsa_id)
+ req.method = 'GET'
+ resp = req.get_response(fakes.wsgi_app())
+ self.assertEqual(resp.status_int, 404)
+ self.assertEqual(str(last_param['vsa_id']), str(vsa_id))
+
+ def test_vsa_index(self):
+- req = webob.Request.blank('/v1.1/777/zadr-vsa')
++ req = webob.Request.blank('/v1.1/fake/zadr-vsa')
+ req.method = 'GET'
+ resp = req.get_response(fakes.wsgi_app())
+ self.assertEqual(resp.status_int, 200)
+@@ -212,7 +212,7 @@ class VSAApiTest(test.TestCase):
+ self.assertEqual(resp_vsa['id'], 123)
+
+ def test_vsa_detail(self):
+- req = webob.Request.blank('/v1.1/777/zadr-vsa/detail')
++ req = webob.Request.blank('/v1.1/fake/zadr-vsa/detail')
+ req.method = 'GET'
+ resp = req.get_response(fakes.wsgi_app())
+ self.assertEqual(resp.status_int, 200)
+@@ -328,7 +328,8 @@ class VSAVolumeApiTest(test.TestCase):
+ "displayName": "VSA Volume Test Name",
+ "displayDescription": "VSA Volume Test Desc"}
+ body = {self.test_obj: vol}
+- req = webob.Request.blank('/v1.1/777/zadr-vsa/123/%s' % self.test_objs)
++ req = webob.Request.blank('/v1.1/fake/zadr-vsa/123/%s' %
++ self.test_objs)
+ req.method = 'POST'
+ req.body = json.dumps(body)
+ req.headers['content-type'] = 'application/json'
+@@ -349,7 +350,8 @@ class VSAVolumeApiTest(test.TestCase):
+ self.assertEqual(resp.status_int, 400)
+
+ def test_vsa_volume_create_no_body(self):
+- req = webob.Request.blank('/v1.1/777/zadr-vsa/123/%s' % self.test_objs)
++ req = webob.Request.blank('/v1.1/fake/zadr-vsa/123/%s' %
++ self.test_objs)
+ req.method = 'POST'
+ req.body = json.dumps({})
+ req.headers['content-type'] = 'application/json'
+@@ -361,25 +363,26 @@ class VSAVolumeApiTest(test.TestCase):
+ self.assertEqual(resp.status_int, 400)
+
+ def test_vsa_volume_index(self):
+- req = webob.Request.blank('/v1.1/777/zadr-vsa/123/%s' % self.test_objs)
++ req = webob.Request.blank('/v1.1/fake/zadr-vsa/123/%s' %
++ self.test_objs)
+ resp = req.get_response(fakes.wsgi_app())
+ self.assertEqual(resp.status_int, 200)
+
+ def test_vsa_volume_detail(self):
+- req = webob.Request.blank('/v1.1/777/zadr-vsa/123/%s/detail' % \
++ req = webob.Request.blank('/v1.1/fake/zadr-vsa/123/%s/detail' % \
+ self.test_objs)
+ resp = req.get_response(fakes.wsgi_app())
+ self.assertEqual(resp.status_int, 200)
+
+ def test_vsa_volume_show(self):
+ obj_num = 234 if self.test_objs == "volumes" else 345
+- req = webob.Request.blank('/v1.1/777/zadr-vsa/123/%s/%s' % \
++ req = webob.Request.blank('/v1.1/fake/zadr-vsa/123/%s/%s' % \
+ (self.test_objs, obj_num))
+ resp = req.get_response(fakes.wsgi_app())
+ self.assertEqual(resp.status_int, 200)
+
+ def test_vsa_volume_show_no_vsa_assignment(self):
+- req = webob.Request.blank('/v1.1/777/zadr-vsa/4/%s/333' % \
++ req = webob.Request.blank('/v1.1/fake/zadr-vsa/4/%s/333' % \
+ (self.test_objs))
+ resp = req.get_response(fakes.wsgi_app())
+ self.assertEqual(resp.status_int, 400)
+@@ -387,7 +390,7 @@ class VSAVolumeApiTest(test.TestCase):
+ def test_vsa_volume_show_no_volume(self):
+ self.stubs.Set(volume.api.API, "get", stub_volume_get_notfound)
+
+- req = webob.Request.blank('/v1.1/777/zadr-vsa/123/%s/333' % \
++ req = webob.Request.blank('/v1.1/fake/zadr-vsa/123/%s/333' % \
+ (self.test_objs))
+ resp = req.get_response(fakes.wsgi_app())
+ self.assertEqual(resp.status_int, 404)
+@@ -397,7 +400,7 @@ class VSAVolumeApiTest(test.TestCase):
+ update = {"status": "available",
+ "displayName": "Test Display name"}
+ body = {self.test_obj: update}
+- req = webob.Request.blank('/v1.1/777/zadr-vsa/123/%s/%s' % \
++ req = webob.Request.blank('/v1.1/fake/zadr-vsa/123/%s/%s' % \
+ (self.test_objs, obj_num))
+ req.method = 'PUT'
+ req.body = json.dumps(body)
+@@ -411,7 +414,7 @@ class VSAVolumeApiTest(test.TestCase):
+
+ def test_vsa_volume_delete(self):
+ obj_num = 234 if self.test_objs == "volumes" else 345
+- req = webob.Request.blank('/v1.1/777/zadr-vsa/123/%s/%s' % \
++ req = webob.Request.blank('/v1.1/fake/zadr-vsa/123/%s/%s' % \
+ (self.test_objs, obj_num))
+ req.method = 'DELETE'
+ resp = req.get_response(fakes.wsgi_app())
+@@ -421,7 +424,7 @@ class VSAVolumeApiTest(test.TestCase):
+ self.assertEqual(resp.status_int, 400)
+
+ def test_vsa_volume_delete_no_vsa_assignment(self):
+- req = webob.Request.blank('/v1.1/777/zadr-vsa/4/%s/333' % \
++ req = webob.Request.blank('/v1.1/fake/zadr-vsa/4/%s/333' % \
+ (self.test_objs))
+ req.method = 'DELETE'
+ resp = req.get_response(fakes.wsgi_app())
+@@ -430,7 +433,7 @@ class VSAVolumeApiTest(test.TestCase):
+ def test_vsa_volume_delete_no_volume(self):
+ self.stubs.Set(volume.api.API, "get", stub_volume_get_notfound)
+
+- req = webob.Request.blank('/v1.1/777/zadr-vsa/123/%s/333' % \
++ req = webob.Request.blank('/v1.1/fake/zadr-vsa/123/%s/333' % \
+ (self.test_objs))
+ req.method = 'DELETE'
+ resp = req.get_response(fakes.wsgi_app())
+diff --git a/nova/tests/api/openstack/test_extensions.py b/nova/tests/api/openstack/test_extensions.py
+index 0e9f9fa..2beb4b6 100644
+--- a/nova/tests/api/openstack/test_extensions.py
++++ b/nova/tests/api/openstack/test_extensions.py
+@@ -107,7 +107,7 @@ class ExtensionControllerTest(test.TestCase):
+ def test_list_extensions_json(self):
+ app = openstack.APIRouterV11()
+ ext_midware = extensions.ExtensionMiddleware(app)
+- request = webob.Request.blank("/123/extensions")
++ request = webob.Request.blank("/fake/extensions")
+ response = request.get_response(ext_midware)
+ self.assertEqual(200, response.status_int)
+
+@@ -133,7 +133,7 @@ class ExtensionControllerTest(test.TestCase):
+ def test_get_extension_json(self):
+ app = openstack.APIRouterV11()
+ ext_midware = extensions.ExtensionMiddleware(app)
+- request = webob.Request.blank("/123/extensions/FOXNSOX")
++ request = webob.Request.blank("/fake/extensions/FOXNSOX")
+ response = request.get_response(ext_midware)
+ self.assertEqual(200, response.status_int)
+
+@@ -149,14 +149,14 @@ class ExtensionControllerTest(test.TestCase):
+ def test_get_non_existing_extension_json(self):
+ app = openstack.APIRouterV11()
+ ext_midware = extensions.ExtensionMiddleware(app)
+- request = webob.Request.blank("/123/extensions/4")
++ request = webob.Request.blank("/fake/extensions/4")
+ response = request.get_response(ext_midware)
+ self.assertEqual(404, response.status_int)
+
+ def test_list_extensions_xml(self):
+ app = openstack.APIRouterV11()
+ ext_midware = extensions.ExtensionMiddleware(app)
+- request = webob.Request.blank("/123/extensions")
++ request = webob.Request.blank("/fake/extensions")
+ request.accept = "application/xml"
+ response = request.get_response(ext_midware)
+ self.assertEqual(200, response.status_int)
+@@ -183,7 +183,7 @@ class ExtensionControllerTest(test.TestCase):
+ def test_get_extension_xml(self):
+ app = openstack.APIRouterV11()
+ ext_midware = extensions.ExtensionMiddleware(app)
+- request = webob.Request.blank("/123/extensions/FOXNSOX")
++ request = webob.Request.blank("/fake/extensions/FOXNSOX")
+ request.accept = "application/xml"
+ response = request.get_response(ext_midware)
+ self.assertEqual(200, response.status_int)
+@@ -224,7 +224,7 @@ class ResourceExtensionTest(test.TestCase):
+ manager = StubExtensionManager(res_ext)
+ app = openstack.APIRouterV11()
+ ext_midware = extensions.ExtensionMiddleware(app, manager)
+- request = webob.Request.blank("/123/tweedles")
++ request = webob.Request.blank("/fake/tweedles")
+ response = request.get_response(ext_midware)
+ self.assertEqual(200, response.status_int)
+ self.assertEqual(response_body, response.body)
+@@ -235,7 +235,7 @@ class ResourceExtensionTest(test.TestCase):
+ manager = StubExtensionManager(res_ext)
+ app = openstack.APIRouterV11()
+ ext_midware = extensions.ExtensionMiddleware(app, manager)
+- request = webob.Request.blank("/123/tweedles")
++ request = webob.Request.blank("/fake/tweedles")
+ response = request.get_response(ext_midware)
+ self.assertEqual(200, response.status_int)
+ self.assertEqual(response_body, response.body)
+@@ -259,7 +259,7 @@ class ExtensionManagerTest(test.TestCase):
+ def test_get_resources(self):
+ app = openstack.APIRouterV11()
+ ext_midware = extensions.ExtensionMiddleware(app)
+- request = webob.Request.blank("/123/foxnsocks")
++ request = webob.Request.blank("/fake/foxnsocks")
+ response = request.get_response(ext_midware)
+ self.assertEqual(200, response.status_int)
+ self.assertEqual(response_body, response.body)
+@@ -292,7 +292,7 @@ class ActionExtensionTest(test.TestCase):
+
+ def test_extended_action(self):
+ body = dict(add_tweedle=dict(name="test"))
+- url = "/123/servers/1/action"
++ url = "/fake/servers/1/action"
+ response = self._send_server_action_request(url, body)
+ self.assertEqual(200, response.status_int)
+ self.assertEqual("Tweedle Beetle Added.", response.body)
+@@ -304,13 +304,13 @@ class ActionExtensionTest(test.TestCase):
+
+ def test_invalid_action_body(self):
+ body = dict(blah=dict(name="test")) # Doesn't exist
+- url = "/123/servers/1/action"
++ url = "/fake/servers/1/action"
+ response = self._send_server_action_request(url, body)
+ self.assertEqual(400, response.status_int)
+
+ def test_invalid_action(self):
+ body = dict(blah=dict(name="test"))
+- url = "/123/fdsa/1/action"
++ url = "/fake/fdsa/1/action"
+ response = self._send_server_action_request(url, body)
+ self.assertEqual(404, response.status_int)
+
+@@ -332,13 +332,13 @@ class RequestExtensionTest(test.TestCase):
+ return res
+
+ req_ext = extensions.RequestExtension('GET',
+- '/v1.1/123/flavors/:(id)',
++ '/v1.1/fake/flavors/:(id)',
+ _req_handler)
+
+ manager = StubExtensionManager(None, None, req_ext)
+ app = fakes.wsgi_app()
+ ext_midware = extensions.ExtensionMiddleware(app, manager)
+- request = webob.Request.blank("/v1.1/123/flavors/1?chewing=bluegoo")
++ request = webob.Request.blank("/v1.1/fake/flavors/1?chewing=bluegoo")
+ request.environ['api.version'] = '1.1'
+ response = request.get_response(ext_midware)
+ self.assertEqual(200, response.status_int)
+@@ -349,7 +349,7 @@ class RequestExtensionTest(test.TestCase):
+
+ app = fakes.wsgi_app()
+ ext_midware = extensions.ExtensionMiddleware(app)
+- request = webob.Request.blank("/v1.1/123/flavors/1?chewing=newblue")
++ request = webob.Request.blank("/v1.1/fake/flavors/1?chewing=newblue")
+ request.environ['api.version'] = '1.1'
+ response = request.get_response(ext_midware)
+ self.assertEqual(200, response.status_int)
+diff --git a/nova/tests/api/openstack/test_flavors_extra_specs.py b/nova/tests/api/openstack/test_flavors_extra_specs.py
+index f382d06..53cfa04 100644
+--- a/nova/tests/api/openstack/test_flavors_extra_specs.py
++++ b/nova/tests/api/openstack/test_flavors_extra_specs.py
+@@ -63,7 +63,7 @@ class FlavorsExtraSpecsTest(test.TestCase):
+ def test_index(self):
+ self.stubs.Set(nova.db.api, 'instance_type_extra_specs_get',
+ return_flavor_extra_specs)
+- request = webob.Request.blank('/v1.1/123/flavors/1/os-extra_specs')
++ request = webob.Request.blank('/v1.1/fake/flavors/1/os-extra_specs')
+ res = request.get_response(fakes.wsgi_app())
+ self.assertEqual(200, res.status_int)
+ res_dict = json.loads(res.body)
+@@ -73,7 +73,7 @@ class FlavorsExtraSpecsTest(test.TestCase):
+ def test_index_no_data(self):
+ self.stubs.Set(nova.db.api, 'instance_type_extra_specs_get',
+ return_empty_flavor_extra_specs)
+- req = webob.Request.blank('/v1.1/123/flavors/1/os-extra_specs')
++ req = webob.Request.blank('/v1.1/fake/flavors/1/os-extra_specs')
+ res = req.get_response(fakes.wsgi_app())
+ res_dict = json.loads(res.body)
+ self.assertEqual(200, res.status_int)
+@@ -83,7 +83,7 @@ class FlavorsExtraSpecsTest(test.TestCase):
+ def test_show(self):
+ self.stubs.Set(nova.db.api, 'instance_type_extra_specs_get',
+ return_flavor_extra_specs)
+- req = webob.Request.blank('/v1.1/123/flavors/1/os-extra_specs/key5')
++ req = webob.Request.blank('/v1.1/fake/flavors/1/os-extra_specs/key5')
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(200, res.status_int)
+ res_dict = json.loads(res.body)
+@@ -93,7 +93,7 @@ class FlavorsExtraSpecsTest(test.TestCase):
+ def test_show_spec_not_found(self):
+ self.stubs.Set(nova.db.api, 'instance_type_extra_specs_get',
+ return_empty_flavor_extra_specs)
+- req = webob.Request.blank('/v1.1/123/flavors/1/os-extra_specs/key6')
++ req = webob.Request.blank('/v1.1/fake/flavors/1/os-extra_specs/key6')
+ res = req.get_response(fakes.wsgi_app())
+ res_dict = json.loads(res.body)
+ self.assertEqual(404, res.status_int)
+@@ -101,7 +101,7 @@ class FlavorsExtraSpecsTest(test.TestCase):
+ def test_delete(self):
+ self.stubs.Set(nova.db.api, 'instance_type_extra_specs_delete',
+ delete_flavor_extra_specs)
+- req = webob.Request.blank('/v1.1/123/flavors/1/os-extra_specs/key5')
++ req = webob.Request.blank('/v1.1/fake/flavors/1/os-extra_specs/key5')
+ req.method = 'DELETE'
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(200, res.status_int)
+@@ -110,7 +110,7 @@ class FlavorsExtraSpecsTest(test.TestCase):
+ self.stubs.Set(nova.db.api,
+ 'instance_type_extra_specs_update_or_create',
+ return_create_flavor_extra_specs)
+- req = webob.Request.blank('/v1.1/123/flavors/1/os-extra_specs')
++ req = webob.Request.blank('/v1.1/fake/flavors/1/os-extra_specs')
+ req.method = 'POST'
+ req.body = '{"extra_specs": {"key1": "value1"}}'
+ req.headers["content-type"] = "application/json"
+@@ -124,7 +124,7 @@ class FlavorsExtraSpecsTest(test.TestCase):
+ self.stubs.Set(nova.db.api,
+ 'instance_type_extra_specs_update_or_create',
+ return_create_flavor_extra_specs)
+- req = webob.Request.blank('/v1.1/123/flavors/1/os-extra_specs')
++ req = webob.Request.blank('/v1.1/fake/flavors/1/os-extra_specs')
+ req.method = 'POST'
+ req.headers["content-type"] = "application/json"
+ res = req.get_response(fakes.wsgi_app())
+@@ -134,7 +134,7 @@ class FlavorsExtraSpecsTest(test.TestCase):
+ self.stubs.Set(nova.db.api,
+ 'instance_type_extra_specs_update_or_create',
+ return_create_flavor_extra_specs)
+- req = webob.Request.blank('/v1.1/123/flavors/1/os-extra_specs/key1')
++ req = webob.Request.blank('/v1.1/fake/flavors/1/os-extra_specs/key1')
+ req.method = 'PUT'
+ req.body = '{"key1": "value1"}'
+ req.headers["content-type"] = "application/json"
+@@ -148,7 +148,7 @@ class FlavorsExtraSpecsTest(test.TestCase):
+ self.stubs.Set(nova.db.api,
+ 'instance_type_extra_specs_update_or_create',
+ return_create_flavor_extra_specs)
+- req = webob.Request.blank('/v1.1/123/flavors/1/os-extra_specs/key1')
++ req = webob.Request.blank('/v1.1/fake/flavors/1/os-extra_specs/key1')
+ req.method = 'PUT'
+ req.headers["content-type"] = "application/json"
+ res = req.get_response(fakes.wsgi_app())
+@@ -158,7 +158,7 @@ class FlavorsExtraSpecsTest(test.TestCase):
+ self.stubs.Set(nova.db.api,
+ 'instance_type_extra_specs_update_or_create',
+ return_create_flavor_extra_specs)
+- req = webob.Request.blank('/v1.1/123/flavors/1/os-extra_specs/key1')
++ req = webob.Request.blank('/v1.1/fake/flavors/1/os-extra_specs/key1')
+ req.method = 'PUT'
+ req.body = '{"key1": "value1", "key2": "value2"}'
+ req.headers["content-type"] = "application/json"
+@@ -169,7 +169,7 @@ class FlavorsExtraSpecsTest(test.TestCase):
+ self.stubs.Set(nova.db.api,
+ 'instance_type_extra_specs_update_or_create',
+ return_create_flavor_extra_specs)
+- req = webob.Request.blank('/v1.1/123/flavors/1/os-extra_specs/bad')
++ req = webob.Request.blank('/v1.1/fake/flavors/1/os-extra_specs/bad')
+ req.method = 'PUT'
+ req.body = '{"key1": "value1"}'
+ req.headers["content-type"] = "application/json"
+diff --git a/nova/tests/api/openstack/test_image_metadata.py b/nova/tests/api/openstack/test_image_metadata.py
+index fe42e35..ea5bba5 100644
+--- a/nova/tests/api/openstack/test_image_metadata.py
++++ b/nova/tests/api/openstack/test_image_metadata.py
+@@ -90,7 +90,7 @@ class ImageMetaDataTest(test.TestCase):
+ fakes.stub_out_glance(self.stubs, self.IMAGE_FIXTURES)
+
+ def test_index(self):
+- req = webob.Request.blank('/v1.1/123/images/1/metadata')
++ req = webob.Request.blank('/v1.1/fake/images/1/metadata')
+ res = req.get_response(fakes.wsgi_app())
+ res_dict = json.loads(res.body)
+ self.assertEqual(200, res.status_int)
+diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py
+index 43633be..6412654 100644
+--- a/nova/tests/api/openstack/test_servers.py
++++ b/nova/tests/api/openstack/test_servers.py
+@@ -1232,7 +1232,8 @@ class ServersTest(test.TestCase):
+ fake_get_all)
+ self.flags(allow_admin_api=True)
+
+- req = webob.Request.blank('/v1.1/fake/servers?tenant_id=faketenant')
++ req = webob.Request.blank(
++ '/v1.1/testproject/servers?tenant_id=faketenant')
+ # Use admin context
+ context = nova.context.RequestContext('testuser', 'testproject',
+ is_admin=True)
+@@ -1354,7 +1355,7 @@ class ServersTest(test.TestCase):
+ self.stubs.Set(nova.compute.API, 'get_all', fake_get_all)
+
+ query_str = "name=foo&ip=10.*&status=active&unknown_option=meow"
+- req = webob.Request.blank('/v1.1/fake/servers?%s' % query_str)
++ req = webob.Request.blank('/v1.1/testproject/servers?%s' % query_str)
+ # Request admin context
+ context = nova.context.RequestContext('testuser', 'testproject',
+ is_admin=True)
+@@ -1388,7 +1389,7 @@ class ServersTest(test.TestCase):
+ self.stubs.Set(nova.compute.API, 'get_all', fake_get_all)
+
+ query_str = "name=foo&ip=10.*&status=active&unknown_option=meow"
+- req = webob.Request.blank('/v1.1/fake/servers?%s' % query_str)
++ req = webob.Request.blank('/v1.1/testproject/servers?%s' % query_str)
+ # Request admin context
+ context = nova.context.RequestContext('testuser', 'testproject',
+ is_admin=False)
+@@ -1421,7 +1422,7 @@ class ServersTest(test.TestCase):
+ self.stubs.Set(nova.compute.API, 'get_all', fake_get_all)
+
+ query_str = "name=foo&ip=10.*&status=active&unknown_option=meow"
+- req = webob.Request.blank('/v1.1/fake/servers?%s' % query_str)
++ req = webob.Request.blank('/v1.1/testproject/servers?%s' % query_str)
+ # Request admin context
+ context = nova.context.RequestContext('testuser', 'testproject',
+ is_admin=True)
+@@ -1447,7 +1448,7 @@ class ServersTest(test.TestCase):
+
+ self.stubs.Set(nova.compute.API, 'get_all', fake_get_all)
+
+- req = webob.Request.blank('/v1.1/fake/servers?ip=10\..*')
++ req = webob.Request.blank('/v1.1/testproject/servers?ip=10\..*')
+ # Request admin context
+ context = nova.context.RequestContext('testuser', 'testproject',
+ is_admin=True)
+@@ -1473,7 +1474,7 @@ class ServersTest(test.TestCase):
+
+ self.stubs.Set(nova.compute.API, 'get_all', fake_get_all)
+
+- req = webob.Request.blank('/v1.1/fake/servers?ip6=ffff.*')
++ req = webob.Request.blank('/v1.1/testproject/servers?ip6=ffff.*')
+ # Request admin context
+ context = nova.context.RequestContext('testuser', 'testproject',
+ is_admin=True)
+@@ -1646,7 +1647,7 @@ class ServersTest(test.TestCase):
+ raise exception.InstanceSnapshotting
+ self.stubs.Set(nova.compute.API, 'snapshot', snapshot)
+
+- req = webob.Request.blank('/v1.1/fakes/servers/1/action')
++ req = webob.Request.blank('/v1.1/fake/servers/1/action')
+ req.method = 'POST'
+ req.body = json.dumps({
+ "createImage": {
+@@ -1719,8 +1720,8 @@ class ServersTest(test.TestCase):
+ self._setup_for_create_instance()
+
+ # proper local hrefs must start with 'http://localhost/v1.1/'
+- image_href = 'http://localhost/v1.1/123/images/2'
+- flavor_ref = 'http://localhost/123/flavors/3'
++ image_href = 'http://localhost/v1.1/fake/images/2'
++ flavor_ref = 'http://localhost/fake/flavors/3'
+ access_ipv4 = '1.2.3.4'
+ access_ipv6 = 'fead::1234'
+ expected_flavor = {
+@@ -1728,7 +1729,7 @@ class ServersTest(test.TestCase):
+ "links": [
+ {
+ "rel": "bookmark",
+- "href": 'http://localhost/123/flavors/3',
++ "href": 'http://localhost/fake/flavors/3',
+ },
+ ],
+ }
+@@ -1737,7 +1738,7 @@ class ServersTest(test.TestCase):
+ "links": [
+ {
+ "rel": "bookmark",
+- "href": 'http://localhost/123/images/2',
++ "href": 'http://localhost/fake/images/2',
+ },
+ ],
+ }
+@@ -1761,7 +1762,7 @@ class ServersTest(test.TestCase):
+ },
+ }
+
+- req = webob.Request.blank('/v1.1/123/servers')
++ req = webob.Request.blank('/v1.1/fake/servers')
+ req.method = 'POST'
+ req.body = json.dumps(body)
+ req.headers["content-type"] = "application/json"
+@@ -1784,7 +1785,7 @@ class ServersTest(test.TestCase):
+
+ # proper local hrefs must start with 'http://localhost/v1.1/'
+ image_href = 'http://localhost/v1.1/images/2'
+- flavor_ref = 'http://localhost/123/flavors/3'
++ flavor_ref = 'http://localhost/fake/flavors/3'
+ expected_flavor = {
+ "id": "3",
+ "links": [
+@@ -1889,13 +1890,13 @@ class ServersTest(test.TestCase):
+ def test_create_instance_v1_1_invalid_flavor_id_int(self):
+ self._setup_for_create_instance()
+
+- image_href = 'http://localhost/v1.1/123/images/2'
++ image_href = 'http://localhost/v1.1/fake/images/2'
+ flavor_ref = -1
+ body = dict(server=dict(
+ name='server_test', imageRef=image_href, flavorRef=flavor_ref,
+ metadata={'hello': 'world', 'open': 'stack'},
+ personality={}))
+- req = webob.Request.blank('/v1.1/123/servers')
++ req = webob.Request.blank('/v1.1/fake/servers')
+ req.method = 'POST'
+ req.body = json.dumps(body)
+ req.headers["content-type"] = "application/json"
+@@ -1922,8 +1923,8 @@ class ServersTest(test.TestCase):
+ self.config_drive = True
+ self._setup_for_create_instance()
+
+- image_href = 'http://localhost/v1.1/123/images/2'
+- flavor_ref = 'http://localhost/v1.1/123/flavors/3'
++ image_href = 'http://localhost/v1.1/fake/images/2'
++ flavor_ref = 'http://localhost/v1.1/fake/flavors/3'
+ body = {
+ 'server': {
+ 'name': 'config_drive_test',
+@@ -1938,7 +1939,7 @@ class ServersTest(test.TestCase):
+ },
+ }
+
+- req = webob.Request.blank('/v1.1/123/servers')
++ req = webob.Request.blank('/v1.1/fake/servers')
+ req.method = 'POST'
+ req.body = json.dumps(body)
+ req.headers["content-type"] = "application/json"
+@@ -1954,8 +1955,8 @@ class ServersTest(test.TestCase):
+ self.config_drive = 2
+ self._setup_for_create_instance()
+
+- image_href = 'http://localhost/v1.1/123/images/2'
+- flavor_ref = 'http://localhost/v1.1/123/flavors/3'
++ image_href = 'http://localhost/v1.1/fake/images/2'
++ flavor_ref = 'http://localhost/v1.1/fake/flavors/3'
+ body = {
+ 'server': {
+ 'name': 'config_drive_test',
+@@ -1970,7 +1971,7 @@ class ServersTest(test.TestCase):
+ },
+ }
+
+- req = webob.Request.blank('/v1.1/123/servers')
++ req = webob.Request.blank('/v1.1/fake/servers')
+ req.method = 'POST'
+ req.body = json.dumps(body)
+ req.headers["content-type"] = "application/json"
+@@ -1987,8 +1988,8 @@ class ServersTest(test.TestCase):
+ self.config_drive = "asdf"
+ self._setup_for_create_instance()
+
+- image_href = 'http://localhost/v1.1/123/images/2'
+- flavor_ref = 'http://localhost/v1.1/123/flavors/3'
++ image_href = 'http://localhost/v1.1/fake/images/2'
++ flavor_ref = 'http://localhost/v1.1/fake/flavors/3'
+ body = {
+ 'server': {
+ 'name': 'config_drive_test',
+@@ -2003,7 +2004,7 @@ class ServersTest(test.TestCase):
+ },
+ }
+
+- req = webob.Request.blank('/v1.1/123/servers')
++ req = webob.Request.blank('/v1.1/fake/servers')
+ req.method = 'POST'
+ req.body = json.dumps(body)
+ req.headers["content-type"] = "application/json"
+@@ -2014,8 +2015,8 @@ class ServersTest(test.TestCase):
+ def test_create_instance_without_config_drive_v1_1(self):
+ self._setup_for_create_instance()
+
+- image_href = 'http://localhost/v1.1/123/images/2'
+- flavor_ref = 'http://localhost/v1.1/123/flavors/3'
++ image_href = 'http://localhost/v1.1/fake/images/2'
++ flavor_ref = 'http://localhost/v1.1/fake/flavors/3'
+ body = {
+ 'server': {
+ 'name': 'config_drive_test',
+@@ -2030,7 +2031,7 @@ class ServersTest(test.TestCase):
+ },
+ }
+
+- req = webob.Request.blank('/v1.1/123/servers')
++ req = webob.Request.blank('/v1.1/fake/servers')
+ req.method = 'POST'
+ req.body = json.dumps(body)
+ req.headers["content-type"] = "application/json"
+@@ -2263,7 +2264,7 @@ class ServersTest(test.TestCase):
+ return_server_with_attributes(name='server_test',
+ access_ipv4='0.0.0.0',
+ access_ipv6='beef::0123'))
+- req = webob.Request.blank('/v1.1/123/servers/1')
++ req = webob.Request.blank('/v1.1/fake/servers/1')
+ req.method = 'PUT'
+ req.content_type = 'application/json'
+ body = {'server': {
+@@ -2296,7 +2297,7 @@ class ServersTest(test.TestCase):
+ def test_update_server_access_ipv4_v1_1(self):
+ self.stubs.Set(nova.db.api, 'instance_get',
+ return_server_with_attributes(access_ipv4='0.0.0.0'))
+- req = webob.Request.blank('/v1.1/123/servers/1')
++ req = webob.Request.blank('/v1.1/fake/servers/1')
+ req.method = 'PUT'
+ req.content_type = 'application/json'
+ req.body = json.dumps({'server': {'accessIPv4': '0.0.0.0'}})
+@@ -2309,7 +2310,7 @@ class ServersTest(test.TestCase):
+ def test_update_server_access_ipv6_v1_1(self):
+ self.stubs.Set(nova.db.api, 'instance_get',
+ return_server_with_attributes(access_ipv6='beef::0123'))
+- req = webob.Request.blank('/v1.1/123/servers/1')
++ req = webob.Request.blank('/v1.1/fake/servers/1')
+ req.method = 'PUT'
+ req.content_type = 'application/json'
+ req.body = json.dumps({'server': {'accessIPv6': 'beef::0123'}})
+diff --git a/nova/tests/api/openstack/test_volume_types.py b/nova/tests/api/openstack/test_volume_types.py
+index 192e668..850787f 100644
+--- a/nova/tests/api/openstack/test_volume_types.py
++++ b/nova/tests/api/openstack/test_volume_types.py
+@@ -83,7 +83,7 @@ class VolumeTypesApiTest(test.TestCase):
+ def test_volume_types_index(self):
+ self.stubs.Set(volume_types, 'get_all_types',
+ return_volume_types_get_all_types)
+- req = webob.Request.blank('/v1.1/123/os-volume-types')
++ req = webob.Request.blank('/v1.1/fake/os-volume-types')
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(200, res.status_int)
+ res_dict = json.loads(res.body)
+@@ -97,7 +97,7 @@ class VolumeTypesApiTest(test.TestCase):
+ def test_volume_types_index_no_data(self):
+ self.stubs.Set(volume_types, 'get_all_types',
+ return_empty_volume_types_get_all_types)
+- req = webob.Request.blank('/v1.1/123/os-volume-types')
++ req = webob.Request.blank('/v1.1/fake/os-volume-types')
+ res = req.get_response(fakes.wsgi_app())
+ res_dict = json.loads(res.body)
+ self.assertEqual(200, res.status_int)
+@@ -107,7 +107,7 @@ class VolumeTypesApiTest(test.TestCase):
+ def test_volume_types_show(self):
+ self.stubs.Set(volume_types, 'get_volume_type',
+ return_volume_types_get_volume_type)
+- req = webob.Request.blank('/v1.1/123/os-volume-types/1')
++ req = webob.Request.blank('/v1.1/fake/os-volume-types/1')
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(200, res.status_int)
+ res_dict = json.loads(res.body)
+@@ -118,7 +118,7 @@ class VolumeTypesApiTest(test.TestCase):
+ def test_volume_types_show_not_found(self):
+ self.stubs.Set(volume_types, 'get_volume_type',
+ return_volume_types_get_volume_type)
+- req = webob.Request.blank('/v1.1/123/os-volume-types/777')
++ req = webob.Request.blank('/v1.1/fake/os-volume-types/777')
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(404, res.status_int)
+
+@@ -127,7 +127,7 @@ class VolumeTypesApiTest(test.TestCase):
+ return_volume_types_get_volume_type)
+ self.stubs.Set(volume_types, 'destroy',
+ return_volume_types_destroy)
+- req = webob.Request.blank('/v1.1/123/os-volume-types/1')
++ req = webob.Request.blank('/v1.1/fake/os-volume-types/1')
+ req.method = 'DELETE'
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(200, res.status_int)
+@@ -137,7 +137,7 @@ class VolumeTypesApiTest(test.TestCase):
+ return_volume_types_get_volume_type)
+ self.stubs.Set(volume_types, 'destroy',
+ return_volume_types_destroy)
+- req = webob.Request.blank('/v1.1/123/os-volume-types/777')
++ req = webob.Request.blank('/v1.1/fake/os-volume-types/777')
+ req.method = 'DELETE'
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(404, res.status_int)
+@@ -147,7 +147,7 @@ class VolumeTypesApiTest(test.TestCase):
+ return_volume_types_create)
+ self.stubs.Set(volume_types, 'get_volume_type_by_name',
+ return_volume_types_get_by_name)
+- req = webob.Request.blank('/v1.1/123/os-volume-types')
++ req = webob.Request.blank('/v1.1/fake/os-volume-types')
+ req.method = 'POST'
+ req.body = '{"volume_type": {"name": "vol_type_1", '\
+ '"extra_specs": {"key1": "value1"}}}'
+@@ -164,7 +164,7 @@ class VolumeTypesApiTest(test.TestCase):
+ return_volume_types_create)
+ self.stubs.Set(volume_types, 'get_volume_type_by_name',
+ return_volume_types_get_by_name)
+- req = webob.Request.blank('/v1.1/123/os-volume-types')
++ req = webob.Request.blank('/v1.1/fake/os-volume-types')
+ req.method = 'POST'
+ req.headers["content-type"] = "application/json"
+ res = req.get_response(fakes.wsgi_app())
+diff --git a/nova/tests/api/openstack/test_volume_types_extra_specs.py b/nova/tests/api/openstack/test_volume_types_extra_specs.py
+index 34bdada..ca21f91 100644
+--- a/nova/tests/api/openstack/test_volume_types_extra_specs.py
++++ b/nova/tests/api/openstack/test_volume_types_extra_specs.py
+@@ -62,7 +62,7 @@ class VolumeTypesExtraSpecsTest(test.TestCase):
+ def setUp(self):
+ super(VolumeTypesExtraSpecsTest, self).setUp()
+ fakes.stub_out_key_pair_funcs(self.stubs)
+- self.api_path = '/v1.1/123/os-volume-types/1/extra_specs'
++ self.api_path = '/v1.1/fake/os-volume-types/1/extra_specs'
+
+ def test_index(self):
+ self.stubs.Set(nova.db.api, 'volume_type_extra_specs_get',
+--
+1.7.4.1
+
diff --git a/openstack-nova.spec b/openstack-nova.spec
index d98e34c..03b396d 100644
--- a/openstack-nova.spec
+++ b/openstack-nova.spec
@@ -123,6 +123,7 @@ Patch83: 0083-Bug-751229-Floating-address-range-fixed.patch
Patch84: 0084-Bug-820059-bin-nova-manage.py-VpnCommands.spawn-call.patch
Patch85: 0085-Pass-r-option-to-collie-cluster-status.patch
Patch86: 0086-Fixing-snapshot-failure-task_state.patch
+Patch97: 0097-Do-not-overwrite-project_id-from-request-params.patch
# These are Fedora specific backports from master
Patch87: 0087-Add-INPUT-chain-rule-for-EC2-metadata-requests-lp-85.patch
@@ -367,6 +368,7 @@ This package contains documentation files for nova.
%patch94 -p1
%patch95 -p1
%patch96 -p1
+%patch97 -p1
find . \( -name .gitignore -o -name .placeholder \) -delete
@@ -555,6 +557,7 @@ fi
%changelog
* Wed Jan 11 2012 Pádraig Brady <P at draigBrady.com> - 2011.3-19
- Fix libguestfs support for specified partitions
+- Fix tenant bypass by authenticated users using API (#772202, CVE-2012-0030)
* Fri Jan 6 2012 Mark McLoughlin <markmc at redhat.com> - 2011.3-18
- Fix up recent patches which don't apply
More information about the scm-commits
mailing list