def test_command_execution_cleanup_exception(self):
        '''Command execution through Docker, catch exception during cleanup'''
        response = Mock(status_code=500, reason='Because')
        self.mocks.configure_mock(
            'docker_client', {
                'exec_create.return_value': {
                    'Id': b'container-foobar'
                },
                'exec_start.return_value':
                b'This is the return',
                'exec_inspect.return_value': {
                    'ExitCode': 0
                },
                'kill.side_effect':
                DockerAPIError('Failure killing container', response,
                               'Failure killing container')
            })

        build_env = DockerEnvironment(version=self.version,
                                      project=self.project,
                                      build={'id': DUMMY_BUILD_ID})
        with build_env:
            build_env.run('echo', 'test', cwd='/tmp')

        self.mocks.docker_client.kill.assert_called_with(
            'build-123-project-6-pip')
        self.assertTrue(build_env.successful)
        self.assertFalse(self.mocks.api()(DUMMY_BUILD_ID).put.called)
    def test_command_execution(self):
        '''Command execution through Docker'''
        self.mocks.configure_mock(
            'docker_client', {
                'exec_create.return_value': {
                    'Id': b'container-foobar'
                },
                'exec_start.return_value': b'This is the return',
                'exec_inspect.return_value': {
                    'ExitCode': 1
                },
            })

        build_env = DockerEnvironment(version=self.version,
                                      project=self.project,
                                      build={'id': DUMMY_BUILD_ID})
        with build_env:
            build_env.run('echo test', cwd='/tmp')

        self.mocks.docker_client.exec_create.assert_called_with(
            container='build-123-project-6-pip',
            cmd="/bin/sh -c 'cd /tmp && echo\\ test'",
            stderr=True,
            stdout=True)
        self.assertEqual(build_env.commands[0].exit_code, 1)
        self.assertEqual(build_env.commands[0].output, u'This is the return')
        self.assertEqual(build_env.commands[0].error, None)
        self.assertTrue(build_env.failed)
        self.assertFalse(self.mocks.api()(DUMMY_BUILD_ID).put.called)
    def test_container_timeout(self):
        '''Docker container timeout and command failure'''
        response = Mock(status_code=404, reason='Container not found')
        self.mocks.configure_mock('docker_client', {
            'inspect_container.side_effect': [
                DockerAPIError(
                    'No container found',
                    response,
                    'No container found',
                ),
                {'State': {'Running': False, 'ExitCode': 42}},
            ],
            'exec_create.return_value': {'Id': 'container-foobar'},
            'exec_start.return_value': 'This is the return',
            'exec_inspect.return_value': {'ExitCode': 0},
        })

        build_env = DockerEnvironment(version=self.version, project=self.project,
                                      build={})
        with build_env:
            build_env.run('echo', 'test', cwd='/tmp')

        self.assertEqual(
            str(build_env.failure),
            'Build exited due to time out')
        self.assertEqual(self.mocks.docker_client.exec_create.call_count, 1)
        self.assertTrue(build_env.failed)
Exemple #4
0
    def test_command_execution(self):
        """Command execution through Docker."""
        self.mocks.configure_mock(
            'docker_client', {
                'exec_create.return_value': {
                    'Id': b'container-foobar'
                },
                'exec_start.return_value': b'This is the return',
                'exec_inspect.return_value': {
                    'ExitCode': 1
                },
            })

        build_env = DockerEnvironment(
            version=self.version,
            project=self.project,
            build={'id': DUMMY_BUILD_ID},
        )

        with build_env:
            build_env.run('echo test', cwd='/tmp')

        self.mocks.docker_client.exec_create.assert_called_with(
            container='build-123-project-6-pip',
            cmd="/bin/sh -c 'cd /tmp && echo\\ test'",
            stderr=True,
            stdout=True)
        self.assertEqual(build_env.commands[0].exit_code, 1)
        self.assertEqual(build_env.commands[0].output, u'This is the return')
        self.assertEqual(build_env.commands[0].error, None)
        self.assertTrue(build_env.failed)

        # api() is not called anymore, we use api_v2 instead
        self.assertFalse(self.mocks.api()(DUMMY_BUILD_ID).put.called)
        self.mocks.mocks['api_v2.build']().put.assert_called_with({
            'id':
            DUMMY_BUILD_ID,
            'version':
            self.version.pk,
            'success':
            False,
            'project':
            self.project.pk,
            'setup_error':
            u'',
            'exit_code':
            1,
            'length':
            0,
            'error':
            '',
            'setup':
            u'',
            'output':
            u'',
            'state':
            u'finished',
            'builder':
            mock.ANY,
        })
