def test_privileged_build(caplog, source_params): if MOCK: mock_docker() image_name = ImageName(repo=TEST_IMAGE) remote_image = image_name.copy() remote_image.registry = LOCALHOST_REGISTRY m = PrivilegedBuildManager( "buildroot-fedora", { "source": source_params, "image": remote_image.to_str(), "parent_registry": LOCALHOST_REGISTRY, # faster "target_registries_insecure": True, "parent_registry_insecure": True, }, ) results = m.build() dt = DockerTasker() dt.pull_image(remote_image, insecure=True) if source_params["provider"] == "path": assert_source_from_path_mounted_ok(caplog, m.temp_dir) assert len(results.build_logs) > 0 # assert isinstance(results.built_img_inspect, dict) # assert len(results.built_img_inspect.items()) > 0 # assert isinstance(results.built_img_info, dict) # assert len(results.built_img_info.items()) > 0 # assert isinstance(results.base_img_info, dict) # assert len(results.base_img_info.items()) > 0 # assert len(results.base_plugins_output) > 0 # assert len(results.built_img_plugins_output) > 0 dt.remove_container(results.container_id) dt.remove_image(remote_image)
def test_privileged_build(caplog, source_params): if MOCK: mock_docker() image_name = ImageName(repo=TEST_IMAGE) remote_image = image_name.copy() remote_image.registry = LOCALHOST_REGISTRY m = PrivilegedBuildManager( "buildroot-fedora", { "source": source_params, "image": remote_image.to_str(), "parent_registry": LOCALHOST_REGISTRY, # faster "target_registries_insecure": True, "parent_registry_insecure": True, }) results = m.build() dt = DockerTasker() dt.pull_image(remote_image, insecure=True) if source_params['provider'] == 'path': assert_source_from_path_mounted_ok(caplog, m.temp_dir) assert len(results.build_logs) > 0 # assert isinstance(results.built_img_inspect, dict) # assert len(results.built_img_inspect.items()) > 0 # assert isinstance(results.built_img_info, dict) # assert len(results.built_img_info.items()) > 0 # assert isinstance(results.base_img_info, dict) # assert len(results.base_img_info.items()) > 0 # assert len(results.base_plugins_output) > 0 # assert len(results.built_img_plugins_output) > 0 dt.remove_container(results.container_id) dt.remove_image(remote_image)
def test_hostdocker_build(caplog, source_params): if MOCK: mock_docker() image_name = ImageName(repo="atomic-reactor-test-ssh-image") remote_image = image_name.copy() remote_image.registry = LOCALHOST_REGISTRY m = DockerhostBuildManager("buildroot-dh-fedora", { "source": source_params, "image": remote_image.to_str(), "parent_registry": LOCALHOST_REGISTRY, # faster "target_registries_insecure": True, "parent_registry_insecure": True, }) results = m.build() dt = DockerTasker() dt.pull_image(remote_image, insecure=True) if source_params['provider'] == 'path': assert_source_from_path_mounted_ok(caplog, m.temp_dir) assert len(results.build_logs) > 0 #assert re.search(r'build json mounted in container .+"uri": %s' % # os.path.join(dconstants.CONTAINER_SHARE_PATH, 'source')) # assert isinstance(results.built_img_inspect, dict) # assert len(results.built_img_inspect.items()) > 0 # assert isinstance(results.built_img_info, dict) # assert len(results.built_img_info.items()) > 0 # assert isinstance(results.base_img_info, dict) # assert len(results.base_img_info.items()) > 0 # assert len(results.base_plugins_output) > 0 # assert len(results.built_img_plugins_output) > 0 dt.remove_container(results.container_id) dt.remove_image(remote_image)
def test_hostdocker_error_build(source_params): if MOCK: mock_docker(wait_should_fail=True) image_name = TEST_IMAGE m = DockerhostBuildManager( "buildroot-dh-fedora", { "source": { "provider": "git", "uri": DOCKERFILE_GIT, "provider_params": { "git_commit": "error-build" } }, "image": image_name, "parent_registry": LOCALHOST_REGISTRY, # faster "target_registries_insecure": True, "parent_registry_insecure": True, }) results = m.build() dt = DockerTasker() assert len(results.build_logs) > 0 assert results.return_code != 0 dt.remove_container(results.container_id)
def test_run(): if MOCK: mock_docker() t = DockerTasker() container_id = t.run(input_image_name, command="id") try: t.wait(container_id) finally: t.remove_container(container_id)
def test_logs(): if MOCK: mock_docker() t = DockerTasker() container_id = t.run(input_image_name, command="id") try: t.wait(container_id) output = t.logs(container_id, stderr=True, stream=False) assert "\n".join(output).startswith("uid=") finally: t.remove_container(container_id)
def test_run_invalid_command(): if MOCK: mock_docker(should_raise_error={'start': []}) t = DockerTasker() try: with pytest.raises(docker.errors.APIError): t.run(input_image_name, command=COMMAND) finally: # remove the container containers = t.d.containers(all=True) container_id = [c for c in containers if c["Command"] == COMMAND][0]['Id'] t.remove_container(container_id)
def test_commit_container(temp_image_name): if MOCK: mock_docker() t = DockerTasker() container_id = t.run(INPUT_IMAGE, command="id") t.wait(container_id) image_id = t.commit_container(container_id, message="test message", image=temp_image_name) try: assert t.image_exists(image_id) finally: t.remove_container(container_id) t.remove_image(image_id)
def test_remove_image(temp_image_name): if MOCK: mock_docker(inspect_should_fail=True) t = DockerTasker() container_id = t.run(input_image_name, command="id") t.wait(container_id) image_id = t.commit_container(container_id, image=temp_image_name) try: t.remove_container(container_id) finally: t.remove_image(image_id) assert not t.image_exists(temp_image_name)
def test_remove_image(temp_image_name): # noqa if MOCK: mock_docker(inspect_should_fail=True) t = DockerTasker() container_id = t.run(input_image_name, command="id") t.wait(container_id) image_id = t.commit_container(container_id, image=temp_image_name) try: t.remove_container(container_id) finally: t.remove_image(image_id) assert not t.image_exists(temp_image_name)
def test_hostdocker_error_build(source_params): if MOCK: mock_docker(wait_should_fail=True) image_name = TEST_IMAGE m = DockerhostBuildManager( "buildroot-dh-fedora", { "source": {"provider": "git", "uri": DOCKERFILE_GIT, "provider_params": {"git_commit": "error-build"}}, "image": image_name, "parent_registry": LOCALHOST_REGISTRY, # faster "target_registries_insecure": True, "parent_registry_insecure": True, }, ) results = m.build() dt = DockerTasker() assert len(results.build_logs) > 0 assert results.return_code != 0 dt.remove_container(results.container_id)
def test_privileged_gitrepo_build(caplog, source_params): if MOCK: mock_docker() image_name = ImageName(repo="atomic-reactor-test-ssh-image") remote_image = image_name.copy() remote_image.registry = LOCALHOST_REGISTRY m = PrivilegedBuildManager("buildroot-fedora", { "source": source_params, "image": remote_image.to_str(), "parent_registry": LOCALHOST_REGISTRY, # faster "target_registries_insecure": True, "parent_registry_insecure": True, }) results = m.build() dt = DockerTasker() dt.pull_image(remote_image, insecure=True) assert len(results.build_logs) > 0 dt.remove_container(results.container_id) dt.remove_image(remote_image)
def test_hostdocker_build(caplog, source_params): if MOCK: mock_docker() image_name = ImageName(repo="atomic-reactor-test-ssh-image") remote_image = image_name.copy() remote_image.registry = LOCALHOST_REGISTRY m = DockerhostBuildManager( "buildroot-dh-fedora", { "source": source_params, "image": remote_image.to_str(), "parent_registry": LOCALHOST_REGISTRY, # faster "target_registries_insecure": True, "parent_registry_insecure": True, }) results = m.build() dt = DockerTasker() dt.pull_image(remote_image, insecure=True) if source_params['provider'] == 'path': assert_source_from_path_mounted_ok(caplog, m.temp_dir) assert len(results.build_logs) > 0 #assert re.search(r'build json mounted in container .+"uri": %s' % # os.path.join(dconstants.CONTAINER_SHARE_PATH, 'source')) # assert isinstance(results.built_img_inspect, dict) # assert len(results.built_img_inspect.items()) > 0 # assert isinstance(results.built_img_info, dict) # assert len(results.built_img_info.items()) > 0 # assert isinstance(results.base_img_info, dict) # assert len(results.base_img_info.items()) > 0 # assert len(results.base_plugins_output) > 0 # assert len(results.built_img_plugins_output) > 0 dt.remove_container(results.container_id) dt.remove_image(remote_image)
class BuildManager(BuilderStateMachine): """ initiates build and waits for it to finish, then it collects data """ def __init__(self, build_image, build_args): BuilderStateMachine.__init__(self) self.build_image = build_image self.build_args = build_args self.image = build_args['image'] self.uri = build_args['source']['uri'] self.temp_dir = None self.build_container_id = None # build image after build self.buildroot_image_id = None self.buildroot_image_name = None self.dt = DockerTasker() def _build(self, build_method): """ build image from provided build_args :return: BuildResults """ logger.info("building image '%s'", self.image) self.ensure_not_built() self.temp_dir = tempfile.mkdtemp() temp_path = os.path.join(self.temp_dir, BUILD_JSON) try: with open(temp_path, 'w') as build_json: json.dump(self.build_args, build_json) self.build_container_id = build_method(self.build_image, self.temp_dir) try: logs_gen = self.dt.logs(self.build_container_id, stream=True) wait_for_command(logs_gen) return_code = self.dt.wait(self.build_container_id) except KeyboardInterrupt: logger.info("killing build container on user's request") self.dt.remove_container(self.build_container_id, force=True) results = BuildResults() results.return_code = 1 return results else: results = self._load_results(self.build_container_id) results.return_code = return_code return results finally: shutil.rmtree(self.temp_dir) def _load_results(self, container_id): """ load results from recent build :return: BuildResults """ if self.temp_dir: dt = DockerTasker() # FIXME: load results only when requested # results_path = os.path.join(self.temp_dir, RESULTS_JSON) # df_path = os.path.join(self.temp_dir, 'Dockerfile') # try: # with open(results_path, 'r') as results_fp: # results = json.load(results_fp, cls=BuildResultsJSONDecoder) # except (IOError, OSError) as ex: # logger.error("Can't open results: '%s'", ex) # for l in self.dt.logs(self.build_container_id, stream=False): # logger.debug(l.strip()) # raise RuntimeError("Can't open results: '%s'" % ex) # results.dockerfile = open(df_path, 'r').read() results = BuildResults() results.build_logs = dt.logs(container_id, stream=False) results.container_id = container_id return results def commit_buildroot(self): """ create image from buildroot :return: """ logger.info("committing buildroot") self.ensure_is_built() commit_message = "docker build of '%s' (%s)" % (self.image, self.uri) self.buildroot_image_name = ImageName( repo="buildroot-%s" % self.image, # save the time when image was built tag=datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S')) self.buildroot_image_id = self.dt.commit_container(self.build_container_id, commit_message) return self.buildroot_image_id def push_buildroot(self, registry): logger.info("pushing buildroot to registry") self.ensure_is_built() image_name_with_registry = self.buildroot_image_name.copy() image_name_with_registry.registry = registry return self.dt.tag_and_push_image( self.buildroot_image_id, image_name_with_registry)
class BuildManager(BuilderStateMachine): """ initiates build and waits for it to finish, then it collects data """ def __init__(self, build_image, build_args): BuilderStateMachine.__init__(self) self.build_image = build_image self.build_args = build_args self.image = build_args['image'] self.uri = build_args['source']['uri'] self.temp_dir = None # build image after build self.buildroot_image_id = None self.buildroot_image_name = None self.dt = DockerTasker() def _build(self, build_method): """ build image from provided build_args :return: BuildResults """ logger.info("building image '%s'", self.image) self._ensure_not_built() self.temp_dir = tempfile.mkdtemp() temp_path = os.path.join(self.temp_dir, BUILD_JSON) try: with open(temp_path, 'w') as build_json: json.dump(self.build_args, build_json) self.build_container_id = build_method(self.build_image, self.temp_dir) try: logs_gen = self.dt.logs(self.build_container_id, stream=True) wait_for_command(logs_gen) return_code = self.dt.wait(self.build_container_id) except KeyboardInterrupt: logger.info("killing build container on user's request") self.dt.remove_container(self.build_container_id, force=True) results = BuildResults() results.return_code = 1 return results else: results = self._load_results(self.build_container_id) results.return_code = return_code return results finally: shutil.rmtree(self.temp_dir) def _load_results(self, container_id): """ load results from recent build :return: BuildResults """ if self.temp_dir: dt = DockerTasker() # FIXME: load results only when requested # results_path = os.path.join(self.temp_dir, RESULTS_JSON) # df_path = os.path.join(self.temp_dir, 'Dockerfile') # try: # with open(results_path, 'r') as results_fp: # results = json.load(results_fp, cls=BuildResultsJSONDecoder) # except (IOError, OSError) as ex: # logger.error("Can't open results: '%s'", repr(ex)) # for l in self.dt.logs(self.build_container_id, stream=False): # logger.debug(l.strip()) # raise RuntimeError("Can't open results: '%s'" % repr(ex)) # results.dockerfile = open(df_path, 'r').read() results = BuildResults() results.build_logs = dt.logs(container_id, stream=False) results.container_id = container_id return results def commit_buildroot(self): """ create image from buildroot :return: """ logger.info("committing buildroot") self._ensure_is_built() commit_message = "docker build of '%s' (%s)" % (self.image, self.uri) self.buildroot_image_name = ImageName( repo="buildroot-%s" % self.image, # save the time when image was built tag=datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S')) self.buildroot_image_id = self.dt.commit_container(self.build_container_id, commit_message) return self.buildroot_image_id def push_buildroot(self, registry): logger.info("pushing buildroot to registry") self._ensure_is_built() image_name_with_registry = self.buildroot_image_name.copy() image_name_with_registry.registry = registry return self.dt.tag_and_push_image( self.buildroot_image_id, image_name_with_registry)