Add nova option osapi_compute_unique_server_name_scope

Setting this option forces nova-api to check for duplicate
server names either in the project or system-wide.

The default behavior remains the same: duplicate names are allowed.

DocImpact: Adds a new Nova config option

Change-Id: I28baf8c63f9c62f457bfff0a2fb510f0c517a351
This commit is contained in:
andrewbogott
2012-10-25 12:28:25 -05:00
parent d8c9a11acc
commit afd68634ec

View File

@@ -45,9 +45,45 @@ class DbApiTestCase(test.TestCase):
def create_instances_with_args(self, **kwargs):
args = {'reservation_id': 'a', 'image_ref': 1, 'host': 'host1',
'project_id': self.project_id}
'project_id': self.project_id, 'vm_state': 'fake'}
if 'context' in kwargs:
ctxt = kwargs.pop('context')
args['project_id'] = ctxt.project_id
else:
ctxt = self.context
args.update(kwargs)
return db.instance_create(self.context, args)
return db.instance_create(ctxt, args)
def test_create_instance_unique_hostname(self):
otherprojectcontext = context.RequestContext(self.user_id,
"%s2" % self.project_id)
self.create_instances_with_args(hostname='fake_name')
# With scope 'global' any duplicate should fail, be it this project:
self.flags(osapi_compute_unique_server_name_scope='global')
self.assertRaises(exception.InstanceExists,
self.create_instances_with_args,
hostname='fake_name')
# or another:
self.assertRaises(exception.InstanceExists,
self.create_instances_with_args,
context=otherprojectcontext,
hostname='fake_name')
# With scope 'project' a duplicate in the project should fail:
self.flags(osapi_compute_unique_server_name_scope='project')
self.assertRaises(exception.InstanceExists,
self.create_instances_with_args,
hostname='fake_name')
# With scope 'project' a duplicate in a different project should work:
self.flags(osapi_compute_unique_server_name_scope='project')
self.create_instances_with_args(context=otherprojectcontext,
hostname='fake_name')
self.flags(osapi_compute_unique_server_name_scope=None)
def test_ec2_ids_not_found_are_printable(self):
def check_exc_format(method):
@@ -291,6 +327,56 @@ class DbApiTestCase(test.TestCase):
self.assertEqual(instance['instance_type']['name'],
inst_type2['name'])
def test_instance_update_unique_name(self):
otherprojectcontext = context.RequestContext(self.user_id,
"%s2" % self.project_id)
inst = self.create_instances_with_args(hostname='fake_name')
uuid1p1 = inst['uuid']
inst = self.create_instances_with_args(hostname='fake_name2')
uuid2p1 = inst['uuid']
inst = self.create_instances_with_args(context=otherprojectcontext,
hostname='fake_name3')
uuid1p2 = inst['uuid']
# osapi_compute_unique_server_name_scope is unset so this should work:
values = {'hostname': 'fake_name2'}
db.instance_update(self.context, uuid1p1, values)
values = {'hostname': 'fake_name'}
db.instance_update(self.context, uuid1p1, values)
# With scope 'global' any duplicate should fail.
self.flags(osapi_compute_unique_server_name_scope='global')
self.assertRaises(exception.InstanceExists,
db.instance_update,
self.context,
uuid2p1,
values)
self.assertRaises(exception.InstanceExists,
db.instance_update,
otherprojectcontext,
uuid1p2,
values)
# But we should definitely be able to update our name if we aren't
# really changing it.
case_only_values = {'hostname': 'fake_NAME'}
db.instance_update(self.context, uuid1p1, case_only_values)
# With scope 'project' a duplicate in the project should fail:
self.flags(osapi_compute_unique_server_name_scope='project')
self.assertRaises(exception.InstanceExists,
db.instance_update,
self.context,
uuid2p1,
values)
# With scope 'project' a duplicate in a different project should work:
self.flags(osapi_compute_unique_server_name_scope='project')
db.instance_update(otherprojectcontext, uuid1p2, values)
def test_instance_update_with_and_get_original(self):
ctxt = context.get_admin_context()