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_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) # 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_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_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_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, })
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)
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_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)
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(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)
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)
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)