示例#1
0
 def test_validate_container_state(self):
     container = Container(self.context, **db_utils.get_test_container())
     container.status = 'Stopped'
     with self.assertRaisesRegex(exception.InvalidStateException,
                                 "%s" % container.uuid):
         utils.validate_container_state(container, 'stop')
     with self.assertRaisesRegex(exception.InvalidStateException,
                                 "%s" % container.uuid):
         utils.validate_container_state(container, 'pause')
     container.status = 'Running'
     with self.assertRaisesRegex(exception.InvalidStateException,
                                 "%s" % container.uuid):
         utils.validate_container_state(container, 'start')
     with self.assertRaisesRegex(exception.InvalidStateException,
                                 "%s" % container.uuid):
         utils.validate_container_state(container, 'unpause')
     with self.assertRaisesRegex(exception.InvalidStateException,
                                 "%s" % container.uuid):
         utils.validate_container_state(container, 'delete')
     self.assertIsNone(utils.validate_container_state(
         container, 'reboot'))
     container.status = 'Stopped'
     self.assertIsNone(utils.validate_container_state(
         container, 'reboot'))
     container.status = 'Running'
     self.assertIsNone(utils.validate_container_state(
         container, 'execute'))
示例#2
0
 def test_container_commit_failed(self, mock_commit, mock_delete):
     container = Container(self.context, **utils.get_test_container())
     mock_commit.side_effect = exception.DockerError
     self.assertRaises(exception.DockerError,
                       self.compute_manager._do_container_commit,
                       self.context, container, 'repo', 'tag')
     self.assertTrue(mock_delete.called)
 def test_fail_container(self, mock_save):
     container = Container(self.context, **utils.get_test_container())
     self.compute_manager._fail_container(self.context, container,
                                          "Creation Failed")
     self.assertEqual(consts.ERROR, container.status)
     self.assertEqual("Creation Failed", container.status_reason)
     self.assertIsNone(container.task_state)
示例#4
0
    def test_connect_container_to_network(self):
        container = Container(self.context, **utils.get_test_container())
        network_name = 'c02afe4e-8350-4263-8078'
        requested_net = {
            'ipv4_address': '10.5.0.22',
            'port': 'fake-port-id',
            'preserve_on_delete': True
        }
        expected_address = [{
            'version': 4,
            'addr': '10.5.0.22',
            'port': 'fake-port-id',
            'subnet_id': 'fake-subnet-id',
            'preserve_on_delete': True
        }]
        old_port = self.network_driver.neutron_api.list_ports(
            id='fake-port-id')['ports'][0]
        self.assertEqual('', old_port['device_id'])
        with mock.patch.object(self.network_driver.docker,
                               'connect_container_to_network') as mock_connect:
            address = self.network_driver.connect_container_to_network(
                container, network_name, requested_net)

        self.assertEqual(expected_address, address)
        mock_connect.assert_called_once_with(container.container_id,
                                             network_name,
                                             ipv4_address='10.5.0.22')
        new_port = self.network_driver.neutron_api.list_ports(
            id='fake-port-id')['ports'][0]
        self.assertEqual(container.uuid, new_port['device_id'])
示例#5
0
 def test_init_container_retries_reboot(self, mock_save,
                                        mock_container_reboot):
     container = Container(self.context, **utils.get_test_container())
     container.task_state = consts.CONTAINER_REBOOTING
     self.compute_manager._init_container(self.context, container)
     mock_container_reboot.assert_called_once_with(self.context,
                                                   container, 60)
示例#6
0
 def test_init_container_retries_stop_already(self, mock_save):
     container = Container(self.context, **utils.get_test_container())
     container.task_state = consts.CONTAINER_STOPPING
     container.status = consts.STOPPED
     self.compute_manager._init_container(self.context, container)
     self.assertEqual(container.status, consts.STOPPED)
     self.assertIsNone(container.task_state)
 def test_container_logs_failed(self, mock_logs):
     container = Container(self.context, **utils.get_test_container())
     mock_logs.side_effect = exception.DockerError
     self.assertRaises(exception.DockerError,
                       self.compute_manager.container_logs,
                       self.context, container, True, True,
                       False, 'all', None)
 def test_container_attach_successful(self, mock_save,
                                      mock_get_websocket_url):
     container = Container(self.context, **utils.get_test_container())
     mock_get_websocket_url.return_value = "ws://test"
     self.compute_manager.container_attach(self.context, container)
     mock_get_websocket_url.assert_called_once_with(self.context, container)
     mock_save.assert_called_once_with(self.context)