Exemple #5
0
    def test_api_failure_on_docker_memory_limit(self):
        """Docker exec_create raised memory issue on `exec`"""
        response = Mock(status_code=500, reason='Internal Server Error')
        self.mocks.configure_mock(
            'docker_client', {
                'exec_create.side_effect':
                DockerAPIError('Failure creating container', response,
                               'Failure creating container'),
            })

        build_env = DockerEnvironment(
            version=self.version,
            project=self.project,
            build={'id': DUMMY_BUILD_ID},
        )

        with build_env:
            build_env.run('echo test', cwd='/tmp')

        self.assertEqual(build_env.commands[0].exit_code, -1)
        self.assertEqual(build_env.commands[0].error, None)
        self.assertTrue(build_env.failed)

        # api() is not called anymore, we use api_v2 instead
        self.assertFalse(self.mocks.api()(DUMMY_BUILD_ID).put.called)
        self.mocks.mocks['api_v2.build']().put.assert_called_with({
            'id':
            DUMMY_BUILD_ID,
            'version':
            self.version.pk,
            'success':
            False,
            'project':
            self.project.pk,
            'setup_error':
            u'',
            'exit_code':
            -1,
            'length':
            mock.ANY,
            'error':
            '',
            'setup':
            u'',
            'output':
            u'',
            'state':
            u'finished',
            'builder':
            mock.ANY,
        })
Exemple #6
0
    def test_api_failure_on_error_in_exit(self):
        response = Mock(status_code=500, reason='Internal Server Error')
        self.mocks.configure_mock('docker_client', {
            'kill.side_effect': BuildEnvironmentError('Failed')
        })

        build_env = DockerEnvironment(
            version=self.version,
            project=self.project,
            build={'id': DUMMY_BUILD_ID},
        )

        with build_env:
            pass

        # api() is not called anymore, we use api_v2 instead
        self.assertFalse(self.mocks.api()(DUMMY_BUILD_ID).put.called)
        self.mocks.mocks['api_v2.build']().put.assert_called_with({
            'id': DUMMY_BUILD_ID,
            'version': self.version.pk,
            'success': False,
            'project': self.project.pk,
            'setup_error': u'',
            'exit_code': 1,
            'length': 0,
            'error': 'Failed',
            'setup': u'',
            'output': u'',
            'state': u'finished',
            'builder': mock.ANY,
        })
    def test_container_already_exists(self):
        '''Docker container already exists'''
        self.mocks.configure_mock(
            'docker_client', {
                'inspect_container.return_value': {
                    'State': {
                        'Running': True
                    }
                },
                'exec_create.return_value': {
                    'Id': b'container-foobar'
                },
                'exec_start.return_value': b'This is the return',
                'exec_inspect.return_value': {
                    'ExitCode': 0
                },
            })

        build_env = DockerEnvironment(version=self.version,
                                      project=self.project,
                                      build={'id': DUMMY_BUILD_ID})

        def _inner():
            with build_env:
                build_env.run('echo', 'test', cwd='/tmp')

        self.assertRaises(BuildEnvironmentError, _inner)
        self.assertEqual(
            str(build_env.failure),
            'A build environment is currently running for this version')
        self.assertEqual(self.mocks.docker_client.exec_create.call_count, 0)
        self.assertTrue(build_env.failed)
        self.assertFalse(self.mocks.api()(DUMMY_BUILD_ID).put.called)
