def test_create_export(self): h = base.Helper(self.conf) name = 'volume-%s' % uuid4() h.volumes.create(name) ip = netaddr.IPAddress('1.2.3.4') h.exports.create(name, ip=ip) e = h.exports.get(name) self.assertEquals(e['volume'], name) self.assertEquals(e['state'], '0') self.assertEquals(e['iomode'], 'wt') self.assertEquals(e['tid'], '1') self.assertEquals(e['iotype'], 'fileio') self.assertEquals(e['lun'], '0') self.assertEquals(e['path'], os.path.join(self.scratch, self.storage.device_prefix, 'lunr-volume', name)) self.assertEquals(e['sessions'], [{ 'name': e['name'], 'tid': '1', 'volume': name, 'connected': False}]) prefix, name = e['name'].split(':') # TODO: FIX ME # self.assertNotEquals(name, e['volume']) self.assertEquals(name, e['volume']) self.assertEquals(name.split('.')[0], e['volume'])
def test_check_reg_api_server_error_retry_success(self): h = base.Helper(self.conf) name = 'volume-%s' % uuid4() out = h.volumes.create(name) def error_validator(req): error_validator.called = True body = StringIO(dumps({'reason': 'Internal Error'})) raise HTTPError(req.get_full_url(), 500, 'Server Error', {}, body) error_validator.called = False def success_validator(req): success_validator.called = True return 200, {} success_validator.called = False validators = [ # listing lambda *args: (200, []), error_validator, success_validator, ] self.validator_gen = iter(validators) with patch(base, 'sleep', lambda t: None): h.check_registration() self.assert_(error_validator.called) self.assert_(success_validator.called)
def test_check_registration(self): h = base.Helper(self.conf) name = 'volume-%s' % uuid4() out = h.volumes.create(name) def validate_update(req): self.assert_(req.get_full_url().endswith('nodes')) self.assertEquals(req.get_method(), 'POST') data = dict(urlparse.parse_qsl(req.data, keep_blank_values=True)) expected = { 'status': 'PENDING', 'volume_type_name': 'vtype', 'name': socket.gethostname(), 'hostname': '127.0.0.1', 'storage_hostname': '127.0.0.1', 'storage_port': '3260', 'port': '8081', 'size': '9', 'cinder_host': '127.0.0.1', 'affinity_group': '', } self.assertEquals(data, expected) return 200, expected validators = [ # listing lambda req: (200, []), # post update validate_update, ] self.validator_gen = iter(validators) h.check_registration()
def test_delete_volume(self): def mock_spawn(_lock_junk, method, vol, callback=None, skip_fork=None): def run(): method(vol) mock_spawn.run = run h = base.Helper(self.conf) name = 'volume-%s' % uuid4() h.volumes.create(name) _orig_spawn = volume.spawn try: volume.spawn = mock_spawn h.volumes.delete(name) finally: volume.spawn = _orig_spawn v = h.volumes.get(name) self.assert_(v['zero']) mock_spawn.run() self.assertRaises(volume.NotFound, h.volumes.get, name)
def test_check_reg_update_node(self): h = base.Helper(self.conf) name = 'volume-%s' % uuid4() out = h.volumes.create(name) node_info = { 'id': 'node1', 'status': 'ACTIVE', 'volume_type_name': 'vtype', 'name': socket.gethostname(), 'hostname': '127.0.0.1', 'storage_hostname': '127.0.0.1', 'storage_port': 3260, 'port': 8081, 'size': '1', 'cinder_host': '127.0.0.1', 'affinity_group': 'ONE', } def validate_update(req): data = dict(urlparse.parse_qsl(req.data)) expected = {'status': 'PENDING', 'size': '9'} self.assertEquals(data, expected) return 200, expected validators = [ # listing lambda req: (200, [node_info]), # get lambda req: (200, node_info), # post update validate_update, ] self.validator_gen = iter(validators) h.check_registration()
def test_check_reg_unable_to_contact_api(self): h = base.Helper(self.conf) def exploding_validator(req): raise URLError('connection refused') self.validator_gen = itertools.cycle([exploding_validator]) with patch(base, 'sleep', lambda t: None): self.assertRaises(APIError, h.check_registration)
def test_list_export(self): h = base.Helper(self.conf) for i in range(3): name = 'volume-%s' % uuid4() h.volumes.create(name) h.exports.create(name) exports = h.exports.list() self.assertEquals(len(exports), 3)
def test_check_reg_api_server_error(self): h = base.Helper(self.conf) def error_validator(req): body = StringIO(dumps({'reason': 'Internal Error'})) raise HTTPError(req.get_full_url(), 500, 'Server Error', {}, body) self.validator_gen = itertools.cycle([error_validator]) with patch(base, 'sleep', lambda t: None): self.assertRaises(APIError, h.check_registration)
def test_delete_export(self): h = base.Helper(self.conf) name = 'volume-%s' % uuid4() h.volumes.create(name) h.exports.create(name) e = h.exports.get(name) self.assertEquals(e['volume'], name) h.exports.delete(name) self.assertRaises(utils.NotFound, h.exports.get, name)
def setUp(self): self.tempdir = mkdtemp() conf = self.config(self.tempdir) self.volume = 'volume-%s' % uuid4() help = base.Helper(conf) self.exports = help.exports self.volumes = help.volumes self.volumes.create(self.volume) self.exports.create(self.volume) self.host = '127.0.0.1'
def test_check_reg_duplicate_entry(self): h = base.Helper(self.conf) validators = [ # duplicate listing lambda req: (200, [{'id': 'node1'}, {'id': 'node2'}]), ] self.validator_gen = itertools.cycle(validators) self.assertRaises(utils.ServiceUnavailable, h.check_registration) try: h.check_registration() except utils.ServiceUnavailable, e: self.assert_('duplicate' in str(e).lower())
def test_check_reg_api_client_error(self): h = base.Helper(self.conf) def error_validator(req): body = StringIO(dumps({'reason': 'Bad Request'})) raise HTTPError(req.get_full_url(), 400, 'Bad Request', {}, body) self.validator_gen = itertools.cycle([error_validator]) def should_not_be_called(t): should_not_be_called.called = True should_not_be_called.called = False with patch(base, 'sleep', should_not_be_called): self.assertRaises(APIError, h.check_registration) self.assertFalse(should_not_be_called.called)
def test_check_reg_unable_to_register(self): h = base.Helper(self.conf) name = 'volume-%s' % uuid4() out = h.volumes.create(name) def error_update(req): body = StringIO(dumps({'reason': 'invalid param'})) raise HTTPError(req.get_full_url(), 400, 'Bad Request', {}, body) validators = [ # listing lambda req: (200, []), # post update error_update, ] self.validator_gen = iter(validators) self.assertRaises(APIError, h.check_registration)
def test_get_export(self): h = base.Helper(self.conf) first_id = 'volume-%s' % uuid4() h.volumes.create(first_id) h.exports.create(first_id) for i in range(3): name = 'volume-%s' % uuid4() h.volumes.create(name) h.exports.create(name) last_id = 'volume-%s' % uuid4() h.volumes.create(last_id) h.exports.create(last_id) first_export = h.exports.get(first_id) self.assertEquals(first_export['volume'], first_id) last_export = h.exports.get(last_id) self.assertEquals(last_export['volume'], last_id)
def test_get_volume(self): h = base.Helper(self.conf) name = 'volume-%s' % uuid4() h.volumes.create(name) v = h.volumes.get(name) expected = { 'id': name, 'path': os.path.join(self.storage.device_prefix, h.volumes.volume_group, name), 'realpath': os.path.join(self.storage.device_prefix, h.volumes.volume_group, name), 'size': 12582912, 'origin': '', 'volume': True, 'device_number': '253:1', } self.assertEquals(v, expected)
def test_create_export_for_non_existant_path(self): h = base.Helper(self.conf) name = 'volume-%s' % uuid4() self.assertRaises(utils.NotFound, h.exports.create, name)
def test_create_duplicate_id(self): h = base.Helper(self.conf) name = 'volume-%s' % uuid4() h.volumes.create(name) h.exports.create(name) self.assertRaises(utils.AlreadyExists, h.exports.create, name)
def test_create_helper(self): h = base.Helper(self.conf) self.assert_(hasattr(h, 'volumes')) self.assert_(hasattr(h, 'exports')) self.assert_(hasattr(h, 'backups'))
def test_override_cinder_host(self): cinder_host = 'therealcinderhostwewant' self.conf.set('storage', 'cinder_host', cinder_host) h = base.Helper(self.conf) self.assertEquals(cinder_host, h.cinder_host)
def test_check_reg_vg_not_configured(self): h = base.Helper(self.conf) self.assertRaises(utils.ServiceUnavailable, h.check_registration)
def test_list_empty_volumes(self): h = base.Helper(self.conf) volumes = h.volumes.list() self.assertEquals(volumes, [])
def test_create_volume(self): h = base.Helper(self.conf) name = 'volume-%s' % uuid4() out = h.volumes.create(name) v = h.volumes.get(name) self.assertTrue(os.path.exists(v['path']))