示例#9
0
 def test_container_run_create_raises_docker_error(
         self, mock_create, mock_pull, mock_attach_volume,
         mock_detach_volume, mock_list_by_container, mock_save,
         mock_spawn_n):
     container = Container(self.context, **utils.get_test_container())
     image = {'image': 'repo', 'path': 'out_path', 'driver': 'glance',
              'repo': 'test', 'tag': 'testtag'}
     mock_pull.return_value = image, True
     mock_create.side_effect = exception.DockerError(
         message="Docker Error occurred")
     mock_spawn_n.side_effect = lambda f, *x, **y: f(*x, **y)
     self.compute_manager._resource_tracker = FakeResourceTracker()
     networks = []
     volumes = [FakeVolumeMapping()]
     self.compute_manager.container_create(
         self.context,
         requested_networks=networks,
         requested_volumes=volumes,
         container=container,
         limits=None, run=True)
     mock_save.assert_called_with(self.context)
     self.assertEqual('Error', container.status)
     self.assertEqual('Docker Error occurred', container.status_reason)
     mock_pull.assert_any_call(self.context, container.image, 'latest',
                               'always', 'glance')
     mock_create.assert_called_once_with(
         self.context, container, image, networks, volumes)
     mock_attach_volume.assert_called_once()
     mock_detach_volume.assert_called_once()
     self.assertEqual(0, len(FakeVolumeMapping.volumes))
示例#10
0
 def test_init_container_sets_creating_error(self, mock_save):
     container = Container(self.context, **utils.get_test_container())
     container.status = consts.CREATING
     self.compute_manager._init_container(context=self.context,
                                          container=container)
     self.assertEqual(consts.ERROR, container.status)
     self.assertIsNone(container.task_state)
示例#11
0
 def test_container_run_driver_attach_failed(
         self, mock_start, mock_create, mock_attach_volume,
         mock_detach_volume, mock_pull, mock_list_by_container, mock_save,
         mock_spawn_n):
     mock_attach_volume.side_effect = [None, base.TestingException("fake")]
     container = Container(self.context, **utils.get_test_container())
     vol = FakeVolumeMapping()
     vol2 = FakeVolumeMapping()
     image = {'image': 'repo', 'path': 'out_path', 'driver': 'glance'}
     mock_create.return_value = container
     mock_pull.return_value = image, False
     mock_spawn_n.side_effect = lambda f, *x, **y: f(*x, **y)
     container.status = 'Stopped'
     self.compute_manager._resource_tracker = FakeResourceTracker()
     networks = []
     volumes = [vol, vol2]
     self.compute_manager.container_create(
         self.context,
         requested_networks=networks,
         requested_volumes=volumes,
         container=container,
         limits=None, run=True)
     mock_save.assert_called_with(self.context)
     mock_pull.assert_not_called()
     mock_create.assert_not_called()
     mock_start.assert_not_called()
     mock_attach_volume.assert_has_calls([
         mock.call(mock.ANY, vol), mock.call(mock.ANY, vol2)])
     mock_detach_volume.assert_has_calls([
         mock.call(mock.ANY, vol)])
     self.assertEqual(0, len(FakeVolumeMapping.volumes))
示例#12
0
 def test_container_run_image_pull_docker_error(
         self, mock_pull, mock_attach_volume, mock_detach_volume,
         mock_list_by_container, mock_save, mock_spawn_n):
     container_dict = utils.get_test_container(
         image='test:latest', image_driver='docker',
         image_pull_policy='ifnotpresent')
     container = Container(self.context, **container_dict)
     mock_pull.side_effect = exception.DockerError(
         message="Docker Error occurred")
     mock_spawn_n.side_effect = lambda f, *x, **y: f(*x, **y)
     networks = []
     volumes = [FakeVolumeMapping()]
     self.compute_manager.container_create(
         self.context,
         requested_networks=networks,
         requested_volumes=volumes,
         container=container,
         limits=None, run=True)
     mock_save.assert_called_with(self.context)
     self.assertEqual('Error', container.status)
     self.assertEqual('Docker Error occurred', container.status_reason)
     mock_pull.assert_called_once_with(self.context, 'test', 'latest',
                                       'ifnotpresent', 'docker')
     mock_attach_volume.assert_called_once()
     mock_detach_volume.assert_called_once()
     self.assertEqual(0, len(FakeVolumeMapping.volumes))
