summaryrefslogtreecommitdiffstats
path: root/nova/tests
diff options
context:
space:
mode:
authorWilliam Wolf <throughnothing@gmail.com>2011-08-10 01:18:44 -0400
committerWilliam Wolf <throughnothing@gmail.com>2011-08-10 01:18:44 -0400
commitc8a4a55437a332c49c7c1afc52a9c1c8bf93e593 (patch)
treee4e335cc60ec553296167dd24acaa51c80cf2688 /nova/tests
parenta8a5b27a577f8e007e2cc79570f97ae075fda767 (diff)
parent4b3165429797d40da17f5c59aaeadb00673b71b2 (diff)
merge trunk
Diffstat (limited to 'nova/tests')
-rw-r--r--nova/tests/api/openstack/fakes.py8
-rw-r--r--nova/tests/api/openstack/test_servers.py277
-rw-r--r--nova/tests/test_compute.py458
-rw-r--r--nova/tests/test_metadata.py6
4 files changed, 743 insertions, 6 deletions
diff --git a/nova/tests/api/openstack/fakes.py b/nova/tests/api/openstack/fakes.py
index a67a28a4e..d11fbf788 100644
--- a/nova/tests/api/openstack/fakes.py
+++ b/nova/tests/api/openstack/fakes.py
@@ -71,14 +71,18 @@ def fake_wsgi(self, req):
return self.application
-def wsgi_app(inner_app10=None, inner_app11=None, fake_auth=True):
+def wsgi_app(inner_app10=None, inner_app11=None, fake_auth=True,
+ fake_auth_context=None):
if not inner_app10:
inner_app10 = openstack.APIRouterV10()
if not inner_app11:
inner_app11 = openstack.APIRouterV11()
if fake_auth:
- ctxt = context.RequestContext('fake', 'fake')
+ if fake_auth_context is not None:
+ ctxt = fake_auth_context
+ else:
+ ctxt = context.RequestContext('fake', 'fake')
api10 = openstack.FaultWrapper(wsgi.InjectContext(ctxt,
limits.RateLimitingMiddleware(inner_app10)))
api11 = openstack.FaultWrapper(wsgi.InjectContext(ctxt,
diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py
index d2ef30f6e..c744b9c04 100644
--- a/nova/tests/api/openstack/test_servers.py
+++ b/nova/tests/api/openstack/test_servers.py
@@ -236,7 +236,8 @@ class ServersTest(test.TestCase):
fakes.stub_out_key_pair_funcs(self.stubs)
fakes.stub_out_image_service(self.stubs)
self.stubs.Set(utils, 'gen_uuid', fake_gen_uuid)
- self.stubs.Set(nova.db.api, 'instance_get_all', return_servers)
+ self.stubs.Set(nova.db.api, 'instance_get_all_by_filters',
+ return_servers)
self.stubs.Set(nova.db.api, 'instance_get', return_server_by_id)
self.stubs.Set(nova.db, 'instance_get_by_uuid',
return_server_by_uuid)
@@ -1098,6 +1099,277 @@ class ServersTest(test.TestCase):
self.assertEqual(res.status_int, 400)
self.assertTrue(res.body.find('marker param') > -1)
+ def test_get_servers_with_bad_option_v1_0(self):
+ # 1.0 API ignores unknown options
+ def fake_get_all(compute_self, context, search_opts=None):
+ return [stub_instance(100)]
+
+ self.stubs.Set(nova.compute.API, 'get_all', fake_get_all)
+
+ req = webob.Request.blank('/v1.0/servers?unknownoption=whee')
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(res.status_int, 200)
+ servers = json.loads(res.body)['servers']
+ self.assertEqual(len(servers), 1)
+ self.assertEqual(servers[0]['id'], 100)
+
+ def test_get_servers_with_bad_option_v1_1(self):
+ # 1.1 API also ignores unknown options
+ def fake_get_all(compute_self, context, search_opts=None):
+ return [stub_instance(100)]
+
+ self.stubs.Set(nova.compute.API, 'get_all', fake_get_all)
+
+ req = webob.Request.blank('/v1.1/servers?unknownoption=whee')
+ res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(res.status_int, 200)
+ servers = json.loads(res.body)['servers']
+ self.assertEqual(len(servers), 1)
+ self.assertEqual(servers[0]['id'], 100)
+
+ def test_get_servers_allows_image_v1_1(self):
+ def fake_get_all(compute_self, context, search_opts=None):
+ self.assertNotEqual(search_opts, None)
+ self.assertTrue('image' in search_opts)
+ self.assertEqual(search_opts['image'], '12345')
+ return [stub_instance(100)]
+
+ 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')
+ res = req.get_response(fakes.wsgi_app())
+ # The following assert will fail if either of the asserts in
+ # fake_get_all() fail
+ self.assertEqual(res.status_int, 200)
+ servers = json.loads(res.body)['servers']
+ self.assertEqual(len(servers), 1)
+ self.assertEqual(servers[0]['id'], 100)
+
+ def test_get_servers_allows_flavor_v1_1(self):
+ def fake_get_all(compute_self, context, search_opts=None):
+ self.assertNotEqual(search_opts, None)
+ self.assertTrue('flavor' in search_opts)
+ # flavor is an integer ID
+ self.assertEqual(search_opts['flavor'], '12345')
+ return [stub_instance(100)]
+
+ 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')
+ res = req.get_response(fakes.wsgi_app())
+ # The following assert will fail if either of the asserts in
+ # fake_get_all() fail
+ self.assertEqual(res.status_int, 200)
+ servers = json.loads(res.body)['servers']
+ self.assertEqual(len(servers), 1)
+ self.assertEqual(servers[0]['id'], 100)
+
+ def test_get_servers_allows_status_v1_1(self):
+ def fake_get_all(compute_self, context, search_opts=None):
+ self.assertNotEqual(search_opts, None)
+ self.assertTrue('state' in search_opts)
+ self.assertEqual(set(search_opts['state']),
+ set([power_state.RUNNING, power_state.BLOCKED]))
+ return [stub_instance(100)]
+
+ 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')
+ res = req.get_response(fakes.wsgi_app())
+ # The following assert will fail if either of the asserts in
+ # fake_get_all() fail
+ self.assertEqual(res.status_int, 200)
+ servers = json.loads(res.body)['servers']
+ self.assertEqual(len(servers), 1)
+ self.assertEqual(servers[0]['id'], 100)
+
+ def test_get_servers_invalid_status_v1_1(self):
+ """Test getting servers by invalid status"""
+
+ self.flags(allow_admin_api=False)
+
+ req = webob.Request.blank('/v1.1/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
+ self.assertEqual(res.status_int, 400)
+ self.assertTrue(res.body.find('Invalid server status') > -1)
+
+ def test_get_servers_allows_name_v1_1(self):
+ def fake_get_all(compute_self, context, search_opts=None):
+ self.assertNotEqual(search_opts, None)
+ self.assertTrue('name' in search_opts)
+ self.assertEqual(search_opts['name'], 'whee.*')
+ return [stub_instance(100)]
+
+ 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.*')
+ res = req.get_response(fakes.wsgi_app())
+ # The following assert will fail if either of the asserts in
+ # fake_get_all() fail
+ self.assertEqual(res.status_int, 200)
+ servers = json.loads(res.body)['servers']
+ self.assertEqual(len(servers), 1)
+ self.assertEqual(servers[0]['id'], 100)
+
+ def test_get_servers_unknown_or_admin_options1(self):
+ """Test getting servers by admin-only or unknown options.
+ This tests when admin_api is off. Make sure the admin and
+ unknown options are stripped before they get to
+ compute_api.get_all()
+ """
+
+ self.flags(allow_admin_api=False)
+
+ def fake_get_all(compute_self, context, search_opts=None):
+ self.assertNotEqual(search_opts, None)
+ # Allowed by user
+ self.assertTrue('name' in search_opts)
+ self.assertTrue('status' in search_opts)
+ # Allowed only by admins with admin API on
+ self.assertFalse('ip' in search_opts)
+ self.assertFalse('unknown_option' in search_opts)
+ return [stub_instance(100)]
+
+ 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)
+ # Request admin context
+ context = nova.context.RequestContext('testuser', 'testproject',
+ is_admin=True)
+ res = req.get_response(fakes.wsgi_app(fake_auth_context=context))
+ # The following assert will fail if either of the asserts in
+ # fake_get_all() fail
+ self.assertEqual(res.status_int, 200)
+ servers = json.loads(res.body)['servers']
+ self.assertEqual(len(servers), 1)
+ self.assertEqual(servers[0]['id'], 100)
+
+ def test_get_servers_unknown_or_admin_options2(self):
+ """Test getting servers by admin-only or unknown options.
+ This tests when admin_api is on, but context is a user.
+ Make sure the admin and unknown options are stripped before
+ they get to compute_api.get_all()
+ """
+
+ self.flags(allow_admin_api=True)
+
+ def fake_get_all(compute_self, context, search_opts=None):
+ self.assertNotEqual(search_opts, None)
+ # Allowed by user
+ self.assertTrue('name' in search_opts)
+ self.assertTrue('status' in search_opts)
+ # Allowed only by admins with admin API on
+ self.assertFalse('ip' in search_opts)
+ self.assertFalse('unknown_option' in search_opts)
+ return [stub_instance(100)]
+
+ 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)
+ # Request admin context
+ context = nova.context.RequestContext('testuser', 'testproject',
+ is_admin=False)
+ res = req.get_response(fakes.wsgi_app(fake_auth_context=context))
+ # The following assert will fail if either of the asserts in
+ # fake_get_all() fail
+ self.assertEqual(res.status_int, 200)
+ servers = json.loads(res.body)['servers']
+ self.assertEqual(len(servers), 1)
+ self.assertEqual(servers[0]['id'], 100)
+
+ def test_get_servers_unknown_or_admin_options3(self):
+ """Test getting servers by admin-only or unknown options.
+ This tests when admin_api is on and context is admin.
+ All options should be passed through to compute_api.get_all()
+ """
+
+ self.flags(allow_admin_api=True)
+
+ def fake_get_all(compute_self, context, search_opts=None):
+ self.assertNotEqual(search_opts, None)
+ # Allowed by user
+ self.assertTrue('name' in search_opts)
+ self.assertTrue('status' in search_opts)
+ # Allowed only by admins with admin API on
+ self.assertTrue('ip' in search_opts)
+ self.assertTrue('unknown_option' in search_opts)
+ return [stub_instance(100)]
+
+ 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)
+ # Request admin context
+ context = nova.context.RequestContext('testuser', 'testproject',
+ is_admin=True)
+ res = req.get_response(fakes.wsgi_app(fake_auth_context=context))
+ # The following assert will fail if either of the asserts in
+ # fake_get_all() fail
+ self.assertEqual(res.status_int, 200)
+ servers = json.loads(res.body)['servers']
+ self.assertEqual(len(servers), 1)
+ self.assertEqual(servers[0]['id'], 100)
+
+ def test_get_servers_admin_allows_ip_v1_1(self):
+ """Test getting servers by ip with admin_api enabled and
+ admin context
+ """
+ self.flags(allow_admin_api=True)
+
+ def fake_get_all(compute_self, context, search_opts=None):
+ self.assertNotEqual(search_opts, None)
+ self.assertTrue('ip' in search_opts)
+ self.assertEqual(search_opts['ip'], '10\..*')
+ return [stub_instance(100)]
+
+ self.stubs.Set(nova.compute.API, 'get_all', fake_get_all)
+
+ req = webob.Request.blank('/v1.1/servers?ip=10\..*')
+ # Request admin context
+ context = nova.context.RequestContext('testuser', 'testproject',
+ is_admin=True)
+ res = req.get_response(fakes.wsgi_app(fake_auth_context=context))
+ # The following assert will fail if either of the asserts in
+ # fake_get_all() fail
+ self.assertEqual(res.status_int, 200)
+ servers = json.loads(res.body)['servers']
+ self.assertEqual(len(servers), 1)
+ self.assertEqual(servers[0]['id'], 100)
+
+ def test_get_servers_admin_allows_ip6_v1_1(self):
+ """Test getting servers by ip6 with admin_api enabled and
+ admin context
+ """
+ self.flags(allow_admin_api=True)
+
+ def fake_get_all(compute_self, context, search_opts=None):
+ self.assertNotEqual(search_opts, None)
+ self.assertTrue('ip6' in search_opts)
+ self.assertEqual(search_opts['ip6'], 'ffff.*')
+ return [stub_instance(100)]
+
+ self.stubs.Set(nova.compute.API, 'get_all', fake_get_all)
+
+ req = webob.Request.blank('/v1.1/servers?ip6=ffff.*')
+ # Request admin context
+ context = nova.context.RequestContext('testuser', 'testproject',
+ is_admin=True)
+ res = req.get_response(fakes.wsgi_app(fake_auth_context=context))
+ # The following assert will fail if either of the asserts in
+ # fake_get_all() fail
+ self.assertEqual(res.status_int, 200)
+ servers = json.loads(res.body)['servers']
+ self.assertEqual(len(servers), 1)
+ self.assertEqual(servers[0]['id'], 100)
+
def _setup_for_create_instance(self):
"""Shared implementation for tests below that create instance"""
def instance_create(context, inst):
@@ -1665,6 +1937,7 @@ class ServersTest(test.TestCase):
def test_get_all_server_details_v1_0(self):
req = webob.Request.blank('/v1.0/servers/detail')
res = req.get_response(fakes.wsgi_app())
+ self.assertEqual(res.status_int, 200)
res_dict = json.loads(res.body)
for i, s in enumerate(res_dict['servers']):
@@ -1720,7 +1993,7 @@ class ServersTest(test.TestCase):
return [stub_instance(i, 'fake', 'fake', None, None, i % 2)
for i in xrange(5)]
- self.stubs.Set(nova.db.api, 'instance_get_all_by_project',
+ self.stubs.Set(nova.db.api, 'instance_get_all_by_filters',
return_servers_with_host)
req = webob.Request.blank('/v1.0/servers/detail')
diff --git a/nova/tests/test_compute.py b/nova/tests/test_compute.py
index d78b30a3d..80f7ff489 100644
--- a/nova/tests/test_compute.py
+++ b/nova/tests/test_compute.py
@@ -26,6 +26,7 @@ from nova.compute import power_state
from nova import context
from nova import db
from nova.db.sqlalchemy import models
+from nova.db.sqlalchemy import api as sqlalchemy_api
from nova import exception
from nova import flags
import nova.image.fake
@@ -73,8 +74,11 @@ class ComputeTestCase(test.TestCase):
self.stubs.Set(nova.image.fake._FakeImageService, 'show', fake_show)
- def _create_instance(self, params={}):
+ def _create_instance(self, params=None):
"""Create a test instance"""
+
+ if params is None:
+ params = {}
inst = {}
inst['image_ref'] = 1
inst['reservation_id'] = 'r-fakeres'
@@ -864,6 +868,458 @@ class ComputeTestCase(test.TestCase):
self.assertEqual(len(instances), 1)
self.assertEqual(power_state.SHUTOFF, instances[0]['state'])
+ def test_get_all_by_name_regexp(self):
+ """Test searching instances by name (display_name)"""
+ c = context.get_admin_context()
+ instance_id1 = self._create_instance({'display_name': 'woot'})
+ instance_id2 = self._create_instance({
+ 'display_name': 'woo',
+ 'id': 20})
+ instance_id3 = self._create_instance({
+ 'display_name': 'not-woot',
+ 'id': 30})
+
+ instances = self.compute_api.get_all(c,
+ search_opts={'name': 'woo.*'})
+ self.assertEqual(len(instances), 2)
+ instance_ids = [instance.id for instance in instances]
+ self.assertTrue(instance_id1 in instance_ids)
+ self.assertTrue(instance_id2 in instance_ids)
+
+ instances = self.compute_api.get_all(c,
+ search_opts={'name': 'woot.*'})
+ instance_ids = [instance.id for instance in instances]
+ self.assertEqual(len(instances), 1)
+ self.assertTrue(instance_id1 in instance_ids)
+
+ instances = self.compute_api.get_all(c,
+ search_opts={'name': '.*oot.*'})
+ self.assertEqual(len(instances), 2)
+ instance_ids = [instance.id for instance in instances]
+ self.assertTrue(instance_id1 in instance_ids)
+ self.assertTrue(instance_id3 in instance_ids)
+
+ instances = self.compute_api.get_all(c,
+ search_opts={'name': 'n.*'})
+ self.assertEqual(len(instances), 1)
+ instance_ids = [instance.id for instance in instances]
+ self.assertTrue(instance_id3 in instance_ids)
+
+ instances = self.compute_api.get_all(c,
+ search_opts={'name': 'noth.*'})
+ self.assertEqual(len(instances), 0)
+
+ db.instance_destroy(c, instance_id1)
+ db.instance_destroy(c, instance_id2)
+ db.instance_destroy(c, instance_id3)
+
+ def test_get_all_by_instance_name_regexp(self):
+ """Test searching instances by name"""
+ self.flags(instance_name_template='instance-%d')
+
+ c = context.get_admin_context()
+ instance_id1 = self._create_instance()
+ instance_id2 = self._create_instance({'id': 2})
+ instance_id3 = self._create_instance({'id': 10})
+
+ instances = self.compute_api.get_all(c,
+ search_opts={'instance_name': 'instance.*'})
+ self.assertEqual(len(instances), 3)
+
+ instances = self.compute_api.get_all(c,
+ search_opts={'instance_name': '.*\-\d$'})
+ self.assertEqual(len(instances), 2)
+ instance_ids = [instance.id for instance in instances]
+ self.assertTrue(instance_id1 in instance_ids)
+ self.assertTrue(instance_id2 in instance_ids)
+
+ instances = self.compute_api.get_all(c,
+ search_opts={'instance_name': 'i.*2'})
+ self.assertEqual(len(instances), 1)
+ self.assertEqual(instances[0].id, instance_id2)
+
+ db.instance_destroy(c, instance_id1)
+ db.instance_destroy(c, instance_id2)
+ db.instance_destroy(c, instance_id3)
+
+ def test_get_by_fixed_ip(self):
+ """Test getting 1 instance by Fixed IP"""
+ c = context.get_admin_context()
+ instance_id1 = self._create_instance()
+ instance_id2 = self._create_instance({'id': 20})
+ instance_id3 = self._create_instance({'id': 30})
+
+ vif_ref1 = db.virtual_interface_create(c,
+ {'address': '12:34:56:78:90:12',
+ 'instance_id': instance_id1,
+ 'network_id': 1})
+ vif_ref2 = db.virtual_interface_create(c,
+ {'address': '90:12:34:56:78:90',
+ 'instance_id': instance_id2,
+ 'network_id': 1})
+
+ db.fixed_ip_create(c,
+ {'address': '1.1.1.1',
+ 'instance_id': instance_id1,
+ 'virtual_interface_id': vif_ref1['id']})
+ db.fixed_ip_create(c,
+ {'address': '1.1.2.1',
+ 'instance_id': instance_id2,
+ 'virtual_interface_id': vif_ref2['id']})
+
+ # regex not allowed
+ instances = self.compute_api.get_all(c,
+ search_opts={'fixed_ip': '.*'})
+ self.assertEqual(len(instances), 0)
+
+ instances = self.compute_api.get_all(c,
+ search_opts={'fixed_ip': '1.1.3.1'})
+ self.assertEqual(len(instances), 0)
+
+ instances = self.compute_api.get_all(c,
+ search_opts={'fixed_ip': '1.1.1.1'})
+ self.assertEqual(len(instances), 1)
+ self.assertEqual(instances[0].id, instance_id1)
+
+ instances = self.compute_api.get_all(c,
+ search_opts={'fixed_ip': '1.1.2.1'})
+ self.assertEqual(len(instances), 1)
+ self.assertEqual(instances[0].id, instance_id2)
+
+ db.virtual_interface_delete(c, vif_ref1['id'])
+ db.virtual_interface_delete(c, vif_ref2['id'])
+ db.instance_destroy(c, instance_id1)
+ db.instance_destroy(c, instance_id2)
+
+ def test_get_all_by_ip_regexp(self):
+ """Test searching by Floating and Fixed IP"""
+ c = context.get_admin_context()
+ instance_id1 = self._create_instance({'display_name': 'woot'})
+ instance_id2 = self._create_instance({
+ 'display_name': 'woo',
+ 'id': 20})
+ instance_id3 = self._create_instance({
+ 'display_name': 'not-woot',
+ 'id': 30})
+
+ vif_ref1 = db.virtual_interface_create(c,
+ {'address': '12:34:56:78:90:12',
+ 'instance_id': instance_id1,
+ 'network_id': 1})
+ vif_ref2 = db.virtual_interface_create(c,
+ {'address': '90:12:34:56:78:90',
+ 'instance_id': instance_id2,
+ 'network_id': 1})
+ vif_ref3 = db.virtual_interface_create(c,
+ {'address': '34:56:78:90:12:34',
+ 'instance_id': instance_id3,
+ 'network_id': 1})
+
+ db.fixed_ip_create(c,
+ {'address': '1.1.1.1',
+ 'instance_id': instance_id1,
+ 'virtual_interface_id': vif_ref1['id']})
+ db.fixed_ip_create(c,
+ {'address': '1.1.2.1',
+ 'instance_id': instance_id2,
+ 'virtual_interface_id': vif_ref2['id']})
+ fix_addr = db.fixed_ip_create(c,
+ {'address': '1.1.3.1',
+ 'instance_id': instance_id3,
+ 'virtual_interface_id': vif_ref3['id']})
+ fix_ref = db.fixed_ip_get_by_address(c, fix_addr)
+ flo_ref = db.floating_ip_create(c,
+ {'address': '10.0.0.2',
+ 'fixed_ip_id': fix_ref['id']})
+
+ # ends up matching 2nd octet here.. so all 3 match
+ instances = self.compute_api.get_all(c,
+ search_opts={'ip': '.*\.1'})
+ self.assertEqual(len(instances), 3)
+
+ instances = self.compute_api.get_all(c,
+ search_opts={'ip': '1.*'})
+ self.assertEqual(len(instances), 3)
+
+ instances = self.compute_api.get_all(c,
+ search_opts={'ip': '.*\.1.\d+$'})
+ self.assertEqual(len(instances), 1)
+ instance_ids = [instance.id for instance in instances]
+ self.assertTrue(instance_id1 in instance_ids)
+
+ instances = self.compute_api.get_all(c,
+ search_opts={'ip': '.*\.2.+'})
+ self.assertEqual(len(instances), 1)
+ self.assertEqual(instances[0].id, instance_id2)
+
+ instances = self.compute_api.get_all(c,
+ search_opts={'ip': '10.*'})
+ self.assertEqual(len(instances), 1)
+ self.assertEqual(instances[0].id, instance_id3)
+
+ db.virtual_interface_delete(c, vif_ref1['id'])
+ db.virtual_interface_delete(c, vif_ref2['id'])
+ db.virtual_interface_delete(c, vif_ref3['id'])
+ db.floating_ip_destroy(c, '10.0.0.2')
+ db.instance_destroy(c, instance_id1)
+ db.instance_destroy(c, instance_id2)
+ db.instance_destroy(c, instance_id3)
+
+ def test_get_all_by_ipv6_regexp(self):
+ """Test searching by IPv6 address"""
+
+ c = context.get_admin_context()
+ instance_id1 = self._create_instance({'display_name': 'woot'})
+ instance_id2 = self._create_instance({
+ 'display_name': 'woo',
+ 'id': 20})
+ instance_id3 = self._create_instance({
+ 'display_name': 'not-woot',
+ 'id': 30})
+
+ vif_ref1 = db.virtual_interface_create(c,
+ {'address': '12:34:56:78:90:12',
+ 'instance_id': instance_id1,
+ 'network_id': 1})
+ vif_ref2 = db.virtual_interface_create(c,
+ {'address': '90:12:34:56:78:90',
+ 'instance_id': instance_id2,
+ 'network_id': 1})
+ vif_ref3 = db.virtual_interface_create(c,
+ {'address': '34:56:78:90:12:34',
+ 'instance_id': instance_id3,
+ 'network_id': 1})
+
+ # This will create IPv6 addresses of:
+ # 1: fd00::1034:56ff:fe78:9012
+ # 20: fd00::9212:34ff:fe56:7890
+ # 30: fd00::3656:78ff:fe90:1234
+
+ instances = self.compute_api.get_all(c,
+ search_opts={'ip6': '.*1034.*'})
+ self.assertEqual(len(instances), 1)
+ self.assertEqual(instances[0].id, instance_id1)
+
+ instances = self.compute_api.get_all(c,
+ search_opts={'ip6': '^fd00.*'})
+ self.assertEqual(len(instances), 3)
+ instance_ids = [instance.id for instance in instances]
+ self.assertTrue(instance_id1 in instance_ids)
+ self.assertTrue(instance_id2 in instance_ids)
+ self.assertTrue(instance_id3 in instance_ids)
+
+ instances = self.compute_api.get_all(c,
+ search_opts={'ip6': '^.*12.*34.*'})
+ self.assertEqual(len(instances), 2)
+ instance_ids = [instance.id for instance in instances]
+ self.assertTrue(instance_id2 in instance_ids)
+ self.assertTrue(instance_id3 in instance_ids)
+
+ db.virtual_interface_delete(c, vif_ref1['id'])
+ db.virtual_interface_delete(c, vif_ref2['id'])
+ db.virtual_interface_delete(c, vif_ref3['id'])
+ db.instance_destroy(c, instance_id1)
+ db.instance_destroy(c, instance_id2)
+ db.instance_destroy(c, instance_id3)
+
+ def test_get_all_by_multiple_options_at_once(self):
+ """Test searching by multiple options at once"""
+ c = context.get_admin_context()
+ instance_id1 = self._create_instance({'display_name': 'woot'})
+ instance_id2 = self._create_instance({
+ 'display_name': 'woo',
+ 'id': 20})
+ instance_id3 = self._create_instance({
+ 'display_name': 'not-woot',
+ 'id': 30})
+
+ vif_ref1 = db.virtual_interface_create(c,
+ {'address': '12:34:56:78:90:12',
+ 'instance_id': instance_id1,
+ 'network_id': 1})
+ vif_ref2 = db.virtual_interface_create(c,
+ {'address': '90:12:34:56:78:90',
+ 'instance_id': instance_id2,
+ 'network_id': 1})
+ vif_ref3 = db.virtual_interface_create(c,
+ {'address': '34:56:78:90:12:34',
+ 'instance_id': instance_id3,
+ 'network_id': 1})
+
+ db.fixed_ip_create(c,
+ {'address': '1.1.1.1',
+ 'instance_id': instance_id1,
+ 'virtual_interface_id': vif_ref1['id']})
+ db.fixed_ip_create(c,
+ {'address': '1.1.2.1',
+ 'instance_id': instance_id2,
+ 'virtual_interface_id': vif_ref2['id']})
+ fix_addr = db.fixed_ip_create(c,
+ {'address': '1.1.3.1',
+ 'instance_id': instance_id3,
+ 'virtual_interface_id': vif_ref3['id']})
+ fix_ref = db.fixed_ip_get_by_address(c, fix_addr)
+ flo_ref = db.floating_ip_create(c,
+ {'address': '10.0.0.2',
+ 'fixed_ip_id': fix_ref['id']})
+
+ # ip ends up matching 2nd octet here.. so all 3 match ip
+ # but 'name' only matches one
+ instances = self.compute_api.get_all(c,
+ search_opts={'ip': '.*\.1', 'name': 'not.*'})
+ self.assertEqual(len(instances), 1)
+ self.assertEqual(instances[0].id, instance_id3)
+
+ # ip ends up matching any ip with a '2' in it.. so instance
+ # 2 and 3.. but name should only match #2
+ # but 'name' only matches one
+ instances = self.compute_api.get_all(c,
+ search_opts={'ip': '.*2', 'name': '^woo.*'})
+ self.assertEqual(len(instances), 1)
+ self.assertEqual(instances[0].id, instance_id2)
+
+ # same as above but no match on name (name matches instance_id1
+ # but the ip query doesn't
+ instances = self.compute_api.get_all(c,
+ search_opts={'ip': '.*2.*', 'name': '^woot.*'})
+ self.assertEqual(len(instances), 0)
+
+ # ip matches all 3... ipv6 matches #2+#3...name matches #3
+ instances = self.compute_api.get_all(c,
+ search_opts={'ip': '.*\.1',
+ 'name': 'not.*',
+ 'ip6': '^.*12.*34.*'})
+ self.assertEqual(len(instances), 1)
+ self.assertEqual(instances[0].id, instance_id3)
+
+ db.virtual_interface_delete(c, vif_ref1['id'])
+ db.virtual_interface_delete(c, vif_ref2['id'])
+ db.virtual_interface_delete(c, vif_ref3['id'])
+ db.floating_ip_destroy(c, '10.0.0.2')
+ db.instance_destroy(c, instance_id1)
+ db.instance_destroy(c, instance_id2)
+ db.instance_destroy(c, instance_id3)
+
+ def test_get_all_by_image(self):
+ """Test searching instances by image"""
+
+ c = context.get_admin_context()
+ instance_id1 = self._create_instance({'image_ref': '1234'})
+ instance_id2 = self._create_instance({
+ 'id': 2,
+ 'image_ref': '4567'})
+ instance_id3 = self._create_instance({
+ 'id': 10,
+ 'image_ref': '4567'})
+
+ instances = self.compute_api.get_all(c,
+ search_opts={'image': '123'})
+ self.assertEqual(len(instances), 0)
+
+ instances = self.compute_api.get_all(c,
+ search_opts={'image': '1234'})
+ self.assertEqual(len(instances), 1)
+ self.assertEqual(instances[0].id, instance_id1)
+
+ instances = self.compute_api.get_all(c,
+ search_opts={'image': '4567'})
+ self.assertEqual(len(instances), 2)
+ instance_ids = [instance.id for instance in instances]
+ self.assertTrue(instance_id2 in instance_ids)
+ self.assertTrue(instance_id3 in instance_ids)
+
+ # Test passing a list as search arg
+ instances = self.compute_api.get_all(c,
+ search_opts={'image': ['1234', '4567']})
+ self.assertEqual(len(instances), 3)
+
+ db.instance_destroy(c, instance_id1)
+ db.instance_destroy(c, instance_id2)
+ db.instance_destroy(c, instance_id3)
+
+ def test_get_all_by_flavor(self):
+ """Test searching instances by image"""
+
+ c = context.get_admin_context()
+ instance_id1 = self._create_instance({'instance_type_id': 1})
+ instance_id2 = self._create_instance({
+ 'id': 2,
+ 'instance_type_id': 2})
+ instance_id3 = self._create_instance({
+ 'id': 10,
+ 'instance_type_id': 2})
+
+ # NOTE(comstud): Migrations set up the instance_types table
+ # for us. Therefore, we assume the following is true for
+ # these tests:
+ # instance_type_id 1 == flavor 3
+ # instance_type_id 2 == flavor 1
+ # instance_type_id 3 == flavor 4
+ # instance_type_id 4 == flavor 5
+ # instance_type_id 5 == flavor 2
+
+ instances = self.compute_api.get_all(c,
+ search_opts={'flavor': 5})
+ self.assertEqual(len(instances), 0)
+
+ self.assertRaises(exception.FlavorNotFound,
+ self.compute_api.get_all,
+ c, search_opts={'flavor': 99})
+
+ instances = self.compute_api.get_all(c,
+ search_opts={'flavor': 3})
+ self.assertEqual(len(instances), 1)
+ self.assertEqual(instances[0].id, instance_id1)
+
+ instances = self.compute_api.get_all(c,
+ search_opts={'flavor': 1})
+ self.assertEqual(len(instances), 2)
+ instance_ids = [instance.id for instance in instances]
+ self.assertTrue(instance_id2 in instance_ids)
+ self.assertTrue(instance_id3 in instance_ids)
+
+ db.instance_destroy(c, instance_id1)
+ db.instance_destroy(c, instance_id2)
+ db.instance_destroy(c, instance_id3)
+
+ def test_get_all_by_state(self):
+ """Test searching instances by state"""
+
+ c = context.get_admin_context()
+ instance_id1 = self._create_instance({'state': power_state.SHUTDOWN})
+ instance_id2 = self._create_instance({
+ 'id': 2,
+ 'state': power_state.RUNNING})
+ instance_id3 = self._create_instance({
+ 'id': 10,
+ 'state': power_state.RUNNING})
+
+ instances = self.compute_api.get_all(c,
+ search_opts={'state': power_state.SUSPENDED})
+ self.assertEqual(len(instances), 0)
+
+ instances = self.compute_api.get_all(c,
+ search_opts={'state': power_state.SHUTDOWN})
+ self.assertEqual(len(instances), 1)
+ self.assertEqual(instances[0].id, instance_id1)
+
+ instances = self.compute_api.get_all(c,
+ search_opts={'state': power_state.RUNNING})
+ self.assertEqual(len(instances), 2)
+ instance_ids = [instance.id for instance in instances]
+ self.assertTrue(instance_id2 in instance_ids)
+ self.assertTrue(instance_id3 in instance_ids)
+
+ # Test passing a list as search arg
+ instances = self.compute_api.get_all(c,
+ search_opts={'state': [power_state.SHUTDOWN,
+ power_state.RUNNING]})
+ self.assertEqual(len(instances), 3)
+
+ db.instance_destroy(c, instance_id1)
+ db.instance_destroy(c, instance_id2)
+ db.instance_destroy(c, instance_id3)
+
@staticmethod
def _parse_db_block_device_mapping(bdm_ref):
attr_list = ('delete_on_termination', 'device_name', 'no_device',
diff --git a/nova/tests/test_metadata.py b/nova/tests/test_metadata.py
index f81e7a00a..ad678714e 100644
--- a/nova/tests/test_metadata.py
+++ b/nova/tests/test_metadata.py
@@ -43,17 +43,21 @@ class MetadataTestCase(test.TestCase):
'reservation_id': 'r-xxxxxxxx',
'user_data': '',
'image_ref': 7,
+ 'fixed_ips': [],
'root_device_name': '/dev/sda1',
'hostname': 'test'})
def instance_get(*args, **kwargs):
return self.instance
+ def instance_get_list(*args, **kwargs):
+ return [self.instance]
+
def floating_get(*args, **kwargs):
return '99.99.99.99'
self.stubs.Set(api, 'instance_get', instance_get)
- self.stubs.Set(api, 'fixed_ip_get_instance', instance_get)
+ self.stubs.Set(api, 'instance_get_all_by_filters', instance_get_list)
self.stubs.Set(api, 'instance_get_floating_address', floating_get)
self.app = metadatarequesthandler.MetadataRequestHandler()