def test_libvirt_kvm_volume_with_multipath_still_in_use(self): name = 'volume-00000001' location = '10.0.2.15:3260' iqn = 'iqn.2010-10.org.openstack:%s' % name mpdev_filepath = '/dev/mapper/foo' def _get_multipath_device_name(path): if '%s-lun-1' % iqn in path: return mpdev_filepath return '/dev/mapper/donotdisconnect' self.flags(iscsi_use_multipath=True, group='libvirt') self.stubs.Set(os.path, 'exists', lambda x: True) libvirt_driver = volume.LibvirtISCSIVolumeDriver(self.fake_conn) libvirt_driver._get_multipath_device_name =\ lambda x: _get_multipath_device_name(x) block_devs = ['/dev/disks/by-path/%s-iscsi-%s-lun-2' % (location, iqn)] self.stubs.Set(self.fake_conn, 'get_all_block_devices', lambda: block_devs) vol = {'id': 1, 'name': name} connection_info = self.iscsi_connection(vol, location, iqn) connection_info['data']['device_path'] = mpdev_filepath libvirt_driver._get_multipath_iqn = lambda x: iqn iscsi_devs = [ '1.2.3.4-iscsi-%s-lun-1' % iqn, '%s-iscsi-%s-lun-1' % (location, iqn), '%s-iscsi-%s-lun-2' % (location, iqn) ] libvirt_driver._get_iscsi_devices = lambda: iscsi_devs self.stubs.Set(libvirt_driver, '_get_target_portals_from_iscsiadm_output', lambda x: [[location, iqn]]) # Set up disconnect volume mock expectations self.mox.StubOutWithMock(libvirt_driver, '_delete_device') self.mox.StubOutWithMock(libvirt_driver, '_rescan_multipath') libvirt_driver._rescan_multipath() libvirt_driver._delete_device('/dev/disk/by-path/%s' % iscsi_devs[0]) libvirt_driver._delete_device('/dev/disk/by-path/%s' % iscsi_devs[1]) libvirt_driver._rescan_multipath() # Ensure that the mpath devices are deleted self.mox.ReplayAll() libvirt_driver.disconnect_volume(connection_info, 'vde')
def test_libvirt_kvm_volume_with_multipath(self): self.flags(libvirt_iscsi_use_multipath=True) self.stubs.Set(os.path, 'exists', lambda x: True) devs = ['/dev/mapper/sda', '/dev/mapper/sdb'] self.stubs.Set(self.fake_conn, 'get_all_block_devices', lambda: devs) libvirt_driver = volume.LibvirtISCSIVolumeDriver(self.fake_conn) connection_info = self.iscsi_connection(self.vol, self.location, self.iqn) mpdev_filepath = '/dev/mapper/foo' connection_info['data']['device_path'] = mpdev_filepath target_portals = ['fake_portal1', 'fake_portal2'] libvirt_driver._get_multipath_device_name = lambda x: mpdev_filepath conf = libvirt_driver.connect_volume(connection_info, self.disk_info) tree = conf.format_dom() self.assertEqual(tree.find('./source').get('dev'), mpdev_filepath) libvirt_driver.disconnect_volume(connection_info, 'vde')
def test_sanitize_log_run_iscsiadm(self): # Tests that the parameters to the _run_iscsiadm function are sanitized # for passwords when logged. def fake_debug(*args, **kwargs): self.assertIn('node.session.auth.password', args[0]) self.assertNotIn('scrubme', args[0]) libvirt_driver = volume.LibvirtISCSIVolumeDriver(self.fake_conn) connection_info = self.iscsi_connection(self.vol, self.location, self.iqn) iscsi_properties = connection_info['data'] with mock.patch.object(volume.LOG, 'debug', side_effect=fake_debug) as debug_mock: libvirt_driver._iscsiadm_update(iscsi_properties, 'node.session.auth.password', 'scrubme') # we don't care what the log message is, we just want to make sure # our stub method is called which asserts the password is scrubbed self.assertTrue(debug_mock.called)
def test_libvirt_kvm_volume(self): self.stubs.Set(os.path, 'exists', lambda x: True) libvirt_driver = volume.LibvirtISCSIVolumeDriver(self.fake_conn) name = 'volume-00000001' location = '10.0.2.15:3260' iqn = 'iqn.2010-10.org.openstack:%s' % name vol = {'id': 1, 'name': name} connection_info = self.iscsi_connection(vol, location, iqn) disk_info = { "bus": "virtio", "dev": "vde", "type": "disk", } conf = libvirt_driver.connect_volume(connection_info, disk_info) tree = conf.format_dom() dev_str = '/dev/disk/by-path/ip-%s-iscsi-%s-lun-1' % (location, iqn) self.assertEqual(tree.get('type'), 'block') self.assertEqual(tree.find('./source').get('dev'), dev_str) libvirt_driver.disconnect_volume(connection_info, 'vde')
def test_libvirt_iscsi_driver_disconnect_multipath_error(self): libvirt_driver = volume.LibvirtISCSIVolumeDriver(self.fake_conn) devs = [ '/dev/disk/by-path/ip-%s-iscsi-%s-lun-2' % (self.location, self.iqn) ] with contextlib.nested( mock.patch.object(os.path, 'exists', return_value=True), mock.patch.object(self.fake_conn, 'get_all_block_devices', return_value=devs), mock.patch.object(libvirt_driver, '_rescan_multipath'), mock.patch.object(libvirt_driver, '_run_multipath'), mock.patch.object( libvirt_driver, '_get_multipath_device_name', return_value='/dev/mapper/fake-multipath-devname'), mock.patch.object(libvirt_driver, '_get_target_portals_from_iscsiadm_output', return_value=[('fake-ip', 'fake-portal')]), mock.patch.object(libvirt_driver, '_get_multipath_iqn', return_value='fake-portal'), ) as (mock_exists, mock_devices, mock_rescan_multipath, mock_run_multipath, mock_device_name, mock_get_portals, mock_get_iqn): mock_run_multipath.side_effect = processutils.ProcessExecutionError name = 'volume-00000001' vol = {'id': 1, 'name': self.name} connection_info = self.iscsi_connection(vol, self.location, self.iqn) conf = libvirt_driver.connect_volume(connection_info, self.disk_info) tree = conf.format_dom() dev_name = 'ip-%s-iscsi-%s-lun-1' % (self.location, self.iqn) dev_str = '/dev/disk/by-path/%s' % dev_name self.assertEqual('block', tree.get('type')) self.assertEqual(dev_str, tree.find('./source').get('dev')) libvirt_driver.use_multipath = True libvirt_driver.disconnect_volume(connection_info, "vde") mock_run_multipath.assert_called_once_with( ['-f', 'fake-multipath-devname'], check_exit_code=[0, 1])
def test_libvirt_kvm_volume_with_multipath_getmpdev(self): self.flags(libvirt_iscsi_use_multipath=True) self.stubs.Set(os.path, 'exists', lambda x: True) libvirt_driver = volume.LibvirtISCSIVolumeDriver(self.fake_conn) name0 = 'volume-00000000' iqn0 = 'iqn.2010-10.org.openstack:%s' % name0 dev0 = '/dev/disk/by-path/ip-%s-iscsi-%s-lun-0' % (self.location, iqn0) dev = '/dev/disk/by-path/ip-%s-iscsi-%s-lun-1' % (self.location, self.iqn) devs = [dev0, dev] self.stubs.Set(self.fake_conn, 'get_all_block_devices', lambda: devs) connection_info = self.iscsi_connection(self.vol, self.location, self.iqn) mpdev_filepath = '/dev/mapper/foo' target_portals = ['fake_portal1', 'fake_portal2'] libvirt_driver._get_multipath_device_name = lambda x: mpdev_filepath conf = libvirt_driver.connect_volume(connection_info, self.disk_info) tree = conf.format_dom() self.assertEqual(tree.find('./source').get('dev'), mpdev_filepath) libvirt_driver.disconnect_volume(connection_info, 'vde')
def test_libvirt_kvm_volume_with_multipath(self): self.flags(iscsi_use_multipath=True, group='libvirt') self.stubs.Set(os.path, 'exists', lambda x: True) devs = ['/dev/mapper/sda', '/dev/mapper/sdb'] self.stubs.Set(self.fake_conn, '_get_all_block_devices', lambda: devs) libvirt_driver = volume.LibvirtISCSIVolumeDriver(self.fake_conn) connection_info = self.iscsi_connection(self.vol, self.location, self.iqn) mpdev_filepath = '/dev/mapper/foo' connection_info['data']['device_path'] = mpdev_filepath libvirt_driver._get_multipath_device_name = lambda x: mpdev_filepath self.stubs.Set(libvirt_driver, '_get_target_portals_from_iscsiadm_output', lambda x: [[self.location, self.iqn]]) conf = libvirt_driver.connect_volume(connection_info, self.disk_info) tree = conf.format_dom() self.assertEqual(tree.find('./source').get('dev'), mpdev_filepath) libvirt_driver._get_multipath_iqn = lambda x: self.iqn libvirt_driver.disconnect_volume(connection_info, 'vde') expected_multipath_cmd = ('multipath', '-f', 'foo') self.assertIn(expected_multipath_cmd, self.executes)
def test_libvirt_kvm_volume_with_multipath(self): self.flags(libvirt_iscsi_use_multipath=True) self.stubs.Set(os.path, 'exists', lambda x: True) devs = ['/dev/mapper/sda', '/dev/mapper/sdb'] self.stubs.Set(self.fake_conn, 'get_all_block_devices', lambda: devs) libvirt_driver = volume.LibvirtISCSIVolumeDriver(self.fake_conn) name = 'volume-00000001' location = '10.0.2.15:3260' iqn = 'iqn.2010-10.org.openstack:%s' % name vol = {'id': 1, 'name': name} connection_info = self.iscsi_connection(vol, location, iqn) mpdev_filepath = '/dev/mapper/foo' connection_info['data']['device_path'] = mpdev_filepath disk_info = { "bus": "virtio", "dev": "vde", "type": "disk", } target_portals = ['fake_portal1', 'fake_portal2'] libvirt_driver._get_multipath_device_name = lambda x: mpdev_filepath conf = libvirt_driver.connect_volume(connection_info, disk_info) tree = conf.format_dom() self.assertEqual(tree.find('./source').get('dev'), mpdev_filepath) libvirt_driver.disconnect_volume(connection_info, 'vde')
def test_libvirt_iscsi_driver(self): # NOTE(vish) exists is to make driver assume connecting worked self.stubs.Set(os.path, 'exists', lambda x: True) libvirt_driver = volume.LibvirtISCSIVolumeDriver(self.fake_conn) location = '10.0.2.15:3260' name = 'volume-00000001' iqn = 'iqn.2010-10.org.openstack:%s' % name vol = {'id': 1, 'name': name} connection_info = self.iscsi_connection(vol, location, iqn) disk_info = { "bus": "virtio", "dev": "vde", "type": "disk", } conf = libvirt_driver.connect_volume(connection_info, disk_info) tree = conf.format_dom() dev_str = '/dev/disk/by-path/ip-%s-iscsi-%s-lun-1' % (location, iqn) self.assertEqual(tree.get('type'), 'block') self.assertEqual(tree.find('./source').get('dev'), dev_str) libvirt_driver.disconnect_volume(connection_info, "vde") expected_commands = [('iscsiadm', '-m', 'node', '-T', iqn, '-p', location), ('iscsiadm', '-m', 'session'), ('iscsiadm', '-m', 'node', '-T', iqn, '-p', location, '--login'), ('iscsiadm', '-m', 'node', '-T', iqn, '-p', location, '--op', 'update', '-n', 'node.startup', '-v', 'automatic'), ('iscsiadm', '-m', 'node', '-T', iqn, '-p', location, '--op', 'update', '-n', 'node.startup', '-v', 'manual'), ('iscsiadm', '-m', 'node', '-T', iqn, '-p', location, '--logout'), ('iscsiadm', '-m', 'node', '-T', iqn, '-p', location, '--op', 'delete')] self.assertEqual(self.executes, expected_commands)
def test_rescan_multipath(self): libvirt_driver = volume.LibvirtISCSIVolumeDriver(self.fake_conn) libvirt_driver._rescan_multipath() expected_multipath_cmd = ('multipath', '-r') self.assertIn(expected_multipath_cmd, self.executes)