Exemple #8
0
    def test_environment_successful_build(self):
        """A successful build exits cleanly and reports the build output."""
        build_env = DockerEnvironment(
            version=self.version,
            project=self.project,
            build={'id': DUMMY_BUILD_ID},
        )

        with build_env:
            pass

        self.assertTrue(build_env.successful)

        # api() is not called anymore, we use api_v2 instead
        self.assertFalse(self.mocks.api()(DUMMY_BUILD_ID).put.called)
        self.mocks.mocks['api_v2.build']().put.assert_called_with({
            'id': DUMMY_BUILD_ID,
            'version': self.version.pk,
            'success': True,
            'project': self.project.pk,
            'setup_error': u'',
            'length': 0,
            'error': '',
            'setup': u'',
            'output': u'',
            'state': u'finished',
            'builder': mock.ANY,
        })
Exemple #9
0
    def test_connection_failure(self):
        """Connection failure on to docker socket should raise exception."""
        self.mocks.configure_mock('docker', {'side_effect': DockerException})
        build_env = DockerEnvironment(
            version=self.version,
            project=self.project,
            build={'id': DUMMY_BUILD_ID},
        )

        def _inner():
            with build_env:
                self.fail('Should not hit this')

        self.assertRaises(BuildEnvironmentError, _inner)

        # api() is not called anymore, we use api_v2 instead
        self.assertFalse(self.mocks.api()(DUMMY_BUILD_ID).put.called)
        self.mocks.mocks['api_v2.build']().put.assert_called_with({
            'id': DUMMY_BUILD_ID,
            'version': self.version.pk,
            'success': False,
            'project': self.project.pk,
            'setup_error': u'',
            'exit_code': 1,
            'length': 0,
            'error': (
                "There was a problem with Read the Docs while building your "
                "documentation. Please report this to us with your build id "
                "(123)."
            ),
            'setup': u'',
            'output': u'',
            'state': u'finished',
            'builder': mock.ANY,
        })
Exemple #10
0
    def test_environment_failed_build_without_update_but_with_error(self):
        """A failed build exits cleanly and doesn't update build."""
        build_env = DockerEnvironment(
            version=self.version,
            project=self.project,
            build={'id': DUMMY_BUILD_ID},
            update_on_success=False,
        )

        with build_env:
            raise BuildEnvironmentError('Test')

        self.assertFalse(build_env.successful)

        # api() is not called anymore, we use api_v2 instead
        self.assertFalse(self.mocks.api()(DUMMY_BUILD_ID).put.called)
        self.mocks.mocks['api_v2.build']().put.assert_called_with({
            'id': DUMMY_BUILD_ID,
            'version': self.version.pk,
            'success': False,
            'project': self.project.pk,
            'setup_error': u'',
            'exit_code': 1,
            'length': 0,
            'error': 'Test',
            'setup': u'',
            'output': u'',
            'state': u'finished',
            'builder': mock.ANY,
        })
