summaryrefslogtreecommitdiffstats
path: root/nova/tests
diff options
context:
space:
mode:
authorBrian Waldon <brian.waldon@rackspace.com>2011-08-23 13:08:42 -0400
committerBrian Waldon <brian.waldon@rackspace.com>2011-08-23 13:08:42 -0400
commit3a64fa3171d424d02c68ec1fbecd4087edb694a0 (patch)
tree6f09840c20cf50cbe2900e6326c8ea6ab19d4656 /nova/tests
parent5ad22e341e0ad5ff62e97906edf7822ee53b4ae9 (diff)
parente23eb5aa5c9810f68f3818cd1119e4993b99a297 (diff)
merging trunk
Diffstat (limited to 'nova/tests')
-rw-r--r--nova/tests/api/openstack/__init__.py29
-rw-r--r--nova/tests/api/openstack/contrib/test_createserverext.py306
-rw-r--r--nova/tests/api/openstack/contrib/test_floating_ips.py20
-rw-r--r--nova/tests/api/openstack/contrib/test_keypairs.py8
-rw-r--r--nova/tests/api/openstack/contrib/test_multinic_xs.py8
-rw-r--r--nova/tests/api/openstack/contrib/test_quotas.py11
-rw-r--r--nova/tests/api/openstack/contrib/test_rescue.py4
-rw-r--r--nova/tests/api/openstack/contrib/test_security_groups.py69
-rw-r--r--nova/tests/api/openstack/contrib/test_virtual_interfaces.py2
-rw-r--r--nova/tests/api/openstack/extensions/foxinsocks.py10
-rw-r--r--nova/tests/api/openstack/test_auth.py8
-rw-r--r--nova/tests/api/openstack/test_extensions.py32
-rw-r--r--nova/tests/api/openstack/test_flavors.py88
-rw-r--r--nova/tests/api/openstack/test_flavors_extra_specs.py22
-rw-r--r--nova/tests/api/openstack/test_image_metadata.py28
-rw-r--r--nova/tests/api/openstack/test_images.py100
-rw-r--r--nova/tests/api/openstack/test_server_actions.py70
-rw-r--r--nova/tests/api/openstack/test_server_metadata.py56
-rw-r--r--nova/tests/api/openstack/test_servers.py1252
-rw-r--r--nova/tests/integrated/api/client.py21
-rw-r--r--nova/tests/integrated/integrated_helpers.py109
-rw-r--r--nova/tests/integrated/test_login.py33
-rw-r--r--nova/tests/integrated/test_servers.py2
-rw-r--r--nova/tests/test_compute.py21
-rw-r--r--nova/tests/test_network.py130
-rw-r--r--nova/tests/test_nova_manage.py52
-rw-r--r--nova/tests/test_utils.py10
27 files changed, 1774 insertions, 727 deletions
diff --git a/nova/tests/api/openstack/__init__.py b/nova/tests/api/openstack/__init__.py
index 458434a81..7d44489a1 100644
--- a/nova/tests/api/openstack/__init__.py
+++ b/nova/tests/api/openstack/__init__.py
@@ -44,14 +44,15 @@ class RateLimitingMiddlewareTest(test.TestCase):
action = middleware.get_action_name(req)
self.assertEqual(action, action_name)
- verify('PUT', '/servers/4', 'PUT')
- verify('DELETE', '/servers/4', 'DELETE')
- verify('POST', '/images/4', 'POST')
- verify('POST', '/servers/4', 'POST servers')
- verify('GET', '/foo?a=4&changes-since=never&b=5', 'GET changes-since')
- verify('GET', '/foo?a=4&monkeys-since=never&b=5', None)
- verify('GET', '/servers/4', None)
- verify('HEAD', '/servers/4', None)
+ verify('PUT', '/fake/servers/4', 'PUT')
+ verify('DELETE', '/fake/servers/4', 'DELETE')
+ verify('POST', '/fake/images/4', 'POST')
+ verify('POST', '/fake/servers/4', 'POST servers')
+ verify('GET', '/fake/foo?a=4&changes-since=never&b=5',
+ 'GET changes-since')
+ verify('GET', '/fake/foo?a=4&monkeys-since=never&b=5', None)
+ verify('GET', '/fake/servers/4', None)
+ verify('HEAD', '/fake/servers/4', None)
def exhaust(self, middleware, method, url, username, times):
req = Request.blank(url, dict(REQUEST_METHOD=method),
@@ -67,13 +68,13 @@ class RateLimitingMiddlewareTest(test.TestCase):
def test_single_action(self):
middleware = RateLimitingMiddleware(simple_wsgi)
- self.exhaust(middleware, 'DELETE', '/servers/4', 'usr1', 100)
- self.exhaust(middleware, 'DELETE', '/servers/4', 'usr2', 100)
+ self.exhaust(middleware, 'DELETE', '/fake/servers/4', 'usr1', 100)
+ self.exhaust(middleware, 'DELETE', '/fake/servers/4', 'usr2', 100)
def test_POST_servers_action_implies_POST_action(self):
middleware = RateLimitingMiddleware(simple_wsgi)
- self.exhaust(middleware, 'POST', '/servers/4', 'usr1', 10)
- self.exhaust(middleware, 'POST', '/images/4', 'usr2', 10)
+ self.exhaust(middleware, 'POST', '/fake/servers/4', 'usr1', 10)
+ self.exhaust(middleware, 'POST', '/fake/images/4', 'usr2', 10)
self.assertTrue(set(middleware.limiter._levels) == \
set(['usr1:POST', 'usr1:POST servers', 'usr2:POST']))
@@ -81,11 +82,11 @@ class RateLimitingMiddlewareTest(test.TestCase):
middleware = RateLimitingMiddleware(simple_wsgi)
# Use up all of our "POST" allowance for the minute, 5 times
for i in range(5):
- self.exhaust(middleware, 'POST', '/servers/4', 'usr1', 10)
+ self.exhaust(middleware, 'POST', '/fake/servers/4', 'usr1', 10)
# Reset the 'POST' action counter.
del middleware.limiter._levels['usr1:POST']
# All 50 daily "POST servers" actions should be all used up
- self.exhaust(middleware, 'POST', '/servers/4', 'usr1', 0)
+ self.exhaust(middleware, 'POST', '/fake/servers/4', 'usr1', 0)
def test_proxy_ctor_works(self):
middleware = RateLimitingMiddleware(simple_wsgi)
diff --git a/nova/tests/api/openstack/contrib/test_createserverext.py b/nova/tests/api/openstack/contrib/test_createserverext.py
new file mode 100644
index 000000000..e5eed14fe
--- /dev/null
+++ b/nova/tests/api/openstack/contrib/test_createserverext.py
@@ -0,0 +1,306 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2010-2011 OpenStack LLC.
+# All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+import base64
+import json
+import unittest
+from xml.dom import minidom
+
+import stubout
+import webob
+
+from nova import exception
+from nova import flags
+from nova import test
+from nova import utils
+import nova.api.openstack
+from nova.api.openstack import servers
+from nova.api.openstack.contrib import createserverext
+import nova.compute.api
+
+import nova.scheduler.api
+import nova.image.fake
+import nova.rpc
+from nova.tests.api.openstack import fakes
+
+
+FLAGS = flags.FLAGS
+FLAGS.verbose = True
+
+FAKE_UUID = 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'
+
+FAKE_NETWORKS = [('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', '10.0.1.12'),
+ ('bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', '10.0.2.12')]
+
+DUPLICATE_NETWORKS = [('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', '10.0.1.12'),
+ ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', '10.0.1.12')]
+
+INVALID_NETWORKS = [('invalid', 'invalid-ip-address')]
+
+
+class CreateserverextTest(test.TestCase):
+
+ def setUp(self):
+ super(CreateserverextTest, self).setUp()
+ self.stubs = stubout.StubOutForTesting()
+ fakes.FakeAuthManager.auth_data = {}
+ fakes.FakeAuthDatabase.data = {}
+ fakes.stub_out_auth(self.stubs)
+ fakes.stub_out_image_service(self.stubs)
+ fakes.stub_out_key_pair_funcs(self.stubs)
+ self.allow_admin = FLAGS.allow_admin_api
+
+ def tearDown(self):
+ self.stubs.UnsetAll()
+ FLAGS.allow_admin_api = self.allow_admin
+ super(CreateserverextTest, self).tearDown()
+
+ def _setup_mock_compute_api(self):
+
+ class MockComputeAPI(nova.compute.API):
+
+ def __init__(self):
+ self.injected_files = None
+ self.networks = None
+
+ def create(self, *args, **kwargs):
+ if 'injected_files' in kwargs:
+ self.injected_files = kwargs['injected_files']
+ else:
+ self.injected_files = None
+
+ if 'requested_networks' in kwargs:
+ self.networks = kwargs['requested_networks']
+ else:
+ self.networks = None
+ return [{'id': '1234', 'display_name': 'fakeinstance',
+ 'uuid': FAKE_UUID,
+ 'created_at': "",
+ 'updated_at': ""}]
+
+ def set_admin_password(self, *args, **kwargs):
+ pass
+
+ def make_stub_method(canned_return):
+ def stub_method(*args, **kwargs):
+ return canned_return
+ return stub_method
+
+ compute_api = MockComputeAPI()
+ self.stubs.Set(nova.compute, 'API', make_stub_method(compute_api))
+ self.stubs.Set(
+ nova.api.openstack.create_instance_helper.CreateInstanceHelper,
+ '_get_kernel_ramdisk_from_image', make_stub_method((1, 1)))
+ return compute_api
+
+ def _create_networks_request_dict(self, networks):
+ server = {}
+ server['name'] = 'new-server-test'
+ server['imageRef'] = 1
+ server['flavorRef'] = 1
+ if networks is not None:
+ network_list = []
+ for uuid, fixed_ip in networks:
+ network_list.append({'uuid': uuid, 'fixed_ip': fixed_ip})
+ server['networks'] = network_list
+ return {'server': server}
+
+ def _get_create_request_json(self, body_dict):
+ req = webob.Request.blank('/v1.1/123/os-create-server-ext')
+ req.headers['Content-Type'] = 'application/json'
+ req.method = 'POST'
+ req.body = json.dumps(body_dict)
+ return req
+
+ def _run_create_instance_with_mock_compute_api(self, request):
+ compute_api = self._setup_mock_compute_api()
+ response = request.get_response(fakes.wsgi_app())
+ return compute_api, response
+
+ def _format_xml_request_body(self, body_dict):
+ server = body_dict['server']
+ body_parts = []
+ body_parts.extend([
+ '<?xml version="1.0" encoding="UTF-8"?>',
+ '<server xmlns="http://docs.rackspacecloud.com/servers/api/v1.1"',
+ ' name="%s" imageRef="%s" flavorRef="%s">' % (
+ server['name'], server['imageRef'], server['flavorRef'])])
+ if 'metadata' in server:
+ metadata = server['metadata']
+ body_parts.append('<metadata>')
+ for item in metadata.iteritems():
+ body_parts.append('<meta key="%s">%s</meta>' % item)
+ body_parts.append('</metadata>')
+ if 'personality' in server:
+ personalities = server['personality']
+ body_parts.append('<personality>')
+ for file in personalities:
+ item = (file['path'], file['contents'])
+ body_parts.append('<file path="%s">%s</file>' % item)
+ body_parts.append('</personality>')
+ if 'networks' in server:
+ networks = server['networks']
+ body_parts.append('<networks>')
+ for network in networks:
+ item = (network['uuid'], network['fixed_ip'])
+ body_parts.append('<network uuid="%s" fixed_ip="%s"></network>'
+ % item)
+ body_parts.append('</networks>')
+ body_parts.append('</server>')
+ return ''.join(body_parts)
+
+ def _get_create_request_xml(self, body_dict):
+ req = webob.Request.blank('/v1.1/123/os-create-server-ext')
+ req.content_type = 'application/xml'
+ req.accept = 'application/xml'
+ req.method = 'POST'
+ req.body = self._format_xml_request_body(body_dict)
+ return req
+
+ def _create_instance_with_networks_json(self, networks):
+ body_dict = self._create_networks_request_dict(networks)
+ request = self._get_create_request_json(body_dict)
+ compute_api, response = \
+ self._run_create_instance_with_mock_compute_api(request)
+ return request, response, compute_api.networks
+
+ def _create_instance_with_networks_xml(self, networks):
+ body_dict = self._create_networks_request_dict(networks)
+ request = self._get_create_request_xml(body_dict)
+ compute_api, response = \
+ self._run_create_instance_with_mock_compute_api(request)
+ return request, response, compute_api.networks
+
+ def test_create_instance_with_no_networks(self):
+ request, response, networks = \
+ self._create_instance_with_networks_json(networks=None)
+ self.assertEquals(response.status_int, 202)
+ self.assertEquals(networks, None)
+
+ def test_create_instance_with_no_networks_xml(self):
+ request, response, networks = \
+ self._create_instance_with_networks_xml(networks=None)
+ self.assertEquals(response.status_int, 202)
+ self.assertEquals(networks, None)
+
+ def test_create_instance_with_one_network(self):
+ request, response, networks = \
+ self._create_instance_with_networks_json([FAKE_NETWORKS[0]])
+ self.assertEquals(response.status_int, 202)
+ self.assertEquals(networks, [FAKE_NETWORKS[0]])
+
+ def test_create_instance_with_one_network_xml(self):
+ request, response, networks = \
+ self._create_instance_with_networks_xml([FAKE_NETWORKS[0]])
+ self.assertEquals(response.status_int, 202)
+ self.assertEquals(networks, [FAKE_NETWORKS[0]])
+
+ def test_create_instance_with_two_networks(self):
+ request, response, networks = \
+ self._create_instance_with_networks_json(FAKE_NETWORKS)
+ self.assertEquals(response.status_int, 202)
+ self.assertEquals(networks, FAKE_NETWORKS)
+
+ def test_create_instance_with_two_networks_xml(self):
+ request, response, networks = \
+ self._create_instance_with_networks_xml(FAKE_NETWORKS)
+ self.assertEquals(response.status_int, 202)
+ self.assertEquals(networks, FAKE_NETWORKS)
+
+ def test_create_instance_with_duplicate_networks(self):
+ request, response, networks = \
+ self._create_instance_with_networks_json(DUPLICATE_NETWORKS)
+ self.assertEquals(response.status_int, 400)
+ self.assertEquals(networks, None)
+
+ def test_create_instance_with_duplicate_networks_xml(self):
+ request, response, networks = \
+ self._create_instance_with_networks_xml(DUPLICATE_NETWORKS)
+ self.assertEquals(response.status_int, 400)
+ self.assertEquals(networks, None)
+
+ def test_create_instance_with_network_no_id(self):
+ body_dict = self._create_networks_request_dict([FAKE_NETWORKS[0]])
+ del body_dict['server']['networks'][0]['uuid']
+ request = self._get_create_request_json(body_dict)
+ compute_api, response = \
+ self._run_create_instance_with_mock_compute_api(request)
+ self.assertEquals(response.status_int, 400)
+ self.assertEquals(compute_api.networks, None)
+
+ def test_create_instance_with_network_no_id_xml(self):
+ body_dict = self._create_networks_request_dict([FAKE_NETWORKS[0]])
+ request = self._get_create_request_xml(body_dict)
+ uuid = ' uuid="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"'
+ request.body = request.body.replace(uuid, '')
+ compute_api, response = \
+ self._run_create_instance_with_mock_compute_api(request)
+ self.assertEquals(response.status_int, 400)
+ self.assertEquals(compute_api.networks, None)
+
+ def test_create_instance_with_network_invalid_id(self):
+ request, response, networks = \
+ self._create_instance_with_networks_json(INVALID_NETWORKS)
+ self.assertEquals(response.status_int, 400)
+ self.assertEquals(networks, None)
+
+ def test_create_instance_with_network_invalid_id_xml(self):
+ request, response, networks = \
+ self._create_instance_with_networks_xml(INVALID_NETWORKS)
+ self.assertEquals(response.status_int, 400)
+ self.assertEquals(networks, None)
+
+ def test_create_instance_with_network_empty_fixed_ip(self):
+ networks = [('1', '')]
+ request, response, networks = \
+ self._create_instance_with_networks_json(networks)
+ self.assertEquals(response.status_int, 400)
+ self.assertEquals(networks, None)
+
+ def test_create_instance_with_network_non_string_fixed_ip(self):
+ networks = [('1', 12345)]
+ request, response, networks = \
+ self._create_instance_with_networks_json(networks)
+ self.assertEquals(response.status_int, 400)
+ self.assertEquals(networks, None)
+
+ def test_create_instance_with_network_empty_fixed_ip_xml(self):
+ networks = [('1', '')]
+ request, response, networks = \
+ self._create_instance_with_networks_xml(networks)
+ self.assertEquals(response.status_int, 400)
+ self.assertEquals(networks, None)
+
+ def test_create_instance_with_network_no_fixed_ip(self):
+ body_dict = self._create_networks_request_dict([FAKE_NETWORKS[0]])
+ del body_dict['server']['networks'][0]['fixed_ip']
+ request = self._get_create_request_json(body_dict)
+ compute_api, response = \
+ self._run_create_instance_with_mock_compute_api(request)
+ self.assertEquals(response.status_int, 202)
+ self.assertEquals(compute_api.networks,
+ [('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', None)])
+
+ def test_create_instance_with_network_no_fixed_ip_xml(self):
+ body_dict = self._create_networks_request_dict([FAKE_NETWORKS[0]])
+ request = self._get_create_request_xml(body_dict)
+ request.body = request.body.replace(' fixed_ip="10.0.1.12"', '')
+ compute_api, response = \
+ self._run_create_instance_with_mock_compute_api(request)
+ self.assertEquals(response.status_int, 202)
+ self.assertEquals(compute_api.networks,
+ [('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', None)])
diff --git a/nova/tests/api/openstack/contrib/test_floating_ips.py b/nova/tests/api/openstack/contrib/test_floating_ips.py
index d2ca9c365..568faf867 100644
--- a/nova/tests/api/openstack/contrib/test_floating_ips.py
+++ b/nova/tests/api/openstack/contrib/test_floating_ips.py
@@ -120,7 +120,7 @@ class FloatingIpTest(test.TestCase):
self.assertTrue('floating_ip' in view)
def test_floating_ips_list(self):
- req = webob.Request.blank('/v1.1/os-floating-ips')
+ req = webob.Request.blank('/v1.1/123/os-floating-ips')
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 200)
res_dict = json.loads(res.body)
@@ -135,7 +135,7 @@ class FloatingIpTest(test.TestCase):
self.assertEqual(res_dict, response)
def test_floating_ip_show(self):
- req = webob.Request.blank('/v1.1/os-floating-ips/1')
+ req = webob.Request.blank('/v1.1/123/os-floating-ips/1')
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 200)
res_dict = json.loads(res.body)
@@ -144,7 +144,7 @@ class FloatingIpTest(test.TestCase):
self.assertEqual(res_dict['floating_ip']['instance_id'], None)
def test_floating_ip_allocate(self):
- req = webob.Request.blank('/v1.1/os-floating-ips')
+ req = webob.Request.blank('/v1.1/123/os-floating-ips')
req.method = 'POST'
req.headers['Content-Type'] = 'application/json'
res = req.get_response(fakes.wsgi_app())
@@ -159,14 +159,14 @@ class FloatingIpTest(test.TestCase):
self.assertEqual(ip, expected)
def test_floating_ip_release(self):
- req = webob.Request.blank('/v1.1/os-floating-ips/1')
+ req = webob.Request.blank('/v1.1/123/os-floating-ips/1')
req.method = 'DELETE'
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 202)
def test_add_floating_ip_to_instance(self):
body = dict(addFloatingIp=dict(address='11.0.0.1'))
- req = webob.Request.blank('/v1.1/servers/test_inst/action')
+ req = webob.Request.blank('/v1.1/123/servers/test_inst/action')
req.method = "POST"
req.body = json.dumps(body)
req.headers["content-type"] = "application/json"
@@ -176,7 +176,7 @@ class FloatingIpTest(test.TestCase):
def test_remove_floating_ip_from_instance(self):
body = dict(removeFloatingIp=dict(address='11.0.0.1'))
- req = webob.Request.blank('/v1.1/servers/test_inst/action')
+ req = webob.Request.blank('/v1.1/123/servers/test_inst/action')
req.method = "POST"
req.body = json.dumps(body)
req.headers["content-type"] = "application/json"
@@ -186,7 +186,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/servers/test_inst/action')
+ req = webob.Request.blank('/v1.1/123/servers/test_inst/action')
req.method = "POST"
req.body = json.dumps(body)
req.headers["content-type"] = "application/json"
@@ -196,7 +196,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/servers/test_inst/action')
+ req = webob.Request.blank('/v1.1/123/servers/test_inst/action')
req.method = "POST"
req.body = json.dumps(body)
req.headers["content-type"] = "application/json"
@@ -206,7 +206,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/servers/test_inst/action')
+ req = webob.Request.blank('/v1.1/123/servers/test_inst/action')
req.method = "POST"
req.body = json.dumps(body)
req.headers["content-type"] = "application/json"
@@ -216,7 +216,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/servers/test_inst/action')
+ req = webob.Request.blank('/v1.1/123/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 eb3bc7af0..92e401aac 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/os-keypairs')
+ req = webob.Request.blank('/v1.1/123/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/os-keypairs')
+ req = webob.Request.blank('/v1.1/123/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/os-keypairs')
+ req = webob.Request.blank('/v1.1/123/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/os-keypairs/FAKE')
+ req = webob.Request.blank('/v1.1/123/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 ac28f6be6..cecc4af4f 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/servers/test_inst/action')
+ req = webob.Request.blank('/v1.1/123/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/servers/test_inst/action')
+ req = webob.Request.blank('/v1.1/123/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/servers/test_inst/action')
+ req = webob.Request.blank('/v1.1/123/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/servers/test_inst/action')
+ req = webob.Request.blank('/v1.1/123/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 f6a25385f..7faef08b2 100644
--- a/nova/tests/api/openstack/contrib/test_quotas.py
+++ b/nova/tests/api/openstack/contrib/test_quotas.py
@@ -78,7 +78,8 @@ class QuotaSetsTest(test.TestCase):
self.assertEqual(qs['injected_file_content_bytes'], 10240)
def test_quotas_defaults(self):
- req = webob.Request.blank('/v1.1/os-quota-sets/fake_tenant/defaults')
+ uri = '/v1.1/fake_tenant/os-quota-sets/fake_tenant/defaults'
+ req = webob.Request.blank(uri)
req.method = 'GET'
req.headers['Content-Type'] = 'application/json'
res = req.get_response(fakes.wsgi_app())
@@ -99,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/os-quota-sets/1234')
+ req = webob.Request.blank('/v1.1/1234/os-quota-sets/1234')
req.method = 'GET'
req.headers['Content-Type'] = 'application/json'
res = req.get_response(fakes.wsgi_app(
@@ -109,7 +110,7 @@ class QuotaSetsTest(test.TestCase):
self.assertEqual(json.loads(res.body), quota_set('1234'))
def test_quotas_show_as_unauthorized_user(self):
- req = webob.Request.blank('/v1.1/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(
@@ -124,7 +125,7 @@ class QuotaSetsTest(test.TestCase):
'metadata_items': 128, 'injected_files': 5,
'injected_file_content_bytes': 10240}}
- req = webob.Request.blank('/v1.1/os-quota-sets/update_me')
+ req = webob.Request.blank('/v1.1/1234/os-quota-sets/update_me')
req.method = 'PUT'
req.body = json.dumps(updated_quota_set)
req.headers['Content-Type'] = 'application/json'
@@ -141,7 +142,7 @@ class QuotaSetsTest(test.TestCase):
'metadata_items': 128, 'injected_files': 5,
'injected_file_content_bytes': 10240}}
- req = webob.Request.blank('/v1.1/os-quota-sets/update_me')
+ req = webob.Request.blank('/v1.1/1234/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 fc8e4be4e..f8126d461 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/servers/test_inst/action')
+ req = webob.Request.blank('/v1.1/123/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/servers/test_inst/action')
+ req = webob.Request.blank('/v1.1/123/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 b44ebc9fb..bc1536911 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/os-security-groups')
+ req = webob.Request.blank('/v1.1/123/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/os-security-groups')
+ req = webob.Request.blank('/v1.1/123/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/os-security-groups/%s'
+ request = webob.Request.blank('/v1.1/123/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/os-security-groups')
+ req = webob.Request.blank('/v1.1/123/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': "fake",
+ 'tenant_id': "123",
"description":"default",
"rules": []
},
@@ -282,7 +282,7 @@ class TestSecurityGroups(test.TestCase):
{
'id': 2,
'name': "test",
- 'tenant_id': "fake",
+ 'tenant_id': "123",
"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/os-security-groups/%s' %
+ req = webob.Request.blank('/v1.1/123/os-security-groups/%s' %
res_dict['security_group']['id'])
req.headers['Content-Type'] = 'application/json'
req.method = 'GET'
@@ -308,23 +308,22 @@ class TestSecurityGroups(test.TestCase):
'security_group': {
'id': 2,
'name': "test",
- 'tenant_id': "fake",
+ 'tenant_id': "123",
'description': "group-description",
'rules': []
}
}
- self.assertEquals(response.status_int, 200)
self.assertEquals(res_dict, expected)
def test_get_security_group_by_invalid_id(self):
- req = webob.Request.blank('/v1.1/os-security-groups/invalid')
+ req = webob.Request.blank('/v1.1/123/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/os-security-groups/111111111')
+ req = webob.Request.blank('/v1.1/123/os-security-groups/111111111')
req.headers['Content-Type'] = 'application/json'
req.method = 'GET'
response = req.get_response(fakes.wsgi_app())
@@ -352,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/servers/1/action')
+ req = webob.Request.blank('/v1.1/123/servers/1/action')
req.headers['Content-Type'] = 'application/json'
req.method = 'POST'
req.body = json.dumps(body)
@@ -363,7 +362,7 @@ class TestSecurityGroups(test.TestCase):
body = dict(addSecurityGroup=dict(name='test'))
self.stubs.Set(nova.db, 'security_group_get_by_name',
return_security_group)
- req = webob.Request.blank('/v1.1/servers/invalid/action')
+ req = webob.Request.blank('/v1.1/123/servers/invalid/action')
req.headers['Content-Type'] = 'application/json'
req.method = 'POST'
req.body = json.dumps(body)
@@ -371,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/servers/1/action')
+ req = webob.Request.blank('/v1.1/123/servers/1/action')
body = dict(addSecurityGroup=None)
self.stubs.Set(nova.db, 'instance_get', return_server)
req.headers['Content-Type'] = 'application/json'
@@ -381,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/servers/1/action')
+ req = webob.Request.blank('/v1.1/123/servers/1/action')
body = dict(addSecurityGroup=dict())
self.stubs.Set(nova.db, 'instance_get', return_server)
req.headers['Content-Type'] = 'application/json'
@@ -391,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/servers/1/action')
+ req = webob.Request.blank('/v1.1/123/servers/1/action')
body = dict(addSecurityGroup=dict(name=" "))
self.stubs.Set(nova.db, 'instance_get', return_server)
req.headers['Content-Type'] = 'application/json'
@@ -405,7 +404,7 @@ class TestSecurityGroups(test.TestCase):
body = dict(addSecurityGroup=dict(name="test"))
self.stubs.Set(nova.db, 'security_group_get_by_name',
return_security_group)
- req = webob.Request.blank('/v1.1/servers/10000/action')
+ req = webob.Request.blank('/v1.1/123/servers/10000/action')
req.headers['Content-Type'] = 'application/json'
req.method = 'POST'
req.body = json.dumps(body)
@@ -417,7 +416,7 @@ class TestSecurityGroups(test.TestCase):
self.stubs.Set(nova.db, 'security_group_get_by_name',
return_security_group_without_instances)
body = dict(addSecurityGroup=dict(name="test"))
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/123/servers/1/action')
req.headers['Content-Type'] = 'application/json'
req.method = 'POST'
req.body = json.dumps(body)
@@ -429,7 +428,7 @@ class TestSecurityGroups(test.TestCase):
self.stubs.Set(nova.db, 'security_group_get_by_name',
return_security_group)
body = dict(addSecurityGroup=dict(name="test"))
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/123/servers/1/action')
req.headers['Content-Type'] = 'application/json'
req.method = 'POST'
req.body = json.dumps(body)
@@ -447,7 +446,7 @@ class TestSecurityGroups(test.TestCase):
self.mox.ReplayAll()
body = dict(addSecurityGroup=dict(name="test"))
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/123/servers/1/action')
req.headers['Content-Type'] = 'application/json'
req.method = 'POST'
req.body = json.dumps(body)
@@ -464,7 +463,7 @@ class TestSecurityGroups(test.TestCase):
return_security_group_without_instances)
self.mox.ReplayAll()
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/123/servers/1/action')
req.headers['Content-Type'] = 'application/xml'
req.method = 'POST'
req.body = """<addSecurityGroup>
@@ -475,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/servers/1/action')
+ req = webob.Request.blank('/v1.1/123/servers/1/action')
req.headers['Content-Type'] = 'application/json'
req.method = 'POST'
req.body = json.dumps(body)
@@ -486,7 +485,7 @@ class TestSecurityGroups(test.TestCase):
body = dict(removeSecurityGroup=dict(name='test'))
self.stubs.Set(nova.db, 'security_group_get_by_name',
return_security_group)
- req = webob.Request.blank('/v1.1/servers/invalid/action')
+ req = webob.Request.blank('/v1.1/123/servers/invalid/action')
req.headers['Content-Type'] = 'application/json'
req.method = 'POST'
req.body = json.dumps(body)
@@ -494,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/servers/1/action')
+ req = webob.Request.blank('/v1.1/123/servers/1/action')
body = dict(removeSecurityGroup=None)
self.stubs.Set(nova.db, 'instance_get', return_server)
req.headers['Content-Type'] = 'application/json'
@@ -504,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/servers/1/action')
+ req = webob.Request.blank('/v1.1/123/servers/1/action')
body = dict(removeSecurityGroup=dict())
self.stubs.Set(nova.db, 'instance_get', return_server)
req.headers['Content-Type'] = 'application/json'
@@ -514,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/servers/1/action')
+ req = webob.Request.blank('/v1.1/123/servers/1/action')
body = dict(removeSecurityGroup=dict(name=" "))
self.stubs.Set(nova.db, 'instance_get', return_server)
req.headers['Content-Type'] = 'application/json'
@@ -528,7 +527,7 @@ class TestSecurityGroups(test.TestCase):
body = dict(removeSecurityGroup=dict(name="test"))
self.stubs.Set(nova.db, 'security_group_get_by_name',
return_security_group)
- req = webob.Request.blank('/v1.1/servers/10000/action')
+ req = webob.Request.blank('/v1.1/123/servers/10000/action')
req.headers['Content-Type'] = 'application/json'
req.method = 'POST'
req.body = json.dumps(body)
@@ -540,7 +539,7 @@ class TestSecurityGroups(test.TestCase):
self.stubs.Set(nova.db, 'security_group_get_by_name',
return_security_group)
body = dict(removeSecurityGroup=dict(name="test"))
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/123/servers/1/action')
req.headers['Content-Type'] = 'application/json'
req.method = 'POST'
req.body = json.dumps(body)
@@ -552,7 +551,7 @@ class TestSecurityGroups(test.TestCase):
self.stubs.Set(nova.db, 'security_group_get_by_name',
return_security_group_without_instances)
body = dict(removeSecurityGroup=dict(name="test"))
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/123/servers/1/action')
req.headers['Content-Type'] = 'application/json'
req.method = 'POST'
req.body = json.dumps(body)
@@ -570,7 +569,7 @@ class TestSecurityGroups(test.TestCase):
self.mox.ReplayAll()
body = dict(removeSecurityGroup=dict(name="test"))
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/123/servers/1/action')
req.headers['Content-Type'] = 'application/json'
req.method = 'POST'
req.body = json.dumps(body)
@@ -587,7 +586,7 @@ class TestSecurityGroups(test.TestCase):
return_security_group)
self.mox.ReplayAll()
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/123/servers/1/action')
req.headers['Content-Type'] = 'application/xml'
req.method = 'POST'
req.body = """<removeSecurityGroup>
@@ -625,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/os-security-group-rules')
+ request = webob.Request.blank('/v1.1/123/os-security-group-rules')
request.headers['Content-Type'] = 'application/json'
request.method = 'POST'
request.body = json.dumps(rules)
@@ -633,7 +632,7 @@ class TestSecurityGroupRules(test.TestCase):
return response
def _delete_security_group_rule(self, id):
- request = webob.Request.blank('/v1.1/os-security-group-rules/%s'
+ request = webob.Request.blank('/v1.1/123/os-security-group-rules/%s'
% id)
request.method = 'DELETE'
response = request.get_response(fakes.wsgi_app())
@@ -691,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/os-security-group-rules')
+ request = webob.Request.blank('/v1.1/123/os-security-group-rules')
request.headers['Content-Type'] = 'application/json'
request.method = 'POST'
request.body = json.dumps(None)
@@ -699,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/os-security-group-rules')
+ request = webob.Request.blank('/v1.1/123/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_virtual_interfaces.py b/nova/tests/api/openstack/contrib/test_virtual_interfaces.py
index d541a9e95..1db253b35 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/servers/1/os-virtual-interfaces')
+ req = webob.Request.blank('/v1.1/123/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/extensions/foxinsocks.py b/nova/tests/api/openstack/extensions/foxinsocks.py
index 03aad007a..2d8313cf6 100644
--- a/nova/tests/api/openstack/extensions/foxinsocks.py
+++ b/nova/tests/api/openstack/extensions/foxinsocks.py
@@ -72,8 +72,9 @@ class Foxinsocks(object):
res.body = json.dumps(data)
return res
- req_ext1 = extensions.RequestExtension('GET', '/v1.1/flavors/:(id)',
- _goose_handler)
+ req_ext1 = extensions.RequestExtension('GET',
+ '/v1.1/:(project_id)/flavors/:(id)',
+ _goose_handler)
request_exts.append(req_ext1)
def _bands_handler(req, res):
@@ -84,8 +85,9 @@ class Foxinsocks(object):
res.body = json.dumps(data)
return res
- req_ext2 = extensions.RequestExtension('GET', '/v1.1/flavors/:(id)',
- _bands_handler)
+ req_ext2 = extensions.RequestExtension('GET',
+ '/v1.1/:(project_id)/flavors/:(id)',
+ _bands_handler)
request_exts.append(req_ext2)
return request_exts
diff --git a/nova/tests/api/openstack/test_auth.py b/nova/tests/api/openstack/test_auth.py
index 306ae1aa0..7fd3935a2 100644
--- a/nova/tests/api/openstack/test_auth.py
+++ b/nova/tests/api/openstack/test_auth.py
@@ -53,6 +53,7 @@ class Test(test.TestCase):
req = webob.Request.blank('/v1.0/')
req.headers['X-Auth-User'] = 'user1'
req.headers['X-Auth-Key'] = 'user1_key'
+ req.headers['X-Auth-Project-Id'] = 'user1_project'
result = req.get_response(fakes.wsgi_app(fake_auth=False))
self.assertEqual(result.status, '204 No Content')
self.assertEqual(len(result.headers['X-Auth-Token']), 40)
@@ -73,14 +74,14 @@ class Test(test.TestCase):
self.assertEqual(result.status, '204 No Content')
self.assertEqual(len(result.headers['X-Auth-Token']), 40)
self.assertEqual(result.headers['X-Server-Management-Url'],
- "http://foo/v1.0/")
+ "http://foo/v1.0")
self.assertEqual(result.headers['X-CDN-Management-Url'],
"")
self.assertEqual(result.headers['X-Storage-Url'], "")
token = result.headers['X-Auth-Token']
self.stubs.Set(nova.api.openstack, 'APIRouterV10', fakes.FakeRouter)
- req = webob.Request.blank('/v1.0/fake')
+ req = webob.Request.blank('/v1.0/user1_project')
req.headers['X-Auth-Token'] = token
result = req.get_response(fakes.wsgi_app(fake_auth=False))
self.assertEqual(result.status, '200 OK')
@@ -125,7 +126,7 @@ class Test(test.TestCase):
token = result.headers['X-Auth-Token']
self.stubs.Set(nova.api.openstack, 'APIRouterV10', fakes.FakeRouter)
- req = webob.Request.blank('/v1.0/fake')
+ req = webob.Request.blank('/v1.0/')
req.headers['X-Auth-Token'] = token
req.headers['X-Auth-Project-Id'] = 'user2_project'
result = req.get_response(fakes.wsgi_app(fake_auth=False))
@@ -136,6 +137,7 @@ class Test(test.TestCase):
req = webob.Request.blank('/v1.0/')
req.headers['X-Auth-User'] = 'unknown_user'
req.headers['X-Auth-Key'] = 'unknown_user_key'
+ req.headers['X-Auth-Project-Id'] = 'user_project'
result = req.get_response(fakes.wsgi_app(fake_auth=False))
self.assertEqual(result.status, '401 Unauthorized')
diff --git a/nova/tests/api/openstack/test_extensions.py b/nova/tests/api/openstack/test_extensions.py
index d89cb28d6..9f923852d 100644
--- a/nova/tests/api/openstack/test_extensions.py
+++ b/nova/tests/api/openstack/test_extensions.py
@@ -85,6 +85,7 @@ class ExtensionControllerTest(test.TestCase):
ext_path = os.path.join(os.path.dirname(__file__), "extensions")
self.flags(osapi_extensions_path=ext_path)
self.ext_list = [
+ "Createserverext",
"FlavorExtraSpecs",
"Floating_ips",
"Fox In Socks",
@@ -102,7 +103,7 @@ class ExtensionControllerTest(test.TestCase):
def test_list_extensions_json(self):
app = openstack.APIRouterV11()
ext_midware = extensions.ExtensionMiddleware(app)
- request = webob.Request.blank("/extensions")
+ request = webob.Request.blank("/123/extensions")
response = request.get_response(ext_midware)
self.assertEqual(200, response.status_int)
@@ -128,7 +129,7 @@ class ExtensionControllerTest(test.TestCase):
def test_get_extension_json(self):
app = openstack.APIRouterV11()
ext_midware = extensions.ExtensionMiddleware(app)
- request = webob.Request.blank("/extensions/FOXNSOX")
+ request = webob.Request.blank("/123/extensions/FOXNSOX")
response = request.get_response(ext_midware)
self.assertEqual(200, response.status_int)
@@ -144,7 +145,7 @@ class ExtensionControllerTest(test.TestCase):
def test_list_extensions_xml(self):
app = openstack.APIRouterV11()
ext_midware = extensions.ExtensionMiddleware(app)
- request = webob.Request.blank("/extensions")
+ request = webob.Request.blank("/123/extensions")
request.accept = "application/xml"
response = request.get_response(ext_midware)
self.assertEqual(200, response.status_int)
@@ -171,7 +172,7 @@ class ExtensionControllerTest(test.TestCase):
def test_get_extension_xml(self):
app = openstack.APIRouterV11()
ext_midware = extensions.ExtensionMiddleware(app)
- request = webob.Request.blank("/extensions/FOXNSOX")
+ request = webob.Request.blank("/123/extensions/FOXNSOX")
request.accept = "application/xml"
response = request.get_response(ext_midware)
self.assertEqual(200, response.status_int)
@@ -212,7 +213,7 @@ class ResourceExtensionTest(test.TestCase):
manager = StubExtensionManager(res_ext)
app = openstack.APIRouterV11()
ext_midware = extensions.ExtensionMiddleware(app, manager)
- request = webob.Request.blank("/tweedles")
+ request = webob.Request.blank("/123/tweedles")
response = request.get_response(ext_midware)
self.assertEqual(200, response.status_int)
self.assertEqual(response_body, response.body)
@@ -223,7 +224,7 @@ class ResourceExtensionTest(test.TestCase):
manager = StubExtensionManager(res_ext)
app = openstack.APIRouterV11()
ext_midware = extensions.ExtensionMiddleware(app, manager)
- request = webob.Request.blank("/tweedles")
+ request = webob.Request.blank("/123/tweedles")
response = request.get_response(ext_midware)
self.assertEqual(200, response.status_int)
self.assertEqual(response_body, response.body)
@@ -247,7 +248,7 @@ class ExtensionManagerTest(test.TestCase):
def test_get_resources(self):
app = openstack.APIRouterV11()
ext_midware = extensions.ExtensionMiddleware(app)
- request = webob.Request.blank("/foxnsocks")
+ request = webob.Request.blank("/123/foxnsocks")
response = request.get_response(ext_midware)
self.assertEqual(200, response.status_int)
self.assertEqual(response_body, response.body)
@@ -280,23 +281,26 @@ class ActionExtensionTest(test.TestCase):
def test_extended_action(self):
body = dict(add_tweedle=dict(name="test"))
- response = self._send_server_action_request("/servers/1/action", body)
+ url = "/123/servers/1/action"
+ response = self._send_server_action_request(url, body)
self.assertEqual(200, response.status_int)
self.assertEqual("Tweedle Beetle Added.", response.body)
body = dict(delete_tweedle=dict(name="test"))
- response = self._send_server_action_request("/servers/1/action", body)
+ response = self._send_server_action_request(url, body)
self.assertEqual(200, response.status_int)
self.assertEqual("Tweedle Beetle Deleted.", response.body)
def test_invalid_action_body(self):
body = dict(blah=dict(name="test")) # Doesn't exist
- response = self._send_server_action_request("/servers/1/action", body)
+ url = "/123/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"))
- response = self._send_server_action_request("/fdsa/1/action", body)
+ url = "/123/fdsa/1/action"
+ response = self._send_server_action_request(url, body)
self.assertEqual(404, response.status_int)
@@ -317,13 +321,13 @@ class RequestExtensionTest(test.TestCase):
return res
req_ext = extensions.RequestExtension('GET',
- '/v1.1/flavors/:(id)',
+ '/v1.1/123/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/flavors/1?chewing=bluegoo")
+ request = webob.Request.blank("/v1.1/123/flavors/1?chewing=bluegoo")
request.environ['api.version'] = '1.1'
response = request.get_response(ext_midware)
self.assertEqual(200, response.status_int)
@@ -334,7 +338,7 @@ class RequestExtensionTest(test.TestCase):
app = fakes.wsgi_app()
ext_midware = extensions.ExtensionMiddleware(app)
- request = webob.Request.blank("/v1.1/flavors/1?chewing=newblue")
+ request = webob.Request.blank("/v1.1/123/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.py b/nova/tests/api/openstack/test_flavors.py
index d0fe72001..812bece42 100644
--- a/nova/tests/api/openstack/test_flavors.py
+++ b/nova/tests/api/openstack/test_flavors.py
@@ -138,7 +138,7 @@ class FlavorsTest(test.TestCase):
self.assertEqual(res.status_int, 404)
def test_get_flavor_by_id_v1_1(self):
- req = webob.Request.blank('/v1.1/flavors/12')
+ req = webob.Request.blank('/v1.1/fake/flavors/12')
req.environ['api.version'] = '1.1'
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 200)
@@ -152,11 +152,11 @@ class FlavorsTest(test.TestCase):
"links": [
{
"rel": "self",
- "href": "http://localhost/v1.1/flavors/12",
+ "href": "http://localhost/v1.1/fake/flavors/12",
},
{
"rel": "bookmark",
- "href": "http://localhost/flavors/12",
+ "href": "http://localhost/fake/flavors/12",
},
],
},
@@ -164,7 +164,7 @@ class FlavorsTest(test.TestCase):
self.assertEqual(flavor, expected)
def test_get_flavor_list_v1_1(self):
- req = webob.Request.blank('/v1.1/flavors')
+ req = webob.Request.blank('/v1.1/fake/flavors')
req.environ['api.version'] = '1.1'
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 200)
@@ -177,11 +177,11 @@ class FlavorsTest(test.TestCase):
"links": [
{
"rel": "self",
- "href": "http://localhost/v1.1/flavors/1",
+ "href": "http://localhost/v1.1/fake/flavors/1",
},
{
"rel": "bookmark",
- "href": "http://localhost/flavors/1",
+ "href": "http://localhost/fake/flavors/1",
},
],
},
@@ -191,11 +191,11 @@ class FlavorsTest(test.TestCase):
"links": [
{
"rel": "self",
- "href": "http://localhost/v1.1/flavors/2",
+ "href": "http://localhost/v1.1/fake/flavors/2",
},
{
"rel": "bookmark",
- "href": "http://localhost/flavors/2",
+ "href": "http://localhost/fake/flavors/2",
},
],
},
@@ -204,7 +204,7 @@ class FlavorsTest(test.TestCase):
self.assertEqual(flavor, expected)
def test_get_flavor_list_detail_v1_1(self):
- req = webob.Request.blank('/v1.1/flavors/detail')
+ req = webob.Request.blank('/v1.1/fake/flavors/detail')
req.environ['api.version'] = '1.1'
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 200)
@@ -219,11 +219,11 @@ class FlavorsTest(test.TestCase):
"links": [
{
"rel": "self",
- "href": "http://localhost/v1.1/flavors/1",
+ "href": "http://localhost/v1.1/fake/flavors/1",
},
{
"rel": "bookmark",
- "href": "http://localhost/flavors/1",
+ "href": "http://localhost/fake/flavors/1",
},
],
},
@@ -235,11 +235,11 @@ class FlavorsTest(test.TestCase):
"links": [
{
"rel": "self",
- "href": "http://localhost/v1.1/flavors/2",
+ "href": "http://localhost/v1.1/fake/flavors/2",
},
{
"rel": "bookmark",
- "href": "http://localhost/flavors/2",
+ "href": "http://localhost/fake/flavors/2",
},
],
},
@@ -252,7 +252,7 @@ class FlavorsTest(test.TestCase):
return {}
self.stubs.Set(nova.db.api, "instance_type_get_all", _return_empty)
- req = webob.Request.blank('/v1.1/flavors')
+ req = webob.Request.blank('/v1.1/fake/flavors')
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 200)
flavors = json.loads(res.body)["flavors"]
@@ -274,11 +274,11 @@ class FlavorsXMLSerializationTest(test.TestCase):
"links": [
{
"rel": "self",
- "href": "http://localhost/v1.1/flavors/12",
+ "href": "http://localhost/v1.1/fake/flavors/12",
},
{
"rel": "bookmark",
- "href": "http://localhost/flavors/12",
+ "href": "http://localhost/fake/flavors/12",
},
],
},
@@ -294,8 +294,10 @@ class FlavorsXMLSerializationTest(test.TestCase):
name="asdf"
ram="256"
disk="10">
- <atom:link href="http://localhost/v1.1/flavors/12" rel="self"/>
- <atom:link href="http://localhost/flavors/12" rel="bookmark"/>
+ <atom:link href="http://localhost/v1.1/fake/flavors/12"
+ rel="self"/>
+ <atom:link href="http://localhost/fake/flavors/12"
+ rel="bookmark"/>
</flavor>
""".replace(" ", ""))
@@ -313,11 +315,11 @@ class FlavorsXMLSerializationTest(test.TestCase):
"links": [
{
"rel": "self",
- "href": "http://localhost/v1.1/flavors/12",
+ "href": "http://localhost/v1.1/fake/flavors/12",
},
{
"rel": "bookmark",
- "href": "http://localhost/flavors/12",
+ "href": "http://localhost/fake/flavors/12",
},
],
},
@@ -333,8 +335,10 @@ class FlavorsXMLSerializationTest(test.TestCase):
name="asdf"
ram="256"
disk="10">
- <atom:link href="http://localhost/v1.1/flavors/12" rel="self"/>
- <atom:link href="http://localhost/flavors/12" rel="bookmark"/>
+ <atom:link href="http://localhost/v1.1/fake/flavors/12"
+ rel="self"/>
+ <atom:link href="http://localhost/fake/flavors/12"
+ rel="bookmark"/>
</flavor>
""".replace(" ", ""))
@@ -353,11 +357,11 @@ class FlavorsXMLSerializationTest(test.TestCase):
"links": [
{
"rel": "self",
- "href": "http://localhost/v1.1/flavors/23",
+ "href": "http://localhost/v1.1/fake/flavors/23",
},
{
"rel": "bookmark",
- "href": "http://localhost/flavors/23",
+ "href": "http://localhost/fake/flavors/23",
},
],
}, {
@@ -368,11 +372,11 @@ class FlavorsXMLSerializationTest(test.TestCase):
"links": [
{
"rel": "self",
- "href": "http://localhost/v1.1/flavors/13",
+ "href": "http://localhost/v1.1/fake/flavors/13",
},
{
"rel": "bookmark",
- "href": "http://localhost/flavors/13",
+ "href": "http://localhost/fake/flavors/13",
},
],
},
@@ -389,15 +393,19 @@ class FlavorsXMLSerializationTest(test.TestCase):
name="flavor 23"
ram="512"
disk="20">
- <atom:link href="http://localhost/v1.1/flavors/23" rel="self"/>
- <atom:link href="http://localhost/flavors/23" rel="bookmark"/>
+ <atom:link href="http://localhost/v1.1/fake/flavors/23"
+ rel="self"/>
+ <atom:link href="http://localhost/fake/flavors/23"
+ rel="bookmark"/>
</flavor>
<flavor id="13"
name="flavor 13"
ram="256"
disk="10">
- <atom:link href="http://localhost/v1.1/flavors/13" rel="self"/>
- <atom:link href="http://localhost/flavors/13" rel="bookmark"/>
+ <atom:link href="http://localhost/v1.1/fake/flavors/13"
+ rel="self"/>
+ <atom:link href="http://localhost/fake/flavors/13"
+ rel="bookmark"/>
</flavor>
</flavors>
""".replace(" ", "") % locals())
@@ -417,11 +425,11 @@ class FlavorsXMLSerializationTest(test.TestCase):
"links": [
{
"rel": "self",
- "href": "http://localhost/v1.1/flavors/23",
+ "href": "http://localhost/v1.1/fake/flavors/23",
},
{
"rel": "bookmark",
- "href": "http://localhost/flavors/23",
+ "href": "http://localhost/fake/flavors/23",
},
],
}, {
@@ -432,11 +440,11 @@ class FlavorsXMLSerializationTest(test.TestCase):
"links": [
{
"rel": "self",
- "href": "http://localhost/v1.1/flavors/13",
+ "href": "http://localhost/v1.1/fake/flavors/13",
},
{
"rel": "bookmark",
- "href": "http://localhost/flavors/13",
+ "href": "http://localhost/fake/flavors/13",
},
],
},
@@ -450,12 +458,16 @@ class FlavorsXMLSerializationTest(test.TestCase):
<flavors xmlns="http://docs.openstack.org/compute/api/v1.1"
xmlns:atom="http://www.w3.org/2005/Atom">
<flavor id="23" name="flavor 23">
- <atom:link href="http://localhost/v1.1/flavors/23" rel="self"/>
- <atom:link href="http://localhost/flavors/23" rel="bookmark"/>
+ <atom:link href="http://localhost/v1.1/fake/flavors/23"
+ rel="self"/>
+ <atom:link href="http://localhost/fake/flavors/23"
+ rel="bookmark"/>
</flavor>
<flavor id="13" name="flavor 13">
- <atom:link href="http://localhost/v1.1/flavors/13" rel="self"/>
- <atom:link href="http://localhost/flavors/13" rel="bookmark"/>
+ <atom:link href="http://localhost/v1.1/fake/flavors/13"
+ rel="self"/>
+ <atom:link href="http://localhost/fake/flavors/13"
+ rel="bookmark"/>
</flavor>
</flavors>
""".replace(" ", "") % locals())
diff --git a/nova/tests/api/openstack/test_flavors_extra_specs.py b/nova/tests/api/openstack/test_flavors_extra_specs.py
index ccd1b0d9f..f382d06e9 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/flavors/1/os-extra_specs')
+ request = webob.Request.blank('/v1.1/123/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/flavors/1/os-extra_specs')
+ req = webob.Request.blank('/v1.1/123/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/flavors/1/os-extra_specs/key5')
+ req = webob.Request.blank('/v1.1/123/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/flavors/1/os-extra_specs/key6')
+ req = webob.Request.blank('/v1.1/123/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/flavors/1/os-extra_specs/key5')
+ req = webob.Request.blank('/v1.1/123/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/flavors/1/os-extra_specs')
+ req = webob.Request.blank('/v1.1/123/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/flavors/1/os-extra_specs')
+ req = webob.Request.blank('/v1.1/123/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/flavors/1/os-extra_specs/key1')
+ req = webob.Request.blank('/v1.1/123/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/flavors/1/os-extra_specs/key1')
+ req = webob.Request.blank('/v1.1/123/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/flavors/1/os-extra_specs/key1')
+ req = webob.Request.blank('/v1.1/123/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/flavors/1/os-extra_specs/bad')
+ req = webob.Request.blank('/v1.1/123/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 21743eeef..fe42e35e5 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/images/1/metadata')
+ req = webob.Request.blank('/v1.1/123/images/1/metadata')
res = req.get_response(fakes.wsgi_app())
res_dict = json.loads(res.body)
self.assertEqual(200, res.status_int)
@@ -100,7 +100,7 @@ class ImageMetaDataTest(test.TestCase):
self.assertEqual(value, res_dict['metadata'][key])
def test_show(self):
- req = webob.Request.blank('/v1.1/images/1/metadata/key1')
+ req = webob.Request.blank('/v1.1/fake/images/1/metadata/key1')
res = req.get_response(fakes.wsgi_app())
res_dict = json.loads(res.body)
self.assertEqual(200, res.status_int)
@@ -109,12 +109,12 @@ class ImageMetaDataTest(test.TestCase):
self.assertEqual('value1', res_dict['meta']['key1'])
def test_show_not_found(self):
- req = webob.Request.blank('/v1.1/images/1/metadata/key9')
+ req = webob.Request.blank('/v1.1/fake/images/1/metadata/key9')
res = req.get_response(fakes.wsgi_app())
self.assertEqual(404, res.status_int)
def test_create(self):
- req = webob.Request.blank('/v1.1/images/2/metadata')
+ req = webob.Request.blank('/v1.1/fake/images/2/metadata')
req.method = 'POST'
req.body = '{"metadata": {"key9": "value9"}}'
req.headers["content-type"] = "application/json"
@@ -134,7 +134,7 @@ class ImageMetaDataTest(test.TestCase):
self.assertEqual(expected_output, actual_output)
def test_update_all(self):
- req = webob.Request.blank('/v1.1/images/2/metadata')
+ req = webob.Request.blank('/v1.1/fake/images/1/metadata')
req.method = 'PUT'
req.body = '{"metadata": {"key9": "value9"}}'
req.headers["content-type"] = "application/json"
@@ -152,7 +152,7 @@ class ImageMetaDataTest(test.TestCase):
self.assertEqual(expected_output, actual_output)
def test_update_item(self):
- req = webob.Request.blank('/v1.1/images/1/metadata/key1')
+ req = webob.Request.blank('/v1.1/fake/images/1/metadata/key1')
req.method = 'PUT'
req.body = '{"meta": {"key1": "zz"}}'
req.headers["content-type"] = "application/json"
@@ -168,7 +168,7 @@ class ImageMetaDataTest(test.TestCase):
self.assertEqual(actual_output, expected_output)
def test_update_item_bad_body(self):
- req = webob.Request.blank('/v1.1/images/1/metadata/key1')
+ req = webob.Request.blank('/v1.1/fake/images/1/metadata/key1')
req.method = 'PUT'
req.body = '{"key1": "zz"}'
req.headers["content-type"] = "application/json"
@@ -176,7 +176,7 @@ class ImageMetaDataTest(test.TestCase):
self.assertEqual(400, res.status_int)
def test_update_item_too_many_keys(self):
- req = webob.Request.blank('/v1.1/images/1/metadata/key1')
+ req = webob.Request.blank('/v1.1/fake/images/1/metadata/key1')
req.method = 'PUT'
req.body = '{"meta": {"key1": "value1", "key2": "value2"}}'
req.headers["content-type"] = "application/json"
@@ -184,7 +184,7 @@ class ImageMetaDataTest(test.TestCase):
self.assertEqual(400, res.status_int)
def test_update_item_body_uri_mismatch(self):
- req = webob.Request.blank('/v1.1/images/1/metadata/bad')
+ req = webob.Request.blank('/v1.1/fake/images/1/metadata/bad')
req.method = 'PUT'
req.body = '{"meta": {"key1": "value1"}}'
req.headers["content-type"] = "application/json"
@@ -192,7 +192,7 @@ class ImageMetaDataTest(test.TestCase):
self.assertEqual(400, res.status_int)
def test_update_item_xml(self):
- req = webob.Request.blank('/v1.1/images/1/metadata/key1')
+ req = webob.Request.blank('/v1.1/fake/images/1/metadata/key1')
req.method = 'PUT'
req.body = '<meta key="key1">five</meta>'
req.headers["content-type"] = "application/xml"
@@ -208,14 +208,14 @@ class ImageMetaDataTest(test.TestCase):
self.assertEqual(actual_output, expected_output)
def test_delete(self):
- req = webob.Request.blank('/v1.1/images/2/metadata/key1')
+ req = webob.Request.blank('/v1.1/fake/images/2/metadata/key1')
req.method = 'DELETE'
res = req.get_response(fakes.wsgi_app())
self.assertEqual(204, res.status_int)
self.assertEqual('', res.body)
def test_delete_not_found(self):
- req = webob.Request.blank('/v1.1/images/2/metadata/blah')
+ req = webob.Request.blank('/v1.1/fake/images/2/metadata/blah')
req.method = 'DELETE'
res = req.get_response(fakes.wsgi_app())
self.assertEqual(404, res.status_int)
@@ -225,7 +225,7 @@ class ImageMetaDataTest(test.TestCase):
for num in range(FLAGS.quota_metadata_items + 1):
data['metadata']['key%i' % num] = "blah"
json_string = str(data).replace("\'", "\"")
- req = webob.Request.blank('/v1.1/images/2/metadata')
+ req = webob.Request.blank('/v1.1/fake/images/2/metadata')
req.method = 'POST'
req.body = json_string
req.headers["content-type"] = "application/json"
@@ -233,7 +233,7 @@ class ImageMetaDataTest(test.TestCase):
self.assertEqual(413, res.status_int)
def test_too_many_metadata_items_on_put(self):
- req = webob.Request.blank('/v1.1/images/3/metadata/blah')
+ req = webob.Request.blank('/v1.1/fake/images/3/metadata/blah')
req.method = 'PUT'
req.body = '{"meta": {"blah": "blah"}}'
req.headers["content-type"] = "application/json"
diff --git a/nova/tests/api/openstack/test_images.py b/nova/tests/api/openstack/test_images.py
index 383ed2e03..2a7cfc382 100644
--- a/nova/tests/api/openstack/test_images.py
+++ b/nova/tests/api/openstack/test_images.py
@@ -339,6 +339,11 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
self.stubs.UnsetAll()
super(ImageControllerWithGlanceServiceTest, self).tearDown()
+ def _get_fake_context(self):
+ class Context(object):
+ project_id = 'fake'
+ return Context()
+
def _applicable_fixture(self, fixture, user_id):
"""Determine if this fixture is applicable for given user id."""
is_public = fixture["is_public"]
@@ -386,13 +391,13 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
self.assertEqual(expected_image, actual_image)
def test_get_image_v1_1(self):
- request = webob.Request.blank('/v1.1/images/124')
+ request = webob.Request.blank('/v1.1/fake/images/124')
response = request.get_response(fakes.wsgi_app())
actual_image = json.loads(response.body)
- href = "http://localhost/v1.1/images/124"
- bookmark = "http://localhost/images/124"
+ href = "http://localhost/v1.1/fake/images/124"
+ bookmark = "http://localhost/fake/images/124"
server_href = "http://localhost/v1.1/servers/42"
server_bookmark = "http://localhost/servers/42"
@@ -508,7 +513,7 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
self.assertEqual(expected.toxml(), actual.toxml())
def test_get_image_404_v1_1_json(self):
- request = webob.Request.blank('/v1.1/images/NonExistantImage')
+ request = webob.Request.blank('/v1.1/fake/images/NonExistantImage')
response = request.get_response(fakes.wsgi_app())
self.assertEqual(404, response.status_int)
@@ -524,7 +529,7 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
self.assertEqual(expected, actual)
def test_get_image_404_v1_1_xml(self):
- request = webob.Request.blank('/v1.1/images/NonExistantImage')
+ request = webob.Request.blank('/v1.1/fake/images/NonExistantImage')
request.accept = "application/xml"
response = request.get_response(fakes.wsgi_app())
self.assertEqual(404, response.status_int)
@@ -545,7 +550,7 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
self.assertEqual(expected.toxml(), actual.toxml())
def test_get_image_index_v1_1(self):
- request = webob.Request.blank('/v1.1/images')
+ request = webob.Request.blank('/v1.1/fake/images')
response = request.get_response(fakes.wsgi_app())
response_dict = json.loads(response.body)
@@ -558,8 +563,8 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
fixtures.remove(image)
continue
- href = "http://localhost/v1.1/images/%s" % image["id"]
- bookmark = "http://localhost/images/%s" % image["id"]
+ href = "http://localhost/v1.1/fake/images/%s" % image["id"]
+ bookmark = "http://localhost/fake/images/%s" % image["id"]
test_image = {
"id": image["id"],
"name": image["name"],
@@ -637,7 +642,7 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
self.assertDictListMatch(expected, response_list)
def test_get_image_details_v1_1(self):
- request = webob.Request.blank('/v1.1/images/detail')
+ request = webob.Request.blank('/v1.1/fake/images/detail')
response = request.get_response(fakes.wsgi_app())
response_dict = json.loads(response.body)
@@ -655,11 +660,11 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
'progress': 100,
"links": [{
"rel": "self",
- "href": "http://localhost/v1.1/images/123",
+ "href": "http://localhost/v1.1/fake/images/123",
},
{
"rel": "bookmark",
- "href": "http://localhost/images/123",
+ "href": "http://localhost/fake/images/123",
}],
},
{
@@ -686,11 +691,11 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
},
"links": [{
"rel": "self",
- "href": "http://localhost/v1.1/images/124",
+ "href": "http://localhost/v1.1/fake/images/124",
},
{
"rel": "bookmark",
- "href": "http://localhost/images/124",
+ "href": "http://localhost/fake/images/124",
}],
},
{
@@ -717,11 +722,11 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
},
"links": [{
"rel": "self",
- "href": "http://localhost/v1.1/images/125",
+ "href": "http://localhost/v1.1/fake/images/125",
},
{
"rel": "bookmark",
- "href": "http://localhost/images/125",
+ "href": "http://localhost/fake/images/125",
}],
},
{
@@ -748,11 +753,11 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
},
"links": [{
"rel": "self",
- "href": "http://localhost/v1.1/images/126",
+ "href": "http://localhost/v1.1/fake/images/126",
},
{
"rel": "bookmark",
- "href": "http://localhost/images/126",
+ "href": "http://localhost/fake/images/126",
}],
},
{
@@ -779,11 +784,11 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
},
"links": [{
"rel": "self",
- "href": "http://localhost/v1.1/images/127",
+ "href": "http://localhost/v1.1/fake/images/127",
},
{
"rel": "bookmark",
- "href": "http://localhost/images/127",
+ "href": "http://localhost/fake/images/127",
}],
},
{
@@ -796,11 +801,11 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
'progress': 100,
"links": [{
"rel": "self",
- "href": "http://localhost/v1.1/images/129",
+ "href": "http://localhost/v1.1/fake/images/129",
},
{
"rel": "bookmark",
- "href": "http://localhost/images/129",
+ "href": "http://localhost/fake/images/129",
}],
},
]
@@ -809,7 +814,7 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
def test_image_filter_with_name(self):
image_service = self.mox.CreateMockAnything()
- context = object()
+ context = self._get_fake_context()
filters = {'name': 'testname'}
image_service.index(context, filters=filters).AndReturn([])
self.mox.ReplayAll()
@@ -821,7 +826,7 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
def test_image_filter_with_status(self):
image_service = self.mox.CreateMockAnything()
- context = object()
+ context = self._get_fake_context()
filters = {'status': 'ACTIVE'}
image_service.index(context, filters=filters).AndReturn([])
self.mox.ReplayAll()
@@ -833,7 +838,7 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
def test_image_filter_with_property(self):
image_service = self.mox.CreateMockAnything()
- context = object()
+ context = self._get_fake_context()
filters = {'property-test': '3'}
image_service.index(context, filters=filters).AndReturn([])
self.mox.ReplayAll()
@@ -845,7 +850,7 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
def test_image_filter_server(self):
image_service = self.mox.CreateMockAnything()
- context = object()
+ context = self._get_fake_context()
# 'server' should be converted to 'property-instance_ref'
filters = {'property-instance_ref': 'http://localhost:8774/servers/12'}
image_service.index(context, filters=filters).AndReturn([])
@@ -859,7 +864,7 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
def test_image_filter_changes_since(self):
image_service = self.mox.CreateMockAnything()
- context = object()
+ context = self._get_fake_context()
filters = {'changes-since': '2011-01-24T17:08Z'}
image_service.index(context, filters=filters).AndReturn([])
self.mox.ReplayAll()
@@ -872,7 +877,7 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
def test_image_filter_with_type(self):
image_service = self.mox.CreateMockAnything()
- context = object()
+ context = self._get_fake_context()
filters = {'property-image_type': 'BASE'}
image_service.index(context, filters=filters).AndReturn([])
self.mox.ReplayAll()
@@ -884,7 +889,7 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
def test_image_filter_not_supported(self):
image_service = self.mox.CreateMockAnything()
- context = object()
+ context = self._get_fake_context()
filters = {'status': 'ACTIVE'}
image_service.detail(context, filters=filters).AndReturn([])
self.mox.ReplayAll()
@@ -897,7 +902,7 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
def test_image_no_filters(self):
image_service = self.mox.CreateMockAnything()
- context = object()
+ context = self._get_fake_context()
filters = {}
image_service.index(
context, filters=filters).AndReturn([])
@@ -911,11 +916,11 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
def test_image_detail_filter_with_name(self):
image_service = self.mox.CreateMockAnything()
- context = object()
+ context = self._get_fake_context()
filters = {'name': 'testname'}
image_service.detail(context, filters=filters).AndReturn([])
self.mox.ReplayAll()
- request = webob.Request.blank('/v1.1/images/detail?name=testname')
+ request = webob.Request.blank('/v1.1/fake/images/detail?name=testname')
request.environ['nova.context'] = context
controller = images.ControllerV11(image_service=image_service)
controller.detail(request)
@@ -923,11 +928,11 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
def test_image_detail_filter_with_status(self):
image_service = self.mox.CreateMockAnything()
- context = object()
+ context = self._get_fake_context()
filters = {'status': 'ACTIVE'}
image_service.detail(context, filters=filters).AndReturn([])
self.mox.ReplayAll()
- request = webob.Request.blank('/v1.1/images/detail?status=ACTIVE')
+ request = webob.Request.blank('/v1.1/fake/images/detail?status=ACTIVE')
request.environ['nova.context'] = context
controller = images.ControllerV11(image_service=image_service)
controller.detail(request)
@@ -935,11 +940,12 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
def test_image_detail_filter_with_property(self):
image_service = self.mox.CreateMockAnything()
- context = object()
+ context = self._get_fake_context()
filters = {'property-test': '3'}
image_service.detail(context, filters=filters).AndReturn([])
self.mox.ReplayAll()
- request = webob.Request.blank('/v1.1/images/detail?property-test=3')
+ request = webob.Request.blank(
+ '/v1.1/fake/images/detail?property-test=3')
request.environ['nova.context'] = context
controller = images.ControllerV11(image_service=image_service)
controller.detail(request)
@@ -947,12 +953,12 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
def test_image_detail_filter_server(self):
image_service = self.mox.CreateMockAnything()
- context = object()
+ context = self._get_fake_context()
# 'server' should be converted to 'property-instance_ref'
filters = {'property-instance_ref': 'http://localhost:8774/servers/12'}
image_service.index(context, filters=filters).AndReturn([])
self.mox.ReplayAll()
- request = webob.Request.blank('/v1.1/images/detail?server='
+ request = webob.Request.blank('/v1.1/fake/images/detail?server='
'http://localhost:8774/servers/12')
request.environ['nova.context'] = context
controller = images.ControllerV11(image_service=image_service)
@@ -961,11 +967,11 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
def test_image_detail_filter_changes_since(self):
image_service = self.mox.CreateMockAnything()
- context = object()
+ context = self._get_fake_context()
filters = {'changes-since': '2011-01-24T17:08Z'}
image_service.index(context, filters=filters).AndReturn([])
self.mox.ReplayAll()
- request = webob.Request.blank('/v1.1/images/detail?changes-since='
+ request = webob.Request.blank('/v1.1/fake/images/detail?changes-since='
'2011-01-24T17:08Z')
request.environ['nova.context'] = context
controller = images.ControllerV11(image_service=image_service)
@@ -974,11 +980,11 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
def test_image_detail_filter_with_type(self):
image_service = self.mox.CreateMockAnything()
- context = object()
+ context = self._get_fake_context()
filters = {'property-image_type': 'BASE'}
image_service.index(context, filters=filters).AndReturn([])
self.mox.ReplayAll()
- request = webob.Request.blank('/v1.1/images/detail?type=BASE')
+ request = webob.Request.blank('/v1.1/fake/images/detail?type=BASE')
request.environ['nova.context'] = context
controller = images.ControllerV11(image_service=image_service)
controller.index(request)
@@ -986,11 +992,11 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
def test_image_detail_filter_not_supported(self):
image_service = self.mox.CreateMockAnything()
- context = object()
+ context = self._get_fake_context()
filters = {'status': 'ACTIVE'}
image_service.detail(context, filters=filters).AndReturn([])
self.mox.ReplayAll()
- request = webob.Request.blank('/v1.1/images/detail?status=ACTIVE&'
+ request = webob.Request.blank('/v1.1/fake/images/detail?status=ACTIVE&'
'UNSUPPORTEDFILTER=testname')
request.environ['nova.context'] = context
controller = images.ControllerV11(image_service=image_service)
@@ -999,11 +1005,11 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
def test_image_detail_no_filters(self):
image_service = self.mox.CreateMockAnything()
- context = object()
+ context = self._get_fake_context()
filters = {}
image_service.detail(context, filters=filters).AndReturn([])
self.mox.ReplayAll()
- request = webob.Request.blank('/v1.1/images/detail')
+ request = webob.Request.blank('/v1.1/fake/images/detail')
request.environ['nova.context'] = context
controller = images.ControllerV11(image_service=image_service)
controller.detail(request)
@@ -1123,8 +1129,8 @@ class ImageXMLSerializationTest(test.TestCase):
TIMESTAMP = "2010-10-11T10:30:22Z"
SERVER_HREF = 'http://localhost/v1.1/servers/123'
SERVER_BOOKMARK = 'http://localhost/servers/123'
- IMAGE_HREF = 'http://localhost/v1.1/images/%s'
- IMAGE_BOOKMARK = 'http://localhost/images/%s'
+ IMAGE_HREF = 'http://localhost/v1.1/fake/images/%s'
+ IMAGE_BOOKMARK = 'http://localhost/fake/images/%s'
def test_show(self):
serializer = images.ImageXMLSerializer()
diff --git a/nova/tests/api/openstack/test_server_actions.py b/nova/tests/api/openstack/test_server_actions.py
index 80a27e30f..bdd6824e7 100644
--- a/nova/tests/api/openstack/test_server_actions.py
+++ b/nova/tests/api/openstack/test_server_actions.py
@@ -1,17 +1,13 @@
import base64
import json
-import unittest
-from xml.dom import minidom
import stubout
import webob
from nova import context
-from nova import db
from nova import utils
from nova import flags
from nova.api.openstack import create_instance_helper
-from nova.compute import instance_types
from nova.compute import power_state
import nova.db.api
from nova import test
@@ -103,8 +99,6 @@ class ServerActionsTest(test.TestCase):
super(ServerActionsTest, self).setUp()
self.flags(verbose=True)
self.stubs = stubout.StubOutForTesting()
- fakes.FakeAuthManager.reset_fake_data()
- fakes.FakeAuthDatabase.data = {}
fakes.stub_out_auth(self.stubs)
self.stubs.Set(nova.db.api, 'instance_get', return_server_by_id)
self.stubs.Set(nova.db.api, 'instance_update', instance_update)
@@ -468,8 +462,6 @@ class ServerActionsTestV11(test.TestCase):
self.maxDiff = None
super(ServerActionsTestV11, self).setUp()
self.stubs = stubout.StubOutForTesting()
- fakes.FakeAuthManager.reset_fake_data()
- fakes.FakeAuthDatabase.data = {}
fakes.stub_out_auth(self.stubs)
self.stubs.Set(nova.db.api, 'instance_get', return_server_by_id)
self.stubs.Set(nova.db.api, 'instance_update', instance_update)
@@ -489,7 +481,7 @@ class ServerActionsTestV11(test.TestCase):
def test_server_bad_body(self):
body = {}
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/fake/servers/1/action')
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
@@ -498,7 +490,7 @@ class ServerActionsTestV11(test.TestCase):
def test_server_unknown_action(self):
body = {'sockTheFox': {'fakekey': '1234'}}
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/fake/servers/1/action')
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
@@ -509,7 +501,7 @@ class ServerActionsTestV11(test.TestCase):
mock_method = MockSetAdminPassword()
self.stubs.Set(nova.compute.api.API, 'set_admin_password', mock_method)
body = {'changePassword': {'adminPass': '1234pass'}}
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/fake/servers/1/action')
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
@@ -521,7 +513,7 @@ class ServerActionsTestV11(test.TestCase):
def test_server_change_password_xml(self):
mock_method = MockSetAdminPassword()
self.stubs.Set(nova.compute.api.API, 'set_admin_password', mock_method)
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/fake/servers/1/action')
req.method = 'POST'
req.content_type = "application/xml"
req.body = """<?xml version="1.0" encoding="UTF-8"?>
@@ -535,7 +527,7 @@ class ServerActionsTestV11(test.TestCase):
def test_server_change_password_not_a_string(self):
body = {'changePassword': {'adminPass': 1234}}
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/fake/servers/1/action')
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
@@ -544,7 +536,7 @@ class ServerActionsTestV11(test.TestCase):
def test_server_change_password_bad_request(self):
body = {'changePassword': {'pass': '12345'}}
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/fake/servers/1/action')
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
@@ -553,7 +545,7 @@ class ServerActionsTestV11(test.TestCase):
def test_server_change_password_empty_string(self):
body = {'changePassword': {'adminPass': ''}}
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/fake/servers/1/action')
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
@@ -562,7 +554,7 @@ class ServerActionsTestV11(test.TestCase):
def test_server_change_password_none(self):
body = {'changePassword': {'adminPass': None}}
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/fake/servers/1/action')
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
@@ -571,7 +563,7 @@ class ServerActionsTestV11(test.TestCase):
def test_server_reboot_hard(self):
body = dict(reboot=dict(type="HARD"))
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/fake/servers/1/action')
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
@@ -580,7 +572,7 @@ class ServerActionsTestV11(test.TestCase):
def test_server_reboot_soft(self):
body = dict(reboot=dict(type="SOFT"))
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/fake/servers/1/action')
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
@@ -589,7 +581,7 @@ class ServerActionsTestV11(test.TestCase):
def test_server_reboot_incorrect_type(self):
body = dict(reboot=dict(type="NOT_A_TYPE"))
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/fake/servers/1/action')
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
@@ -598,7 +590,7 @@ class ServerActionsTestV11(test.TestCase):
def test_server_reboot_missing_type(self):
body = dict(reboot=dict())
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/fake/servers/1/action')
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
@@ -612,7 +604,7 @@ class ServerActionsTestV11(test.TestCase):
},
}
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/fake/servers/1/action')
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
@@ -633,7 +625,7 @@ class ServerActionsTestV11(test.TestCase):
self.stubs.Set(nova.db, 'instance_get_by_uuid',
return_server_with_uuid_and_power_state(state))
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/fake/servers/1/action')
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
@@ -651,7 +643,7 @@ class ServerActionsTestV11(test.TestCase):
},
}
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/fake/servers/1/action')
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
@@ -667,7 +659,7 @@ class ServerActionsTestV11(test.TestCase):
},
}
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/fake/servers/1/action')
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
@@ -682,7 +674,7 @@ class ServerActionsTestV11(test.TestCase):
},
}
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/fake/servers/1/action')
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
@@ -701,7 +693,7 @@ class ServerActionsTestV11(test.TestCase):
},
}
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/fake/servers/1/action')
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
@@ -720,7 +712,7 @@ class ServerActionsTestV11(test.TestCase):
},
}
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/fake/servers/1/action')
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
@@ -730,7 +722,7 @@ class ServerActionsTestV11(test.TestCase):
def test_resize_server(self):
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/fake/servers/1/action')
req.content_type = 'application/json'
req.method = 'POST'
body_dict = dict(resize=dict(flavorRef="http://localhost/3"))
@@ -748,7 +740,7 @@ class ServerActionsTestV11(test.TestCase):
self.assertEqual(self.resize_called, True)
def test_resize_server_no_flavor(self):
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/fake/servers/1/action')
req.content_type = 'application/json'
req.method = 'POST'
body_dict = dict(resize=dict())
@@ -758,7 +750,7 @@ class ServerActionsTestV11(test.TestCase):
self.assertEqual(res.status_int, 400)
def test_resize_server_no_flavor_ref(self):
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/fake/servers/1/action')
req.content_type = 'application/json'
req.method = 'POST'
body_dict = dict(resize=dict(flavorRef=None))
@@ -768,7 +760,7 @@ class ServerActionsTestV11(test.TestCase):
self.assertEqual(res.status_int, 400)
def test_confirm_resize_server(self):
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/fake/servers/1/action')
req.content_type = 'application/json'
req.method = 'POST'
body_dict = dict(confirmResize=None)
@@ -786,7 +778,7 @@ class ServerActionsTestV11(test.TestCase):
self.assertEqual(self.confirm_resize_called, True)
def test_revert_resize_server(self):
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/fake/servers/1/action')
req.content_type = 'application/json'
req.method = 'POST'
body_dict = dict(revertResize=None)
@@ -809,7 +801,7 @@ class ServerActionsTestV11(test.TestCase):
'name': 'Snapshot 1',
},
}
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/fake/servers/1/action')
req.method = 'POST'
req.body = json.dumps(body)
req.headers["content-type"] = "application/json"
@@ -828,7 +820,7 @@ class ServerActionsTestV11(test.TestCase):
'name': 'Snapshot 1',
},
}
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/fake/servers/1/action')
req.method = 'POST'
req.body = json.dumps(body)
req.headers["content-type"] = "application/json"
@@ -842,7 +834,7 @@ class ServerActionsTestV11(test.TestCase):
'metadata': {'key': 'asdf'},
},
}
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/fake/servers/1/action')
req.method = 'POST'
req.body = json.dumps(body)
req.headers["content-type"] = "application/json"
@@ -860,7 +852,7 @@ class ServerActionsTestV11(test.TestCase):
}
for num in range(FLAGS.quota_metadata_items + 1):
body['createImage']['metadata']['foo%i' % num] = "bar"
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/fake/servers/1/action')
req.method = 'POST'
req.body = json.dumps(body)
req.headers["content-type"] = "application/json"
@@ -871,7 +863,7 @@ class ServerActionsTestV11(test.TestCase):
body = {
'createImage': {},
}
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/fake/servers/1/action')
req.method = 'POST'
req.body = json.dumps(body)
req.headers["content-type"] = "application/json"
@@ -885,7 +877,7 @@ class ServerActionsTestV11(test.TestCase):
'metadata': 'henry',
},
}
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/fake/servers/1/action')
req.method = 'POST'
req.body = json.dumps(body)
req.headers["content-type"] = "application/json"
@@ -904,7 +896,7 @@ class ServerActionsTestV11(test.TestCase):
},
}
- req = webob.Request.blank('/v1.1/servers/1/action')
+ req = webob.Request.blank('/v1.1/fake/servers/1/action')
req.method = 'POST'
req.body = json.dumps(body)
req.headers["content-type"] = "application/json"
diff --git a/nova/tests/api/openstack/test_server_metadata.py b/nova/tests/api/openstack/test_server_metadata.py
index 8512bd518..296bbd9dc 100644
--- a/nova/tests/api/openstack/test_server_metadata.py
+++ b/nova/tests/api/openstack/test_server_metadata.py
@@ -83,7 +83,7 @@ class ServerMetaDataTest(test.TestCase):
def test_index(self):
self.stubs.Set(nova.db.api, 'instance_metadata_get',
return_server_metadata)
- req = webob.Request.blank('/v1.1/servers/1/metadata')
+ req = webob.Request.blank('/v1.1/fake/servers/1/metadata')
res = req.get_response(fakes.wsgi_app())
self.assertEqual(200, res.status_int)
res_dict = json.loads(res.body)
@@ -100,7 +100,7 @@ class ServerMetaDataTest(test.TestCase):
def test_index_xml(self):
self.stubs.Set(nova.db.api, 'instance_metadata_get',
return_server_metadata)
- request = webob.Request.blank("/v1.1/servers/1/metadata")
+ request = webob.Request.blank("/v1.1/fake/servers/1/metadata")
request.accept = "application/xml"
response = request.get_response(fakes.wsgi_app())
self.assertEqual(200, response.status_int)
@@ -120,14 +120,14 @@ class ServerMetaDataTest(test.TestCase):
def test_index_nonexistant_server(self):
self.stubs.Set(nova.db.api, 'instance_get', return_server_nonexistant)
- req = webob.Request.blank('/v1.1/servers/1/metadata')
+ req = webob.Request.blank('/v1.1/fake/servers/1/metadata')
res = req.get_response(fakes.wsgi_app())
self.assertEqual(404, res.status_int)
def test_index_no_data(self):
self.stubs.Set(nova.db.api, 'instance_metadata_get',
return_empty_server_metadata)
- req = webob.Request.blank('/v1.1/servers/1/metadata')
+ req = webob.Request.blank('/v1.1/fake/servers/1/metadata')
res = req.get_response(fakes.wsgi_app())
self.assertEqual(200, res.status_int)
res_dict = json.loads(res.body)
@@ -137,7 +137,7 @@ class ServerMetaDataTest(test.TestCase):
def test_show(self):
self.stubs.Set(nova.db.api, 'instance_metadata_get',
return_server_metadata)
- req = webob.Request.blank('/v1.1/servers/1/metadata/key2')
+ req = webob.Request.blank('/v1.1/fake/servers/1/metadata/key2')
res = req.get_response(fakes.wsgi_app())
res_dict = json.loads(res.body)
self.assertEqual(200, res.status_int)
@@ -147,7 +147,7 @@ class ServerMetaDataTest(test.TestCase):
def test_show_xml(self):
self.stubs.Set(nova.db.api, 'instance_metadata_get',
return_server_metadata)
- request = webob.Request.blank("/v1.1/servers/1/metadata/key2")
+ request = webob.Request.blank("/v1.1/fake/servers/1/metadata/key2")
request.accept = "application/xml"
response = request.get_response(fakes.wsgi_app())
self.assertEqual(200, response.status_int)
@@ -164,14 +164,14 @@ class ServerMetaDataTest(test.TestCase):
def test_show_nonexistant_server(self):
self.stubs.Set(nova.db.api, 'instance_get', return_server_nonexistant)
- req = webob.Request.blank('/v1.1/servers/1/metadata/key2')
+ req = webob.Request.blank('/v1.1/fake/servers/1/metadata/key2')
res = req.get_response(fakes.wsgi_app())
self.assertEqual(404, res.status_int)
def test_show_meta_not_found(self):
self.stubs.Set(nova.db.api, 'instance_metadata_get',
return_empty_server_metadata)
- req = webob.Request.blank('/v1.1/servers/1/metadata/key6')
+ req = webob.Request.blank('/v1.1/fake/servers/1/metadata/key6')
res = req.get_response(fakes.wsgi_app())
self.assertEqual(404, res.status_int)
@@ -180,7 +180,7 @@ class ServerMetaDataTest(test.TestCase):
return_server_metadata)
self.stubs.Set(nova.db.api, 'instance_metadata_delete',
delete_server_metadata)
- req = webob.Request.blank('/v1.1/servers/1/metadata/key2')
+ req = webob.Request.blank('/v1.1/fake/servers/1/metadata/key2')
req.method = 'DELETE'
res = req.get_response(fakes.wsgi_app())
self.assertEqual(204, res.status_int)
@@ -188,7 +188,7 @@ class ServerMetaDataTest(test.TestCase):
def test_delete_nonexistant_server(self):
self.stubs.Set(nova.db.api, 'instance_get', return_server_nonexistant)
- req = webob.Request.blank('/v1.1/servers/1/metadata/key1')
+ req = webob.Request.blank('/v1.1/fake/servers/1/metadata/key1')
req.method = 'DELETE'
res = req.get_response(fakes.wsgi_app())
self.assertEqual(404, res.status_int)
@@ -196,7 +196,7 @@ class ServerMetaDataTest(test.TestCase):
def test_delete_meta_not_found(self):
self.stubs.Set(nova.db.api, 'instance_metadata_get',
return_empty_server_metadata)
- req = webob.Request.blank('/v1.1/servers/1/metadata/key6')
+ req = webob.Request.blank('/v1.1/fake/servers/1/metadata/key6')
req.method = 'DELETE'
res = req.get_response(fakes.wsgi_app())
self.assertEqual(404, res.status_int)
@@ -206,7 +206,7 @@ class ServerMetaDataTest(test.TestCase):
return_server_metadata)
self.stubs.Set(nova.db.api, 'instance_metadata_update',
return_create_instance_metadata)
- req = webob.Request.blank('/v1.1/servers/1/metadata')
+ req = webob.Request.blank('/v1.1/fake/servers/1/metadata')
req.method = 'POST'
req.content_type = "application/json"
input = {"metadata": {"key9": "value9"}}
@@ -227,7 +227,7 @@ class ServerMetaDataTest(test.TestCase):
return_server_metadata)
self.stubs.Set(nova.db.api, "instance_metadata_update",
return_create_instance_metadata)
- req = webob.Request.blank("/v1.1/servers/1/metadata")
+ req = webob.Request.blank("/v1.1/fake/servers/1/metadata")
req.method = "POST"
req.content_type = "application/xml"
req.accept = "application/xml"
@@ -258,7 +258,7 @@ class ServerMetaDataTest(test.TestCase):
def test_create_empty_body(self):
self.stubs.Set(nova.db.api, 'instance_metadata_update',
return_create_instance_metadata)
- req = webob.Request.blank('/v1.1/servers/1/metadata')
+ req = webob.Request.blank('/v1.1/fake/servers/1/metadata')
req.method = 'POST'
req.headers["content-type"] = "application/json"
res = req.get_response(fakes.wsgi_app())
@@ -266,7 +266,7 @@ class ServerMetaDataTest(test.TestCase):
def test_create_nonexistant_server(self):
self.stubs.Set(nova.db.api, 'instance_get', return_server_nonexistant)
- req = webob.Request.blank('/v1.1/servers/100/metadata')
+ req = webob.Request.blank('/v1.1/fake/servers/100/metadata')
req.method = 'POST'
req.body = '{"metadata": {"key1": "value1"}}'
req.headers["content-type"] = "application/json"
@@ -276,7 +276,7 @@ class ServerMetaDataTest(test.TestCase):
def test_update_all(self):
self.stubs.Set(nova.db.api, 'instance_metadata_update',
return_create_instance_metadata)
- req = webob.Request.blank('/v1.1/servers/1/metadata')
+ req = webob.Request.blank('/v1.1/fake/servers/1/metadata')
req.method = 'PUT'
req.content_type = "application/json"
expected = {
@@ -294,7 +294,7 @@ class ServerMetaDataTest(test.TestCase):
def test_update_all_empty_container(self):
self.stubs.Set(nova.db.api, 'instance_metadata_update',
return_create_instance_metadata)
- req = webob.Request.blank('/v1.1/servers/1/metadata')
+ req = webob.Request.blank('/v1.1/fake/servers/1/metadata')
req.method = 'PUT'
req.content_type = "application/json"
expected = {'metadata': {}}
@@ -307,7 +307,7 @@ class ServerMetaDataTest(test.TestCase):
def test_update_all_malformed_container(self):
self.stubs.Set(nova.db.api, 'instance_metadata_update',
return_create_instance_metadata)
- req = webob.Request.blank('/v1.1/servers/1/metadata')
+ req = webob.Request.blank('/v1.1/fake/servers/1/metadata')
req.method = 'PUT'
req.content_type = "application/json"
expected = {'meta': {}}
@@ -318,7 +318,7 @@ class ServerMetaDataTest(test.TestCase):
def test_update_all_malformed_data(self):
self.stubs.Set(nova.db.api, 'instance_metadata_update',
return_create_instance_metadata)
- req = webob.Request.blank('/v1.1/servers/1/metadata')
+ req = webob.Request.blank('/v1.1/fake/servers/1/metadata')
req.method = 'PUT'
req.content_type = "application/json"
expected = {'metadata': ['asdf']}
@@ -328,7 +328,7 @@ class ServerMetaDataTest(test.TestCase):
def test_update_all_nonexistant_server(self):
self.stubs.Set(nova.db.api, 'instance_get', return_server_nonexistant)
- req = webob.Request.blank('/v1.1/servers/100/metadata')
+ req = webob.Request.blank('/v1.1/fake/servers/100/metadata')
req.method = 'PUT'
req.content_type = "application/json"
req.body = json.dumps({'metadata': {'key10': 'value10'}})
@@ -338,7 +338,7 @@ class ServerMetaDataTest(test.TestCase):
def test_update_item(self):
self.stubs.Set(nova.db.api, 'instance_metadata_update',
return_create_instance_metadata)
- req = webob.Request.blank('/v1.1/servers/1/metadata/key1')
+ req = webob.Request.blank('/v1.1/fake/servers/1/metadata/key1')
req.method = 'PUT'
req.body = '{"meta": {"key1": "value1"}}'
req.headers["content-type"] = "application/json"
@@ -352,7 +352,7 @@ class ServerMetaDataTest(test.TestCase):
def test_update_item_xml(self):
self.stubs.Set(nova.db.api, 'instance_metadata_update',
return_create_instance_metadata)
- req = webob.Request.blank('/v1.1/servers/1/metadata/key9')
+ req = webob.Request.blank('/v1.1/fake/servers/1/metadata/key9')
req.method = 'PUT'
req.accept = "application/json"
req.content_type = "application/xml"
@@ -369,7 +369,7 @@ class ServerMetaDataTest(test.TestCase):
def test_update_item_nonexistant_server(self):
self.stubs.Set(nova.db.api, 'instance_get', return_server_nonexistant)
- req = webob.Request.blank('/v1.1/servers/asdf/metadata/key1')
+ req = webob.Request.blank('/v1.1/fake/servers/asdf/metadata/key1')
req.method = 'PUT'
req.body = '{"meta":{"key1": "value1"}}'
req.headers["content-type"] = "application/json"
@@ -379,7 +379,7 @@ class ServerMetaDataTest(test.TestCase):
def test_update_item_empty_body(self):
self.stubs.Set(nova.db.api, 'instance_metadata_update',
return_create_instance_metadata)
- req = webob.Request.blank('/v1.1/servers/1/metadata/key1')
+ req = webob.Request.blank('/v1.1/fake/servers/1/metadata/key1')
req.method = 'PUT'
req.headers["content-type"] = "application/json"
res = req.get_response(fakes.wsgi_app())
@@ -388,7 +388,7 @@ class ServerMetaDataTest(test.TestCase):
def test_update_item_too_many_keys(self):
self.stubs.Set(nova.db.api, 'instance_metadata_update',
return_create_instance_metadata)
- req = webob.Request.blank('/v1.1/servers/1/metadata/key1')
+ req = webob.Request.blank('/v1.1/fake/servers/1/metadata/key1')
req.method = 'PUT'
req.body = '{"meta": {"key1": "value1", "key2": "value2"}}'
req.headers["content-type"] = "application/json"
@@ -398,7 +398,7 @@ class ServerMetaDataTest(test.TestCase):
def test_update_item_body_uri_mismatch(self):
self.stubs.Set(nova.db.api, 'instance_metadata_update',
return_create_instance_metadata)
- req = webob.Request.blank('/v1.1/servers/1/metadata/bad')
+ req = webob.Request.blank('/v1.1/fake/servers/1/metadata/bad')
req.method = 'PUT'
req.body = '{"meta": {"key1": "value1"}}'
req.headers["content-type"] = "application/json"
@@ -412,7 +412,7 @@ class ServerMetaDataTest(test.TestCase):
for num in range(FLAGS.quota_metadata_items + 1):
data['metadata']['key%i' % num] = "blah"
json_string = str(data).replace("\'", "\"")
- req = webob.Request.blank('/v1.1/servers/1/metadata')
+ req = webob.Request.blank('/v1.1/fake/servers/1/metadata')
req.method = 'POST'
req.body = json_string
req.headers["content-type"] = "application/json"
@@ -422,7 +422,7 @@ class ServerMetaDataTest(test.TestCase):
def test_too_many_metadata_items_on_update_item(self):
self.stubs.Set(nova.db.api, 'instance_metadata_update',
return_create_instance_metadata_max)
- req = webob.Request.blank('/v1.1/servers/1/metadata/key1')
+ req = webob.Request.blank('/v1.1/fake/servers/1/metadata/key1')
req.method = 'PUT'
req.body = '{"meta": {"a new key": "a new value"}}'
req.headers["content-type"] = "application/json"
diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py
index 8167c4ace..cec6eecc0 100644
--- a/nova/tests/api/openstack/test_servers.py
+++ b/nova/tests/api/openstack/test_servers.py
@@ -1,6 +1,7 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
# Copyright 2010-2011 OpenStack LLC.
+# Copyright 2011 Piston Cloud Computing, Inc.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -19,6 +20,7 @@ import base64
import datetime
import json
import unittest
+from lxml import etree
from xml.dom import minidom
import webob
@@ -32,6 +34,7 @@ import nova.api.openstack
from nova.api.openstack import create_instance_helper
from nova.api.openstack import servers
from nova.api.openstack import wsgi
+from nova.api.openstack import xmlutil
import nova.compute.api
from nova.compute import instance_types
from nova.compute import power_state
@@ -46,6 +49,8 @@ from nova.tests.api.openstack import fakes
FAKE_UUID = 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'
+NS = "{http://docs.openstack.org/compute/api/v1.1}"
+ATOMNS = "{http://www.w3.org/2005/Atom}"
def fake_gen_uuid():
@@ -145,7 +150,8 @@ def instance_addresses(context, instance_id):
def stub_instance(id, user_id='fake', project_id='fake', private_address=None,
public_addresses=None, host=None, power_state=0,
reservation_id="", uuid=FAKE_UUID, image_ref="10",
- flavor_id="1", interfaces=None, name=None):
+ flavor_id="1", interfaces=None, name=None,
+ access_ipv4=None, access_ipv6=None):
metadata = []
metadata.append(InstanceMetadata(key='seq', value=id))
@@ -197,6 +203,8 @@ def stub_instance(id, user_id='fake', project_id='fake', private_address=None,
"display_description": "",
"locked": False,
"metadata": metadata,
+ "access_ip_v4": access_ipv4,
+ "access_ip_v6": access_ipv6,
"uuid": uuid,
"virtual_interfaces": interfaces}
@@ -226,7 +234,6 @@ class MockSetAdminPassword(object):
class ServersTest(test.TestCase):
-
def setUp(self):
self.maxDiff = None
super(ServersTest, self).setUp()
@@ -258,6 +265,7 @@ class ServersTest(test.TestCase):
self.stubs.Set(nova.compute.API, "get_actions", fake_compute_api)
self.webreq = common.webob_factory('/v1.0/servers')
+ self.config_drive = None
def test_get_server_by_id(self):
req = webob.Request.blank('/v1.0/servers/1')
@@ -297,10 +305,10 @@ class ServersTest(test.TestCase):
self.assertEqual(res_dict['server']['name'], 'server1')
def test_get_server_by_id_v1_1(self):
- image_bookmark = "http://localhost/images/10"
- flavor_ref = "http://localhost/v1.1/flavors/1"
+ image_bookmark = "http://localhost/fake/images/10"
+ flavor_ref = "http://localhost/v1.1/fake/flavors/1"
flavor_id = "1"
- flavor_bookmark = "http://localhost/flavors/1"
+ flavor_bookmark = "http://localhost/fake/flavors/1"
public_ip = '192.168.0.3'
private_ip = '172.19.0.1'
@@ -322,7 +330,7 @@ class ServersTest(test.TestCase):
interfaces=interfaces)
self.stubs.Set(nova.db.api, 'instance_get', new_return_server)
- req = webob.Request.blank('/v1.1/servers/1')
+ req = webob.Request.blank('/v1.1/fake/servers/1')
res = req.get_response(fakes.wsgi_app())
res_dict = json.loads(res.body)
expected_server = {
@@ -334,6 +342,8 @@ class ServersTest(test.TestCase):
"progress": 0,
"name": "server1",
"status": "BUILD",
+ "accessIPv4": "",
+ "accessIPv6": "",
"hostId": '',
"image": {
"id": "10",
@@ -370,15 +380,16 @@ class ServersTest(test.TestCase):
"metadata": {
"seq": "1",
},
+ "config_drive": None,
"links": [
{
"rel": "self",
#FIXME(wwolf) Do we want the links to be id or uuid?
- "href": "http://localhost/v1.1/servers/1",
+ "href": "http://localhost/v1.1/fake/servers/1",
},
{
"rel": "bookmark",
- "href": "http://localhost/servers/1",
+ "href": "http://localhost/fake/servers/1",
},
],
}
@@ -387,12 +398,12 @@ class ServersTest(test.TestCase):
self.assertDictMatch(res_dict, expected_server)
def test_get_server_by_id_v1_1_xml(self):
- image_bookmark = "http://localhost/images/10"
- flavor_ref = "http://localhost/v1.1/flavors/1"
+ image_bookmark = "http://localhost/fake/images/10"
+ flavor_ref = "http://localhost/v1.1/fake/flavors/1"
flavor_id = "1"
- flavor_bookmark = "http://localhost/flavors/1"
- server_href = "http://localhost/v1.1/servers/1"
- server_bookmark = "http://localhost/servers/1"
+ flavor_bookmark = "http://localhost/fake/flavors/1"
+ server_href = "http://localhost/v1.1/fake/servers/1"
+ server_bookmark = "http://localhost/fake/servers/1"
public_ip = '192.168.0.3'
private_ip = '172.19.0.1'
@@ -414,7 +425,7 @@ class ServersTest(test.TestCase):
interfaces=interfaces)
self.stubs.Set(nova.db.api, 'instance_get', new_return_server)
- req = webob.Request.blank('/v1.1/servers/1')
+ req = webob.Request.blank('/v1.1/fake/servers/1')
req.headers['Accept'] = 'application/xml'
res = req.get_response(fakes.wsgi_app())
actual = minidom.parseString(res.body.replace(' ', ''))
@@ -431,6 +442,8 @@ class ServersTest(test.TestCase):
created="%(expected_created)s"
hostId=""
status="BUILD"
+ accessIPv4=""
+ accessIPv6=""
progress="0">
<atom:link href="%(server_href)s" rel="self"/>
<atom:link href="%(server_bookmark)s" rel="bookmark"/>
@@ -459,10 +472,10 @@ class ServersTest(test.TestCase):
self.assertEqual(expected.toxml(), actual.toxml())
def test_get_server_with_active_status_by_id_v1_1(self):
- image_bookmark = "http://localhost/images/10"
- flavor_ref = "http://localhost/v1.1/flavors/1"
+ image_bookmark = "http://localhost/fake/images/10"
+ flavor_ref = "http://localhost/v1.1/fake/flavors/1"
flavor_id = "1"
- flavor_bookmark = "http://localhost/flavors/1"
+ flavor_bookmark = "http://localhost/fake/flavors/1"
private_ip = "192.168.0.3"
public_ip = "1.2.3.4"
@@ -484,7 +497,7 @@ class ServersTest(test.TestCase):
interfaces=interfaces, power_state=1)
self.stubs.Set(nova.db.api, 'instance_get', new_return_server)
- req = webob.Request.blank('/v1.1/servers/1')
+ req = webob.Request.blank('/v1.1/fake/servers/1')
res = req.get_response(fakes.wsgi_app())
res_dict = json.loads(res.body)
expected_server = {
@@ -496,6 +509,8 @@ class ServersTest(test.TestCase):
"progress": 100,
"name": "server1",
"status": "ACTIVE",
+ "accessIPv4": "",
+ "accessIPv6": "",
"hostId": '',
"image": {
"id": "10",
@@ -532,14 +547,15 @@ class ServersTest(test.TestCase):
"metadata": {
"seq": "1",
},
+ "config_drive": None,
"links": [
{
"rel": "self",
- "href": "http://localhost/v1.1/servers/1",
+ "href": "http://localhost/v1.1/fake/servers/1",
},
{
"rel": "bookmark",
- "href": "http://localhost/servers/1",
+ "href": "http://localhost/fake/servers/1",
},
],
}
@@ -549,10 +565,10 @@ class ServersTest(test.TestCase):
def test_get_server_with_id_image_ref_by_id_v1_1(self):
image_ref = "10"
- image_bookmark = "http://localhost/images/10"
- flavor_ref = "http://localhost/v1.1/flavors/1"
+ image_bookmark = "http://localhost/fake/images/10"
+ flavor_ref = "http://localhost/v1.1/fake/flavors/1"
flavor_id = "1"
- flavor_bookmark = "http://localhost/flavors/1"
+ flavor_bookmark = "http://localhost/fake/flavors/1"
private_ip = "192.168.0.3"
public_ip = "1.2.3.4"
@@ -575,7 +591,7 @@ class ServersTest(test.TestCase):
flavor_id=flavor_id)
self.stubs.Set(nova.db.api, 'instance_get', new_return_server)
- req = webob.Request.blank('/v1.1/servers/1')
+ req = webob.Request.blank('/v1.1/fake/servers/1')
res = req.get_response(fakes.wsgi_app())
res_dict = json.loads(res.body)
expected_server = {
@@ -587,6 +603,8 @@ class ServersTest(test.TestCase):
"progress": 100,
"name": "server1",
"status": "ACTIVE",
+ "accessIPv4": "",
+ "accessIPv6": "",
"hostId": '',
"image": {
"id": "10",
@@ -623,14 +641,15 @@ class ServersTest(test.TestCase):
"metadata": {
"seq": "1",
},
+ "config_drive": None,
"links": [
{
"rel": "self",
- "href": "http://localhost/v1.1/servers/1",
+ "href": "http://localhost/v1.1/fake/servers/1",
},
{
"rel": "bookmark",
- "href": "http://localhost/servers/1",
+ "href": "http://localhost/fake/servers/1",
},
],
}
@@ -796,7 +815,7 @@ class ServersTest(test.TestCase):
interfaces=interfaces)
self.stubs.Set(nova.db.api, 'instance_get', new_return_server)
- req = webob.Request.blank('/v1.1/servers/1')
+ req = webob.Request.blank('/v1.1/fake/servers/1')
res = req.get_response(fakes.wsgi_app())
res_dict = json.loads(res.body)
@@ -840,7 +859,7 @@ class ServersTest(test.TestCase):
interfaces=interfaces)
self.stubs.Set(nova.db.api, 'instance_get', new_return_server)
- req = webob.Request.blank('/v1.1/servers/1')
+ req = webob.Request.blank('/v1.1/fake/servers/1')
res = req.get_response(fakes.wsgi_app())
res_dict = json.loads(res.body)
@@ -890,7 +909,7 @@ class ServersTest(test.TestCase):
'virtual_interface_get_by_instance',
_return_vifs)
- req = webob.Request.blank('/v1.1/servers/1/ips')
+ req = webob.Request.blank('/v1.1/fake/servers/1/ips')
res = req.get_response(fakes.wsgi_app())
res_dict = json.loads(res.body)
@@ -940,7 +959,7 @@ class ServersTest(test.TestCase):
'virtual_interface_get_by_instance',
_return_vifs)
- req = webob.Request.blank('/v1.1/servers/1/ips/network_2')
+ req = webob.Request.blank('/v1.1/fake/servers/1/ips/network_2')
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 200)
res_dict = json.loads(res.body)
@@ -960,7 +979,7 @@ class ServersTest(test.TestCase):
'virtual_interface_get_by_instance',
_return_vifs)
- req = webob.Request.blank('/v1.1/servers/1/ips/network_0')
+ req = webob.Request.blank('/v1.1/fake/servers/1/ips/network_0')
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 404)
@@ -970,7 +989,7 @@ class ServersTest(test.TestCase):
'virtual_interface_get_by_instance',
_return_vifs)
- req = webob.Request.blank('/v1.1/servers/600/ips')
+ req = webob.Request.blank('/v1.1/fake/servers/600/ips')
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 404)
@@ -1039,7 +1058,7 @@ class ServersTest(test.TestCase):
i += 1
def test_get_server_list_v1_1(self):
- req = webob.Request.blank('/v1.1/servers')
+ req = webob.Request.blank('/v1.1/fake/servers')
res = req.get_response(fakes.wsgi_app())
res_dict = json.loads(res.body)
@@ -1052,11 +1071,11 @@ class ServersTest(test.TestCase):
expected_links = [
{
"rel": "self",
- "href": "http://localhost/v1.1/servers/%s" % s['id'],
+ "href": "http://localhost/v1.1/fake/servers/%s" % s['id'],
},
{
"rel": "bookmark",
- "href": "http://localhost/servers/%s" % s['id'],
+ "href": "http://localhost/fake/servers/%s" % s['id'],
},
]
@@ -1103,19 +1122,19 @@ class ServersTest(test.TestCase):
self.assertTrue(res.body.find('offset param') > -1)
def test_get_servers_with_marker(self):
- req = webob.Request.blank('/v1.1/servers?marker=2')
+ req = webob.Request.blank('/v1.1/fake/servers?marker=2')
res = req.get_response(fakes.wsgi_app())
servers = json.loads(res.body)['servers']
self.assertEqual([s['name'] for s in servers], ["server3", "server4"])
def test_get_servers_with_limit_and_marker(self):
- req = webob.Request.blank('/v1.1/servers?limit=2&marker=1')
+ req = webob.Request.blank('/v1.1/fake/servers?limit=2&marker=1')
res = req.get_response(fakes.wsgi_app())
servers = json.loads(res.body)['servers']
self.assertEqual([s['name'] for s in servers], ['server2', 'server3'])
def test_get_servers_with_bad_marker(self):
- req = webob.Request.blank('/v1.1/servers?limit=2&marker=asdf')
+ req = webob.Request.blank('/v1.1/fake/servers?limit=2&marker=asdf')
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 400)
self.assertTrue(res.body.find('marker param') > -1)
@@ -1141,7 +1160,7 @@ class ServersTest(test.TestCase):
self.stubs.Set(nova.compute.API, 'get_all', fake_get_all)
- req = webob.Request.blank('/v1.1/servers?unknownoption=whee')
+ req = webob.Request.blank('/v1.1/fake/servers?unknownoption=whee')
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 200)
servers = json.loads(res.body)['servers']
@@ -1158,7 +1177,7 @@ class ServersTest(test.TestCase):
self.stubs.Set(nova.compute.API, 'get_all', fake_get_all)
self.flags(allow_admin_api=False)
- req = webob.Request.blank('/v1.1/servers?image=12345')
+ req = webob.Request.blank('/v1.1/fake/servers?image=12345')
res = req.get_response(fakes.wsgi_app())
# The following assert will fail if either of the asserts in
# fake_get_all() fail
@@ -1178,7 +1197,7 @@ class ServersTest(test.TestCase):
self.stubs.Set(nova.compute.API, 'get_all', fake_get_all)
self.flags(allow_admin_api=False)
- req = webob.Request.blank('/v1.1/servers?flavor=12345')
+ req = webob.Request.blank('/v1.1/fake/servers?flavor=12345')
res = req.get_response(fakes.wsgi_app())
# The following assert will fail if either of the asserts in
# fake_get_all() fail
@@ -1198,7 +1217,7 @@ class ServersTest(test.TestCase):
self.stubs.Set(nova.compute.API, 'get_all', fake_get_all)
self.flags(allow_admin_api=False)
- req = webob.Request.blank('/v1.1/servers?status=active')
+ req = webob.Request.blank('/v1.1/fake/servers?status=active')
res = req.get_response(fakes.wsgi_app())
# The following assert will fail if either of the asserts in
# fake_get_all() fail
@@ -1212,7 +1231,7 @@ class ServersTest(test.TestCase):
self.flags(allow_admin_api=False)
- req = webob.Request.blank('/v1.1/servers?status=running')
+ req = webob.Request.blank('/v1.1/fake/servers?status=running')
res = req.get_response(fakes.wsgi_app())
# The following assert will fail if either of the asserts in
# fake_get_all() fail
@@ -1229,7 +1248,7 @@ class ServersTest(test.TestCase):
self.stubs.Set(nova.compute.API, 'get_all', fake_get_all)
self.flags(allow_admin_api=False)
- req = webob.Request.blank('/v1.1/servers?name=whee.*')
+ req = webob.Request.blank('/v1.1/fake/servers?name=whee.*')
res = req.get_response(fakes.wsgi_app())
# The following assert will fail if either of the asserts in
# fake_get_all() fail
@@ -1260,7 +1279,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/servers?%s' % query_str)
+ req = webob.Request.blank('/v1.1/fake/servers?%s' % query_str)
# Request admin context
context = nova.context.RequestContext('testuser', 'testproject',
is_admin=True)
@@ -1294,7 +1313,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/servers?%s' % query_str)
+ req = webob.Request.blank('/v1.1/fake/servers?%s' % query_str)
# Request admin context
context = nova.context.RequestContext('testuser', 'testproject',
is_admin=False)
@@ -1327,7 +1346,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/servers?%s' % query_str)
+ req = webob.Request.blank('/v1.1/fake/servers?%s' % query_str)
# Request admin context
context = nova.context.RequestContext('testuser', 'testproject',
is_admin=True)
@@ -1353,7 +1372,7 @@ class ServersTest(test.TestCase):
self.stubs.Set(nova.compute.API, 'get_all', fake_get_all)
- req = webob.Request.blank('/v1.1/servers?ip=10\..*')
+ req = webob.Request.blank('/v1.1/fake/servers?ip=10\..*')
# Request admin context
context = nova.context.RequestContext('testuser', 'testproject',
is_admin=True)
@@ -1379,7 +1398,7 @@ class ServersTest(test.TestCase):
self.stubs.Set(nova.compute.API, 'get_all', fake_get_all)
- req = webob.Request.blank('/v1.1/servers?ip6=ffff.*')
+ req = webob.Request.blank('/v1.1/fake/servers?ip6=ffff.*')
# Request admin context
context = nova.context.RequestContext('testuser', 'testproject',
is_admin=True)
@@ -1400,9 +1419,12 @@ class ServersTest(test.TestCase):
'display_name': 'server_test',
'uuid': FAKE_UUID,
'instance_type': dict(inst_type),
+ 'access_ip_v4': '1.2.3.4',
+ 'access_ip_v6': 'fead::1234',
'image_ref': image_ref,
"created_at": datetime.datetime(2010, 10, 10, 12, 0, 0),
"updated_at": datetime.datetime(2010, 11, 11, 11, 0, 0),
+ "config_drive": self.config_drive,
}
def server_update(context, id, params):
@@ -1428,8 +1450,7 @@ class ServersTest(test.TestCase):
self.stubs.Set(nova.db.api, 'instance_create', instance_create)
self.stubs.Set(nova.rpc, 'cast', fake_method)
self.stubs.Set(nova.rpc, 'call', fake_method)
- self.stubs.Set(nova.db.api, 'instance_update',
- server_update)
+ self.stubs.Set(nova.db.api, 'instance_update', server_update)
self.stubs.Set(nova.db.api, 'queue_get_for', queue_get_for)
self.stubs.Set(nova.network.manager.VlanManager, 'allocate_fixed_ip',
fake_method)
@@ -1600,18 +1621,82 @@ class ServersTest(test.TestCase):
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 400)
+ def test_create_instance_with_access_ip_v1_1(self):
+ 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'
+ access_ipv4 = '1.2.3.4'
+ access_ipv6 = 'fead::1234'
+ expected_flavor = {
+ "id": "3",
+ "links": [
+ {
+ "rel": "bookmark",
+ "href": 'http://localhost/123/flavors/3',
+ },
+ ],
+ }
+ expected_image = {
+ "id": "2",
+ "links": [
+ {
+ "rel": "bookmark",
+ "href": 'http://localhost/123/images/2',
+ },
+ ],
+ }
+ body = {
+ 'server': {
+ 'name': 'server_test',
+ 'imageRef': image_href,
+ 'flavorRef': flavor_ref,
+ 'accessIPv4': access_ipv4,
+ 'accessIPv6': access_ipv6,
+ 'metadata': {
+ 'hello': 'world',
+ 'open': 'stack',
+ },
+ 'personality': [
+ {
+ "path": "/etc/banner.txt",
+ "contents": "MQ==",
+ },
+ ],
+ },
+ }
+
+ req = webob.Request.blank('/v1.1/123/servers')
+ req.method = 'POST'
+ req.body = json.dumps(body)
+ req.headers["content-type"] = "application/json"
+
+ res = req.get_response(fakes.wsgi_app())
+
+ self.assertEqual(res.status_int, 202)
+ server = json.loads(res.body)['server']
+ self.assertEqual(16, len(server['adminPass']))
+ self.assertEqual(1, server['id'])
+ self.assertEqual(0, server['progress'])
+ self.assertEqual('server_test', server['name'])
+ self.assertEqual(expected_flavor, server['flavor'])
+ self.assertEqual(expected_image, server['image'])
+ self.assertEqual(access_ipv4, server['accessIPv4'])
+ self.assertEqual(access_ipv6, server['accessIPv6'])
+
def test_create_instance_v1_1(self):
self._setup_for_create_instance()
# proper local hrefs must start with 'http://localhost/v1.1/'
image_href = 'http://localhost/v1.1/images/2'
- flavor_ref = 'http://localhost/flavors/3'
+ flavor_ref = 'http://localhost/123/flavors/3'
expected_flavor = {
"id": "3",
"links": [
{
"rel": "bookmark",
- "href": 'http://localhost/flavors/3',
+ "href": 'http://localhost/fake/flavors/3',
},
],
}
@@ -1620,7 +1705,7 @@ class ServersTest(test.TestCase):
"links": [
{
"rel": "bookmark",
- "href": 'http://localhost/images/2',
+ "href": 'http://localhost/fake/images/2',
},
],
}
@@ -1642,7 +1727,7 @@ class ServersTest(test.TestCase):
},
}
- req = webob.Request.blank('/v1.1/servers')
+ req = webob.Request.blank('/v1.1/fake/servers')
req.method = 'POST'
req.body = json.dumps(body)
req.headers["content-type"] = "application/json"
@@ -1657,6 +1742,8 @@ class ServersTest(test.TestCase):
self.assertEqual('server_test', server['name'])
self.assertEqual(expected_flavor, server['flavor'])
self.assertEqual(expected_image, server['image'])
+ self.assertEqual('1.2.3.4', server['accessIPv4'])
+ self.assertEqual('fead::1234', server['accessIPv6'])
def test_create_instance_v1_1_invalid_flavor_href(self):
self._setup_for_create_instance()
@@ -1667,7 +1754,7 @@ class ServersTest(test.TestCase):
name='server_test', imageRef=image_href, flavorRef=flavor_ref,
metadata={'hello': 'world', 'open': 'stack'},
personality={}))
- req = webob.Request.blank('/v1.1/servers')
+ req = webob.Request.blank('/v1.1/fake/servers')
req.method = 'POST'
req.body = json.dumps(body)
req.headers["content-type"] = "application/json"
@@ -1677,13 +1764,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/images/2'
+ image_href = 'http://localhost/v1.1/123/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/servers')
+ req = webob.Request.blank('/v1.1/123/servers')
req.method = 'POST'
req.body = json.dumps(body)
req.headers["content-type"] = "application/json"
@@ -1699,13 +1786,136 @@ class ServersTest(test.TestCase):
name='server_test', imageRef=image_href, flavorRef=flavor_ref,
metadata={'hello': 'world', 'open': 'stack'},
personality={}))
- req = webob.Request.blank('/v1.1/servers')
+ req = webob.Request.blank('/v1.1/fake/servers')
req.method = 'POST'
req.body = json.dumps(body)
req.headers["content-type"] = "application/json"
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 400)
+ def test_create_instance_with_config_drive_v1_1(self):
+ 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'
+ body = {
+ 'server': {
+ 'name': 'config_drive_test',
+ 'imageRef': image_href,
+ 'flavorRef': flavor_ref,
+ 'metadata': {
+ 'hello': 'world',
+ 'open': 'stack',
+ },
+ 'personality': {},
+ 'config_drive': True,
+ },
+ }
+
+ req = webob.Request.blank('/v1.1/123/servers')
+ req.method = 'POST'
+ req.body = json.dumps(body)
+ req.headers["content-type"] = "application/json"
+
+ res = req.get_response(fakes.wsgi_app())
+ print res
+ self.assertEqual(res.status_int, 202)
+ server = json.loads(res.body)['server']
+ self.assertEqual(1, server['id'])
+ self.assertTrue(server['config_drive'])
+
+ def test_create_instance_with_config_drive_as_id_v1_1(self):
+ 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'
+ body = {
+ 'server': {
+ 'name': 'config_drive_test',
+ 'imageRef': image_href,
+ 'flavorRef': flavor_ref,
+ 'metadata': {
+ 'hello': 'world',
+ 'open': 'stack',
+ },
+ 'personality': {},
+ 'config_drive': 2,
+ },
+ }
+
+ req = webob.Request.blank('/v1.1/123/servers')
+ req.method = 'POST'
+ req.body = json.dumps(body)
+ req.headers["content-type"] = "application/json"
+
+ res = req.get_response(fakes.wsgi_app())
+
+ self.assertEqual(res.status_int, 202)
+ server = json.loads(res.body)['server']
+ self.assertEqual(1, server['id'])
+ self.assertTrue(server['config_drive'])
+ self.assertEqual(2, server['config_drive'])
+
+ def test_create_instance_with_bad_config_drive_v1_1(self):
+ 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'
+ body = {
+ 'server': {
+ 'name': 'config_drive_test',
+ 'imageRef': image_href,
+ 'flavorRef': flavor_ref,
+ 'metadata': {
+ 'hello': 'world',
+ 'open': 'stack',
+ },
+ 'personality': {},
+ 'config_drive': 'asdf',
+ },
+ }
+
+ req = webob.Request.blank('/v1.1/123/servers')
+ req.method = 'POST'
+ req.body = json.dumps(body)
+ req.headers["content-type"] = "application/json"
+
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(res.status_int, 400)
+
+ 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'
+ body = {
+ 'server': {
+ 'name': 'config_drive_test',
+ 'imageRef': image_href,
+ 'flavorRef': flavor_ref,
+ 'metadata': {
+ 'hello': 'world',
+ 'open': 'stack',
+ },
+ 'personality': {},
+ 'config_drive': True,
+ },
+ }
+
+ req = webob.Request.blank('/v1.1/123/servers')
+ req.method = 'POST'
+ req.body = json.dumps(body)
+ req.headers["content-type"] = "application/json"
+
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(res.status_int, 202)
+ server = json.loads(res.body)['server']
+ self.assertEqual(1, server['id'])
+ self.assertFalse(server['config_drive'])
+
def test_create_instance_v1_1_bad_href(self):
self._setup_for_create_instance()
@@ -1715,7 +1925,7 @@ class ServersTest(test.TestCase):
name='server_test', imageRef=image_href, flavorRef=flavor_ref,
metadata={'hello': 'world', 'open': 'stack'},
personality={}))
- req = webob.Request.blank('/v1.1/servers')
+ req = webob.Request.blank('/v1.1/fake/servers')
req.method = 'POST'
req.body = json.dumps(body)
req.headers["content-type"] = "application/json"
@@ -1732,7 +1942,7 @@ class ServersTest(test.TestCase):
"links": [
{
"rel": "bookmark",
- "href": 'http://localhost/flavors/3',
+ "href": 'http://localhost/fake/flavors/3',
},
],
}
@@ -1741,7 +1951,7 @@ class ServersTest(test.TestCase):
"links": [
{
"rel": "bookmark",
- "href": 'http://localhost/images/2',
+ "href": 'http://localhost/fake/images/2',
},
],
}
@@ -1753,7 +1963,7 @@ class ServersTest(test.TestCase):
},
}
- req = webob.Request.blank('/v1.1/servers')
+ req = webob.Request.blank('/v1.1/fake/servers')
req.method = 'POST'
req.body = json.dumps(body)
req.headers["content-type"] = "application/json"
@@ -1800,7 +2010,7 @@ class ServersTest(test.TestCase):
},
}
- req = webob.Request.blank('/v1.1/servers')
+ req = webob.Request.blank('/v1.1/fake/servers')
req.method = 'POST'
req.body = json.dumps(body)
req.headers['content-type'] = "application/json"
@@ -1821,13 +2031,36 @@ class ServersTest(test.TestCase):
},
}
- req = webob.Request.blank('/v1.1/servers')
+ req = webob.Request.blank('/v1.1/fake/servers')
req.method = 'POST'
req.body = json.dumps(body)
req.headers['content-type'] = "application/json"
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 400)
+ def test_create_instance_whitespace_name(self):
+ self._setup_for_create_instance()
+
+ body = {
+ 'server': {
+ 'name': ' ',
+ 'imageId': 3,
+ 'flavorId': 1,
+ 'metadata': {
+ 'hello': 'world',
+ 'open': 'stack',
+ },
+ 'personality': {},
+ },
+ }
+
+ req = webob.Request.blank('/v1.0/servers')
+ req.method = 'POST'
+ req.body = json.dumps(body)
+ req.headers["content-type"] = "application/json"
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(res.status_int, 400)
+
def test_update_server_no_body(self):
req = webob.Request.blank('/v1.0/servers/1')
req.method = 'PUT'
@@ -1895,15 +2128,37 @@ class ServersTest(test.TestCase):
self.assertEqual(mock_method.password, 'bacon')
def test_update_server_no_body_v1_1(self):
- req = webob.Request.blank('/v1.0/servers/1')
+ req = webob.Request.blank('/v1.1/fake/servers/1')
req.method = 'PUT'
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 400)
+ def test_update_server_all_attributes_v1_1(self):
+ self.stubs.Set(nova.db.api, 'instance_get',
+ 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.method = 'PUT'
+ req.content_type = 'application/json'
+ body = {'server': {
+ 'name': 'server_test',
+ 'accessIPv4': '0.0.0.0',
+ 'accessIPv6': 'beef::0123',
+ }}
+ req.body = json.dumps(body)
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(res.status_int, 200)
+ res_dict = json.loads(res.body)
+ self.assertEqual(res_dict['server']['id'], 1)
+ self.assertEqual(res_dict['server']['name'], 'server_test')
+ self.assertEqual(res_dict['server']['accessIPv4'], '0.0.0.0')
+ self.assertEqual(res_dict['server']['accessIPv6'], 'beef::0123')
+
def test_update_server_name_v1_1(self):
self.stubs.Set(nova.db.api, 'instance_get',
return_server_with_attributes(name='server_test'))
- req = webob.Request.blank('/v1.1/servers/1')
+ req = webob.Request.blank('/v1.1/fake/servers/1')
req.method = 'PUT'
req.content_type = 'application/json'
req.body = json.dumps({'server': {'name': 'server_test'}})
@@ -1913,6 +2168,32 @@ class ServersTest(test.TestCase):
self.assertEqual(res_dict['server']['id'], 1)
self.assertEqual(res_dict['server']['name'], 'server_test')
+ 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.method = 'PUT'
+ req.content_type = 'application/json'
+ req.body = json.dumps({'server': {'accessIPv4': '0.0.0.0'}})
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(res.status_int, 200)
+ res_dict = json.loads(res.body)
+ self.assertEqual(res_dict['server']['id'], 1)
+ self.assertEqual(res_dict['server']['accessIPv4'], '0.0.0.0')
+
+ 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.method = 'PUT'
+ req.content_type = 'application/json'
+ req.body = json.dumps({'server': {'accessIPv6': 'beef::0123'}})
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(res.status_int, 200)
+ res_dict = json.loads(res.body)
+ self.assertEqual(res_dict['server']['id'], 1)
+ self.assertEqual(res_dict['server']['accessIPv6'], 'beef::0123')
+
def test_update_server_adminPass_ignored_v1_1(self):
inst_dict = dict(name='server_test', adminPass='bacon')
self.body = json.dumps(dict(server=inst_dict))
@@ -1926,7 +2207,7 @@ class ServersTest(test.TestCase):
self.stubs.Set(nova.db.api, 'instance_get',
return_server_with_attributes(name='server_test'))
- req = webob.Request.blank('/v1.1/servers/1')
+ req = webob.Request.blank('/v1.1/fake/servers/1')
req.method = 'PUT'
req.content_type = "application/json"
req.body = self.body
@@ -1959,7 +2240,7 @@ class ServersTest(test.TestCase):
self.assertEqual(res.status_int, 501)
def test_server_backup_schedule_deprecated_v1_1(self):
- req = webob.Request.blank('/v1.1/servers/1/backup_schedule')
+ req = webob.Request.blank('/v1.1/fake/servers/1/backup_schedule')
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 404)
@@ -1999,7 +2280,7 @@ class ServersTest(test.TestCase):
"links": [
{
"rel": "bookmark",
- "href": 'http://localhost/flavors/1',
+ "href": 'http://localhost/fake/flavors/1',
},
],
}
@@ -2008,11 +2289,11 @@ class ServersTest(test.TestCase):
"links": [
{
"rel": "bookmark",
- "href": 'http://localhost/images/10',
+ "href": 'http://localhost/fake/images/10',
},
],
}
- req = webob.Request.blank('/v1.1/servers/detail')
+ req = webob.Request.blank('/v1.1/fake/servers/detail')
res = req.get_response(fakes.wsgi_app())
res_dict = json.loads(res.body)
@@ -2171,7 +2452,7 @@ class ServersTest(test.TestCase):
self.assertEqual(res.status_int, 422)
def test_delete_server_instance_v1_1(self):
- req = webob.Request.blank('/v1.1/servers/1')
+ req = webob.Request.blank('/v1.1/fake/servers/1')
req.method = 'DELETE'
self.server_delete_called = False
@@ -2512,6 +2793,62 @@ class TestServerCreateRequestXMLDeserializerV11(test.TestCase):
}
self.assertEquals(request['body'], expected)
+ def test_access_ipv4(self):
+ serial_request = """
+<server xmlns="http://docs.openstack.org/compute/api/v1.1"
+ name="new-server-test"
+ imageRef="1"
+ flavorRef="2"
+ accessIPv4="1.2.3.4"/>"""
+ request = self.deserializer.deserialize(serial_request, 'create')
+ expected = {
+ "server": {
+ "name": "new-server-test",
+ "imageRef": "1",
+ "flavorRef": "2",
+ "accessIPv4": "1.2.3.4",
+ },
+ }
+ self.assertEquals(request['body'], expected)
+
+ def test_access_ipv6(self):
+ serial_request = """
+<server xmlns="http://docs.openstack.org/compute/api/v1.1"
+ name="new-server-test"
+ imageRef="1"
+ flavorRef="2"
+ accessIPv6="fead::1234"/>"""
+ request = self.deserializer.deserialize(serial_request, 'create')
+ expected = {
+ "server": {
+ "name": "new-server-test",
+ "imageRef": "1",
+ "flavorRef": "2",
+ "accessIPv6": "fead::1234",
+ },
+ }
+ self.assertEquals(request['body'], expected)
+
+ def test_access_ip(self):
+ serial_request = """
+<server xmlns="http://docs.openstack.org/compute/api/v1.1"
+ name="new-server-test"
+ imageRef="1"
+ flavorRef="2"
+ accessIPv4="1.2.3.4"
+ accessIPv6="fead::1234"/>"""
+ request = self.deserializer.deserialize(serial_request, 'create')
+ expected = {
+ "server": {
+ "name": "new-server-test",
+ "imageRef": "1",
+ "flavorRef": "2",
+ "accessIPv4": "1.2.3.4",
+ "accessIPv6": "fead::1234",
+ },
+ }
+ self.assertEquals(request['body'], expected)
+
def test_admin_pass(self):
serial_request = """
<server xmlns="http://docs.openstack.org/compute/api/v1.1"
@@ -2663,6 +3000,164 @@ class TestServerCreateRequestXMLDeserializerV11(test.TestCase):
}
self.assertEquals(request['body'], expected)
+ def test_request_with_empty_networks(self):
+ serial_request = """
+<server xmlns="http://docs.openstack.org/compute/api/v1.1"
+ name="new-server-test" imageRef="1" flavorRef="1">
+ <networks/>
+</server>"""
+ request = self.deserializer.deserialize(serial_request, 'create')
+ expected = {"server": {
+ "name": "new-server-test",
+ "imageRef": "1",
+ "flavorRef": "1",
+ "networks": []
+ }}
+ self.assertEquals(request['body'], expected)
+
+ def test_request_with_one_network(self):
+ serial_request = """
+<server xmlns="http://docs.openstack.org/compute/api/v1.1"
+ name="new-server-test" imageRef="1" flavorRef="1">
+ <networks>
+ <network uuid="1" fixed_ip="10.0.1.12"/>
+ </networks>
+</server>"""
+ request = self.deserializer.deserialize(serial_request, 'create')
+ expected = {"server": {
+ "name": "new-server-test",
+ "imageRef": "1",
+ "flavorRef": "1",
+ "networks": [{"uuid": "1", "fixed_ip": "10.0.1.12"}],
+ }}
+ self.assertEquals(request['body'], expected)
+
+ def test_request_with_two_networks(self):
+ serial_request = """
+<server xmlns="http://docs.openstack.org/compute/api/v1.1"
+ name="new-server-test" imageRef="1" flavorRef="1">
+ <networks>
+ <network uuid="1" fixed_ip="10.0.1.12"/>
+ <network uuid="2" fixed_ip="10.0.2.12"/>
+ </networks>
+</server>"""
+ request = self.deserializer.deserialize(serial_request, 'create')
+ expected = {"server": {
+ "name": "new-server-test",
+ "imageRef": "1",
+ "flavorRef": "1",
+ "networks": [{"uuid": "1", "fixed_ip": "10.0.1.12"},
+ {"uuid": "2", "fixed_ip": "10.0.2.12"}],
+ }}
+ self.assertEquals(request['body'], expected)
+
+ def test_request_with_second_network_node_ignored(self):
+ serial_request = """
+<server xmlns="http://docs.openstack.org/compute/api/v1.1"
+ name="new-server-test" imageRef="1" flavorRef="1">
+ <networks>
+ <network uuid="1" fixed_ip="10.0.1.12"/>
+ </networks>
+ <networks>
+ <network uuid="2" fixed_ip="10.0.2.12"/>
+ </networks>
+</server>"""
+ request = self.deserializer.deserialize(serial_request, 'create')
+ expected = {"server": {
+ "name": "new-server-test",
+ "imageRef": "1",
+ "flavorRef": "1",
+ "networks": [{"uuid": "1", "fixed_ip": "10.0.1.12"}],
+ }}
+ self.assertEquals(request['body'], expected)
+
+ def test_request_with_one_network_missing_id(self):
+ serial_request = """
+<server xmlns="http://docs.openstack.org/compute/api/v1.1"
+ name="new-server-test" imageRef="1" flavorRef="1">
+ <networks>
+ <network fixed_ip="10.0.1.12"/>
+ </networks>
+</server>"""
+ request = self.deserializer.deserialize(serial_request, 'create')
+ expected = {"server": {
+ "name": "new-server-test",
+ "imageRef": "1",
+ "flavorRef": "1",
+ "networks": [{"fixed_ip": "10.0.1.12"}],
+ }}
+ self.assertEquals(request['body'], expected)
+
+ def test_request_with_one_network_missing_fixed_ip(self):
+ serial_request = """
+<server xmlns="http://docs.openstack.org/compute/api/v1.1"
+ name="new-server-test" imageRef="1" flavorRef="1">
+ <networks>
+ <network uuid="1"/>
+ </networks>
+</server>"""
+ request = self.deserializer.deserialize(serial_request, 'create')
+ expected = {"server": {
+ "name": "new-server-test",
+ "imageRef": "1",
+ "flavorRef": "1",
+ "networks": [{"uuid": "1"}],
+ }}
+ self.assertEquals(request['body'], expected)
+
+ def test_request_with_one_network_empty_id(self):
+ serial_request = """
+ <server xmlns="http://docs.openstack.org/compute/api/v1.1"
+ name="new-server-test" imageRef="1" flavorRef="1">
+ <networks>
+ <network uuid="" fixed_ip="10.0.1.12"/>
+ </networks>
+ </server>"""
+ request = self.deserializer.deserialize(serial_request, 'create')
+ expected = {"server": {
+ "name": "new-server-test",
+ "imageRef": "1",
+ "flavorRef": "1",
+ "networks": [{"uuid": "", "fixed_ip": "10.0.1.12"}],
+ }}
+ self.assertEquals(request['body'], expected)
+
+ def test_request_with_one_network_empty_fixed_ip(self):
+ serial_request = """
+ <server xmlns="http://docs.openstack.org/compute/api/v1.1"
+ name="new-server-test" imageRef="1" flavorRef="1">
+ <networks>
+ <network uuid="1" fixed_ip=""/>
+ </networks>
+ </server>"""
+ request = self.deserializer.deserialize(serial_request, 'create')
+ expected = {"server": {
+ "name": "new-server-test",
+ "imageRef": "1",
+ "flavorRef": "1",
+ "networks": [{"uuid": "1", "fixed_ip": ""}],
+ }}
+ self.assertEquals(request['body'], expected)
+
+ def test_request_with_networks_duplicate_ids(self):
+ serial_request = """
+ <server xmlns="http://docs.openstack.org/compute/api/v1.1"
+ name="new-server-test" imageRef="1" flavorRef="1">
+ <networks>
+ <network uuid="1" fixed_ip="10.0.1.12"/>
+ <network uuid="1" fixed_ip="10.0.2.12"/>
+ </networks>
+ </server>"""
+ request = self.deserializer.deserialize(serial_request, 'create')
+ expected = {"server": {
+ "name": "new-server-test",
+ "imageRef": "1",
+ "flavorRef": "1",
+ "networks": [{"uuid": "1", "fixed_ip": "10.0.1.12"},
+ {"uuid": "1", "fixed_ip": "10.0.2.12"}],
+ }}
+ self.assertEquals(request['body'], expected)
+
class TestAddressesXMLSerialization(test.TestCase):
@@ -2733,12 +3228,14 @@ class TestServerInstanceCreation(test.TestCase):
def __init__(self):
self.injected_files = None
+ self.networks = None
def create(self, *args, **kwargs):
if 'injected_files' in kwargs:
self.injected_files = kwargs['injected_files']
else:
self.injected_files = None
+
return [{'id': '1234', 'display_name': 'fakeinstance',
'uuid': FAKE_UUID}]
@@ -3060,24 +3557,28 @@ class ServersViewBuilderV11Test(test.TestCase):
"display_description": "",
"locked": False,
"metadata": [],
+ "accessIPv4": "1.2.3.4",
+ "accessIPv6": "fead::1234",
#"address": ,
#"floating_ips": [{"address":ip} for ip in public_addresses]}
"uuid": "deadbeef-feed-edee-beef-d0ea7beefedd"}
return instance
- def _get_view_builder(self):
+ def _get_view_builder(self, project_id=""):
base_url = "http://localhost/v1.1"
views = nova.api.openstack.views
address_builder = views.addresses.ViewBuilderV11()
- flavor_builder = views.flavors.ViewBuilderV11(base_url)
- image_builder = views.images.ViewBuilderV11(base_url)
+ flavor_builder = views.flavors.ViewBuilderV11(base_url, project_id)
+ image_builder = views.images.ViewBuilderV11(base_url, project_id)
view_builder = nova.api.openstack.views.servers.ViewBuilderV11(
address_builder,
flavor_builder,
image_builder,
- base_url)
+ base_url,
+ project_id,
+ )
return view_builder
def test_build_server(self):
@@ -3096,12 +3597,37 @@ class ServersViewBuilderV11Test(test.TestCase):
"href": "http://localhost/servers/1",
},
],
+ "config_drive": None,
}
}
output = self.view_builder.build(self.instance, False)
self.assertDictMatch(output, expected_server)
+ def test_build_server_with_project_id(self):
+ expected_server = {
+ "server": {
+ "id": 1,
+ "uuid": self.instance['uuid'],
+ "name": "test_server",
+ "config_drive": None,
+ "links": [
+ {
+ "rel": "self",
+ "href": "http://localhost/v1.1/fake/servers/1",
+ },
+ {
+ "rel": "bookmark",
+ "href": "http://localhost/fake/servers/1",
+ },
+ ],
+ }
+ }
+
+ view_builder = self._get_view_builder(project_id='fake')
+ output = view_builder.build(self.instance, False)
+ self.assertDictMatch(output, expected_server)
+
def test_build_server_detail(self):
image_bookmark = "http://localhost/images/5"
flavor_bookmark = "http://localhost/flavors/1"
@@ -3114,6 +3640,8 @@ class ServersViewBuilderV11Test(test.TestCase):
"progress": 0,
"name": "test_server",
"status": "BUILD",
+ "accessIPv4": "",
+ "accessIPv6": "",
"hostId": '',
"image": {
"id": "5",
@@ -3135,6 +3663,7 @@ class ServersViewBuilderV11Test(test.TestCase):
},
"addresses": {},
"metadata": {},
+ "config_drive": None,
"links": [
{
"rel": "self",
@@ -3165,6 +3694,8 @@ class ServersViewBuilderV11Test(test.TestCase):
"progress": 100,
"name": "test_server",
"status": "ACTIVE",
+ "accessIPv4": "",
+ "accessIPv6": "",
"hostId": '',
"image": {
"id": "5",
@@ -3186,6 +3717,117 @@ class ServersViewBuilderV11Test(test.TestCase):
},
"addresses": {},
"metadata": {},
+ "config_drive": None,
+ "links": [
+ {
+ "rel": "self",
+ "href": "http://localhost/v1.1/servers/1",
+ },
+ {
+ "rel": "bookmark",
+ "href": "http://localhost/servers/1",
+ },
+ ],
+ }
+ }
+
+ output = self.view_builder.build(self.instance, True)
+ self.assertDictMatch(output, expected_server)
+
+ def test_build_server_detail_with_accessipv4(self):
+
+ self.instance['access_ip_v4'] = '1.2.3.4'
+
+ image_bookmark = "http://localhost/images/5"
+ flavor_bookmark = "http://localhost/flavors/1"
+ expected_server = {
+ "server": {
+ "id": 1,
+ "uuid": self.instance['uuid'],
+ "updated": "2010-11-11T11:00:00Z",
+ "created": "2010-10-10T12:00:00Z",
+ "progress": 0,
+ "name": "test_server",
+ "status": "BUILD",
+ "hostId": '',
+ "image": {
+ "id": "5",
+ "links": [
+ {
+ "rel": "bookmark",
+ "href": image_bookmark,
+ },
+ ],
+ },
+ "flavor": {
+ "id": "1",
+ "links": [
+ {
+ "rel": "bookmark",
+ "href": flavor_bookmark,
+ },
+ ],
+ },
+ "addresses": {},
+ "metadata": {},
+ "config_drive": None,
+ "accessIPv4": "1.2.3.4",
+ "accessIPv6": "",
+ "links": [
+ {
+ "rel": "self",
+ "href": "http://localhost/v1.1/servers/1",
+ },
+ {
+ "rel": "bookmark",
+ "href": "http://localhost/servers/1",
+ },
+ ],
+ }
+ }
+
+ output = self.view_builder.build(self.instance, True)
+ self.assertDictMatch(output, expected_server)
+
+ def test_build_server_detail_with_accessipv6(self):
+
+ self.instance['access_ip_v6'] = 'fead::1234'
+
+ image_bookmark = "http://localhost/images/5"
+ flavor_bookmark = "http://localhost/flavors/1"
+ expected_server = {
+ "server": {
+ "id": 1,
+ "uuid": self.instance['uuid'],
+ "updated": "2010-11-11T11:00:00Z",
+ "created": "2010-10-10T12:00:00Z",
+ "progress": 0,
+ "name": "test_server",
+ "status": "BUILD",
+ "hostId": '',
+ "image": {
+ "id": "5",
+ "links": [
+ {
+ "rel": "bookmark",
+ "href": image_bookmark,
+ },
+ ],
+ },
+ "flavor": {
+ "id": "1",
+ "links": [
+ {
+ "rel": "bookmark",
+ "href": flavor_bookmark,
+ },
+ ],
+ },
+ "addresses": {},
+ "metadata": {},
+ "config_drive": None,
+ "accessIPv4": "",
+ "accessIPv6": "fead::1234",
"links": [
{
"rel": "self",
@@ -3220,6 +3862,8 @@ class ServersViewBuilderV11Test(test.TestCase):
"progress": 0,
"name": "test_server",
"status": "BUILD",
+ "accessIPv4": "",
+ "accessIPv6": "",
"hostId": '',
"image": {
"id": "5",
@@ -3244,6 +3888,7 @@ class ServersViewBuilderV11Test(test.TestCase):
"Open": "Stack",
"Number": "1",
},
+ "config_drive": None,
"links": [
{
"rel": "self",
@@ -3286,6 +3931,8 @@ class ServerXMLSerializationTest(test.TestCase):
"name": "test_server",
"status": "BUILD",
"hostId": 'e4d909c290d0fb1ca068ffaddf22cbd0',
+ "accessIPv4": "1.2.3.4",
+ "accessIPv6": "fead::1234",
"image": {
"id": "5",
"links": [
@@ -3344,7 +3991,9 @@ class ServerXMLSerializationTest(test.TestCase):
}
output = serializer.serialize(fixture, 'show')
- actual = minidom.parseString(output.replace(" ", ""))
+ print output
+ root = etree.XML(output)
+ xmlutil.validate_schema(root, 'server')
expected_server_href = self.SERVER_HREF
expected_server_bookmark = self.SERVER_BOOKMARK
@@ -3352,47 +4001,57 @@ class ServerXMLSerializationTest(test.TestCase):
expected_flavor_bookmark = self.FLAVOR_BOOKMARK
expected_now = self.TIMESTAMP
expected_uuid = FAKE_UUID
- expected = minidom.parseString("""
- <server id="1"
- uuid="%(expected_uuid)s"
- xmlns="http://docs.openstack.org/compute/api/v1.1"
- xmlns:atom="http://www.w3.org/2005/Atom"
- name="test_server"
- updated="%(expected_now)s"
- created="%(expected_now)s"
- hostId="e4d909c290d0fb1ca068ffaddf22cbd0"
- status="BUILD"
- progress="0">
- <atom:link href="%(expected_server_href)s" rel="self"/>
- <atom:link href="%(expected_server_bookmark)s" rel="bookmark"/>
- <image id="5">
- <atom:link rel="bookmark" href="%(expected_image_bookmark)s"/>
- </image>
- <flavor id="1">
- <atom:link rel="bookmark" href="%(expected_flavor_bookmark)s"/>
- </flavor>
- <metadata>
- <meta key="Open">
- Stack
- </meta>
- <meta key="Number">
- 1
- </meta>
- </metadata>
- <addresses>
- <network id="network_one">
- <ip version="4" addr="67.23.10.138"/>
- <ip version="6" addr="::babe:67.23.10.138"/>
- </network>
- <network id="network_two">
- <ip version="4" addr="67.23.10.139"/>
- <ip version="6" addr="::babe:67.23.10.139"/>
- </network>
- </addresses>
- </server>
- """.replace(" ", "") % (locals()))
-
- self.assertEqual(expected.toxml(), actual.toxml())
+ server_dict = fixture['server']
+
+ for key in ['name', 'id', 'uuid', 'created', 'accessIPv4',
+ 'updated', 'progress', 'status', 'hostId',
+ 'accessIPv6']:
+ self.assertEqual(root.get(key), str(server_dict[key]))
+
+ link_nodes = root.findall('{0}link'.format(ATOMNS))
+ self.assertEqual(len(link_nodes), 2)
+ for i, link in enumerate(server_dict['links']):
+ for key, value in link.items():
+ self.assertEqual(link_nodes[i].get(key), value)
+
+ metadata_root = root.find('{0}metadata'.format(NS))
+ metadata_elems = metadata_root.findall('{0}meta'.format(NS))
+ self.assertEqual(len(metadata_elems), 2)
+ for i, metadata_elem in enumerate(metadata_elems):
+ (meta_key, meta_value) = server_dict['metadata'].items()[i]
+ self.assertEqual(str(metadata_elem.get('key')), str(meta_key))
+ self.assertEqual(str(metadata_elem.text).strip(), str(meta_value))
+
+ image_root = root.find('{0}image'.format(NS))
+ self.assertEqual(image_root.get('id'), server_dict['image']['id'])
+ link_nodes = image_root.findall('{0}link'.format(ATOMNS))
+ self.assertEqual(len(link_nodes), 1)
+ for i, link in enumerate(server_dict['image']['links']):
+ for key, value in link.items():
+ self.assertEqual(link_nodes[i].get(key), value)
+
+ flavor_root = root.find('{0}flavor'.format(NS))
+ self.assertEqual(flavor_root.get('id'), server_dict['flavor']['id'])
+ link_nodes = flavor_root.findall('{0}link'.format(ATOMNS))
+ self.assertEqual(len(link_nodes), 1)
+ for i, link in enumerate(server_dict['flavor']['links']):
+ for key, value in link.items():
+ self.assertEqual(link_nodes[i].get(key), value)
+
+ addresses_root = root.find('{0}addresses'.format(NS))
+ addresses_dict = server_dict['addresses']
+ network_elems = addresses_root.findall('{0}network'.format(NS))
+ self.assertEqual(len(network_elems), 2)
+ for i, network_elem in enumerate(network_elems):
+ network = addresses_dict.items()[i]
+ self.assertEqual(str(network_elem.get('id')), str(network[0]))
+ ip_elems = network_elem.findall('{0}ip'.format(NS))
+ for z, ip_elem in enumerate(ip_elems):
+ ip = network[1][z]
+ self.assertEqual(str(ip_elem.get('version')),
+ str(ip['version']))
+ self.assertEqual(str(ip_elem.get('addr')),
+ str(ip['addr']))
def test_create(self):
serializer = servers.ServerXMLSerializer()
@@ -3406,6 +4065,8 @@ class ServerXMLSerializationTest(test.TestCase):
"progress": 0,
"name": "test_server",
"status": "BUILD",
+ "accessIPv4": "1.2.3.4",
+ "accessIPv6": "fead::1234",
"hostId": "e4d909c290d0fb1ca068ffaddf22cbd0",
"adminPass": "test_password",
"image": {
@@ -3466,7 +4127,9 @@ class ServerXMLSerializationTest(test.TestCase):
}
output = serializer.serialize(fixture, 'create')
- actual = minidom.parseString(output.replace(" ", ""))
+ print output
+ root = etree.XML(output)
+ xmlutil.validate_schema(root, 'server')
expected_server_href = self.SERVER_HREF
expected_server_bookmark = self.SERVER_BOOKMARK
@@ -3474,48 +4137,57 @@ class ServerXMLSerializationTest(test.TestCase):
expected_flavor_bookmark = self.FLAVOR_BOOKMARK
expected_now = self.TIMESTAMP
expected_uuid = FAKE_UUID
- expected = minidom.parseString("""
- <server id="1"
- uuid="%(expected_uuid)s"
- xmlns="http://docs.openstack.org/compute/api/v1.1"
- xmlns:atom="http://www.w3.org/2005/Atom"
- name="test_server"
- updated="%(expected_now)s"
- created="%(expected_now)s"
- hostId="e4d909c290d0fb1ca068ffaddf22cbd0"
- status="BUILD"
- adminPass="test_password"
- progress="0">
- <atom:link href="%(expected_server_href)s" rel="self"/>
- <atom:link href="%(expected_server_bookmark)s" rel="bookmark"/>
- <image id="5">
- <atom:link rel="bookmark" href="%(expected_image_bookmark)s"/>
- </image>
- <flavor id="1">
- <atom:link rel="bookmark" href="%(expected_flavor_bookmark)s"/>
- </flavor>
- <metadata>
- <meta key="Open">
- Stack
- </meta>
- <meta key="Number">
- 1
- </meta>
- </metadata>
- <addresses>
- <network id="network_one">
- <ip version="4" addr="67.23.10.138"/>
- <ip version="6" addr="::babe:67.23.10.138"/>
- </network>
- <network id="network_two">
- <ip version="4" addr="67.23.10.139"/>
- <ip version="6" addr="::babe:67.23.10.139"/>
- </network>
- </addresses>
- </server>
- """.replace(" ", "") % (locals()))
-
- self.assertEqual(expected.toxml(), actual.toxml())
+ server_dict = fixture['server']
+
+ for key in ['name', 'id', 'uuid', 'created', 'accessIPv4',
+ 'updated', 'progress', 'status', 'hostId',
+ 'accessIPv6', 'adminPass']:
+ self.assertEqual(root.get(key), str(server_dict[key]))
+
+ link_nodes = root.findall('{0}link'.format(ATOMNS))
+ self.assertEqual(len(link_nodes), 2)
+ for i, link in enumerate(server_dict['links']):
+ for key, value in link.items():
+ self.assertEqual(link_nodes[i].get(key), value)
+
+ metadata_root = root.find('{0}metadata'.format(NS))
+ metadata_elems = metadata_root.findall('{0}meta'.format(NS))
+ self.assertEqual(len(metadata_elems), 2)
+ for i, metadata_elem in enumerate(metadata_elems):
+ (meta_key, meta_value) = server_dict['metadata'].items()[i]
+ self.assertEqual(str(metadata_elem.get('key')), str(meta_key))
+ self.assertEqual(str(metadata_elem.text).strip(), str(meta_value))
+
+ image_root = root.find('{0}image'.format(NS))
+ self.assertEqual(image_root.get('id'), server_dict['image']['id'])
+ link_nodes = image_root.findall('{0}link'.format(ATOMNS))
+ self.assertEqual(len(link_nodes), 1)
+ for i, link in enumerate(server_dict['image']['links']):
+ for key, value in link.items():
+ self.assertEqual(link_nodes[i].get(key), value)
+
+ flavor_root = root.find('{0}flavor'.format(NS))
+ self.assertEqual(flavor_root.get('id'), server_dict['flavor']['id'])
+ link_nodes = flavor_root.findall('{0}link'.format(ATOMNS))
+ self.assertEqual(len(link_nodes), 1)
+ for i, link in enumerate(server_dict['flavor']['links']):
+ for key, value in link.items():
+ self.assertEqual(link_nodes[i].get(key), value)
+
+ addresses_root = root.find('{0}addresses'.format(NS))
+ addresses_dict = server_dict['addresses']
+ network_elems = addresses_root.findall('{0}network'.format(NS))
+ self.assertEqual(len(network_elems), 2)
+ for i, network_elem in enumerate(network_elems):
+ network = addresses_dict.items()[i]
+ self.assertEqual(str(network_elem.get('id')), str(network[0]))
+ ip_elems = network_elem.findall('{0}ip'.format(NS))
+ for z, ip_elem in enumerate(ip_elems):
+ ip = network[1][z]
+ self.assertEqual(str(ip_elem.get('version')),
+ str(ip['version']))
+ self.assertEqual(str(ip_elem.get('addr')),
+ str(ip['addr']))
def test_index(self):
serializer = servers.ServerXMLSerializer()
@@ -3556,23 +4228,21 @@ class ServerXMLSerializationTest(test.TestCase):
]}
output = serializer.serialize(fixture, 'index')
- actual = minidom.parseString(output.replace(" ", ""))
-
- expected = minidom.parseString("""
- <servers xmlns="http://docs.openstack.org/compute/api/v1.1"
- xmlns:atom="http://www.w3.org/2005/Atom">
- <server id="1" name="test_server">
- <atom:link href="%(expected_server_href)s" rel="self"/>
- <atom:link href="%(expected_server_bookmark)s" rel="bookmark"/>
- </server>
- <server id="2" name="test_server_2">
- <atom:link href="%(expected_server_href_2)s" rel="self"/>
- <atom:link href="%(expected_server_bookmark_2)s" rel="bookmark"/>
- </server>
- </servers>
- """.replace(" ", "") % (locals()))
-
- self.assertEqual(expected.toxml(), actual.toxml())
+ print output
+ root = etree.XML(output)
+ xmlutil.validate_schema(root, 'servers_index')
+ server_elems = root.findall('{0}server'.format(NS))
+ self.assertEqual(len(server_elems), 2)
+ for i, server_elem in enumerate(server_elems):
+ server_dict = fixture['servers'][i]
+ for key in ['name', 'id']:
+ self.assertEqual(server_elem.get(key), str(server_dict[key]))
+
+ link_nodes = server_elem.findall('{0}link'.format(ATOMNS))
+ self.assertEqual(len(link_nodes), 2)
+ for i, link in enumerate(server_dict['links']):
+ for key, value in link.items():
+ self.assertEqual(link_nodes[i].get(key), value)
def test_detail(self):
serializer = servers.ServerXMLSerializer()
@@ -3595,6 +4265,8 @@ class ServerXMLSerializationTest(test.TestCase):
"progress": 0,
"name": "test_server",
"status": "BUILD",
+ "accessIPv4": "1.2.3.4",
+ "accessIPv6": "fead::1234",
"hostId": 'e4d909c290d0fb1ca068ffaddf22cbd0',
"image": {
"id": "5",
@@ -3648,6 +4320,8 @@ class ServerXMLSerializationTest(test.TestCase):
"progress": 100,
"name": "test_server_2",
"status": "ACTIVE",
+ "accessIPv4": "1.2.3.4",
+ "accessIPv6": "fead::1234",
"hostId": 'e4d909c290d0fb1ca068ffaddf22cbd0',
"image": {
"id": "5",
@@ -3696,71 +4370,63 @@ class ServerXMLSerializationTest(test.TestCase):
]}
output = serializer.serialize(fixture, 'detail')
- actual = minidom.parseString(output.replace(" ", ""))
-
- expected = minidom.parseString("""
- <servers xmlns="http://docs.openstack.org/compute/api/v1.1"
- xmlns:atom="http://www.w3.org/2005/Atom">
- <server id="1"
- uuid="%(expected_uuid)s"
- name="test_server"
- updated="%(expected_now)s"
- created="%(expected_now)s"
- hostId="e4d909c290d0fb1ca068ffaddf22cbd0"
- status="BUILD"
- progress="0">
- <atom:link href="%(expected_server_href)s" rel="self"/>
- <atom:link href="%(expected_server_bookmark)s" rel="bookmark"/>
- <image id="5">
- <atom:link rel="bookmark" href="%(expected_image_bookmark)s"/>
- </image>
- <flavor id="1">
- <atom:link rel="bookmark" href="%(expected_flavor_bookmark)s"/>
- </flavor>
- <metadata>
- <meta key="Number">
- 1
- </meta>
- </metadata>
- <addresses>
- <network id="network_one">
- <ip version="4" addr="67.23.10.138"/>
- <ip version="6" addr="::babe:67.23.10.138"/>
- </network>
- </addresses>
- </server>
- <server id="2"
- uuid="%(expected_uuid)s"
- name="test_server_2"
- updated="%(expected_now)s"
- created="%(expected_now)s"
- hostId="e4d909c290d0fb1ca068ffaddf22cbd0"
- status="ACTIVE"
- progress="100">
- <atom:link href="%(expected_server_href_2)s" rel="self"/>
- <atom:link href="%(expected_server_bookmark_2)s" rel="bookmark"/>
- <image id="5">
- <atom:link rel="bookmark" href="%(expected_image_bookmark)s"/>
- </image>
- <flavor id="1">
- <atom:link rel="bookmark" href="%(expected_flavor_bookmark)s"/>
- </flavor>
- <metadata>
- <meta key="Number">
- 2
- </meta>
- </metadata>
- <addresses>
- <network id="network_one">
- <ip version="4" addr="67.23.10.138"/>
- <ip version="6" addr="::babe:67.23.10.138"/>
- </network>
- </addresses>
- </server>
- </servers>
- """.replace(" ", "") % (locals()))
-
- self.assertEqual(expected.toxml(), actual.toxml())
+ print output
+ root = etree.XML(output)
+ xmlutil.validate_schema(root, 'servers')
+ server_elems = root.findall('{0}server'.format(NS))
+ self.assertEqual(len(server_elems), 2)
+ for i, server_elem in enumerate(server_elems):
+ server_dict = fixture['servers'][i]
+
+ for key in ['name', 'id', 'uuid', 'created', 'accessIPv4',
+ 'updated', 'progress', 'status', 'hostId',
+ 'accessIPv6']:
+ self.assertEqual(server_elem.get(key), str(server_dict[key]))
+
+ link_nodes = server_elem.findall('{0}link'.format(ATOMNS))
+ self.assertEqual(len(link_nodes), 2)
+ for i, link in enumerate(server_dict['links']):
+ for key, value in link.items():
+ self.assertEqual(link_nodes[i].get(key), value)
+
+ metadata_root = server_elem.find('{0}metadata'.format(NS))
+ metadata_elems = metadata_root.findall('{0}meta'.format(NS))
+ for i, metadata_elem in enumerate(metadata_elems):
+ (meta_key, meta_value) = server_dict['metadata'].items()[i]
+ self.assertEqual(str(metadata_elem.get('key')), str(meta_key))
+ self.assertEqual(str(metadata_elem.text).strip(),
+ str(meta_value))
+
+ image_root = server_elem.find('{0}image'.format(NS))
+ self.assertEqual(image_root.get('id'), server_dict['image']['id'])
+ link_nodes = image_root.findall('{0}link'.format(ATOMNS))
+ self.assertEqual(len(link_nodes), 1)
+ for i, link in enumerate(server_dict['image']['links']):
+ for key, value in link.items():
+ self.assertEqual(link_nodes[i].get(key), value)
+
+ flavor_root = server_elem.find('{0}flavor'.format(NS))
+ self.assertEqual(flavor_root.get('id'),
+ server_dict['flavor']['id'])
+ link_nodes = flavor_root.findall('{0}link'.format(ATOMNS))
+ self.assertEqual(len(link_nodes), 1)
+ for i, link in enumerate(server_dict['flavor']['links']):
+ for key, value in link.items():
+ self.assertEqual(link_nodes[i].get(key), value)
+
+ addresses_root = server_elem.find('{0}addresses'.format(NS))
+ addresses_dict = server_dict['addresses']
+ network_elems = addresses_root.findall('{0}network'.format(NS))
+ for i, network_elem in enumerate(network_elems):
+ network = addresses_dict.items()[i]
+ self.assertEqual(str(network_elem.get('id')), str(network[0]))
+ ip_elems = network_elem.findall('{0}ip'.format(NS))
+ for z, ip_elem in enumerate(ip_elems):
+ ip = network[1][z]
+ self.assertEqual(str(ip_elem.get('version')),
+ str(ip['version']))
+ self.assertEqual(str(ip_elem.get('addr')),
+ str(ip['addr']))
def test_update(self):
serializer = servers.ServerXMLSerializer()
@@ -3775,6 +4441,8 @@ class ServerXMLSerializationTest(test.TestCase):
"name": "test_server",
"status": "BUILD",
"hostId": 'e4d909c290d0fb1ca068ffaddf22cbd0',
+ "accessIPv4": "1.2.3.4",
+ "accessIPv6": "fead::1234",
"image": {
"id": "5",
"links": [
@@ -3833,7 +4501,9 @@ class ServerXMLSerializationTest(test.TestCase):
}
output = serializer.serialize(fixture, 'update')
- actual = minidom.parseString(output.replace(" ", ""))
+ print output
+ root = etree.XML(output)
+ xmlutil.validate_schema(root, 'server')
expected_server_href = self.SERVER_HREF
expected_server_bookmark = self.SERVER_BOOKMARK
@@ -3841,44 +4511,54 @@ class ServerXMLSerializationTest(test.TestCase):
expected_flavor_bookmark = self.FLAVOR_BOOKMARK
expected_now = self.TIMESTAMP
expected_uuid = FAKE_UUID
- expected = minidom.parseString("""
- <server id="1"
- uuid="%(expected_uuid)s"
- xmlns="http://docs.openstack.org/compute/api/v1.1"
- xmlns:atom="http://www.w3.org/2005/Atom"
- name="test_server"
- updated="%(expected_now)s"
- created="%(expected_now)s"
- hostId="e4d909c290d0fb1ca068ffaddf22cbd0"
- status="BUILD"
- progress="0">
- <atom:link href="%(expected_server_href)s" rel="self"/>
- <atom:link href="%(expected_server_bookmark)s" rel="bookmark"/>
- <image id="5">
- <atom:link rel="bookmark" href="%(expected_image_bookmark)s"/>
- </image>
- <flavor id="1">
- <atom:link rel="bookmark" href="%(expected_flavor_bookmark)s"/>
- </flavor>
- <metadata>
- <meta key="Open">
- Stack
- </meta>
- <meta key="Number">
- 1
- </meta>
- </metadata>
- <addresses>
- <network id="network_one">
- <ip version="4" addr="67.23.10.138"/>
- <ip version="6" addr="::babe:67.23.10.138"/>
- </network>
- <network id="network_two">
- <ip version="4" addr="67.23.10.139"/>
- <ip version="6" addr="::babe:67.23.10.139"/>
- </network>
- </addresses>
- </server>
- """.replace(" ", "") % (locals()))
-
- self.assertEqual(expected.toxml(), actual.toxml())
+ server_dict = fixture['server']
+
+ for key in ['name', 'id', 'uuid', 'created', 'accessIPv4',
+ 'updated', 'progress', 'status', 'hostId',
+ 'accessIPv6']:
+ self.assertEqual(root.get(key), str(server_dict[key]))
+
+ link_nodes = root.findall('{0}link'.format(ATOMNS))
+ self.assertEqual(len(link_nodes), 2)
+ for i, link in enumerate(server_dict['links']):
+ for key, value in link.items():
+ self.assertEqual(link_nodes[i].get(key), value)
+
+ metadata_root = root.find('{0}metadata'.format(NS))
+ metadata_elems = metadata_root.findall('{0}meta'.format(NS))
+ self.assertEqual(len(metadata_elems), 2)
+ for i, metadata_elem in enumerate(metadata_elems):
+ (meta_key, meta_value) = server_dict['metadata'].items()[i]
+ self.assertEqual(str(metadata_elem.get('key')), str(meta_key))
+ self.assertEqual(str(metadata_elem.text).strip(), str(meta_value))
+
+ image_root = root.find('{0}image'.format(NS))
+ self.assertEqual(image_root.get('id'), server_dict['image']['id'])
+ link_nodes = image_root.findall('{0}link'.format(ATOMNS))
+ self.assertEqual(len(link_nodes), 1)
+ for i, link in enumerate(server_dict['image']['links']):
+ for key, value in link.items():
+ self.assertEqual(link_nodes[i].get(key), value)
+
+ flavor_root = root.find('{0}flavor'.format(NS))
+ self.assertEqual(flavor_root.get('id'), server_dict['flavor']['id'])
+ link_nodes = flavor_root.findall('{0}link'.format(ATOMNS))
+ self.assertEqual(len(link_nodes), 1)
+ for i, link in enumerate(server_dict['flavor']['links']):
+ for key, value in link.items():
+ self.assertEqual(link_nodes[i].get(key), value)
+
+ addresses_root = root.find('{0}addresses'.format(NS))
+ addresses_dict = server_dict['addresses']
+ network_elems = addresses_root.findall('{0}network'.format(NS))
+ self.assertEqual(len(network_elems), 2)
+ for i, network_elem in enumerate(network_elems):
+ network = addresses_dict.items()[i]
+ self.assertEqual(str(network_elem.get('id')), str(network[0]))
+ ip_elems = network_elem.findall('{0}ip'.format(NS))
+ for z, ip_elem in enumerate(ip_elems):
+ ip = network[1][z]
+ self.assertEqual(str(ip_elem.get('version')),
+ str(ip['version']))
+ self.assertEqual(str(ip_elem.get('addr')),
+ str(ip['addr']))
diff --git a/nova/tests/integrated/api/client.py b/nova/tests/integrated/api/client.py
index 035a35aab..67c35fe6b 100644
--- a/nova/tests/integrated/api/client.py
+++ b/nova/tests/integrated/api/client.py
@@ -48,6 +48,14 @@ class OpenStackApiAuthenticationException(OpenStackApiException):
response)
+class OpenStackApiAuthorizationException(OpenStackApiException):
+ def __init__(self, response=None, message=None):
+ if not message:
+ message = _("Authorization error")
+ super(OpenStackApiAuthorizationException, self).__init__(message,
+ response)
+
+
class OpenStackApiNotFoundException(OpenStackApiException):
def __init__(self, response=None, message=None):
if not message:
@@ -69,6 +77,8 @@ class TestOpenStackClient(object):
self.auth_user = auth_user
self.auth_key = auth_key
self.auth_uri = auth_uri
+ # default project_id
+ self.project_id = 'openstack'
def request(self, url, method='GET', body=None, headers=None):
_headers = {'Content-Type': 'application/json'}
@@ -105,7 +115,8 @@ class TestOpenStackClient(object):
auth_uri = self.auth_uri
headers = {'X-Auth-User': self.auth_user,
- 'X-Auth-Key': self.auth_key}
+ 'X-Auth-Key': self.auth_key,
+ 'X-Auth-Project-Id': self.project_id}
response = self.request(auth_uri,
headers=headers)
@@ -127,7 +138,8 @@ class TestOpenStackClient(object):
# NOTE(justinsb): httplib 'helpfully' converts headers to lower case
base_uri = auth_result['x-server-management-url']
- full_uri = base_uri + relative_uri
+
+ full_uri = '%s/%s' % (base_uri, relative_uri)
headers = kwargs.setdefault('headers', {})
headers['X-Auth-Token'] = auth_result['x-auth-token']
@@ -141,6 +153,8 @@ class TestOpenStackClient(object):
if not http_status in check_response_status:
if http_status == 404:
raise OpenStackApiNotFoundException(response=response)
+ elif http_status == 401:
+ raise OpenStackApiAuthorizationException(response=response)
else:
raise OpenStackApiException(
message=_("Unexpected status code"),
@@ -256,7 +270,8 @@ class TestOpenStackClient(object):
def post_server_volume(self, server_id, volume_attachment):
return self.api_post('/servers/%s/os-volume_attachments' %
- (server_id), volume_attachment)['volumeAttachment']
+ (server_id), volume_attachment
+ )['volumeAttachment']
def delete_server_volume(self, server_id, attachment_id):
return self.api_delete('/servers/%s/os-volume_attachments/%s' %
diff --git a/nova/tests/integrated/integrated_helpers.py b/nova/tests/integrated/integrated_helpers.py
index fb2f88502..343190427 100644
--- a/nova/tests/integrated/integrated_helpers.py
+++ b/nova/tests/integrated/integrated_helpers.py
@@ -22,10 +22,8 @@ Provides common functionality for integrated unit tests
import random
import string
-from nova import exception
from nova import service
from nova import test # For the flags
-from nova.auth import manager
import nova.image.glance
from nova.log import logging
from nova.tests.integrated.api import client
@@ -58,90 +56,6 @@ def generate_new_element(items, prefix, numeric=False):
LOG.debug("Random collision on %s" % candidate)
-class TestUser(object):
- def __init__(self, name, secret, auth_url):
- self.name = name
- self.secret = secret
- self.auth_url = auth_url
-
- if not auth_url:
- raise exception.Error("auth_url is required")
- self.openstack_api = client.TestOpenStackClient(self.name,
- self.secret,
- self.auth_url)
-
- def get_unused_server_name(self):
- servers = self.openstack_api.get_servers()
- server_names = [server['name'] for server in servers]
- return generate_new_element(server_names, 'server')
-
- def get_invalid_image(self):
- images = self.openstack_api.get_images()
- image_ids = [image['id'] for image in images]
- return generate_new_element(image_ids, '', numeric=True)
-
- def get_valid_image(self, create=False):
- images = self.openstack_api.get_images()
- if create and not images:
- # TODO(justinsb): No way currently to create an image through API
- #created_image = self.openstack_api.post_image(image)
- #images.append(created_image)
- raise exception.Error("No way to create an image through API")
-
- if images:
- return images[0]
- return None
-
-
-class IntegratedUnitTestContext(object):
- def __init__(self, auth_url):
- self.auth_manager = manager.AuthManager()
-
- self.auth_url = auth_url
- self.project_name = None
-
- self.test_user = None
-
- self.setup()
-
- def setup(self):
- self._create_test_user()
-
- def _create_test_user(self):
- self.test_user = self._create_unittest_user()
-
- # No way to currently pass this through the OpenStack API
- self.project_name = 'openstack'
- self._configure_project(self.project_name, self.test_user)
-
- def cleanup(self):
- self.test_user = None
-
- def _create_unittest_user(self):
- users = self.auth_manager.get_users()
- user_names = [user.name for user in users]
- auth_name = generate_new_element(user_names, 'unittest_user_')
- auth_key = generate_random_alphanumeric(16)
-
- # Right now there's a bug where auth_name and auth_key are reversed
- # bug732907
- auth_key = auth_name
-
- self.auth_manager.create_user(auth_name, auth_name, auth_key, False)
- return TestUser(auth_name, auth_key, self.auth_url)
-
- def _configure_project(self, project_name, user):
- projects = self.auth_manager.get_projects()
- project_names = [project.name for project in projects]
- if not project_name in project_names:
- project = self.auth_manager.create_project(project_name,
- user.name,
- description=None,
- member_users=None)
- else:
- self.auth_manager.add_to_project(user.name, project_name)
-
-
class _IntegratedTestBase(test.TestCase):
def setUp(self):
super(_IntegratedTestBase, self).setUp()
@@ -163,10 +77,7 @@ class _IntegratedTestBase(test.TestCase):
self._start_api_service()
- self.context = IntegratedUnitTestContext(self.auth_url)
-
- self.user = self.context.test_user
- self.api = self.user.openstack_api
+ self.api = client.TestOpenStackClient('fake', 'fake', self.auth_url)
def _start_api_service(self):
osapi = service.WSGIService("osapi")
@@ -174,10 +85,6 @@ class _IntegratedTestBase(test.TestCase):
self.auth_url = 'http://%s:%s/v1.1' % (osapi.host, osapi.port)
LOG.warn(self.auth_url)
- def tearDown(self):
- self.context.cleanup()
- super(_IntegratedTestBase, self).tearDown()
-
def _get_flags(self):
"""An opportunity to setup flags, before the services are started."""
f = {}
@@ -190,10 +97,20 @@ class _IntegratedTestBase(test.TestCase):
f['fake_network'] = True
return f
+ def get_unused_server_name(self):
+ servers = self.api.get_servers()
+ server_names = [server['name'] for server in servers]
+ return generate_new_element(server_names, 'server')
+
+ def get_invalid_image(self):
+ images = self.api.get_images()
+ image_ids = [image['id'] for image in images]
+ return generate_new_element(image_ids, '', numeric=True)
+
def _build_minimal_create_server_request(self):
server = {}
- image = self.user.get_valid_image(create=True)
+ image = self.api.get_images()[0]
LOG.debug("Image: %s" % image)
if 'imageRef' in image:
@@ -211,7 +128,7 @@ class _IntegratedTestBase(test.TestCase):
server['flavorRef'] = 'http://fake.server/%s' % flavor['id']
# Set a valid server name
- server_name = self.user.get_unused_server_name()
+ server_name = self.get_unused_server_name()
server['name'] = server_name
return server
diff --git a/nova/tests/integrated/test_login.py b/nova/tests/integrated/test_login.py
index 06359a52f..3a863d0f9 100644
--- a/nova/tests/integrated/test_login.py
+++ b/nova/tests/integrated/test_login.py
@@ -15,11 +15,9 @@
# License for the specific language governing permissions and limitations
# under the License.
-import unittest
from nova.log import logging
from nova.tests.integrated import integrated_helpers
-from nova.tests.integrated.api import client
LOG = logging.getLogger('nova.tests.integrated')
@@ -31,34 +29,3 @@ class LoginTest(integrated_helpers._IntegratedTestBase):
flavors = self.api.get_flavors()
for flavor in flavors:
LOG.debug(_("flavor: %s") % flavor)
-
- def test_bad_login_password(self):
- """Test that I get a 401 with a bad username."""
- bad_credentials_api = client.TestOpenStackClient(self.user.name,
- "notso_password",
- self.user.auth_url)
-
- self.assertRaises(client.OpenStackApiAuthenticationException,
- bad_credentials_api.get_flavors)
-
- def test_bad_login_username(self):
- """Test that I get a 401 with a bad password."""
- bad_credentials_api = client.TestOpenStackClient("notso_username",
- self.user.secret,
- self.user.auth_url)
-
- self.assertRaises(client.OpenStackApiAuthenticationException,
- bad_credentials_api.get_flavors)
-
- def test_bad_login_both_bad(self):
- """Test that I get a 401 with both bad username and bad password."""
- bad_credentials_api = client.TestOpenStackClient("notso_username",
- "notso_password",
- self.user.auth_url)
-
- self.assertRaises(client.OpenStackApiAuthenticationException,
- bad_credentials_api.get_flavors)
-
-
-if __name__ == "__main__":
- unittest.main()
diff --git a/nova/tests/integrated/test_servers.py b/nova/tests/integrated/test_servers.py
index 725f6d529..c2f800689 100644
--- a/nova/tests/integrated/test_servers.py
+++ b/nova/tests/integrated/test_servers.py
@@ -51,7 +51,7 @@ class ServersTest(integrated_helpers._IntegratedTestBase):
self.api.post_server, post)
# With an invalid imageRef, this throws 500.
- server['imageRef'] = self.user.get_invalid_image()
+ server['imageRef'] = self.get_invalid_image()
# TODO(justinsb): Check whatever the spec says should be thrown here
self.assertRaises(client.OpenStackApiException,
self.api.post_server, post)
diff --git a/nova/tests/test_compute.py b/nova/tests/test_compute.py
index 4f5d36f14..0523d73b6 100644
--- a/nova/tests/test_compute.py
+++ b/nova/tests/test_compute.py
@@ -2,6 +2,7 @@
# Copyright 2010 United States Government as represented by the
# Administrator of the National Aeronautics and Space Administration.
+# Copyright 2011 Piston Cloud Computing, Inc.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -159,6 +160,20 @@ class ComputeTestCase(test.TestCase):
db.security_group_destroy(self.context, group['id'])
db.instance_destroy(self.context, ref[0]['id'])
+ def test_create_instance_associates_config_drive(self):
+ """Make sure create associates a config drive."""
+
+ instance_id = self._create_instance(params={'config_drive': True, })
+
+ try:
+ self.compute.run_instance(self.context, instance_id)
+ instances = db.instance_get_all(context.get_admin_context())
+ instance = instances[0]
+
+ self.assertTrue(instance.config_drive)
+ finally:
+ db.instance_destroy(self.context, instance_id)
+
def test_default_hostname_generator(self):
cases = [(None, 'server_1'), ('Hello, Server!', 'hello_server'),
('<}\x1fh\x10e\x08l\x02l\x05o\x12!{>', 'hello')]
@@ -347,7 +362,7 @@ class ComputeTestCase(test.TestCase):
self.assertEquals(msg['priority'], 'INFO')
self.assertEquals(msg['event_type'], 'compute.instance.create')
payload = msg['payload']
- self.assertEquals(payload['tenant_id'], self.project_id)
+ self.assertEquals(payload['project_id'], self.project_id)
self.assertEquals(payload['user_id'], self.user_id)
self.assertEquals(payload['instance_id'], instance_id)
self.assertEquals(payload['instance_type'], 'm1.tiny')
@@ -371,7 +386,7 @@ class ComputeTestCase(test.TestCase):
self.assertEquals(msg['priority'], 'INFO')
self.assertEquals(msg['event_type'], 'compute.instance.delete')
payload = msg['payload']
- self.assertEquals(payload['tenant_id'], self.project_id)
+ self.assertEquals(payload['project_id'], self.project_id)
self.assertEquals(payload['user_id'], self.user_id)
self.assertEquals(payload['instance_id'], instance_id)
self.assertEquals(payload['instance_type'], 'm1.tiny')
@@ -454,7 +469,7 @@ class ComputeTestCase(test.TestCase):
self.assertEquals(msg['priority'], 'INFO')
self.assertEquals(msg['event_type'], 'compute.instance.resize.prep')
payload = msg['payload']
- self.assertEquals(payload['tenant_id'], self.project_id)
+ self.assertEquals(payload['project_id'], self.project_id)
self.assertEquals(payload['user_id'], self.user_id)
self.assertEquals(payload['instance_id'], instance_id)
self.assertEquals(payload['instance_type'], 'm1.tiny')
diff --git a/nova/tests/test_network.py b/nova/tests/test_network.py
index e5c80b6f6..0b8539442 100644
--- a/nova/tests/test_network.py
+++ b/nova/tests/test_network.py
@@ -15,6 +15,7 @@
# License for the specific language governing permissions and limitations
# under the License.
+from nova import context
from nova import db
from nova import exception
from nova import log as logging
@@ -41,6 +42,7 @@ class FakeModel(dict):
networks = [{'id': 0,
+ 'uuid': "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
'label': 'test0',
'injected': False,
'multi_host': False,
@@ -60,6 +62,7 @@ networks = [{'id': 0,
'project_id': 'fake_project',
'vpn_public_address': '192.168.0.2'},
{'id': 1,
+ 'uuid': "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
'label': 'test1',
'injected': False,
'multi_host': False,
@@ -126,6 +129,8 @@ class FlatNetworkTestCase(test.TestCase):
super(FlatNetworkTestCase, self).setUp()
self.network = network_manager.FlatManager(host=HOST)
self.network.db = db
+ self.context = context.RequestContext('testuser', 'testproject',
+ is_admin=False)
def test_get_instance_nw_info(self):
self.mox.StubOutWithMock(db, 'fixed_ip_get_by_instance')
@@ -183,12 +188,73 @@ class FlatNetworkTestCase(test.TestCase):
'netmask': '255.255.255.0'}]
self.assertDictListMatch(nw[1]['ips'], check)
+ def test_validate_networks(self):
+ self.mox.StubOutWithMock(db, 'network_get_all_by_uuids')
+ self.mox.StubOutWithMock(db, "fixed_ip_get_by_address")
+
+ requested_networks = [("bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
+ "192.168.1.100")]
+ db.network_get_all_by_uuids(mox.IgnoreArg(),
+ mox.IgnoreArg()).AndReturn(networks)
+
+ fixed_ips[1]['network'] = FakeModel(**networks[1])
+ fixed_ips[1]['instance'] = None
+ db.fixed_ip_get_by_address(mox.IgnoreArg(),
+ mox.IgnoreArg()).AndReturn(fixed_ips[1])
+
+ self.mox.ReplayAll()
+ self.network.validate_networks(self.context, requested_networks)
+
+ def test_validate_networks_none_requested_networks(self):
+ self.network.validate_networks(self.context, None)
+
+ def test_validate_networks_empty_requested_networks(self):
+ requested_networks = []
+ self.mox.ReplayAll()
+
+ self.network.validate_networks(self.context, requested_networks)
+
+ def test_validate_networks_invalid_fixed_ip(self):
+ self.mox.StubOutWithMock(db, 'network_get_all_by_uuids')
+ requested_networks = [(1, "192.168.0.100.1")]
+ db.network_get_all_by_uuids(mox.IgnoreArg(),
+ mox.IgnoreArg()).AndReturn(networks)
+ self.mox.ReplayAll()
+
+ self.assertRaises(exception.FixedIpInvalid,
+ self.network.validate_networks, None,
+ requested_networks)
+
+ def test_validate_networks_empty_fixed_ip(self):
+ self.mox.StubOutWithMock(db, 'network_get_all_by_uuids')
+
+ requested_networks = [(1, "")]
+ db.network_get_all_by_uuids(mox.IgnoreArg(),
+ mox.IgnoreArg()).AndReturn(networks)
+ self.mox.ReplayAll()
+
+ self.assertRaises(exception.FixedIpInvalid,
+ self.network.validate_networks,
+ None, requested_networks)
+
+ def test_validate_networks_none_fixed_ip(self):
+ self.mox.StubOutWithMock(db, 'network_get_all_by_uuids')
+
+ requested_networks = [(1, None)]
+ db.network_get_all_by_uuids(mox.IgnoreArg(),
+ mox.IgnoreArg()).AndReturn(networks)
+ self.mox.ReplayAll()
+
+ self.network.validate_networks(None, requested_networks)
+
class VlanNetworkTestCase(test.TestCase):
def setUp(self):
super(VlanNetworkTestCase, self).setUp()
self.network = network_manager.VlanManager(host=HOST)
self.network.db = db
+ self.context = context.RequestContext('testuser', 'testproject',
+ is_admin=False)
def test_vpn_allocate_fixed_ip(self):
self.mox.StubOutWithMock(db, 'fixed_ip_associate')
@@ -232,7 +298,7 @@ class VlanNetworkTestCase(test.TestCase):
network = dict(networks[0])
network['vpn_private_address'] = '192.168.0.2'
- self.network.allocate_fixed_ip(None, 0, network)
+ self.network.allocate_fixed_ip(self.context, 0, network)
def test_create_networks_too_big(self):
self.assertRaises(ValueError, self.network.create_networks, None,
@@ -243,6 +309,68 @@ class VlanNetworkTestCase(test.TestCase):
num_networks=100, vlan_start=1,
cidr='192.168.0.1/24', network_size=100)
+ def test_validate_networks(self):
+ self.mox.StubOutWithMock(db, 'network_get_all_by_uuids')
+ self.mox.StubOutWithMock(db, "fixed_ip_get_by_address")
+
+ requested_networks = [("bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
+ "192.168.1.100")]
+ db.network_get_all_by_uuids(mox.IgnoreArg(),
+ mox.IgnoreArg(),
+ mox.IgnoreArg()).AndReturn(networks)
+
+ fixed_ips[1]['network'] = FakeModel(**networks[1])
+ fixed_ips[1]['instance'] = None
+ db.fixed_ip_get_by_address(mox.IgnoreArg(),
+ mox.IgnoreArg()).AndReturn(fixed_ips[1])
+
+ self.mox.ReplayAll()
+ self.network.validate_networks(self.context, requested_networks)
+
+ def test_validate_networks_none_requested_networks(self):
+ self.network.validate_networks(self.context, None)
+
+ def test_validate_networks_empty_requested_networks(self):
+ requested_networks = []
+ self.mox.ReplayAll()
+
+ self.network.validate_networks(self.context, requested_networks)
+
+ def test_validate_networks_invalid_fixed_ip(self):
+ self.mox.StubOutWithMock(db, 'network_get_all_by_uuids')
+ requested_networks = [(1, "192.168.0.100.1")]
+ db.network_get_all_by_uuids(mox.IgnoreArg(),
+ mox.IgnoreArg(),
+ mox.IgnoreArg()).AndReturn(networks)
+ self.mox.ReplayAll()
+
+ self.assertRaises(exception.FixedIpInvalid,
+ self.network.validate_networks, self.context,
+ requested_networks)
+
+ def test_validate_networks_empty_fixed_ip(self):
+ self.mox.StubOutWithMock(db, 'network_get_all_by_uuids')
+
+ requested_networks = [(1, "")]
+ db.network_get_all_by_uuids(mox.IgnoreArg(),
+ mox.IgnoreArg(),
+ mox.IgnoreArg()).AndReturn(networks)
+ self.mox.ReplayAll()
+
+ self.assertRaises(exception.FixedIpInvalid,
+ self.network.validate_networks,
+ self.context, requested_networks)
+
+ def test_validate_networks_none_fixed_ip(self):
+ self.mox.StubOutWithMock(db, 'network_get_all_by_uuids')
+
+ requested_networks = [(1, None)]
+ db.network_get_all_by_uuids(mox.IgnoreArg(),
+ mox.IgnoreArg(),
+ mox.IgnoreArg()).AndReturn(networks)
+ self.mox.ReplayAll()
+ self.network.validate_networks(self.context, requested_networks)
+
class CommonNetworkTestCase(test.TestCase):
diff --git a/nova/tests/test_nova_manage.py b/nova/tests/test_nova_manage.py
index 9c6563f14..f5ea68a03 100644
--- a/nova/tests/test_nova_manage.py
+++ b/nova/tests/test_nova_manage.py
@@ -28,55 +28,45 @@ sys.dont_write_bytecode = True
import imp
nova_manage = imp.load_source('nova_manage.py', NOVA_MANAGE_PATH)
sys.dont_write_bytecode = False
+import mox
+import stubout
-import netaddr
from nova import context
from nova import db
-from nova import flags
+from nova import exception
from nova import test
-
-FLAGS = flags.FLAGS
+from nova.tests.db import fakes as db_fakes
class FixedIpCommandsTestCase(test.TestCase):
def setUp(self):
super(FixedIpCommandsTestCase, self).setUp()
- cidr = '10.0.0.0/24'
- net = netaddr.IPNetwork(cidr)
- net_info = {'bridge': 'fakebr',
- 'bridge_interface': 'fakeeth',
- 'dns': FLAGS.flat_network_dns,
- 'cidr': cidr,
- 'netmask': str(net.netmask),
- 'gateway': str(net[1]),
- 'broadcast': str(net.broadcast),
- 'dhcp_start': str(net[2])}
- self.network = db.network_create_safe(context.get_admin_context(),
- net_info)
- num_ips = len(net)
- for index in range(num_ips):
- address = str(net[index])
- reserved = (index == 1 or index == 2)
- db.fixed_ip_create(context.get_admin_context(),
- {'network_id': self.network['id'],
- 'address': address,
- 'reserved': reserved})
+ self.stubs = stubout.StubOutForTesting()
+ db_fakes.stub_out_db_network_api(self.stubs)
self.commands = nova_manage.FixedIpCommands()
def tearDown(self):
- db.network_delete_safe(context.get_admin_context(), self.network['id'])
super(FixedIpCommandsTestCase, self).tearDown()
+ self.stubs.UnsetAll()
def test_reserve(self):
- self.commands.reserve('10.0.0.100')
+ self.commands.reserve('192.168.0.100')
address = db.fixed_ip_get_by_address(context.get_admin_context(),
- '10.0.0.100')
+ '192.168.0.100')
self.assertEqual(address['reserved'], True)
+ def test_reserve_nonexistent_address(self):
+ self.assertRaises(SystemExit,
+ self.commands.reserve,
+ '55.55.55.55')
+
def test_unreserve(self):
- db.fixed_ip_update(context.get_admin_context(), '10.0.0.100',
- {'reserved': True})
- self.commands.unreserve('10.0.0.100')
+ self.commands.unreserve('192.168.0.100')
address = db.fixed_ip_get_by_address(context.get_admin_context(),
- '10.0.0.100')
+ '192.168.0.100')
self.assertEqual(address['reserved'], False)
+
+ def test_unreserve_nonexistent_address(self):
+ self.assertRaises(SystemExit,
+ self.commands.unreserve,
+ '55.55.55.55')
diff --git a/nova/tests/test_utils.py b/nova/tests/test_utils.py
index ec5098a37..28e366a8e 100644
--- a/nova/tests/test_utils.py
+++ b/nova/tests/test_utils.py
@@ -384,3 +384,13 @@ class ToPrimitiveTestCase(test.TestCase):
def test_typeerror(self):
x = bytearray # Class, not instance
self.assertEquals(utils.to_primitive(x), u"<type 'bytearray'>")
+
+ def test_nasties(self):
+ def foo():
+ pass
+ x = [datetime, foo, dir]
+ ret = utils.to_primitive(x)
+ self.assertEquals(len(ret), 3)
+ self.assertTrue(ret[0].startswith(u"<module 'datetime' from "))
+ self.assertTrue(ret[1].startswith(u'<function foo at 0x'))
+ self.assertEquals(ret[2], u'<built-in function dir>')