Merged with trunk
This commit is contained in:
@@ -82,6 +82,21 @@ class ComputeTestCase(test.TestCase):
|
|||||||
inst.update(params)
|
inst.update(params)
|
||||||
return db.instance_create(self.context, inst)['id']
|
return db.instance_create(self.context, inst)['id']
|
||||||
|
|
||||||
|
def _create_instance_type(self, params={}):
|
||||||
|
"""Create a test instance"""
|
||||||
|
context = self.context.elevated()
|
||||||
|
inst = {}
|
||||||
|
inst['name'] = 'm1.small'
|
||||||
|
inst['memory_mb'] = '1024'
|
||||||
|
inst['vcpus'] = '1'
|
||||||
|
inst['local_gb'] = '20'
|
||||||
|
inst['flavorid'] = '1'
|
||||||
|
inst['swap'] = '2048'
|
||||||
|
inst['rxtx_quota'] = 100
|
||||||
|
inst['rxtx_cap'] = 200
|
||||||
|
inst.update(params)
|
||||||
|
return db.instance_type_create(context, inst)['id']
|
||||||
|
|
||||||
def _create_group(self):
|
def _create_group(self):
|
||||||
values = {'name': 'testgroup',
|
values = {'name': 'testgroup',
|
||||||
'description': 'testgroup',
|
'description': 'testgroup',
|
||||||
@@ -299,15 +314,53 @@ class ComputeTestCase(test.TestCase):
|
|||||||
"""Ensure instance can be migrated/resized"""
|
"""Ensure instance can be migrated/resized"""
|
||||||
instance_id = self._create_instance()
|
instance_id = self._create_instance()
|
||||||
context = self.context.elevated()
|
context = self.context.elevated()
|
||||||
|
|
||||||
self.compute.run_instance(self.context, instance_id)
|
self.compute.run_instance(self.context, instance_id)
|
||||||
db.instance_update(self.context, instance_id, {'host': 'foo'})
|
db.instance_update(self.context, instance_id, {'host': 'foo'})
|
||||||
self.compute.prep_resize(context, instance_id)
|
self.compute.prep_resize(context, instance_id, 1)
|
||||||
migration_ref = db.migration_get_by_instance_and_status(context,
|
migration_ref = db.migration_get_by_instance_and_status(context,
|
||||||
instance_id, 'pre-migrating')
|
instance_id, 'pre-migrating')
|
||||||
self.compute.resize_instance(context, instance_id,
|
self.compute.resize_instance(context, instance_id,
|
||||||
migration_ref['id'])
|
migration_ref['id'])
|
||||||
self.compute.terminate_instance(context, instance_id)
|
self.compute.terminate_instance(context, instance_id)
|
||||||
|
|
||||||
|
def test_resize_invalid_flavor_fails(self):
|
||||||
|
"""Ensure invalid flavors raise"""
|
||||||
|
instance_id = self._create_instance()
|
||||||
|
context = self.context.elevated()
|
||||||
|
self.compute.run_instance(self.context, instance_id)
|
||||||
|
|
||||||
|
self.assertRaises(exception.NotFound, self.compute_api.resize,
|
||||||
|
context, instance_id, 200)
|
||||||
|
|
||||||
|
self.compute.terminate_instance(context, instance_id)
|
||||||
|
|
||||||
|
def test_resize_down_fails(self):
|
||||||
|
"""Ensure resizing down raises and fails"""
|
||||||
|
context = self.context.elevated()
|
||||||
|
instance_id = self._create_instance()
|
||||||
|
|
||||||
|
self.compute.run_instance(self.context, instance_id)
|
||||||
|
db.instance_update(self.context, instance_id,
|
||||||
|
{'instance_type': 'm1.xlarge'})
|
||||||
|
|
||||||
|
self.assertRaises(exception.ApiError, self.compute_api.resize,
|
||||||
|
context, instance_id, 1)
|
||||||
|
|
||||||
|
self.compute.terminate_instance(context, instance_id)
|
||||||
|
|
||||||
|
def test_resize_same_size_fails(self):
|
||||||
|
"""Ensure invalid flavors raise"""
|
||||||
|
context = self.context.elevated()
|
||||||
|
instance_id = self._create_instance()
|
||||||
|
|
||||||
|
self.compute.run_instance(self.context, instance_id)
|
||||||
|
|
||||||
|
self.assertRaises(exception.ApiError, self.compute_api.resize,
|
||||||
|
context, instance_id, 1)
|
||||||
|
|
||||||
|
self.compute.terminate_instance(context, instance_id)
|
||||||
|
|
||||||
def test_get_by_flavor_id(self):
|
def test_get_by_flavor_id(self):
|
||||||
type = instance_types.get_by_flavor_id(1)
|
type = instance_types.get_by_flavor_id(1)
|
||||||
self.assertEqual(type, 'm1.tiny')
|
self.assertEqual(type, 'm1.tiny')
|
||||||
@@ -318,10 +371,8 @@ class ComputeTestCase(test.TestCase):
|
|||||||
instance_id = self._create_instance()
|
instance_id = self._create_instance()
|
||||||
self.compute.run_instance(self.context, instance_id)
|
self.compute.run_instance(self.context, instance_id)
|
||||||
self.assertRaises(exception.Error, self.compute.prep_resize,
|
self.assertRaises(exception.Error, self.compute.prep_resize,
|
||||||
self.context, instance_id)
|
self.context, instance_id, 1)
|
||||||
self.compute.terminate_instance(self.context, instance_id)
|
self.compute.terminate_instance(self.context, instance_id)
|
||||||
type = instance_types.get_by_flavor_id("1")
|
|
||||||
self.assertEqual(type, 'm1.tiny')
|
|
||||||
|
|
||||||
def _setup_other_managers(self):
|
def _setup_other_managers(self):
|
||||||
self.volume_manager = utils.import_object(FLAGS.volume_manager)
|
self.volume_manager = utils.import_object(FLAGS.volume_manager)
|
||||||
|
@@ -21,9 +21,10 @@ import sys
|
|||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
import nova
|
import nova
|
||||||
|
from nova import test
|
||||||
|
|
||||||
|
|
||||||
class LocalizationTestCase(unittest.TestCase):
|
class LocalizationTestCase(test.TestCase):
|
||||||
def test_multiple_positional_format_placeholders(self):
|
def test_multiple_positional_format_placeholders(self):
|
||||||
pat = re.compile("\W_\(")
|
pat = re.compile("\W_\(")
|
||||||
single_pat = re.compile("\W%\W")
|
single_pat = re.compile("\W%\W")
|
||||||
|
@@ -18,8 +18,12 @@ import errno
|
|||||||
import os
|
import os
|
||||||
import select
|
import select
|
||||||
|
|
||||||
|
from eventlet import greenpool
|
||||||
|
from eventlet import greenthread
|
||||||
|
|
||||||
from nova import test
|
from nova import test
|
||||||
from nova.utils import parse_mailmap, str_dict_replace, synchronized
|
from nova import utils
|
||||||
|
from nova.utils import parse_mailmap, str_dict_replace
|
||||||
|
|
||||||
|
|
||||||
class ProjectTestCase(test.TestCase):
|
class ProjectTestCase(test.TestCase):
|
||||||
@@ -63,7 +67,7 @@ class ProjectTestCase(test.TestCase):
|
|||||||
|
|
||||||
class LockTestCase(test.TestCase):
|
class LockTestCase(test.TestCase):
|
||||||
def test_synchronized_wrapped_function_metadata(self):
|
def test_synchronized_wrapped_function_metadata(self):
|
||||||
@synchronized('whatever')
|
@utils.synchronized('whatever')
|
||||||
def foo():
|
def foo():
|
||||||
"""Bar"""
|
"""Bar"""
|
||||||
pass
|
pass
|
||||||
@@ -72,11 +76,42 @@ class LockTestCase(test.TestCase):
|
|||||||
self.assertEquals(foo.__name__, 'foo', "Wrapped function's name "
|
self.assertEquals(foo.__name__, 'foo', "Wrapped function's name "
|
||||||
"got mangled")
|
"got mangled")
|
||||||
|
|
||||||
def test_synchronized(self):
|
def test_synchronized_internally(self):
|
||||||
|
"""We can lock across multiple green threads"""
|
||||||
|
saved_sem_num = len(utils._semaphores)
|
||||||
|
seen_threads = list()
|
||||||
|
|
||||||
|
@utils.synchronized('testlock2', external=False)
|
||||||
|
def f(id):
|
||||||
|
for x in range(10):
|
||||||
|
seen_threads.append(id)
|
||||||
|
greenthread.sleep(0)
|
||||||
|
|
||||||
|
threads = []
|
||||||
|
pool = greenpool.GreenPool(10)
|
||||||
|
for i in range(10):
|
||||||
|
threads.append(pool.spawn(f, i))
|
||||||
|
|
||||||
|
for thread in threads:
|
||||||
|
thread.wait()
|
||||||
|
|
||||||
|
self.assertEquals(len(seen_threads), 100)
|
||||||
|
# Looking at the seen threads, split it into chunks of 10, and verify
|
||||||
|
# that the last 9 match the first in each chunk.
|
||||||
|
for i in range(10):
|
||||||
|
for j in range(9):
|
||||||
|
self.assertEquals(seen_threads[i * 10],
|
||||||
|
seen_threads[i * 10 + 1 + j])
|
||||||
|
|
||||||
|
self.assertEqual(saved_sem_num, len(utils._semaphores),
|
||||||
|
"Semaphore leak detected")
|
||||||
|
|
||||||
|
def test_synchronized_externally(self):
|
||||||
|
"""We can lock across multiple processes"""
|
||||||
rpipe1, wpipe1 = os.pipe()
|
rpipe1, wpipe1 = os.pipe()
|
||||||
rpipe2, wpipe2 = os.pipe()
|
rpipe2, wpipe2 = os.pipe()
|
||||||
|
|
||||||
@synchronized('testlock')
|
@utils.synchronized('testlock1', external=True)
|
||||||
def f(rpipe, wpipe):
|
def f(rpipe, wpipe):
|
||||||
try:
|
try:
|
||||||
os.write(wpipe, "foo")
|
os.write(wpipe, "foo")
|
||||||
|
@@ -77,13 +77,11 @@ class CacheConcurrencyTestCase(test.TestCase):
|
|||||||
eventlet.sleep(0)
|
eventlet.sleep(0)
|
||||||
try:
|
try:
|
||||||
self.assertFalse(done2.ready())
|
self.assertFalse(done2.ready())
|
||||||
self.assertTrue('fname' in conn._image_sems)
|
|
||||||
finally:
|
finally:
|
||||||
wait1.send()
|
wait1.send()
|
||||||
done1.wait()
|
done1.wait()
|
||||||
eventlet.sleep(0)
|
eventlet.sleep(0)
|
||||||
self.assertTrue(done2.ready())
|
self.assertTrue(done2.ready())
|
||||||
self.assertFalse('fname' in conn._image_sems)
|
|
||||||
|
|
||||||
def test_different_fname_concurrency(self):
|
def test_different_fname_concurrency(self):
|
||||||
"""Ensures that two different fname caches are concurrent"""
|
"""Ensures that two different fname caches are concurrent"""
|
||||||
|
@@ -228,6 +228,9 @@ class FakeSessionForMigrationTests(fake.SessionBase):
|
|||||||
def VDI_get_by_uuid(*args):
|
def VDI_get_by_uuid(*args):
|
||||||
return 'hurr'
|
return 'hurr'
|
||||||
|
|
||||||
|
def VDI_resize_online(*args):
|
||||||
|
pass
|
||||||
|
|
||||||
def VM_start(self, _1, ref, _2, _3):
|
def VM_start(self, _1, ref, _2, _3):
|
||||||
vm = fake.get_record('VM', ref)
|
vm = fake.get_record('VM', ref)
|
||||||
if vm['power_state'] != 'Halted':
|
if vm['power_state'] != 'Halted':
|
||||||
@@ -240,7 +243,7 @@ class FakeSessionForMigrationTests(fake.SessionBase):
|
|||||||
|
|
||||||
def stub_out_migration_methods(stubs):
|
def stub_out_migration_methods(stubs):
|
||||||
def fake_get_snapshot(self, instance):
|
def fake_get_snapshot(self, instance):
|
||||||
return 'foo', 'bar'
|
return 'vm_ref', dict(image='foo', snap='bar')
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def fake_get_vdi(cls, session, vm_ref):
|
def fake_get_vdi(cls, session, vm_ref):
|
||||||
@@ -249,7 +252,7 @@ def stub_out_migration_methods(stubs):
|
|||||||
vdi_rec = session.get_xenapi().VDI.get_record(vdi_ref)
|
vdi_rec = session.get_xenapi().VDI.get_record(vdi_ref)
|
||||||
return vdi_ref, {'uuid': vdi_rec['uuid'], }
|
return vdi_ref, {'uuid': vdi_rec['uuid'], }
|
||||||
|
|
||||||
def fake_shutdown(self, inst, vm, method='clean'):
|
def fake_shutdown(self, inst, vm, hard=True):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
Reference in New Issue
Block a user