示例#13
0
 def test_container_run(
         self, mock_start, mock_create, mock_attach_volume,
         mock_detach_volume, mock_pull, mock_list_by_container, mock_save,
         mock_spawn_n):
     container = Container(self.context, **utils.get_test_container())
     image = {'image': 'repo', 'path': 'out_path', 'driver': 'glance'}
     mock_create.return_value = container
     mock_pull.return_value = image, False
     mock_spawn_n.side_effect = lambda f, *x, **y: f(*x, **y)
     container.status = 'Stopped'
     self.compute_manager._resource_tracker = FakeResourceTracker()
     networks = []
     volumes = [FakeVolumeMapping()]
     self.compute_manager.container_create(
         self.context,
         requested_networks=networks,
         requested_volumes=volumes,
         container=container,
         limits=None, run=True)
     mock_save.assert_called_with(self.context)
     mock_pull.assert_any_call(self.context, container.image, 'latest',
                               'always', 'glance')
     mock_create.assert_called_once_with(self.context, container, image,
                                         networks, volumes)
     mock_start.assert_called_once_with(self.context, container)
     mock_attach_volume.assert_called_once()
     mock_detach_volume.assert_not_called()
     self.assertEqual(1, len(FakeVolumeMapping.volumes))
示例#14
0
 def test_init_container_retries_container_delete_task(
         self, mock_save, mock_container_delete):
     container = Container(self.context, **utils.get_test_container())
     container.task_state = consts.CONTAINER_DELETING
     self.compute_manager._init_container(self.context, container)
     mock_container_delete.assert_called_once_with(self.context, container,
                                                   force=True)
示例#15
0
 def test_connect_container_to_network(self):
     container = Container(self.context, **utils.get_test_container())
     network_name = 'c02afe4e-8350-4263-8078'
     expected = [{'version': 4, 'addr': '192.168.2.22', 'port': '1234567'}]
     address = self.network_api.connect_container_to_network(
         container, network_name)
     self.assertEqual(expected, address)
示例#16
0
 def test_container_unpause_failed(self, mock_unpause):
     container = Container(self.context, **utils.get_test_container())
     mock_unpause.side_effect = exception.DockerError
     self.assertRaises(exception.DockerError,
                       self.compute_manager._do_container_unpause,
                       self.context,
                       container,
                       reraise=True)
示例#17
0
 def test_init_container_retries_deleting(self, mock_save,
                                          mock_container_delete):
     kw = {'status': consts.DELETING,
           'task_state': None}
     container = Container(self.context, **utils.get_test_container(**kw))
     self.compute_manager._init_container(self.context, container)
     mock_container_delete.assert_called_once_with(self.context, container,
                                                   force=True)
示例#18
0
 def test_container_create_pull_image_failed_image_not_found(
         self, mock_fail, mock_pull, mock_create_sandbox, mock_save):
     container = Container(self.context, **utils.get_test_container())
     mock_pull.side_effect = exception.ImageNotFound("Image Not Found")
     mock_create_sandbox.return_value = mock.MagicMock()
     self.compute_manager._do_container_create(self.context, container)
     mock_fail.assert_called_once_with(self.context, container,
                                       "Image Not Found")