Exemple #11
0
    def test_container_timeout(self):
        """Docker container timeout and command failure."""
        response = Mock(status_code=404, reason='Container not found')
        self.mocks.configure_mock(
            'docker_client', {
                'inspect_container.side_effect': [
                    DockerAPIError(
                        'No container found',
                        response,
                        'No container found',
                    ),
                    {'State': {'Running': False, 'ExitCode': 42}},
                ],
                'exec_create.return_value': {'Id': b'container-foobar'},
                'exec_start.return_value': b'This is the return',
                'exec_inspect.return_value': {'ExitCode': 0},
            })

        build_env = DockerEnvironment(
            version=self.version,
            project=self.project,
            build={'id': DUMMY_BUILD_ID},
        )
        with build_env:
            build_env.run('echo', 'test', cwd='/tmp')

        self.assertEqual(str(build_env.failure), 'Build exited due to time out')
        self.assertEqual(self.mocks.docker_client.exec_create.call_count, 1)
        self.assertTrue(build_env.failed)

        # api() is not called anymore, we use api_v2 instead
        self.assertFalse(self.mocks.api()(DUMMY_BUILD_ID).put.called)
        self.mocks.mocks['api_v2.build']().put.assert_called_with({
            'id': DUMMY_BUILD_ID,
            'version': self.version.pk,
            'success': False,
            'project': self.project.pk,
            'setup_error': u'',
            'exit_code': 1,
            'length': 0,
            'error': 'Build exited due to time out',
            'setup': u'',
            'output': u'',
            'state': u'finished',
            'builder': mock.ANY,
        })
Exemple #12
0
 def test_container_id(self):
     """Test docker build command."""
     docker = DockerEnvironment(
         version=self.version,
         project=self.project,
         build={'id': DUMMY_BUILD_ID},
     )
     self.assertEqual(docker.container_id, 'build-123-project-6-pip')
    def test_command_execution_cleanup_exception(self):
        """Command execution through Docker, catch exception during cleanup"""
        response = Mock(status_code=500, reason="Because")
        self.mocks.configure_mock(
            "docker_client",
            {
                "exec_create.return_value": {"Id": "container-foobar"},
                "exec_start.return_value": "This is the return",
                "exec_inspect.return_value": {"ExitCode": 0},
                "kill.side_effect": DockerAPIError("Failure killing container", response, "Failure killing container"),
            },
        )

        build_env = DockerEnvironment(version=self.version, project=self.project, build={})
        with build_env:
            build_env.run("echo", "test", cwd="/tmp")

        self.mocks.docker_client.kill.assert_called_with("version-foobar-of-pip-20")
        self.assertTrue(build_env.successful)
