Example #1
0
    def test_spawn_container_start_fail(self, neutron_failure=None):
        def container_get(*args, **kwargs):
            raise lxdcore_exceptions.LXDAPIException(MockResponse(404))

        def side_effect(*args, **kwargs):
            raise lxdcore_exceptions.LXDAPIException(MockResponse(200))

        self.client.containers.get.side_effect = container_get
        container = mock.Mock()
        ctx = context.get_admin_context()
        instance = fake_instance.fake_instance_obj(
            ctx, name='test', memory_mb=0)
        image_meta = mock.Mock()
        injected_files = mock.Mock()
        admin_password = mock.Mock()
        network_info = [_VIF]
        block_device_info = mock.Mock()
        virtapi = manager.ComputeVirtAPI(mock.MagicMock())

        lxd_driver = driver.LXDDriver(virtapi)
        lxd_driver.init_host(None)
        lxd_driver.cleanup = mock.Mock()
        lxd_driver.client.containers.create = mock.Mock(
            side_effect=side_effect)
        container.start.side_effect = side_effect

        self.assertRaises(
            lxdcore_exceptions.LXDAPIException,
            lxd_driver.spawn,
            ctx, instance, image_meta, injected_files, admin_password,
            network_info, block_device_info)
        lxd_driver.cleanup.assert_called_once_with(
            ctx, instance, network_info, block_device_info)
Example #2
0
    def test_spawn_profile_fail(self, configdrive, neutron_failure=None):
        """Cleanup is called when profile creation fails."""
        def container_get(*args, **kwargs):
            raise lxdcore_exceptions.LXDAPIException(MockResponse(404))

        def profile_create(*args, **kwargs):
            raise lxdcore_exceptions.LXDAPIException(MockResponse(500))
        self.client.containers.get.side_effect = container_get
        self.client.profiles.create.side_effect = profile_create
        configdrive.return_value = False
        ctx = context.get_admin_context()
        instance = fake_instance.fake_instance_obj(
            ctx, name='test', memory_mb=0)
        image_meta = mock.Mock()
        injected_files = mock.Mock()
        admin_password = mock.Mock()
        network_info = [_VIF]
        block_device_info = mock.Mock()
        virtapi = manager.ComputeVirtAPI(mock.MagicMock())

        lxd_driver = driver.LXDDriver(virtapi)
        lxd_driver.init_host(None)
        lxd_driver.cleanup = mock.Mock()

        self.assertRaises(
            lxdcore_exceptions.LXDAPIException,
            lxd_driver.spawn,
            ctx, instance, image_meta, injected_files, admin_password,
            network_info, block_device_info)
        lxd_driver.cleanup.assert_called_once_with(
            ctx, instance, network_info, block_device_info)
Example #3
0
    def test_spawn_with_configdrive(self, configdrive):
        def container_get(*args, **kwargs):
            raise lxdcore_exceptions.LXDAPIException(MockResponse(404))

        self.client.containers.get.side_effect = container_get
        configdrive.return_value = True

        ctx = context.get_admin_context()
        instance = fake_instance.fake_instance_obj(
            ctx, name='test', memory_mb=0)
        image_meta = mock.Mock()
        injected_files = mock.Mock()
        admin_password = mock.Mock()
        network_info = [_VIF]
        block_device_info = mock.Mock()
        virtapi = manager.ComputeVirtAPI(mock.MagicMock())

        lxd_driver = driver.LXDDriver(virtapi)
        lxd_driver.init_host(None)
        # XXX: rockstar (6 Jul 2016) - There are a number of XXX comments
        # related to these calls in spawn. They require some work before we
        # can take out these mocks and follow the real codepaths.
        lxd_driver.firewall_driver = mock.Mock()
        lxd_driver._add_configdrive = mock.Mock()

        lxd_driver.spawn(
            ctx, instance, image_meta, injected_files, admin_password,
            network_info, block_device_info)

        self.vif_driver.plug.assert_called_once_with(
            instance, network_info[0])
        fd = lxd_driver.firewall_driver
        fd.setup_basic_filtering.assert_called_once_with(
            instance, network_info)
        fd.apply_instance_filter.assert_called_once_with(
            instance, network_info)
        configdrive.assert_called_once_with(instance)
        lxd_driver.client.profiles.get.assert_called_once_with(instance.name)
