Beispiel #1
0
class TestVmFunctions(unittest.TestCase):
    def mock_rabbitcli(self, exchange, exchange_type, process_message=None):
        class MockRabbitMQCommonClient(RabbitMQCommonClient):
            def publish_message(self,
                                message,
                                routing_key=None,
                                reply_to=None,
                                exchange=None,
                                correlation_id=None,
                                on_fail=None):
                return

        return MockRabbitMQCommonClient

    @mock.patch('imgstorage.imgstoragevm.RabbitMQCommonClient')
    def setUp(self, mock_rabbit):
        self.client = VmDaemon()
        mock_rabbit.publish_message = MagicMock()
        self.client.process_message = MagicMock()

        self.client.run()

        self.client.SQLITE_DB = '/tmp/test_db_%s' % uuid.uuid4()
        self.client.run()

        with sqlite3.connect(self.client.SQLITE_DB) as con:
            cur = con.cursor()
            cur.execute('INSERT INTO sync_queue VALUES (?,?,?,?,?,?,?)',
                        ('vol1', 'iqn.2001-04.com.nas-0-1-vol1', 12345,
                         'reply_to', 'corr_id', 0, 1))
            con.commit()

    """ Testing mapping of zvol """

    @mock.patch('imgstorage.imgstoragevm.runCommand')
    @mock.patch('imgstorage.imgstoragevm.VmDaemon.is_sync_enabled',
                return_value=False)
    def test_map_zvol_createnew_success(self, mockSyncEnabled, mockRunCommand):
        zvol = 'vol2'
        target = 'iqn.2001-04.com.nas-0-1-%s' % zvol
        bdev = 'sdc'

        mockRunCommand.side_effect = self.create_iscsiadm_side_effect(
            target, bdev)
        self.client.map_zvol(
            {
                'action': 'map_zvol',
                'target': target,
                'nas': 'nas-0-1',
                'size': '35',
                'zvol': zvol
            }, BasicProperties(reply_to='reply_to', message_id='message_id'))
        self.client.queue_connector.publish_message.assert_called_with(
            {
                'action': 'zvol_mapped',
                'status': 'success',
                'bdev': '/dev/%s' % bdev,
                'target': target
            },
            'reply_to',
            reply_to=self.client.NODE_NAME,
            correlation_id='message_id')
        mockRunCommand.assert_any_call([
            'iscsiadm', '-m', 'discovery', '-t', 'sendtargets', '-p', 'nas-0-1'
        ])
        mockRunCommand.assert_any_call(
            ['iscsiadm', '-m', 'node', '-T', target, '-p', 'nas-0-1', '-l'])
        mockRunCommand.assert_any_call(['iscsiadm', '-m', 'session', '-P3'])
        assert 3 == mockRunCommand.call_count

    """ Testing mapping of zvol for missing block device """

    @mock.patch('imgstorage.imgstoragevm.runCommand')
    @mock.patch('imgstorage.imgstoragevm.VmDaemon.is_sync_enabled',
                return_value=False)
    def test_map_zvol_createnew_missing_blkdev_error(self, mockSyncEnabled,
                                                     mockRunCommand):
        zvol = 'vol2'
        target = 'iqn.2001-04.com.nas-0-1-%s' % zvol
        bdev = 'sdc'

        mockRunCommand.side_effect = self.create_iscsiadm_side_effect(
            target + "_missing_target", bdev)
        self.client.map_zvol(
            {
                'action': 'map_zvol',
                'target': target,
                'nas': 'nas-0-1',
                'size': '35',
                'zvol': zvol
            }, BasicProperties(reply_to='reply_to', message_id='message_id'))
        self.client.queue_connector.publish_message.assert_called_with(
            {
                'action': 'zvol_mapped',
                'status': 'error',
                'target': target,
                'error': 'Not found %s in targets' % target
            },
            'reply_to',
            reply_to=self.client.NODE_NAME,
            correlation_id='message_id')

    """ Testing unmapping of zvol """

    @mock.patch('imgstorage.imgstoragevm.runCommand')
    def test_unmap_zvol_success(self, mockRunCommand):
        zvol = 'vol2'
        target = 'iqn.2001-04.com.nas-0-1-%s' % zvol
        bdev = 'sdc'

        mockRunCommand.side_effect = self.create_iscsiadm_side_effect(
            target, bdev)
        self.client.unmap_zvol(
            {
                'action': 'unmap_zvol',
                'target': target,
                'zvol': zvol
            }, BasicProperties(reply_to='reply_to', message_id='message_id'))
        print self.client.queue_connector.publish_message.mock_calls
        self.client.queue_connector.publish_message.assert_called_with(
            {
                'action': 'zvol_unmapped',
                'status': 'success',
                'target': target,
                'zvol': zvol
            },
            'reply_to',
            reply_to=self.client.NODE_NAME,
            correlation_id='message_id')
        mockRunCommand.assert_any_call(
            ['iscsiadm', '-m', 'node', '-T', target, '-u'])
        mockRunCommand.assert_any_call(['iscsiadm', '-m', 'session', '-P3'])

    """ Testing unmapping of zvol when not found - still returns success """

    @mock.patch('imgstorage.imgstoragevm.runCommand')
    def test_unmap_zvol_not_found(self, mockRunCommand):
        zvol = 'vol2'
        target = 'iqn.2001-04.com.nas-0-1-%s' % zvol
        bdev = 'sdc'

        mockRunCommand.side_effect = self.create_iscsiadm_side_effect(
            target, bdev)
        self.client.unmap_zvol(
            {
                'action': 'unmap_zvol',
                'target': target + "not_found",
                'zvol': zvol
            }, BasicProperties(reply_to='reply_to', message_id='message_id'))
        print self.client.queue_connector.publish_message.mock_calls

        self.client.queue_connector.publish_message.assert_called_with(
            {
                'action': 'zvol_unmapped',
                'status': 'success',
                'target': target + "not_found",
                'zvol': zvol
            },
            'reply_to',
            reply_to=self.client.NODE_NAME,
            correlation_id='message_id')

    """ Testing unmapping of zvol with error from system call """

    @mock.patch('imgstorage.imgstoragevm.runCommand')
    def test_map_zvol_unmap_error(self, mockRunCommand):
        zvol = 'vol2'
        target = 'iqn.2001-04.com.nas-0-1-%s' % zvol
        bdev = 'sdc'

        def my_side_effect(*args, **kwargs):
            if args[0][:3] == ['iscsiadm', '-m', 'session']:
                return StringIO(iscsiadm_session_response % (target, bdev))
            elif args[0][:3] == ['iscsiadm', '-m', 'discovery']:
                return StringIO(iscsiadm_discovery_response %
                                target)  # find remote targets
            elif args[0][:3] == ['iscsiadm', '-m', 'node']:
                raise ActionError('Some error happened')

        mockRunCommand.side_effect = my_side_effect
        self.client.unmap_zvol(
            {
                'action': 'unmap_zvol',
                'target': target,
                'zvol': zvol
            }, BasicProperties(reply_to='reply_to', message_id='message_id'))
        self.client.queue_connector.publish_message.assert_called_with(
            {
                'action': 'zvol_unmapped',
                'status': 'error',
                'target': target,
                'zvol': zvol,
                'error': 'Some error happened'
            },
            'reply_to',
            reply_to=self.client.NODE_NAME,
            correlation_id='message_id')
        mockRunCommand.assert_called_with(
            ['iscsiadm', '-m', 'node', '-T', target, '-u'])

    def create_iscsiadm_side_effect(self, target, bdev):
        def iscsiadm_side_effect(*args, **kwargs):
            if args[0][:3] == ['iscsiadm', '-m', 'session']:
                return (iscsiadm_session_response %
                        (target, bdev)).splitlines()  # list local devices
            elif args[0][:3] == ['iscsiadm', '-m', 'discovery']:
                return (iscsiadm_discovery_response %
                        target).splitlines()  # find remote targets
            elif args[0][:3] == ['iscsiadm', '-m', 'node']:
                return '\n'.splitlines()  # connect to iscsi target
            elif args[0][0] == 'blockdev':
                return '12345'.splitlines()

        return iscsiadm_side_effect
