def prepare(self, tmpdir, key, value, update_labels_args=None, update_labels_kwargs=None, reactor_config_map=False, base_from_scratch=False, custom_base=False): if MOCK: mock_docker() tasker = DockerTasker() workflow = DockerBuildWorkflow(source=MOCK_SOURCE) parent_images = None if base_from_scratch: parent_images = ['scratch'] if custom_base: parent_images = ['koji/image-build'] if parent_images: workflow.builder = MockInsideBuilder(tmpdir, parent_images=parent_images) else: workflow.builder = MockInsideBuilder(tmpdir) workflow.source = workflow.builder.source setattr(workflow.builder, 'base_image_inspect', {}) expectation = (flexmock(OSBS) .should_receive('update_labels_on_build_config')) if update_labels_args is not None: if update_labels_kwargs is None: update_labels_kwargs = {} expectation.with_args(*update_labels_args) namespace = None if update_labels_kwargs is not None: namespace = update_labels_kwargs.get('namespace') (flexmock(osbs.conf).should_call('Configuration') .with_args(namespace=namespace, conf_file=None, verify_ssl=True, openshift_url="", use_auth=True, build_json_dir=None)) if reactor_config_map: workflow.plugin_workspace[ReactorConfigPlugin.key] = {} workflow.plugin_workspace[ReactorConfigPlugin.key][WORKSPACE_CONF_KEY] =\ ReactorConfig({'version': 1, 'openshift': { 'url': '', 'insecure': False, 'auth': {'enable': True}}}) runner = PreBuildPluginsRunner(tasker, workflow, [ { 'name': CheckAndSetRebuildPlugin.key, 'args': { 'label_key': key, 'label_value': value, 'url': '', }, } ]) return workflow, runner
def test_add_help_no_help_file(request, tmpdir, docker_tasker, filename): df_content = "FROM fedora" df = df_parser(str(tmpdir)) df.content = df_content workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = X workflow.builder.df_path = df.dockerfile_path workflow.builder.df_dir = str(tmpdir) runner = PreBuildPluginsRunner(docker_tasker, workflow, [{ 'name': AddHelpPlugin.key, 'args': { 'help_file': filename } }]) # Runner should not crash if no help.md found result = runner.run() assert result == { 'add_help': { 'status': AddHelpPlugin.NO_HELP_FILE_FOUND, 'help_file': filename } }
def test_dangling_volumes_removed(docker_tasker, request): # noqa:F811 fake_logger = FakeLogger() existing_logger = atomic_reactor.core.logger def restore_logger(): atomic_reactor.core.logger = existing_logger request.addfinalizer(restore_logger) atomic_reactor.core.logger = fake_logger mock_docker() workflow = DockerBuildWorkflow(SOURCE, TEST_IMAGE) workflow.builder = StubInsideBuilder().for_workflow(workflow) runner = PostBuildPluginsRunner(docker_tasker, workflow, [{ "name": PostBuildRPMqaPlugin.key, "args": { 'image_id': TEST_IMAGE } }]) runner.run() assert ("container_id = '%s'", u'f8ee920b2db5e802da2583a13a4edbf0523ca5fff6b6d6454c1fd6db5f38014d') \ in fake_logger.debugs expected_volumes = [u'test', u'conflict_exception', u'real_exception'] assert ("volumes = %s", expected_volumes) in fake_logger.debugs assert ("removing volume '%s'", u'test') in fake_logger.infos assert ("removing volume '%s'", u'conflict_exception') in fake_logger.infos assert ("removing volume '%s'", u'real_exception') in fake_logger.infos assert ('ignoring a conflict when removing volume %s', 'conflict_exception') in \ fake_logger.debugs
def test_yuminject_plugin_wrapped(tmpdir, docker_tasker): df_content = """\ FROM fedora RUN yum install -y python-django CMD blabla""" df = df_parser(str(tmpdir)) df.content = df_content workflow = DockerBuildWorkflow(SOURCE, "test-image") workflow.builder = (StubInsideBuilder().for_workflow(workflow).set_df_path( df.dockerfile_path)) metalink = 'https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch' workflow.files[os.path.join(YUM_REPOS_DIR, DEFAULT_YUM_REPOFILE_NAME)] = \ render_yum_repo(OrderedDict((('name', 'my-repo'), ('metalink', metalink), ('enabled', '1'), ('gpgcheck', '0')), )) runner = PreBuildPluginsRunner(docker_tasker, workflow, [{ 'name': InjectYumRepoPlugin.key, 'args': { "wrap_commands": True } }]) runner.run() assert InjectYumRepoPlugin.key is not None expected_output = """FROM fedora RUN printf "[my-repo]\nname=my-repo\nmetalink=https://mirrors.fedoraproject.org/metalink?repo=fedora-\\$releasever&arch=\\$basearch\nenabled=1\ngpgcheck=0\n" >/etc/yum.repos.d/atomic-reactor-injected.repo && yum install -y python-django && yum clean all && rm -f /etc/yum.repos.d/atomic-reactor-injected.repo CMD blabla""" # noqa assert df.content == expected_output
def prepare(self, df_path, inherited_user='', hide_files=None, parent_images=None): if MOCK: mock_docker() tasker = DockerTasker() workflow = DockerBuildWorkflow("test-image", source=SOURCE) workflow.source = MockSource(df_path) workflow.builder = (StubInsideBuilder() .for_workflow(workflow) .set_df_path(df_path)) for parent in parent_images or []: workflow.builder.set_parent_inspection_data(parent, { INSPECT_CONFIG: { 'User': inherited_user, }, }) if hide_files is not None: reactor_config = ReactorConfig({ 'version': 1, 'hide_files': hide_files }) workflow.plugin_workspace[ReactorConfigPlugin.key] = { WORKSPACE_CONF_KEY: reactor_config } return tasker, workflow
def test_assertlabels_plugin(tmpdir, docker_tasker, df_content, req_labels, expected): df = DockerfileParser(str(tmpdir)) df.content = df_content workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = X workflow.builder.df_path = df.dockerfile_path workflow.builder.df_dir = str(tmpdir) runner = PreBuildPluginsRunner(docker_tasker, workflow, [{ 'name': AssertLabelsPlugin.key, 'args': { 'required_labels': req_labels } }]) assert AssertLabelsPlugin.key is not None if isinstance(expected, PluginFailedException): with pytest.raises(PluginFailedException): runner.run() else: runner.run()
def test_assertlabels_plugin(tmpdir, df_content, req_labels, expected): df = DockerfileParser(str(tmpdir)) df.content = df_content tasker = DockerTasker() workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = X workflow.builder.df_path = df.dockerfile_path workflow.builder.df_dir = str(tmpdir) runner = PreBuildPluginsRunner( tasker, workflow, [{ 'name': AssertLabelsPlugin.key, 'args': {'required_labels': req_labels} }] ) assert AssertLabelsPlugin.key is not None if isinstance(expected, PluginFailedException): with pytest.raises(PluginFailedException): runner.run() else: runner.run()
def test_distgit_fetch_artefacts_plugin(tmpdir, docker_tasker): # noqa command = 'fedpkg sources' expected_command = ['fedpkg', 'sources'] workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = X() workflow.source = flexmock(path=str(tmpdir)) initial_dir = os.getcwd() assert initial_dir != str(tmpdir) def assert_tmpdir(*args, **kwargs): assert os.getcwd() == str(tmpdir) (flexmock(pre_pyrpkg_fetch_artefacts.subprocess) .should_receive('check_call') .with_args(expected_command) .replace_with(assert_tmpdir) .once()) runner = PreBuildPluginsRunner( docker_tasker, workflow, [{ 'name': DistgitFetchArtefactsPlugin.key, 'args': {'command': command} }] ) runner.run() assert os.getcwd() == initial_dir
def workflow(tmpdir, user_params): workflow = DockerBuildWorkflow(source=MOCK_SOURCE) # Stash the tmpdir in workflow so it can be used later workflow._tmpdir = tmpdir class MockSource(StubSource): def __init__(self, workdir): super(MockSource, self).__init__() self.workdir = workdir workflow.source = MockSource(str(tmpdir)) builder = StubInsideBuilder().for_workflow(workflow) builder.set_df_path(str(tmpdir)) builder.tasker = flexmock() workflow.builder = flexmock(builder) workflow.buildstep_plugins_conf = [{'name': PLUGIN_BUILD_ORCHESTRATE_KEY}] mock_repo_config(workflow) mock_reactor_config(workflow) mock_build_json() mock_koji() return workflow
def test_retry_pull_base_image(exc, failures, should_succeed): if MOCK: mock_docker(remember_images=True) tasker = DockerTasker() workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = MockBuilder() workflow.builder.base_image = ImageName.parse('parent-image') class MockResponse(object): content = '' expectation = flexmock(tasker).should_receive('tag_image') for _ in range(failures): expectation = expectation.and_raise(exc('', MockResponse())) expectation.and_return('foo') expectation.and_return('parent-image') runner = PreBuildPluginsRunner( tasker, workflow, [{ 'name': PullBaseImagePlugin.key, 'args': {'parent_registry': 'registry.example.com', 'parent_registry_insecure': True}, }], ) if should_succeed: runner.run() else: with pytest.raises(Exception): runner.run()
def workflow(tmpdir): if MOCK: mock_docker() buildstep_plugin = [{ 'name': OrchestrateBuildPlugin.key, 'args': { 'platforms': ODCS_COMPOSE_DEFAULT_ARCH_LIST }, }] workflow = DockerBuildWorkflow( MOCK_SOURCE, 'test-image', buildstep_plugins=buildstep_plugin, ) workflow.builder = MockInsideBuilder(tmpdir) workflow.source = workflow.builder.source workflow._tmpdir = tmpdir workflow.prebuild_results[PLUGIN_CHECK_AND_SET_PLATFORMS_KEY] = set( ODCS_COMPOSE_DEFAULT_ARCH_LIST) setattr(workflow.builder, 'base_image_inspect', {}) mock_reactor_config(workflow, tmpdir) mock_repo_config(tmpdir) mock_odcs_request() workflow._koji_session = mock_koji_session() return workflow
def prepare(self, df_path, inherited_user='', hide_files=None, parent_images=None): if MOCK: mock_docker() tasker = DockerTasker() workflow = DockerBuildWorkflow(SOURCE, "test-image") workflow.source = MockSource(df_path) workflow.builder = (StubInsideBuilder() .for_workflow(workflow) .set_df_path(df_path)) for parent in parent_images or []: workflow.builder.set_parent_inspection_data(parent, { INSPECT_CONFIG: { 'User': inherited_user, }, }) if hide_files is not None: reactor_config = ReactorConfig({ 'version': 1, 'hide_files': hide_files }) workflow.plugin_workspace[ReactorConfigPlugin.key] = { WORKSPACE_CONF_KEY: reactor_config } return tasker, workflow
def test_all_missing_required_labels(tmpdir, docker_tasker, caplog, df_content, req_labels): df = df_parser(str(tmpdir)) df.content = df_content workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = X workflow.builder.df_path = df.dockerfile_path workflow.builder.df_dir = str(tmpdir) runner = PreBuildPluginsRunner( docker_tasker, workflow, [{ 'name': AssertLabelsPlugin.key, 'args': {'required_labels': req_labels} }] ) assert AssertLabelsPlugin.key is not None with pytest.raises(PluginFailedException): runner.run() error_msg = "Dockerfile is missing required labels: {0}".format(req_labels) assert error_msg in caplog.text()
def test_compress(self, tmpdir, method, load_exported_image, extension): if MOCK: mock_docker() tasker = DockerTasker() workflow = DockerBuildWorkflow({ 'provider': 'git', 'uri': 'asd' }, 'test-image') workflow.builder = X() exp_img = os.path.join(str(tmpdir), 'img.tar') if load_exported_image: tarfile.open(exp_img, mode='w').close() workflow.exported_image_sequence.append({'path': exp_img}) runner = PostBuildPluginsRunner( tasker, workflow, [{ 'name': CompressPlugin.key, 'args': { 'method': method, 'load_exported_image': load_exported_image, }, }]) runner.run() compressed_img = os.path.join( workflow.source.tmpdir, EXPORTED_COMPRESSED_IMAGE_NAME_TEMPLATE.format(extension)) assert os.path.exists(compressed_img) assert workflow.exported_image_sequence[-1]['path'] == compressed_img
def test_pull_base_image_plugin(df_base, parent_registry, expected_w_reg, expected_wo_reg): if MOCK: mock_docker(remember_images=True) tasker = DockerTasker() workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = MockBuilder() workflow.builder.base_image = ImageName.parse(df_base) assert not tasker.image_exists(BASE_IMAGE) assert not tasker.image_exists(BASE_IMAGE_W_REGISTRY) runner = PreBuildPluginsRunner(tasker, workflow, [{ 'name': PullBaseImagePlugin.key, 'args': { 'parent_registry': parent_registry, 'parent_registry_insecure': True } }]) runner.run() assert tasker.image_exists(BASE_IMAGE) == expected_wo_reg assert tasker.image_exists(BASE_IMAGE_W_REGISTRY) == expected_w_reg try: tasker.remove_image(BASE_IMAGE) tasker.remove_image(BASE_IMAGE_W_REGISTRY) except: pass
def test_returndockerfile_plugin(tmpdir): df_content = """ FROM fedora RUN yum install -y python-django CMD blabla""" df = DockerfileParser(str(tmpdir)) df.content = df_content tasker = DockerTasker() workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = X workflow.builder.df_path = df.dockerfile_path workflow.builder.df_dir = str(tmpdir) runner = PreBuildPluginsRunner( tasker, workflow, [{ 'name': CpDockerfilePlugin.key }] ) runner.run() assert CpDockerfilePlugin.key is not None assert workflow.prebuild_results.get(CpDockerfilePlugin.key, "") == df_content
def test_distgit_fetch_artefacts_plugin(tmpdir, docker_tasker): command = 'fedpkg sources' expected_command = ['fedpkg', 'sources'] workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = X() workflow.source = flexmock(path=str(tmpdir)) initial_dir = os.getcwd() assert initial_dir != str(tmpdir) def assert_tmpdir(*args, **kwargs): assert os.getcwd() == str(tmpdir) (flexmock(pre_pyrpkg_fetch_artefacts.subprocess) .should_receive('check_call') .with_args(expected_command) .replace_with(assert_tmpdir) .once()) runner = PreBuildPluginsRunner( docker_tasker, workflow, [{ 'name': DistgitFetchArtefactsPlugin.key, 'args': {'command': command} }] ) runner.run() assert os.getcwd() == initial_dir
def workflow(tmpdir): workflow = DockerBuildWorkflow(TEST_IMAGE, source={ "provider": "git", "uri": "asd" }) # Stash the tmpdir in workflow so it can be used later workflow._tmpdir = tmpdir class MockSource(StubSource): def __init__(self, workdir): super(MockSource, self).__init__() self.workdir = workdir workflow.source = MockSource(str(tmpdir)) builder = StubInsideBuilder().for_workflow(workflow) builder.set_df_path(str(tmpdir)) builder.tasker = flexmock() workflow.builder = flexmock(builder) workflow.buildstep_plugins_conf = [{'name': PLUGIN_BUILD_ORCHESTRATE_KEY}] mock_repo_config(workflow) mock_reactor_config(workflow) mock_build_json() mock_cachito_api(workflow) mock_koji() return workflow
def test_adddockerfile_todest(tmpdir, docker_tasker): df_content = """ FROM fedora RUN yum install -y python-django CMD blabla""" df = DockerfileParser(str(tmpdir)) df.content = df_content workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = X workflow.builder.df_path = df.dockerfile_path workflow.builder.df_dir = str(tmpdir) runner = PreBuildPluginsRunner(docker_tasker, workflow, [{ 'name': AddDockerfilePlugin.key, 'args': { 'nvr': 'jboss-eap-6-docker-6.4-77', 'destdir': '/usr/share/doc/' } }]) runner.run() assert AddDockerfilePlugin.key is not None expected_output = """ FROM fedora RUN yum install -y python-django ADD Dockerfile-jboss-eap-6-docker-6.4-77 /usr/share/doc/Dockerfile-jboss-eap-6-docker-6.4-77 CMD blabla""" assert df.content == expected_output
def test_adddockerfile_plugin(tmpdir, docker_tasker): df_content = """ FROM fedora RUN yum install -y python-django CMD blabla""" df = DockerfileParser(str(tmpdir)) df.content = df_content workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = X workflow.builder.df_path = df.dockerfile_path workflow.builder.df_dir = str(tmpdir) runner = PreBuildPluginsRunner(docker_tasker, workflow, [{ 'name': AddDockerfilePlugin.key, 'args': { 'nvr': 'rhel-server-docker-7.1-20' } }]) runner.run() assert AddDockerfilePlugin.key is not None expected_output = """ FROM fedora RUN yum install -y python-django ADD Dockerfile-rhel-server-docker-7.1-20 /root/buildinfo/Dockerfile-rhel-server-docker-7.1-20 CMD blabla""" assert df.content == expected_output
def test_cp_built_image_to_nfs(tmpdir, docker_tasker, dest_dir): mountpoint = tmpdir.join("mountpoint") def fake_check_call(cmd): assert cmd == [ "mount", "-t", "nfs", "-o", "nolock", NFS_SERVER_PATH, mountpoint, ] flexmock(subprocess, check_call=fake_check_call) workflow = DockerBuildWorkflow({"provider": "git", "uri": "asd"}, "test-image") workflow.builder = X() workflow.exported_image_sequence.append({"path": os.path.join(str(tmpdir), EXPORTED_SQUASHED_IMAGE_NAME)}) open(workflow.exported_image_sequence[-1].get("path"), 'a').close() runner = PostBuildPluginsRunner( docker_tasker, workflow, [{ 'name': CopyBuiltImageToNFSPlugin.key, 'args': { "nfs_server_path": NFS_SERVER_PATH, "dest_dir": dest_dir, "mountpoint": str(mountpoint), } }] ) runner.run() if dest_dir is None: assert os.path.isfile(os.path.join(str(mountpoint), EXPORTED_SQUASHED_IMAGE_NAME)) else: assert os.path.isfile(os.path.join(str(mountpoint), dest_dir, EXPORTED_SQUASHED_IMAGE_NAME))
def test_dangling_volumes_removed(docker_tasker, caplog): mock_docker() workflow = DockerBuildWorkflow(TEST_IMAGE, source=SOURCE) workflow.source = StubSource() workflow.builder = StubInsideBuilder().for_workflow(workflow) workflow.builder.set_base_from_scratch(False) runner = PostBuildPluginsRunner(docker_tasker, workflow, [{ "name": PostBuildRPMqaPlugin.key, "args": { 'image_id': TEST_IMAGE } }]) runner.run() logs = {} for record in caplog.records: logs.setdefault(record.levelno, []).append(record.message) assert "container_id = 'f8ee920b2db5e802da2583a13a4edbf0523ca5fff6b6d6454c1fd6db5f38014d'" \ in logs[logging.DEBUG] expected_volumes = [u'test', u'conflict_exception', u'real_exception'] assert "volumes = {}".format(expected_volumes) in logs[logging.DEBUG] for volume in expected_volumes: assert "removing volume '{}'".format(volume) in logs[logging.INFO] assert 'ignoring a conflict when removing volume conflict_exception' in logs[ logging.DEBUG]
def test_rpmqa_plugin(caplog, docker_tasker, base_from_scratch, remove_container_error, ignore_autogenerated): should_raise_error = {} if remove_container_error: should_raise_error['remove_container'] = None mock_docker(should_raise_error=should_raise_error) workflow = DockerBuildWorkflow(TEST_IMAGE, source=SOURCE) workflow.source = StubSource() workflow.builder = StubInsideBuilder().for_workflow(workflow) workflow.builder.set_base_from_scratch(base_from_scratch) flexmock(docker.APIClient, logs=mock_logs) runner = PostBuildPluginsRunner( docker_tasker, workflow, [{ "name": PostBuildRPMqaPlugin.key, "args": { 'image_id': TEST_IMAGE, "ignore_autogenerated_gpg_keys": ignore_autogenerated["ignore"] } }]) results = runner.run() if base_from_scratch: log_msg = "from scratch can't run rpmqa" assert log_msg in caplog.text assert results[PostBuildRPMqaPlugin.key] is None assert workflow.image_components is None else: assert results[ PostBuildRPMqaPlugin.key] == ignore_autogenerated["package_list"] assert workflow.image_components == parse_rpm_output( ignore_autogenerated["package_list"])
def test_compress(self, tmpdir, method, load_exported_image, extension): if MOCK: mock_docker() tasker = DockerTasker() workflow = DockerBuildWorkflow({'provider': 'git', 'uri': 'asd'}, 'test-image') workflow.builder = X() exp_img = os.path.join(str(tmpdir), 'img.tar') if load_exported_image: tarfile.open(exp_img, mode='w').close() workflow.exported_image_sequence.append({'path': exp_img}) runner = PostBuildPluginsRunner( tasker, workflow, [{ 'name': CompressPlugin.key, 'args': { 'method': method, 'load_exported_image': load_exported_image, }, }] ) runner.run() compressed_img = os.path.join( workflow.source.tmpdir, EXPORTED_COMPRESSED_IMAGE_NAME_TEMPLATE.format(extension)) assert os.path.exists(compressed_img) assert workflow.exported_image_sequence[-1]['path'] == compressed_img
def test_adddockerfile_nvr_from_labels(tmpdir, docker_tasker): df_content = """ FROM fedora RUN yum install -y python-django LABEL Name="jboss-eap-6-docker" "Version"="6.4" "Release"=77 CMD blabla""" df = df_parser(str(tmpdir)) df.content = df_content workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = X workflow.builder.df_path = df.dockerfile_path workflow.builder.df_dir = str(tmpdir) runner = PreBuildPluginsRunner( docker_tasker, workflow, [{ 'name': AddDockerfilePlugin.key }] ) runner.run() assert AddDockerfilePlugin.key is not None assert "ADD Dockerfile-jboss-eap-6-docker-6.4-77 /root/buildinfo/Dockerfile-jboss-eap-6-docker-6.4-77" in df.content
def test_adddockerfile_nvr_from_labels2(tmpdir, docker_tasker): df_content = """ FROM fedora RUN yum install -y python-django CMD blabla""" df = df_parser(str(tmpdir)) df.content = df_content if MOCK: mock_docker() workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') flexmock(workflow, base_image_inspect={INSPECT_CONFIG: {"Labels": {}}}) workflow.builder = X workflow.builder.df_path = df.dockerfile_path workflow.builder.df_dir = str(tmpdir) runner = PreBuildPluginsRunner( docker_tasker, workflow, [{ 'name': AddLabelsPlugin.key, 'args': {'labels': {'Name': 'jboss-eap-6-docker', 'Version': '6.4', 'Release': '77'}, 'auto_labels': []} }, { 'name': AddDockerfilePlugin.key }] ) runner.run() assert AddDockerfilePlugin.key is not None assert "ADD Dockerfile-jboss-eap-6-docker-6.4-77 /root/buildinfo/Dockerfile-jboss-eap-6-docker-6.4-77" in df.content
def test_pull_base_image_plugin(df_base, parent_registry, expected_w_reg, expected_wo_reg): if MOCK: mock_docker(remember_images=True) tasker = DockerTasker() workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = MockBuilder() workflow.builder.base_image = ImageName.parse(df_base) assert not tasker.image_exists(BASE_IMAGE) assert not tasker.image_exists(BASE_IMAGE_W_REGISTRY) runner = PreBuildPluginsRunner( tasker, workflow, [{ 'name': PullBaseImagePlugin.key, 'args': {'parent_registry': parent_registry, 'parent_registry_insecure': True} }] ) runner.run() assert tasker.image_exists(BASE_IMAGE) == expected_wo_reg assert tasker.image_exists(BASE_IMAGE_W_REGISTRY) == expected_w_reg try: tasker.remove_image(BASE_IMAGE) tasker.remove_image(BASE_IMAGE_W_REGISTRY) except: pass
def test_adddockerfile_todest(tmpdir, docker_tasker): df_content = """ FROM fedora RUN yum install -y python-django CMD blabla""" df = df_parser(str(tmpdir)) df.content = df_content workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = X workflow.builder.df_path = df.dockerfile_path workflow.builder.df_dir = str(tmpdir) runner = PreBuildPluginsRunner( docker_tasker, workflow, [{ 'name': AddDockerfilePlugin.key, 'args': {'nvr': 'jboss-eap-6-docker-6.4-77', 'destdir': '/usr/share/doc/'} }] ) runner.run() assert AddDockerfilePlugin.key is not None expected_output = """ FROM fedora RUN yum install -y python-django ADD Dockerfile-jboss-eap-6-docker-6.4-77 /usr/share/doc/Dockerfile-jboss-eap-6-docker-6.4-77 CMD blabla""" assert df.content == expected_output
def test_adddockerfile_plugin(tmpdir, docker_tasker): df_content = """ FROM fedora RUN yum install -y python-django CMD blabla""" df = df_parser(str(tmpdir)) df.content = df_content workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = X workflow.builder.df_path = df.dockerfile_path workflow.builder.df_dir = str(tmpdir) runner = PreBuildPluginsRunner( docker_tasker, workflow, [{ 'name': AddDockerfilePlugin.key, 'args': {'nvr': 'rhel-server-docker-7.1-20'} }] ) runner.run() assert AddDockerfilePlugin.key is not None expected_output = """ FROM fedora RUN yum install -y python-django ADD Dockerfile-rhel-server-docker-7.1-20 /root/buildinfo/Dockerfile-rhel-server-docker-7.1-20 CMD blabla""" assert df.content == expected_output
def test_adddockerfile_nvr_from_labels2(tmpdir, docker_tasker): # noqa df_content = """ FROM fedora RUN yum install -y python-django CMD blabla""" df = df_parser(str(tmpdir)) df.content = df_content if MOCK: mock_docker() workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') flexmock(workflow, base_image_inspect={INSPECT_CONFIG: {"Labels": {}}}) workflow.builder = X workflow.builder.df_path = df.dockerfile_path workflow.builder.df_dir = str(tmpdir) runner = PreBuildPluginsRunner(docker_tasker, workflow, [{ 'name': AddLabelsPlugin.key, 'args': { 'labels': { 'Name': 'jboss-eap-6-docker', 'Version': '6.4', 'Release': '77' }, 'auto_labels': [] } }, { 'name': AddDockerfilePlugin.key }]) runner.run() assert AddDockerfilePlugin.key is not None assert "ADD Dockerfile-jboss-eap-6-docker-6.4-77 /root/buildinfo/Dockerfile-jboss-eap-6-docker-6.4-77" in df.content # noqa
def mock_workflow(tmpdir, for_orchestrator=False, config_map=None, default_si=DEFAULT_SIGNING_INTENT): workflow = DockerBuildWorkflow(TEST_IMAGE, source={ "provider": "git", "uri": "asd" }) workflow.source = MockSource(str(tmpdir)) builder = StubInsideBuilder().for_workflow(workflow) builder.set_df_path(str(tmpdir)) builder.tasker = flexmock() workflow.builder = flexmock(builder) if for_orchestrator: workflow.buildstep_plugins_conf = [{ 'name': constants.PLUGIN_BUILD_ORCHESTRATE_KEY }] mock_reactor_config(workflow, tmpdir, data=config_map, default_si=default_si) return workflow
def test_adddockerfile_nvr_from_labels2(tmpdir, docker_tasker, add_labels, aliases): df_content = """ FROM fedora RUN yum install -y python-django CMD blabla""" df = DockerfileParser(str(tmpdir)) df.content = df_content if MOCK: mock_docker() workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') flexmock(workflow, base_image_inspect={"Config": {"Labels": {}}}) workflow.builder = X workflow.builder.df_path = df.dockerfile_path workflow.builder.df_dir = str(tmpdir) runner = PreBuildPluginsRunner(docker_tasker, workflow, [{ 'name': AddLabelsPlugin.key, 'args': { 'labels': add_labels, 'auto_labels': [], 'aliases': aliases } }, { 'name': AddDockerfilePlugin.key }]) runner.run() assert AddDockerfilePlugin.key is not None assert "ADD Dockerfile-jboss-eap-6-docker-6.4-77 /root/buildinfo/Dockerfile-jboss-eap-6-docker-6.4-77" in df.content
def test_distgit_fetch_artefacts_failure(tmpdir, docker_tasker): command = 'fedpkg sources' expected_command = ['fedpkg', 'sources'] workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = X() workflow.source = flexmock(path=str(tmpdir)) initial_dir = os.getcwd() assert initial_dir != str(tmpdir) (flexmock(pre_pyrpkg_fetch_artefacts.subprocess) .should_receive('check_call') .with_args(expected_command) .and_raise(RuntimeError) .once()) runner = PreBuildPluginsRunner( docker_tasker, workflow, [{ 'name': DistgitFetchArtefactsPlugin.key, 'args': {'command': command} }] ) with pytest.raises(PluginFailedException) as exc: runner.run() assert os.getcwd() == initial_dir
def test_distgit_fetch_artefacts_failure(tmpdir, docker_tasker): # noqa command = 'fedpkg sources' expected_command = ['fedpkg', 'sources'] workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = X() workflow.source = flexmock(path=str(tmpdir)) initial_dir = os.getcwd() assert initial_dir != str(tmpdir) (flexmock(pre_pyrpkg_fetch_artefacts.subprocess) .should_receive('check_call') .with_args(expected_command) .and_raise(RuntimeError) .once()) runner = PreBuildPluginsRunner( docker_tasker, workflow, [{ 'name': DistgitFetchArtefactsPlugin.key, 'args': {'command': command} }] ) with pytest.raises(PluginFailedException): runner.run() assert os.getcwd() == initial_dir
def test_compress(self, tmpdir, caplog, source_build, method, load_exported_image, give_export, extension): if MOCK: mock_docker() tasker = DockerTasker() workflow = DockerBuildWorkflow('test-image', source={ 'provider': 'git', 'uri': 'asd' }) workflow.builder = X() exp_img = os.path.join(str(tmpdir), 'img.tar') if source_build: workflow.build_result = BuildResult(oci_image_path="oci_path") else: workflow.build_result = BuildResult(image_id="12345") if load_exported_image and give_export: tarfile.open(exp_img, mode='w').close() workflow.exported_image_sequence.append({ 'path': exp_img, 'type': IMAGE_TYPE_DOCKER_ARCHIVE }) tasker = None # image provided, should not query docker runner = PostBuildPluginsRunner( tasker, workflow, [{ 'name': CompressPlugin.key, 'args': { 'method': method, 'load_exported_image': load_exported_image, }, }]) if not extension: with pytest.raises(Exception) as excinfo: runner.run() assert 'Unsupported compression format' in str(excinfo.value) return runner.run() if source_build and not (give_export and load_exported_image): assert 'skipping, no exported source image to compress' in caplog.text else: compressed_img = os.path.join( workflow.source.tmpdir, EXPORTED_COMPRESSED_IMAGE_NAME_TEMPLATE.format(extension)) assert os.path.exists(compressed_img) metadata = workflow.exported_image_sequence[-1] assert metadata['path'] == compressed_img assert metadata['type'] == IMAGE_TYPE_DOCKER_ARCHIVE assert 'uncompressed_size' in metadata assert isinstance(metadata['uncompressed_size'], integer_types) assert ", ratio: " in caplog.text
def workflow(): if MOCK: mock_docker() workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = MockInsideBuilder() setattr(workflow.builder, 'base_image_inspect', {}) return workflow
def workflow(): if MOCK: mock_docker() workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = MockInsideBuilder() setattr(workflow.builder, 'base_image_inspect', {}) return workflow
def mock_workflow(tmpdir): workflow = DockerBuildWorkflow({"provider": "git", "uri": "asd"}, TEST_IMAGE) workflow.source = StubSource() builder = StubInsideBuilder().for_workflow(workflow) builder.set_df_path(str(tmpdir)) builder.tasker = flexmock() workflow.builder = flexmock(builder) return workflow
def workflow(): if MOCK: mock_docker() workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = MockInsideBuilder() base_inspect = {INSPECT_CONFIG: {'Labels': BASE_IMAGE_LABELS.copy()}} flexmock(workflow.builder, base_image_inspect=base_inspect) return workflow
def workflow(): if MOCK: mock_docker() workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = MockInsideBuilder() flexmock(workflow, base_image_inspect={}) return workflow
def workflow(): if MOCK: mock_docker() workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = MockInsideBuilder() flexmock(workflow, base_image_inspect={}) return workflow
def workflow(): if MOCK: mock_docker() workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = MockInsideBuilder() base_inspect = {INSPECT_CONFIG: {'Labels': BASE_IMAGE_LABELS.copy()}} flexmock(workflow.builder, base_image_inspect=base_inspect) return workflow
def prepare(df_path): if MOCK: mock_docker() tasker = DockerTasker() workflow = DockerBuildWorkflow("test-image", source=SOURCE) workflow.source = StubSource() workflow.builder = ( StubInsideBuilder().for_workflow(workflow).set_df_path(df_path)) return tasker, workflow
def test_try_with_library_pull_base_image(library, reactor_config_map): if MOCK: mock_docker(remember_images=True) tasker = DockerTasker(retry_times=0) workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = MockBuilder() if library: base_image = 'library/parent-image' else: base_image = 'parent-image' workflow.builder.base_image = ImageName.parse(base_image) workflow.builder.parent_images = {base_image: None} class MockResponse(object): content = '' cr = CommandResult() cr._error = "cmd_error" cr._error_detail = {"message": "error_detail"} if library: call_wait = 1 else: call_wait = 2 (flexmock(atomic_reactor.util).should_receive('wait_for_command').times( call_wait).and_return(cr)) error_message = 'registry.example.com/' + base_image if reactor_config_map: workflow.plugin_workspace[ReactorConfigPlugin.key] = {} workflow.plugin_workspace[ReactorConfigPlugin.key][WORKSPACE_CONF_KEY] =\ ReactorConfig({'version': 1, 'source_registry': {'url': 'registry.example.com', 'insecure': True}}) runner = PreBuildPluginsRunner( tasker, workflow, [{ 'name': PullBaseImagePlugin.key, 'args': { 'parent_registry': 'registry.example.com', 'parent_registry_insecure': True }, }], ) with pytest.raises(PluginFailedException) as exc: runner.run() assert error_message in exc.value.args[0]
def test_try_with_library_pull_base_image(library, reactor_config_map): if MOCK: mock_docker(remember_images=True) tasker = DockerTasker(retry_times=0) workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = MockBuilder() if library: base_image = 'library/parent-image' else: base_image = 'parent-image' workflow.builder.base_image = ImageName.parse(base_image) workflow.builder.parent_images = {ImageName.parse(base_image): None} class MockResponse(object): content = '' cr = CommandResult() cr._error = "cmd_error" cr._error_detail = {"message": "error_detail"} if library: call_wait = 1 else: call_wait = 2 (flexmock(atomic_reactor.util) .should_receive('wait_for_command') .times(call_wait) .and_return(cr)) error_message = 'registry.example.com/' + base_image if reactor_config_map: workflow.plugin_workspace[ReactorConfigPlugin.key] = {} workflow.plugin_workspace[ReactorConfigPlugin.key][WORKSPACE_CONF_KEY] =\ ReactorConfig({'version': 1, 'source_registry': {'url': 'registry.example.com', 'insecure': True}}) runner = PreBuildPluginsRunner( tasker, workflow, [{ 'name': PullBaseImagePlugin.key, 'args': {'parent_registry': 'registry.example.com', 'parent_registry_insecure': True}, }], ) with pytest.raises(PluginFailedException) as exc: runner.run() assert error_message in exc.value.args[0]
def test_add_help_generate_metadata(tmpdir, docker_tasker, filename): df_content = dedent("""\ FROM fedora LABEL name='test' \\ maintainer='me' """) df = df_parser(str(tmpdir)) df.content = df_content workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = X workflow.builder.df_path = df.dockerfile_path workflow.builder.df_dir = str(tmpdir) help_markdown_path = os.path.join(workflow.builder.df_dir, filename) generate_a_file(help_markdown_path, "foo") help_man_path = os.path.join(workflow.builder.df_dir, AddHelpPlugin.man_filename) generate_a_file(help_man_path, "bar") cmd = [ 'go-md2man', '-in={}'.format(help_markdown_path), '-out={}'.format(help_man_path) ] def check_popen(*args, **kwargs): assert args[0] == cmd return MockedPopen() (flexmock(subprocess).should_receive("Popen").once().replace_with( check_popen)) runner = PreBuildPluginsRunner(docker_tasker, workflow, [{ 'name': AddHelpPlugin.key, 'args': { 'help_file': filename } }]) runner.run() lines = "" with open(help_markdown_path) as f: lines = "".join(f.readlines()) example = dedent("""\ %% test (1) Container Image Pages %% me %% %s foo""") % dt.fromtimestamp(atomic_reactor_start_time).strftime( format="%B %-d, %Y") assert lines == dedent(example)
def test_add_help_generate_metadata(tmpdir, docker_tasker, filename): df_content = dedent("""\ FROM fedora LABEL name='test' \\ maintainer='me' """) df = df_parser(str(tmpdir)) df.content = df_content workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = X workflow.builder.df_path = df.dockerfile_path workflow.builder.df_dir = str(tmpdir) help_markdown_path = os.path.join(workflow.builder.df_dir, filename) generate_a_file(help_markdown_path, "foo") help_man_path = os.path.join(workflow.builder.df_dir, AddHelpPlugin.man_filename) generate_a_file(help_man_path, "bar") cmd = ['go-md2man', '-in={}'.format(help_markdown_path), '-out={}'.format(help_man_path)] def check_popen(*args, **kwargs): assert args[0] == cmd return MockedPopen() (flexmock(subprocess) .should_receive("Popen") .once() .replace_with(check_popen)) runner = PreBuildPluginsRunner( docker_tasker, workflow, [{ 'name': AddHelpPlugin.key, 'args': {'help_file': filename} }] ) runner.run() lines = "" with open(help_markdown_path) as f: lines = "".join(f.readlines()) example = dedent("""\ %% test (1) Container Image Pages %% me %% %s foo""") % dt.fromtimestamp(atomic_reactor_start_time).strftime(format="%B %-d, %Y") assert lines == dedent(example)
def workflow(tmpdir): if MOCK: mock_docker() workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = MockInsideBuilder(tmpdir) workflow.source = workflow.builder.source workflow._tmpdir = tmpdir flexmock(workflow, base_image_inspect={}) mock_reactor_config(tmpdir) mock_repo_config(tmpdir) mock_odcs_request() workflow._koji_session = mock_koji_session() return workflow
def prepare(): if MOCK: mock_docker() tasker = DockerTasker() workflow = DockerBuildWorkflow(SOURCE, "test-image") workflow.source = StubSource() workflow.builder = StubInsideBuilder().for_workflow(workflow) session = MockedClientSession(hub='', opts=None) workflow.koji_session = session flexmock(koji, ClientSession=session, PathInfo=MockedPathInfo) return tasker, workflow
def prepare(self, tmpdir, key, value, update_labels_args=None, update_labels_kwargs=None, reactor_config_map=False, base_from_scratch=False, custom_base=False): if MOCK: mock_docker() tasker = DockerTasker() workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = MockInsideBuilder(tmpdir) workflow.builder.base_from_scratch = base_from_scratch workflow.builder.custom_base_image = custom_base workflow.source = workflow.builder.source setattr(workflow.builder, 'base_image_inspect', {}) expectation = (flexmock(OSBS) .should_receive('update_labels_on_build_config')) if update_labels_args is not None: if update_labels_kwargs is None: update_labels_kwargs = {} expectation.with_args(*update_labels_args) namespace = None if update_labels_kwargs is not None: namespace = update_labels_kwargs.get('namespace') (flexmock(osbs.conf).should_call('Configuration') .with_args(namespace=namespace, conf_file=None, verify_ssl=True, openshift_url="", use_auth=True, build_json_dir=None)) if reactor_config_map: workflow.plugin_workspace[ReactorConfigPlugin.key] = {} workflow.plugin_workspace[ReactorConfigPlugin.key][WORKSPACE_CONF_KEY] =\ ReactorConfig({'version': 1, 'openshift': { 'url': '', 'insecure': False, 'auth': {'enable': True}}}) runner = PreBuildPluginsRunner(tasker, workflow, [ { 'name': CheckAndSetRebuildPlugin.key, 'args': { 'label_key': key, 'label_value': value, 'url': '', }, } ]) return workflow, runner
def prepare(testfile="test-image", check_repo_retval=0): if MOCK: mock_docker() tasker = DockerTasker() workflow = DockerBuildWorkflow(SOURCE, testfile) workflow.source = StubSource() workflow.builder = StubInsideBuilder() workflow.tag_conf = StubTagConf().set_images([ ImageName(repo="image-name1"), ImageName(namespace="prefix", repo="image-name2"), ImageName(repo="image-name3", tag="asd"), ]) # Mock dockpulp and docker dockpulp.Pulp = flexmock(dockpulp.Pulp) dockpulp.Pulp.registry = 'registry.example.com' (flexmock(dockpulp.imgutils).should_receive('get_metadata') .with_args(object) .and_return([{'id': 'foo'}])) (flexmock(dockpulp.imgutils).should_receive('get_manifest') .with_args(object) .and_return([{'id': 'foo'}])) (flexmock(dockpulp.imgutils).should_receive('get_versions') .with_args(object) .and_return({'id': '1.6.0'})) (flexmock(dockpulp.imgutils).should_receive('check_repo') .and_return(check_repo_retval)) (flexmock(dockpulp.Pulp) .should_receive('set_certs') .with_args(object, object)) (flexmock(dockpulp.Pulp) .should_receive('login') .with_args(object, object)) (flexmock(dockpulp.Pulp) .should_receive('getRepos') .with_args(list, fields=list, distributors=True) .and_return([ {"id": "redhat-image-name1"}, {"id": "redhat-prefix-image-name2"} ])) (flexmock(dockpulp.Pulp) .should_receive('createRepo')) mock_docker() return tasker, workflow
def test_compress(self, tmpdir, caplog, method, load_exported_image, give_export, extension): if MOCK: mock_docker() tasker = DockerTasker() workflow = DockerBuildWorkflow({'provider': 'git', 'uri': 'asd'}, 'test-image') workflow.builder = X() exp_img = os.path.join(str(tmpdir), 'img.tar') if load_exported_image and give_export: tarfile.open(exp_img, mode='w').close() workflow.exported_image_sequence.append({'path': exp_img, 'type': IMAGE_TYPE_DOCKER_ARCHIVE}) tasker = None # image provided, should not query docker runner = PostBuildPluginsRunner( tasker, workflow, [{ 'name': CompressPlugin.key, 'args': { 'method': method, 'load_exported_image': load_exported_image, }, }] ) if not extension: with pytest.raises(Exception) as excinfo: runner.run() assert 'Unsupported compression format' in str(excinfo.value) return runner.run() compressed_img = os.path.join( workflow.source.tmpdir, EXPORTED_COMPRESSED_IMAGE_NAME_TEMPLATE.format(extension)) assert os.path.exists(compressed_img) metadata = workflow.exported_image_sequence[-1] assert metadata['path'] == compressed_img assert metadata['type'] == IMAGE_TYPE_DOCKER_ARCHIVE assert 'uncompressed_size' in metadata assert isinstance(metadata['uncompressed_size'], integer_types) assert ", ratio: " in caplog.text
def mock_workflow(): """ Provide just enough structure that workflow can be used to run the plugin. Defaults below are solely to enable that purpose; tests where those values matter should provide their own. """ workflow = DockerBuildWorkflow(SOURCE, "mock:default_built") workflow.source = StubSource() builder = StubInsideBuilder().for_workflow(workflow) builder.set_df_path('/mock-path') base_image_name = ImageName.parse("mock:tag") builder.parent_images[ImageName.parse("mock:base")] = base_image_name builder.base_image = base_image_name builder.tasker = flexmock() workflow.builder = flexmock(builder) return workflow
def test_add_help_plugin(tmpdir, docker_tasker, filename): df_content = dedent(""" FROM fedora RUN yum install -y python-django CMD blabla""") df = df_parser(str(tmpdir)) df.content = df_content workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = X workflow.builder.df_path = df.dockerfile_path workflow.builder.df_dir = str(tmpdir) help_markdown_path = os.path.join(workflow.builder.df_dir, filename) generate_a_file(help_markdown_path, "foo") help_man_path = os.path.join(workflow.builder.df_dir, AddHelpPlugin.man_filename) generate_a_file(help_man_path, "bar") cmd = ['go-md2man', '-in={}'.format(help_markdown_path), '-out={}'.format(help_man_path)] def check_popen(*args, **kwargs): assert args[0] == cmd return MockedPopen() (flexmock(subprocess) .should_receive("Popen") .once() .replace_with(check_popen)) runner = PreBuildPluginsRunner( docker_tasker, workflow, [{ 'name': AddHelpPlugin.key, 'args': {'help_file': filename} }] ) runner.run() assert df.content == dedent(""" FROM fedora RUN yum install -y python-django ADD %s /%s CMD blabla""" % (AddHelpPlugin.man_filename, AddHelpPlugin.man_filename))
def test_pull_base_image_plugin(parent_registry, df_base, expected, not_expected): if MOCK: mock_docker(remember_images=True) tasker = DockerTasker(retry_times=0) workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = MockBuilder() workflow.builder.base_image = ImageName.parse(df_base) expected = set(expected) expected.add(UNIQUE_ID) expected.add(df_base) all_images = set(expected).union(not_expected) for image in all_images: assert not tasker.image_exists(image) runner = PreBuildPluginsRunner( tasker, workflow, [{ 'name': PullBaseImagePlugin.key, 'args': {'parent_registry': parent_registry, 'parent_registry_insecure': True} }] ) runner.run() for image in expected: assert tasker.image_exists(image) assert image in workflow.pulled_base_images for image in not_expected: assert not tasker.image_exists(image) for image in workflow.pulled_base_images: assert tasker.image_exists(image) for image in all_images: try: tasker.remove_image(image) except: pass assert workflow.builder.base_image == df_base
def prepare(df_path, inherited_user=''): if MOCK: mock_docker() tasker = DockerTasker() workflow = DockerBuildWorkflow(SOURCE, "test-image") workflow.source = StubSource() workflow.builder = (StubInsideBuilder() .for_workflow(workflow) .set_df_path(df_path) .set_inspection_data({ INSPECT_CONFIG: { 'User': inherited_user, }, })) (flexmock(requests.Response, content=repocontent) .should_receive('raise_for_status') .and_return(None)) (flexmock(requests.Session, get=lambda *_: requests.Response())) return tasker, workflow
def test_retry_pull_base_image(exc, failures, should_succeed, reactor_config_map): if MOCK: mock_docker(remember_images=True) tasker = DockerTasker() workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = MockBuilder() workflow.builder.base_image = ImageName.parse('parent-image') class MockResponse(object): content = '' expectation = flexmock(tasker).should_receive('tag_image') for _ in range(failures): expectation = expectation.and_raise(exc('', MockResponse())) expectation.and_return('foo') if reactor_config_map: workflow.plugin_workspace[ReactorConfigPlugin.key] = {} workflow.plugin_workspace[ReactorConfigPlugin.key][WORKSPACE_CONF_KEY] =\ ReactorConfig({'version': 1, 'source_registry': {'url': 'registry.example.com', 'insecure': True}}) runner = PreBuildPluginsRunner( tasker, workflow, [{ 'name': PullBaseImagePlugin.key, 'args': {'parent_registry': 'registry.example.com', 'parent_registry_insecure': True}, }], ) if should_succeed: runner.run() else: with pytest.raises(Exception): runner.run()
def test_adddockerfile_fails(tmpdir, docker_tasker, caplog): df_content = """ FROM fedora RUN yum install -y python-django CMD blabla""" df = df_parser(str(tmpdir)) df.content = df_content workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') workflow.builder = X workflow.builder.df_path = df.dockerfile_path workflow.builder.df_dir = str(tmpdir) runner = PreBuildPluginsRunner( docker_tasker, workflow, [{ 'name': AddDockerfilePlugin.key }] ) runner.run() assert "plugin 'add_dockerfile' raised an exception: ValueError" in caplog.text()