Exemple #14
0
    def test_command_execution_cleanup_exception(self):
        """Command execution through Docker, catch exception during cleanup."""
        response = Mock(status_code=500, reason='Because')
        self.mocks.configure_mock(
            'docker_client', {
                'exec_create.return_value': {'Id': b'container-foobar'},
                'exec_start.return_value': b'This is the return',
                'exec_inspect.return_value': {'ExitCode': 0},
                'kill.side_effect': DockerAPIError(
                    'Failure killing container',
                    response,
                    'Failure killing container',
                )
            })

        build_env = DockerEnvironment(
            version=self.version,
            project=self.project,
            build={'id': DUMMY_BUILD_ID},
        )
        with build_env:
            build_env.run('echo', 'test', cwd='/tmp')

        self.mocks.docker_client.kill.assert_called_with(
            'build-123-project-6-pip')
        self.assertTrue(build_env.successful)

        # api() is not called anymore, we use api_v2 instead
        self.assertFalse(self.mocks.api()(DUMMY_BUILD_ID).put.called)
        self.mocks.mocks['api_v2.build']().put.assert_called_with({
            'id': DUMMY_BUILD_ID,
            'version': self.version.pk,
            'error': '',
            'success': True,
            'project': self.project.pk,
            'setup_error': u'',
            'exit_code': 0,
            'length': 0,
            'setup': u'',
            'output': u'',
            'state': u'finished',
            'builder': mock.ANY,
        })
    def test_command_execution(self):
        """Command execution through Docker."""
        self.mocks.configure_mock(
            'docker_client', {
                'exec_create.return_value': {'Id': b'container-foobar'},
                'exec_start.return_value': b'This is the return',
                'exec_inspect.return_value': {'ExitCode': 1},
            })

        build_env = DockerEnvironment(
            version=self.version,
            project=self.project,
            build={'id': DUMMY_BUILD_ID},
        )

        with build_env:
            build_env.run('echo test', cwd='/tmp')

        self.mocks.docker_client.exec_create.assert_called_with(
            container='build-123-project-6-pip',
            cmd="/bin/sh -c 'cd /tmp && echo\\ test'", stderr=True, stdout=True)
        self.assertEqual(build_env.commands[0].exit_code, 1)
        self.assertEqual(build_env.commands[0].output, u'This is the return')
        self.assertEqual(build_env.commands[0].error, None)
        self.assertTrue(build_env.failed)

        # api() is not called anymore, we use api_v2 instead
        self.assertFalse(self.mocks.api()(DUMMY_BUILD_ID).put.called)
        self.mocks.mocks['api_v2.build']().put.assert_called_with({
            'id': DUMMY_BUILD_ID,
            'version': self.version.pk,
            'success': False,
            'project': self.project.pk,
            'setup_error': u'',
            'exit_code': 1,
            'length': 0,
            'error': '',
            'setup': u'',
            'output': u'',
            'state': u'finished',
            'builder': mock.ANY,
        })
    def test_connection_failure(self):
        '''Connection failure on to docker socket should raise exception'''
        self.mocks.configure_mock('docker', {'side_effect': DockerException})
        build_env = DockerEnvironment(version=self.version,
                                      project=self.project,
                                      build={})

        def _inner():
            with build_env:
                self.fail('Should not hit this')

        self.assertRaises(BuildEnvironmentError, _inner)
    def test_command_execution(self):
        """Command execution through Docker"""
        self.mocks.configure_mock(
            "docker_client",
            {
                "exec_create.return_value": {"Id": "container-foobar"},
                "exec_start.return_value": "This is the return",
                "exec_inspect.return_value": {"ExitCode": 1},
            },
        )

        build_env = DockerEnvironment(version=self.version, project=self.project, build={})
        with build_env:
            build_env.run("echo test", cwd="/tmp")

        self.mocks.docker_client.exec_create.assert_called_with(
            container="version-foobar-of-pip-20", cmd="/bin/sh -c 'cd /tmp && echo\\ test'", stderr=True, stdout=True
        )
        self.assertEqual(build_env.commands[0].exit_code, 1)
        self.assertEqual(build_env.commands[0].output, "This is the return")
        self.assertEqual(build_env.commands[0].error, None)
        self.assertTrue(build_env.failed)
    def test_api_failure_on_docker_memory_limit(self):
        """Docker exec_create raised memory issue on `exec`"""
        response = Mock(status_code=500, reason='Internal Server Error')
        self.mocks.configure_mock(
            'docker_client', {
                'exec_create.side_effect': DockerAPIError(
                    'Failure creating container', response,
                    'Failure creating container'),
            })

        build_env = DockerEnvironment(
            version=self.version,
            project=self.project,
            build={'id': DUMMY_BUILD_ID},
        )

        with build_env:
            build_env.run('echo test', cwd='/tmp')

        self.assertEqual(build_env.commands[0].exit_code, -1)
        self.assertEqual(build_env.commands[0].error, None)
        self.assertTrue(build_env.failed)

        # api() is not called anymore, we use api_v2 instead
        self.assertFalse(self.mocks.api()(DUMMY_BUILD_ID).put.called)
        self.mocks.mocks['api_v2.build']().put.assert_called_with({
            'id': DUMMY_BUILD_ID,
            'version': self.version.pk,
            'success': False,
            'project': self.project.pk,
            'setup_error': u'',
            'exit_code': -1,
            'length': mock.ANY,
            'error': '',
            'setup': u'',
            'output': u'',
            'state': u'finished',
            'builder': mock.ANY,
        })
    def test_command_execution_cleanup_exception(self):
        '''Command execution through Docker, catch exception during cleanup'''
        response = Mock(status_code=500, reason='Because')
        self.mocks.configure_mock('docker_client', {
            'exec_create.return_value': {'Id': 'container-foobar'},
            'exec_start.return_value': 'This is the return',
            'exec_inspect.return_value': {'ExitCode': 0},
            'kill.side_effect': DockerAPIError(
                'Failure killing container',
                response,
                'Failure killing container'
            )
        })

        build_env = DockerEnvironment(version=self.version, project=self.project,
                                      build={'id': 123})
        with build_env:
            build_env.run('echo', 'test', cwd='/tmp')

        self.mocks.docker_client.kill.assert_called_with(
            'build-123-project-6-pip')
        self.assertTrue(build_env.successful)