class TestVmFunctions(unittest.TestCase):

    def mock_rabbitcli(self, exchange, exchange_type, process_message=None):
        class MockRabbitMQCommonClient(RabbitMQCommonClient):
            def publish_message(self, message, routing_key=None, reply_to=None, exchange=None, correlation_id=None, on_fail=None):
                return
        return MockRabbitMQCommonClient

    @mock.patch('imgstorage.imgstoragevm.RabbitMQCommonClient')
    def setUp(self, mock_rabbit):
        self.client = VmDaemon()
        mock_rabbit.publish_message = MagicMock()
        self.client.process_message = MagicMock()

        self.client.run()

        self.client.SQLITE_DB = '/tmp/test_db_%s'%uuid.uuid4()
        self.client.run()

        with sqlite3.connect(self.client.SQLITE_DB) as con:
            cur = con.cursor()
            cur.execute('INSERT INTO sync_queue VALUES (?,?,?,?,?,?,?)',('vol1', 'iqn.2001-04.com.nas-0-1-vol1', 12345, 'reply_to', 'corr_id', 0, 1))
            con.commit()


    """ Testing mapping of zvol """
    @mock.patch('imgstorage.imgstoragevm.runCommand')
    @mock.patch('imgstorage.imgstoragevm.VmDaemon.is_sync_enabled', return_value=False)
    def test_map_zvol_createnew_success(self, mockSyncEnabled, mockRunCommand):
        zvol = 'vol2'
        target = 'iqn.2001-04.com.nas-0-1-%s'%zvol
        bdev = 'sdc'

        mockRunCommand.side_effect = self.create_iscsiadm_side_effect(target, bdev)
        self.client.map_zvol(
            {'action': 'map_zvol', 'target':target, 'nas': 'nas-0-1', 'size':'35', 'zvol':zvol},
            BasicProperties(reply_to='reply_to', message_id='message_id'))
        self.client.queue_connector.publish_message.assert_called_with(
            {'action': 'zvol_mapped', 'status': 'success', 'bdev': '/dev/%s'%bdev, 'target': target}, 'reply_to', reply_to=self.client.NODE_NAME, correlation_id='message_id')
        mockRunCommand.assert_any_call(['iscsiadm', '-m', 'discovery', '-t', 'sendtargets', '-p', 'nas-0-1'])
        mockRunCommand.assert_any_call(['iscsiadm', '-m', 'node', '-T', target, '-p', 'nas-0-1', '-l'])
        mockRunCommand.assert_any_call(['iscsiadm', '-m', 'session', '-P3'])
        assert 3 == mockRunCommand.call_count

    """ Testing mapping of zvol for missing block device """
    @mock.patch('imgstorage.imgstoragevm.runCommand')
    @mock.patch('imgstorage.imgstoragevm.VmDaemon.is_sync_enabled', return_value=False)
    def test_map_zvol_createnew_missing_blkdev_error(self, mockSyncEnabled, mockRunCommand):
        zvol = 'vol2'
        target = 'iqn.2001-04.com.nas-0-1-%s'%zvol
        bdev = 'sdc'

        mockRunCommand.side_effect = self.create_iscsiadm_side_effect(target+"_missing_target", bdev)
        self.client.map_zvol(
            {'action': 'map_zvol', 'target':target, 'nas': 'nas-0-1', 'size':'35', 'zvol':zvol},
            BasicProperties(reply_to='reply_to', message_id='message_id'))
        self.client.queue_connector.publish_message.assert_called_with(
            {'action': 'zvol_mapped', 'status': 'error', 'target': target,
            'error': 'Not found %s in targets'%target},
            'reply_to', reply_to=self.client.NODE_NAME, correlation_id='message_id')

    """ Testing unmapping of zvol """
    @mock.patch('imgstorage.imgstoragevm.runCommand')
    def test_unmap_zvol_success(self, mockRunCommand):
        zvol = 'vol2'
        target = 'iqn.2001-04.com.nas-0-1-%s'%zvol
        bdev = 'sdc'

        mockRunCommand.side_effect = self.create_iscsiadm_side_effect(target, bdev)
        self.client.unmap_zvol(
            {'action': 'unmap_zvol', 'target':target, 'zvol':zvol},
            BasicProperties(reply_to='reply_to', message_id='message_id'))
        print self.client.queue_connector.publish_message.mock_calls
        self.client.queue_connector.publish_message.assert_called_with(
            {'action': 'zvol_unmapped', 'status': 'success', 'target': target, 'zvol':zvol}, 'reply_to', reply_to=self.client.NODE_NAME, correlation_id='message_id')
        mockRunCommand.assert_any_call(['iscsiadm', '-m', 'node', '-T', target, '-u'])
        mockRunCommand.assert_any_call(['iscsiadm', '-m', 'session', '-P3'])

    """ Testing unmapping of zvol when not found - still returns success """
    @mock.patch('imgstorage.imgstoragevm.runCommand')
    def test_unmap_zvol_not_found(self, mockRunCommand):
        zvol = 'vol2'
        target = 'iqn.2001-04.com.nas-0-1-%s'%zvol
        bdev = 'sdc'

        mockRunCommand.side_effect = self.create_iscsiadm_side_effect(target, bdev)
        self.client.unmap_zvol(
            {'action': 'unmap_zvol', 'target':target+"not_found", 'zvol':zvol},
            BasicProperties(reply_to='reply_to', message_id='message_id'))
        print self.client.queue_connector.publish_message.mock_calls

        self.client.queue_connector.publish_message.assert_called_with(
            {'action': 'zvol_unmapped', 'status': 'success', 'target': target+"not_found", 'zvol':zvol}, 'reply_to', reply_to=self.client.NODE_NAME, correlation_id='message_id')


    """ Testing unmapping of zvol with error from system call """
    @mock.patch('imgstorage.imgstoragevm.runCommand')
    def test_map_zvol_unmap_error(self, mockRunCommand):
        zvol = 'vol2'
        target = 'iqn.2001-04.com.nas-0-1-%s'%zvol
        bdev = 'sdc'
        def my_side_effect(*args, **kwargs):
            if args[0][:3] == ['iscsiadm', '-m', 'session']:    return StringIO(iscsiadm_session_response%(target, bdev))
            elif args[0][:3] == ['iscsiadm', '-m', 'discovery']:    return StringIO(iscsiadm_discovery_response%target) # find remote targets
            elif args[0][:3] == ['iscsiadm', '-m', 'node']:
                raise ActionError('Some error happened')

        mockRunCommand.side_effect = my_side_effect
        self.client.unmap_zvol(
            {'action': 'unmap_zvol', 'target':target, 'zvol':zvol},
            BasicProperties(reply_to='reply_to', message_id='message_id'))
        self.client.queue_connector.publish_message.assert_called_with(
            {'action': 'zvol_unmapped', 'status': 'error', 'target': target, 'zvol':zvol, 'error': 'Some error happened'},
            'reply_to', reply_to=self.client.NODE_NAME,  correlation_id='message_id')
        mockRunCommand.assert_called_with(['iscsiadm', '-m', 'node', '-T', target, '-u'])

    def create_iscsiadm_side_effect(self, target, bdev):
        def iscsiadm_side_effect(*args, **kwargs):
            if args[0][:3] == ['iscsiadm', '-m', 'session']:        return (iscsiadm_session_response%(target, bdev)).splitlines() # list local devices
            elif args[0][:3] == ['iscsiadm', '-m', 'discovery']:    return (iscsiadm_discovery_response%target).splitlines() # find remote targets
            elif args[0][:3] == ['iscsiadm', '-m', 'node']:         return '\n'.splitlines() # connect to iscsi target
            elif args[0][0] == 'blockdev':                          return '12345'.splitlines()
        return iscsiadm_side_effect