[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