Exemple #20
0
    def test_command_execution(self):
        '''Command execution through Docker'''
        self.mocks.configure_mock('docker_client', {
            'exec_create.return_value': {'Id': 'container-foobar'},
            'exec_start.return_value': 'This is the return',
            'exec_inspect.return_value': {'ExitCode': 1},
        })

        build_env = DockerEnvironment(version=self.version, project=self.project,
                                      build={})
        with build_env:
            build_env.run('echo test', cwd='/tmp')

        self.mocks.docker_client.exec_create.assert_called_with(
            container='version-foobar-of-pip-20',
            cmd="/bin/sh -c 'cd /tmp && READTHEDOCS=True echo\\ test'",
            stderr=True,
            stdout=True
        )
        self.assertEqual(build_env.commands[0].exit_code, 1)
        self.assertEqual(build_env.commands[0].output, 'This is the return')
        self.assertEqual(build_env.commands[0].error, None)
        self.assertTrue(build_env.failed)
Exemple #21
0
    def test_api_failure(self):
        """Failing API error response from docker should raise exception."""
        response = Mock(status_code=500, reason='Because')
        self.mocks.configure_mock(
            'docker_client', {
                'create_container.side_effect':
                DockerAPIError('Failure creating container', response,
                               'Failure creating container')
            })

        build_env = DockerEnvironment(
            version=self.version,
            project=self.project,
            build={'id': DUMMY_BUILD_ID},
        )

        def _inner():
            with build_env:
                self.fail('Should not hit this')

        self.assertRaises(BuildEnvironmentError, _inner)

        # api() is not called anymore, we use api_v2 instead
        self.assertFalse(self.mocks.api()(DUMMY_BUILD_ID).put.called)
        self.mocks.mocks['api_v2.build']().put.assert_called_with({
            'id':
            DUMMY_BUILD_ID,
            'version':
            self.version.pk,
            'success':
            False,
            'project':
            self.project.pk,
            'setup_error':
            u'',
            'exit_code':
            1,
            'length':
            mock.ANY,
            'error':
            'Build environment creation failed',
            'setup':
            u'',
            'output':
            u'',
            'state':
            u'finished',
            'builder':
            mock.ANY,
        })
    def test_container_timeout(self):
        """Docker container timeout and command failure"""
        response = Mock(status_code=404, reason="Container not found")
        self.mocks.configure_mock(
            "docker_client",
            {
                "inspect_container.side_effect": [
                    DockerAPIError("No container found", response, "No container found"),
                    {"State": {"Running": False, "ExitCode": 42}},
                ],
                "exec_create.return_value": {"Id": "container-foobar"},
                "exec_start.return_value": "This is the return",
                "exec_inspect.return_value": {"ExitCode": 0},
            },
        )

        build_env = DockerEnvironment(version=self.version, project=self.project, build={})
        with build_env:
            build_env.run("echo", "test", cwd="/tmp")

        self.assertEqual(str(build_env.failure), "Build exited due to time out")
        self.assertEqual(self.mocks.docker_client.exec_create.call_count, 1)
        self.assertTrue(build_env.failed)
    def test_command_execution(self):
        '''Command execution through Docker'''
        self.mocks.configure_mock('docker_client', {
            'exec_create.return_value': {'Id': 'container-foobar'},
            'exec_start.return_value': 'This is the return',
            'exec_inspect.return_value': {'ExitCode': 1},
        })

        build_env = DockerEnvironment(version=self.version, project=self.project,
                                      build={'id': 123})
        with build_env:
            build_env.run('echo test', cwd='/tmp')

        self.mocks.docker_client.exec_create.assert_called_with(
            container='build-123-project-6-pip',
            cmd="/bin/sh -c 'cd /tmp && echo\\ test'",
            stderr=True,
            stdout=True
        )
        self.assertEqual(build_env.commands[0].exit_code, 1)
        self.assertEqual(build_env.commands[0].output, 'This is the return')
        self.assertEqual(build_env.commands[0].error, None)
        self.assertTrue(build_env.failed)