Example #4
0
    def _test_spawn_instance_with_network_events(self, neutron_failure=None):
        generated_events = []

        def wait_timeout():
            event = mock.MagicMock()
            if neutron_failure == 'timeout':
                raise eventlet.timeout.Timeout()
            elif neutron_failure == 'error':
                event.status = 'failed'
            else:
                event.status = 'completed'
            return event

        def fake_prepare(instance, event_name):
            m = mock.MagicMock()
            m.instance = instance
            m.event_name = event_name
            m.wait.side_effect = wait_timeout
            generated_events.append(m)
            return m

        virtapi = manager.ComputeVirtAPI(mock.MagicMock())
        prepare = virtapi._compute.instance_events.prepare_for_instance_event
        prepare.side_effect = fake_prepare
        drv = driver.LXDDriver(virtapi)

        instance_href = fake_instance.fake_instance_obj(
            context.get_admin_context(), name='test', memory_mb=0)

        @mock.patch.object(drv, 'plug_vifs')
        @mock.patch('nova.virt.configdrive.required_by')
        def test_spawn(configdrive, plug_vifs):
            def container_get(*args, **kwargs):
                raise lxdcore_exceptions.LXDAPIException(MockResponse(404))
            self.client.containers.get.side_effect = container_get
            configdrive.return_value = False

            ctx = context.get_admin_context()
            instance = fake_instance.fake_instance_obj(
                ctx, name='test', memory_mb=0)
            image_meta = mock.Mock()
            injected_files = mock.Mock()
            admin_password = mock.Mock()
            network_info = [_VIF]
            block_device_info = mock.Mock()

            drv.init_host(None)
            drv.spawn(
                ctx, instance, image_meta, injected_files, admin_password,
                network_info, block_device_info)

        test_spawn()

        if cfg.CONF.vif_plugging_timeout and utils.is_neutron():
            prepare.assert_has_calls([
                mock.call(instance_href, 'network-vif-plugged-vif1'),
                mock.call(instance_href, 'network-vif-plugged-vif2')])
            for event in generated_events:
                if neutron_failure and generated_events.index(event) != 0:
                    self.assertEqual(0, event.call_count)
        else:
            self.assertEqual(0, prepare.call_count)
Example #5
0
 def set_up_virtapi(self):
     self.compute = FakeCompute()
     self.virtapi = compute_manager.ComputeVirtAPI(self.compute)
Example #6
0
    def _test_start_container_with_network_events(self, neutron_failure=None):
        generated_events = []

        def wait_timeout():
            event = mock.MagicMock()
            if neutron_failure == 'timeout':
                raise eventlet.timeout.Timeout()
            elif neutron_failure == 'error':
                event.status = 'failed'
            else:
                event.status = 'completed'
            return event

        def fake_prepare(instance, event_name):
            m = mock.MagicMock()
            m.instance = instance
            m.event_name = event_name
            m.wait.side_effect = wait_timeout
            generated_events.append(m)
            return m

        virtapi = manager.ComputeVirtAPI(mock.MagicMock())
        prepare = virtapi._compute.instance_events.prepare_for_instance_event
        prepare.side_effect = fake_prepare
        drvr = novadocker.virt.docker.driver.DockerDriver(virtapi)

        instance_href = utils.get_test_instance()
        container_id = self.connection._find_container_by_uuid(
            instance_href['uuid']).get('id')

        vifs = [{'id': 'vif1', 'active': False},
                {'id': 'vif2', 'active': False}]

        @mock.patch.object(drvr, '_extract_dns_entries')
        @mock.patch.object(drvr, 'plug_vifs')
        @mock.patch.object(drvr, '_attach_vifs')
        @mock.patch.object(self.mock_client, 'start')
        @mock.patch.object(self.mock_client, 'kill')
        @mock.patch.object(self.mock_client, 'remove_container')
        def test_start(remove_container, kill, start, attach_vif, plug_vifs,
                       extract_dns_entries):
            drvr._start_container(container_id, instance_href,
                                  vifs)
            plug_vifs.assert_called_with(instance_href, vifs)
            attach_vif.assert_called_with(instance_href, vifs)

            if neutron_failure and cfg.CONF.vif_plugging_is_fatal:
                kill.assert_called_once_with(container_id)
                remove_container.assert_called_once_with(container_id,
                                                         Force=True)
        test_start()

        if nova.utils.is_neutron() and cfg.CONF.vif_plugging_timeout:
            prepare.assert_has_calls([
                mock.call(instance_href, 'network-vif-plugged-vif1'),
                mock.call(instance_href, 'network-vif-plugged-vif2')])
            for event in generated_events:
                if neutron_failure and generated_events.index(event) != 0:
                    self.assertEqual(0, event.call_count)
        else:
            self.assertEqual(0, prepare.call_count)