示例#19
0
 def test_init_container_retries_start(self, mock_save,
                                       mock_container_start):
     container = Container(self.context, **utils.get_test_container())
     container.task_state = consts.CONTAINER_STARTING
     container.status = consts.STOPPED
     self.compute_manager._init_container(self.context, container)
     mock_container_start.assert_called_once_with(self.context,
                                                  container)
 def test_container_execute(self, mock_execute_create, mock_execute_run):
     mock_execute_create.return_value = 'fake_exec_id'
     container = Container(self.context, **utils.get_test_container())
     self.compute_manager.container_exec(
         self.context, container, 'fake_cmd', True, False)
     mock_execute_create.assert_called_once_with(
         self.context, container, 'fake_cmd', False)
     mock_execute_run.assert_called_once_with('fake_exec_id', 'fake_cmd')
 def test_container_logs(self, mock_logs):
     container = Container(self.context, **utils.get_test_container())
     self.compute_manager.container_logs(self.context,
                                         container, True, True,
                                         False, 'all', None)
     mock_logs.assert_called_once_with(
         self.context, container, stderr=True, stdout=True,
         timestamps=False, tail='all', since=None)
 def test_container_create_pull_image_failed_image_not_found(
         self, mock_fail, mock_pull, mock_save):
     container = Container(self.context, **utils.get_test_container())
     mock_pull.side_effect = exception.ImageNotFound("Image Not Found")
     networks = []
     self.compute_manager._do_container_create(self.context, container,
                                               networks)
     mock_fail.assert_called_once_with(self.context,
                                       container, "Image Not Found")
 def test_container_kill_failed(self, mock_kill, mock_fail):
     container = Container(self.context, **utils.get_test_container())
     mock_kill.side_effect = exception.DockerError(
         message="Docker Error occurred")
     self.assertRaises(exception.DockerError,
                       self.compute_manager._do_container_kill,
                       self.context, container, None, reraise=True)
     mock_fail.assert_called_with(self.context,
                                  container, 'Docker Error occurred')
示例#24
0
 def test_init_container_sets_creating_tasks_error(self, mock_save):
     tasks = [consts.CONTAINER_CREATING, consts.IMAGE_PULLING]
     container = Container(self.context, **utils.get_test_container())
     for task in tasks:
         container.task_state = task
         self.compute_manager._init_container(context=self.context,
                                              container=container)
         self.assertEqual(consts.ERROR, container.status)
         self.assertIsNone(container.task_state)
 def test_container_delete(self, mock_delete, mock_save, mock_cnt_destroy,
                           mock_remove_usage):
     container = Container(self.context, **utils.get_test_container())
     self.compute_manager.container_delete(self. context, container, False)
     mock_save.assert_called_with(self.context)
     mock_delete.assert_called_once_with(self.context, container, False)
     mock_cnt_destroy.assert_called_once_with(self.context)
     mock_remove_usage.assert_called_once_with(self.context, container,
                                               True)
 def test_container_create_pull_image_failed_docker_error(
         self, mock_fail, mock_pull, mock_save):
     container = Container(self.context, **utils.get_test_container())
     mock_pull.side_effect = exception.DockerError("Pull Failed")
     networks = []
     self.compute_manager._do_container_create(self.context, container,
                                               networks)
     mock_fail.assert_called_once_with(self.context,
                                       container, "Pull Failed")
示例#27
0
 def test_container_start_failed(self, mock_start, mock_fail):
     container = Container(self.context, **utils.get_test_container())
     mock_start.side_effect = exception.DockerError
     self.assertRaises(exception.DockerError,
                       self.compute_manager._do_container_start,
                       self.context,
                       container,
                       reraise=True)
     mock_fail.assert_called_once()
示例#28
0
 def test_container_create_docker_create_failed(self, mock_fail,
                                                mock_create_sandbox,
                                                mock_create, mock_pull,
                                                mock_save):
     container = Container(self.context, **utils.get_test_container())
     mock_create.side_effect = exception.DockerError("Creation Failed")
     mock_create_sandbox.return_value = mock.MagicMock()
     self.compute_manager._do_container_create(self.context, container)
     mock_fail.assert_called_once_with(self.context, container,
                                       "Creation Failed")
示例#29
0
 def test_container_delete_failed(self, mock_delete, mock_save, mock_fail):
     container = Container(self.context, **utils.get_test_container())
     mock_delete.side_effect = exception.DockerError(
         message="Docker Error occurred")
     self.assertRaises(exception.DockerError,
                       self.compute_manager.container_delete, self.context,
                       container, False)
     mock_save.assert_called_with(self.context)
     mock_fail.assert_called_with(self.context, container,
                                  'Docker Error occurred')
示例#30
0
    def test_wart_container_event(self, mock_finish, mock_start):
        container = Container(self.context, **db_utils.get_test_container())

        @utils.wrap_container_event(prefix='compute')
        def fake_event(self, context, container):
            pass

        fake_event(self, self.context, container=container)

        self.assertTrue(mock_start.called)
        self.assertTrue(mock_finish.called)