Exemple #24
0
    def test_api_failure_returns_previous_error_on_error_in_exit(self):
        """
        Treat previously raised errors with more priority.

        Don't report a connection problem to Docker on cleanup if we have a more
        usable error to show the user.
        """
        response = Mock(status_code=500, reason='Internal Server Error')
        self.mocks.configure_mock(
            'docker_client',
            {'kill.side_effect': BuildEnvironmentError('Outer failed')})

        build_env = DockerEnvironment(
            version=self.version,
            project=self.project,
            build={'id': DUMMY_BUILD_ID},
        )

        with build_env:
            raise BuildEnvironmentError('Inner failed')

        # api() is not called anymore, we use api_v2 instead
        self.assertFalse(self.mocks.api()(DUMMY_BUILD_ID).put.called)
        self.mocks.mocks['api_v2.build']().put.assert_called_with({
            'id':
            DUMMY_BUILD_ID,
            'version':
            self.version.pk,
            'success':
            False,
            'project':
            self.project.pk,
            'setup_error':
            u'',
            'exit_code':
            1,
            'length':
            0,
            'error':
            'Inner failed',
            'setup':
            u'',
            'output':
            u'',
            'state':
            u'finished',
            'builder':
            mock.ANY,
        })
Exemple #25
0
    def test_environment_successful_build_without_update(self):
        """A successful build exits cleanly and doesn't update build."""
        build_env = DockerEnvironment(
            version=self.version,
            project=self.project,
            build={'id': DUMMY_BUILD_ID},
            update_on_success=False,
        )

        with build_env:
            pass

        self.assertTrue(build_env.successful)

        # api() is not called anymore, we use api_v2 instead
        self.assertFalse(self.mocks.api()(DUMMY_BUILD_ID).put.called)
        self.assertFalse(self.mocks.mocks['api_v2.build']().put.called)
    def test_api_failure(self):
        '''Failing API error response from docker should raise exception'''
        response = Mock(status_code=500, reason='Because')
        self.mocks.configure_mock('docker_client', {
            'create_container.side_effect': DockerAPIError(
                'Failure creating container',
                response,
                'Failure creating container'
            )
        })

        build_env = DockerEnvironment(version=self.version, project=self.project,
                                      build={})

        def _inner():
            with build_env:
                self.fail('Should not hit this')

        self.assertRaises(BuildEnvironmentError, _inner)
Exemple #27
0
    def test_container_already_exists(self):
        """Docker container already exists."""
        self.mocks.configure_mock(
            'docker_client', {
                'inspect_container.return_value': {'State': {'Running': True}},
                'exec_create.return_value': {'Id': b'container-foobar'},
                'exec_start.return_value': b'This is the return',
                'exec_inspect.return_value': {'ExitCode': 0},
            })

        build_env = DockerEnvironment(
            version=self.version,
            project=self.project,
            build={'id': DUMMY_BUILD_ID},
        )

        def _inner():
            with build_env:
                build_env.run('echo', 'test', cwd='/tmp')

        self.assertRaises(BuildEnvironmentError, _inner)
        self.assertEqual(
            str(build_env.failure),
            'A build environment is currently running for this version')
        self.assertEqual(self.mocks.docker_client.exec_create.call_count, 0)
        self.assertTrue(build_env.failed)

        # api() is not called anymore, we use api_v2 instead
        self.assertFalse(self.mocks.api()(DUMMY_BUILD_ID).put.called)
        self.mocks.mocks['api_v2.build']().put.assert_called_with({
            'id': DUMMY_BUILD_ID,
            'version': self.version.pk,
            'success': False,
            'project': self.project.pk,
            'setup_error': u'',
            'exit_code': 1,
            'length': 0,
            'error': 'A build environment is currently running for this version',
            'setup': u'',
            'output': u'',
            'state': u'finished',
            'builder': mock.ANY,
        })
Exemple #28
0
 def test_container_id(self):
     '''Test docker build command'''
     docker = DockerEnvironment(self.version)
     self.assertEqual(docker.container_id(), 'version-foobar-of-pip-20')
Exemple #29
0
def update_docs(pk, version_pk=None, build_pk=None, record=True, docker=False,
                search=True, force=False, intersphinx=True, localmedia=True,
                basic=False, **kwargs):
    """
    The main entry point for updating documentation.

    It handles all of the logic around whether a project is imported or we
    created it.  Then it will build the html docs and other requested parts.

    `pk`
        Primary key of the project to update

    `record`
        Whether or not to keep a record of the update in the database. Useful
        for preventing changes visible to the end-user when running commands
        from the shell, for example.

    """
    start_time = datetime.datetime.utcnow()
    try:
        project_data = api_v1.project(pk).get()
    except HttpClientError:
        log.exception(LOG_TEMPLATE.format(project=pk, version='', msg='Failed to get project data on build. Erroring.'))
    project = make_api_project(project_data)
    # Don't build skipped projects
    if project.skip:
        log.info(LOG_TEMPLATE.format(project=project.slug, version='', msg='Skipping'))
        return
    else:
        log.info(LOG_TEMPLATE.format(project=project.slug, version='', msg='Building'))
    version = ensure_version(project, version_pk)
    build = create_build(build_pk)
    results = {}

    # Build Servery stuff
    try:
        record_build(build=build, record=record, results=results, state='cloning')
        vcs_results = setup_vcs(version, build)
        if vcs_results:
            results.update(vcs_results)

        if project.documentation_type == 'auto':
            update_documentation_type(version)

        if docker or settings.DOCKER_ENABLE:
            record_build(build=build, record=record, results=results, state='building')
            docker = DockerEnvironment(version)
            build_results = docker.build()
            results.update(build_results)
        else:
            record_build(build=build, record=record, results=results, state='installing')
            setup_results = setup_environment(version)
            results.update(setup_results)

            record_build(build=build, record=record, results=results, state='building')
            build_results = build_docs(version, force, search, localmedia)
            results.update(build_results)

    except vcs_support_utils.LockTimeout, e:
        results['checkout'] = (423, "", "Version locked, retrying in 5 minutes.")
        log.info(LOG_TEMPLATE.format(project=version.project.slug,
                                     version=version.slug, msg="Unable to lock, will retry"))
        # http://celery.readthedocs.org/en/3.0/userguide/tasks.html#retrying
        # Should completely retry the task for us until max_retries is exceeded
        update_docs.retry(exc=e, throw=False)
Exemple #30
0
 def test_container_id(self):
     '''Test docker build command'''
     docker = DockerEnvironment(version=self.version, project=self.project,
                                build={})
     self.assertEqual(docker.container_id,
                      'version-foobar-of-pip-20')
 def test_container_id(self):
     '''Test docker build command'''
     docker = DockerEnvironment(self.version)
     self.assertEqual(docker.container_id(),
                      'version-foobar-of-pip-20')
 def test_container_id(self):
     '''Test docker build command'''
     docker = DockerEnvironment(version=self.version, project=self.project,
                                build={'id': 123})
     self.assertEqual(docker.container_id,
                      'build-123-project-6-pip')