def mock_environment(tmpdir, session=None, build_process_failed=False, koji_build_id=None, use_import=False): if session is None: session = MockedClientSession('') if MOCK: mock_docker() tasker = DockerTasker() workflow = DockerBuildWorkflow(SOURCE, 'test-image') setattr(workflow, 'builder', X()) setattr(workflow.builder, 'image_id', '123456imageid') setattr(workflow.builder, 'base_image', ImageName(repo='Fedora', tag='22')) setattr(workflow.builder, 'source', X()) setattr(workflow.builder.source, 'dockerfile_path', None) setattr(workflow.builder.source, 'path', None) flexmock(koji, ClientSession=lambda hub, opts: session) if build_process_failed: workflow.build_result = BuildResult(fail_reason="not built") else: workflow.build_result = BuildResult(image_id="id1234") if koji_build_id: if use_import: workflow.exit_results[KojiImportPlugin.key] = koji_build_id else: workflow.exit_results[KojiPromotePlugin.key] = koji_build_id (flexmock(time) .should_receive('sleep') .and_return(None)) return tasker, workflow
def mock_environment(tmpdir, session=None, build_process_failed=False, koji_build_id=None, use_import=False): if session is None: session = MockedClientSession('') if MOCK: mock_docker() tasker = DockerTasker() workflow = DockerBuildWorkflow(SOURCE, 'test-image') setattr(workflow, 'builder', X()) setattr(workflow.builder, 'image_id', '123456imageid') setattr(workflow.builder, 'base_image', ImageName(repo='Fedora', tag='22')) setattr(workflow.builder, 'source', X()) setattr(workflow.builder.source, 'dockerfile_path', None) setattr(workflow.builder.source, 'path', None) flexmock(koji, ClientSession=lambda hub, opts: session) if build_process_failed: workflow.build_result = BuildResult(fail_reason="not built") else: workflow.build_result = BuildResult(image_id="id1234") if koji_build_id: if use_import: workflow.exit_results[KojiImportPlugin.key] = koji_build_id else: workflow.exit_results[KojiPromotePlugin.key] = koji_build_id (flexmock(time).should_receive('sleep').and_return(None)) return tasker, workflow
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 test_get_primary_images(tag_conf, tag_annotation, expected): template_image = ImageName.parse('registry.example.com/fedora') workflow = DockerBuildWorkflow(MOCK_SOURCE, 'test-image') for tag in tag_conf: image_name = ImageName.parse(str(template_image)) image_name.tag = tag workflow.tag_conf.add_primary_image(str(image_name)) annotations = {} for tag in tag_annotation: annotations.setdefault('repositories', {}).setdefault('primary', []) image_name = ImageName.parse(str(template_image)) image_name.tag = tag annotations['repositories']['primary'].append(str(image_name)) build_result = BuildResult(annotations=annotations, image_id='foo') workflow.build_result = build_result actual = get_primary_images(workflow) assert len(actual) == len(expected) for index, primary_image in enumerate(actual): assert primary_image.registry == template_image.registry assert primary_image.namespace == template_image.namespace assert primary_image.repo == template_image.repo assert primary_image.tag == expected[index]
def mock_environment(tmpdir, primary_images=None, annotations={}): if MOCK: mock_docker() tasker = DockerTasker() workflow = DockerBuildWorkflow(SOURCE, "test-image") base_image_id = '123456parent-id' setattr(workflow, '_base_image_inspect', {'Id': base_image_id}) setattr(workflow, 'builder', X()) setattr(workflow.builder, 'image_id', '123456imageid') setattr(workflow.builder, 'base_image', ImageName(repo='Fedora', tag='22')) setattr(workflow.builder, 'source', X()) setattr(workflow.builder, 'built_image_info', {'ParentId': base_image_id}) setattr(workflow.builder.source, 'dockerfile_path', None) setattr(workflow.builder.source, 'path', None) setattr(workflow, 'tag_conf', TagConf()) if primary_images: for image in primary_images: if '-' in ImageName.parse(image).tag: workflow.tag_conf.add_primary_image(image) workflow.tag_conf.add_unique_image(primary_images[0]) workflow.build_result = BuildResult(image_id='123456', annotations=annotations) return tasker, workflow
def mock_environment(tmpdir, primary_images=None, worker_annotations={}): if MOCK: mock_docker() tasker = DockerTasker() workflow = DockerBuildWorkflow(SOURCE, "test-image") base_image_id = '123456parent-id' setattr(workflow, '_base_image_inspect', {'Id': base_image_id}) setattr(workflow, 'builder', X()) setattr(workflow.builder, 'image_id', '123456imageid') setattr(workflow.builder, 'base_image', ImageName(repo='Fedora', tag='22')) setattr(workflow.builder, 'source', X()) setattr(workflow.builder, 'built_image_info', {'ParentId': base_image_id}) setattr(workflow.builder.source, 'dockerfile_path', None) setattr(workflow.builder.source, 'path', None) setattr(workflow, 'tag_conf', TagConf()) if primary_images: workflow.tag_conf.add_primary_images(primary_images) workflow.tag_conf.add_unique_image(primary_images[0]) annotations = deepcopy(BUILD_ANNOTATIONS) if not worker_annotations: worker_annotations = {'ppc64le': PPC_ANNOTATIONS} for worker in worker_annotations: annotations['worker-builds'][worker] = deepcopy( worker_annotations[worker]) workflow.build_result = BuildResult(image_id='123456', annotations=annotations) return tasker, workflow
def mock_environment(tmpdir, primary_images=None, annotations=None): if MOCK: mock_docker() tasker = DockerTasker() workflow = DockerBuildWorkflow(source=SOURCE) base_image_id = '123456parent-id' setattr(workflow, '_base_image_inspect', {'Id': base_image_id}) setattr(workflow, 'builder', StubInsideBuilder()) setattr(workflow.builder, 'image_id', '123456imageid') setattr(workflow.builder, 'base_image', ImageName(repo='Fedora', tag='22')) setattr(workflow.builder, 'source', StubInsideBuilder()) setattr(workflow.builder, 'built_image_info', {'ParentId': base_image_id}) setattr(workflow.builder.source, 'dockerfile_path', None) setattr(workflow.builder.source, 'path', None) setattr(workflow, 'tag_conf', TagConf()) if primary_images: for image in primary_images: if '-' in ImageName.parse(image).tag: workflow.tag_conf.add_primary_image(image) workflow.tag_conf.add_unique_image(primary_images[0]) workflow.tag_conf.add_floating_image('namespace/httpd:floating') workflow.build_result = BuildResult(image_id='123456', annotations=annotations or {}) return tasker, workflow
def prepare(success=True, v1_image_ids={}): if MOCK: mock_docker() tasker = DockerTasker() workflow = DockerBuildWorkflow(SOURCE, "test-image") setattr(workflow, 'builder', X()) setattr(workflow.builder, 'source', X()) setattr(workflow.builder.source, 'dockerfile_path', None) setattr(workflow.builder.source, 'path', None) setattr(workflow, 'tag_conf', X()) setattr(workflow.tag_conf, 'images', [ImageName(repo="image-name1"), ImageName(repo="image-name1", tag="2"), ImageName(namespace="namespace", 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('check_repo') .and_return(0)) (flexmock(dockpulp.Pulp) .should_receive('set_certs') .with_args(object, object)) (flexmock(dockpulp.Pulp) .should_receive('getRepos') .with_args(list, fields=list) .and_return([ {"id": "redhat-image-name1"}, {"id": "redhat-namespace-image-name2"} ])) (flexmock(dockpulp.Pulp) .should_receive('createRepo')) (flexmock(dockpulp.Pulp) .should_receive('copy') .with_args(unicode, unicode)) (flexmock(dockpulp.Pulp) .should_receive('updateRepo') .with_args(unicode, dict)) (flexmock(dockpulp.Pulp) .should_receive('') .with_args(object, object) .and_return([1, 2, 3])) annotations = { 'worker-builds': { 'x86_64': { 'build': { 'build-name': 'build-1-x64_64', }, 'metadata_fragment': 'configmap/build-1-x86_64-md', 'metadata_fragment_key': 'metadata.json', }, 'ppc64le': { 'build': { 'build-name': 'build-1-ppc64le', }, 'metadata_fragment': 'configmap/build-1-ppc64le-md', 'metadata_fragment_key': 'metadata.json', } } } if success: workflow.build_result = BuildResult(image_id='12345') else: workflow.build_result = BuildResult(fail_reason="not built", annotations=annotations) build_info = {} build_info['x86_64'] = BuildInfo() build_info['ppc64le'] = BuildInfo() for platform, v1_image_id in v1_image_ids.items(): build_info[platform] = BuildInfo(v1_image_id) workflow.plugin_workspace = { OrchestrateBuildPlugin.key: { WORKSPACE_KEY_BUILD_INFO: build_info } } mock_docker() return tasker, workflow
def prepare(success=True, v1_image_ids={}): if MOCK: mock_docker() tasker = DockerTasker() workflow = DockerBuildWorkflow(SOURCE, "test-image") setattr(workflow, 'builder', X()) setattr(workflow.builder, 'source', X()) setattr(workflow.builder.source, 'dockerfile_path', None) setattr(workflow.builder.source, 'path', None) setattr(workflow, 'tag_conf', X()) setattr(workflow.tag_conf, 'images', [ ImageName(repo="image-name1"), ImageName(repo="image-name1", tag="2"), ImageName(namespace="namespace", 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('check_repo').and_return(0)) (flexmock(dockpulp.Pulp).should_receive('set_certs').with_args( object, object)) (flexmock(dockpulp.Pulp).should_receive('getRepos').with_args( list, fields=list).and_return([{ "id": "redhat-image-name1" }, { "id": "redhat-namespace-image-name2" }])) (flexmock(dockpulp.Pulp).should_receive('createRepo')) (flexmock(dockpulp.Pulp).should_receive('copy').with_args( unicode, unicode)) (flexmock(dockpulp.Pulp).should_receive('updateRepo').with_args( unicode, dict)) (flexmock(dockpulp.Pulp).should_receive('').with_args( object, object).and_return([1, 2, 3])) annotations = { 'worker-builds': { 'x86_64': { 'build': { 'build-name': 'build-1-x64_64', }, 'metadata_fragment': 'configmap/build-1-x86_64-md', 'metadata_fragment_key': 'metadata.json', }, 'ppc64le': { 'build': { 'build-name': 'build-1-ppc64le', }, 'metadata_fragment': 'configmap/build-1-ppc64le-md', 'metadata_fragment_key': 'metadata.json', }, 'bogus': {}, }, } if success: workflow.build_result = BuildResult(image_id='12345') else: workflow.build_result = BuildResult(fail_reason="not built", annotations=annotations) build_info = {} build_info['x86_64'] = BuildInfo() build_info['ppc64le'] = BuildInfo() build_info['bogus'] = BuildInfo(unset_annotations=True) # OSBS-5262 for platform, v1_image_id in v1_image_ids.items(): build_info[platform] = BuildInfo(v1_image_id) workflow.plugin_workspace = { OrchestrateBuildPlugin.key: { WORKSPACE_KEY_BUILD_INFO: build_info } } mock_docker() return tasker, workflow
def mock_environment(tmpdir, session=None, name=None, component=None, version=None, release=None, source=None, build_process_failed=False, docker_registry=True, pulp_registries=0, blocksize=None, task_states=None, additional_tags=None, has_config=None, prefer_schema1_digest=True): if session is None: session = MockedClientSession('', task_states=None) if source is None: source = GitSource('git', 'git://hostname/path') if MOCK: mock_docker() tasker = DockerTasker() workflow = DockerBuildWorkflow(SOURCE, "test-image") base_image_id = '123456parent-id' workflow.source = StubSource() workflow.builder = StubInsideBuilder().for_workflow(workflow) workflow.builder.image_id = '123456imageid' workflow.builder.set_inspection_data({'Id': base_image_id}) setattr(workflow, 'tag_conf', TagConf()) with open(os.path.join(str(tmpdir), 'Dockerfile'), 'wt') as df: df.write( 'FROM base\n' 'LABEL BZComponent={component} com.redhat.component={component}\n' 'LABEL Version={version} version={version}\n' 'LABEL Release={release} release={release}\n'.format( component=component, version=version, release=release)) workflow.builder.set_df_path(df.name) if name and version: workflow.tag_conf.add_unique_image( 'user/test-image:{v}-timestamp'.format(v=version)) if name and version and release: workflow.tag_conf.add_primary_images([ "{0}:{1}-{2}".format(name, version, release), "{0}:{1}".format(name, version), "{0}:latest".format(name) ]) if additional_tags: workflow.tag_conf.add_primary_images( ["{0}:{1}".format(name, tag) for tag in additional_tags]) flexmock(subprocess, Popen=fake_Popen) flexmock(koji, ClientSession=lambda hub, opts: session) flexmock(GitSource) setattr(workflow, 'source', source) setattr(workflow.source, 'lg', X()) setattr(workflow.source.lg, 'commit_id', '123456') setattr(workflow, 'push_conf', PushConf()) if docker_registry: docker_reg = workflow.push_conf.add_docker_registry( 'docker.example.com') for image in workflow.tag_conf.images: tag = image.to_str(registry=False) if pulp_registries and prefer_schema1_digest: docker_reg.digests[tag] = ManifestDigest(v1=fake_digest(image), v2='sha256:not-used') else: docker_reg.digests[tag] = ManifestDigest(v1='sha256:not-used', v2=fake_digest(image)) if has_config: docker_reg.config = { 'config': { 'architecture': LOCAL_ARCH }, 'container_config': {} } for pulp_registry in range(pulp_registries): workflow.push_conf.add_pulp_registry('env', 'pulp.example.com') with open(os.path.join(str(tmpdir), 'image.tar.xz'), 'wt') as fp: fp.write('x' * 2**12) setattr(workflow, 'exported_image_sequence', [{ 'path': fp.name, 'type': IMAGE_TYPE_DOCKER_ARCHIVE }]) if build_process_failed: workflow.build_result = BuildResult( logs=["docker build log - \u2018 \u2017 \u2019 \n'"], fail_reason="not built") else: workflow.build_result = BuildResult( logs=["docker build log - \u2018 \u2017 \u2019 \n'"], image_id="id1234") workflow.prebuild_plugins_conf = {} workflow.image_components = parse_rpm_output([ "name1;1.0;1;" + LOCAL_ARCH + ";0;2000;" + FAKE_SIGMD5.decode() + ";23000;" "RSA/SHA256, Tue 30 Aug 2016 00:00:00, Key ID 01234567890abc;(none)", "name2;2.0;1;" + LOCAL_ARCH + ";0;3000;" + FAKE_SIGMD5.decode() + ";24000" "RSA/SHA256, Tue 30 Aug 2016 00:00:00, Key ID 01234567890abd;(none)", ]) return tasker, workflow
def mock_environment(tmpdir, session=None, name=None, component=None, version=None, release=None, source=None, build_process_failed=False, is_rebuild=True, docker_registry=True, pulp_registries=0, blocksize=None, task_states=None, additional_tags=None, has_config=None): if session is None: session = MockedClientSession('', task_states=None) if source is None: source = GitSource('git', 'git://hostname/path') if MOCK: mock_docker() tasker = DockerTasker() workflow = DockerBuildWorkflow(SOURCE, "test-image") base_image_id = '123456parent-id' setattr(workflow, '_base_image_inspect', {'Id': base_image_id}) setattr(workflow, 'builder', X()) setattr(workflow.builder, 'image_id', '123456imageid') setattr(workflow.builder, 'base_image', ImageName(repo='Fedora', tag='22')) setattr(workflow.builder, 'source', X()) setattr(workflow.builder, 'built_image_info', {'ParentId': base_image_id}) setattr(workflow.builder.source, 'dockerfile_path', None) setattr(workflow.builder.source, 'path', None) setattr(workflow, 'tag_conf', TagConf()) with open(os.path.join(str(tmpdir), 'Dockerfile'), 'wt') as df: df.write('FROM base\n' 'LABEL BZComponent={component} com.redhat.component={component}\n' 'LABEL Version={version} version={version}\n' 'LABEL Release={release} release={release}\n' .format(component=component, version=version, release=release)) setattr(workflow.builder, 'df_path', df.name) if name and version: workflow.tag_conf.add_unique_image('user/test-image:{v}-timestamp' .format(v=version)) if name and version and release: workflow.tag_conf.add_primary_images(["{0}:{1}-{2}".format(name, version, release), "{0}:{1}".format(name, version), "{0}:latest".format(name)]) if additional_tags: workflow.tag_conf.add_primary_images(["{0}:{1}".format(name, tag) for tag in additional_tags]) flexmock(subprocess, Popen=fake_Popen) flexmock(koji, ClientSession=lambda hub, opts: session) flexmock(GitSource) (flexmock(OSBS) .should_receive('get_build_logs') .with_args(BUILD_ID) .and_return('build logs - \u2018 \u2017 \u2019')) (flexmock(OSBS) .should_receive('get_pod_for_build') .with_args(BUILD_ID) .and_return(MockedPodResponse())) setattr(workflow, 'source', source) setattr(workflow.source, 'lg', X()) setattr(workflow.source.lg, 'commit_id', '123456') setattr(workflow, 'push_conf', PushConf()) if docker_registry: docker_reg = workflow.push_conf.add_docker_registry('docker.example.com') for image in workflow.tag_conf.images: tag = image.to_str(registry=False) if pulp_registries: docker_reg.digests[tag] = ManifestDigest(v1=fake_digest(image), v2='sha256:not-used') else: docker_reg.digests[tag] = ManifestDigest(v1='sha256:not-used', v2=fake_digest(image)) if has_config: docker_reg.config = { 'config': {'architecture': 'x86_64'}, 'container_config': {} } for pulp_registry in range(pulp_registries): workflow.push_conf.add_pulp_registry('env', 'pulp.example.com') with open(os.path.join(str(tmpdir), 'image.tar.xz'), 'wt') as fp: fp.write('x' * 2**12) setattr(workflow, 'exported_image_sequence', [{'path': fp.name}]) if build_process_failed: workflow.build_result = BuildResult(logs=["docker build log - \u2018 \u2017 \u2019 \n'"], fail_reason="not built") else: workflow.build_result = BuildResult(logs=["docker build log - \u2018 \u2017 \u2019 \n'"], image_id="id1234") workflow.prebuild_plugins_conf = {} workflow.prebuild_results[CheckAndSetRebuildPlugin.key] = is_rebuild workflow.postbuild_results[PostBuildRPMqaPlugin.key] = [ "name1;1.0;1;x86_64;0;2000;" + FAKE_SIGMD5.decode() + ";23000;" "RSA/SHA256, Tue 30 Aug 2016 00:00:00, Key ID 01234567890abc;(none)", "name2;2.0;1;x86_64;0;3000;" + FAKE_SIGMD5.decode() + ";24000" "RSA/SHA256, Tue 30 Aug 2016 00:00:00, Key ID 01234567890abd;(none)", ] return tasker, workflow
def prepare(v1_image_ids={}): if MOCK: mock_docker() tasker = DockerTasker() workflow = DockerBuildWorkflow(SOURCE, "test-image") setattr(workflow, 'builder', X()) setattr(workflow.builder, 'source', X()) setattr(workflow.builder.source, 'dockerfile_path', None) setattr(workflow.builder.source, 'path', None) setattr(workflow, 'tag_conf', X()) setattr(workflow.tag_conf, 'images', [ImageName(repo="image-name1")]) # 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(0)) (flexmock(dockpulp.Pulp).should_receive('set_certs').with_args( object, object)) (flexmock(dockpulp.Pulp).should_receive('getRepos').with_args( list, fields=list).and_return([{ "id": "redhat-image-name1" }, { "id": "redhat-prefix-image-name2" }])) (flexmock(dockpulp.Pulp).should_receive('createRepo')) (flexmock(dockpulp.Pulp).should_receive('upload').with_args(unicode) ).at_most().once() (flexmock(dockpulp.Pulp).should_receive('copy').with_args( unicode, unicode)) (flexmock(dockpulp.Pulp).should_receive('updateRepo').with_args( 'redhat-image-name1', {'tag': 'latest:ppc64le_v1_image_id'})) (flexmock(dockpulp.Pulp).should_receive('crane').with_args( list, wait=True).and_return([2, 3, 4])) (flexmock(dockpulp.Pulp).should_receive('').with_args( object, object).and_return([1, 2, 3])) (flexmock(dockpulp.Pulp).should_receive('watch_tasks').with_args(list)) annotations = { 'worker-builds': { 'x86_64': { 'build': { 'build-name': 'build-1-x64_64', }, 'metadata_fragment': 'configmap/build-1-x86_64-md', 'metadata_fragment_key': 'metadata.json', }, 'ppc64le': { 'build': { 'build-name': 'build-1-ppc64le', }, 'metadata_fragment': 'configmap/build-1-ppc64le-md', 'metadata_fragment_key': 'metadata.json', } } } workflow.build_result = BuildResult( logs=["docker build log - \u2018 \u2017 \u2019 \n'"], image_id="id1234", annotations=annotations) build_info = {} build_info['x86_64'] = BuildInfo() build_info['ppc64le'] = BuildInfo() for platform, v1_image_id in v1_image_ids.items(): build_info[platform] = BuildInfo(v1_image_id) workflow.plugin_workspace = { OrchestrateBuildPlugin.key: { WORKSPACE_KEY_BUILD_INFO: build_info } } mock_docker() return tasker, workflow
def mock_environment(tmpdir, session=None, name=None, component=None, version=None, release=None, source=None, build_process_failed=False, docker_registry=True, pulp_registries=0, blocksize=None, task_states=None, additional_tags=None, has_config=None, prefer_schema1_digest=True): if session is None: session = MockedClientSession('', task_states=None) if source is None: source = GitSource('git', 'git://hostname/path') if MOCK: mock_docker() tasker = DockerTasker() workflow = DockerBuildWorkflow(SOURCE, "test-image") base_image_id = '123456parent-id' setattr(workflow, '_base_image_inspect', {'Id': base_image_id}) setattr(workflow, 'builder', X()) setattr(workflow.builder, 'image_id', '123456imageid') setattr(workflow.builder, 'base_image', ImageName(repo='Fedora', tag='22')) setattr(workflow.builder, 'source', X()) setattr(workflow.builder, 'built_image_info', {'ParentId': base_image_id}) setattr(workflow.builder.source, 'dockerfile_path', None) setattr(workflow.builder.source, 'path', None) setattr(workflow, 'tag_conf', TagConf()) with open(os.path.join(str(tmpdir), 'Dockerfile'), 'wt') as df: df.write('FROM base\n' 'LABEL BZComponent={component} com.redhat.component={component}\n' 'LABEL Version={version} version={version}\n' 'LABEL Release={release} release={release}\n' .format(component=component, version=version, release=release)) setattr(workflow.builder, 'df_path', df.name) if name and version: workflow.tag_conf.add_unique_image('user/test-image:{v}-timestamp' .format(v=version)) if name and version and release: workflow.tag_conf.add_primary_images(["{0}:{1}-{2}".format(name, version, release), "{0}:{1}".format(name, version), "{0}:latest".format(name)]) if additional_tags: workflow.tag_conf.add_primary_images(["{0}:{1}".format(name, tag) for tag in additional_tags]) flexmock(subprocess, Popen=fake_Popen) flexmock(koji, ClientSession=lambda hub, opts: session) flexmock(GitSource) setattr(workflow, 'source', source) setattr(workflow.source, 'lg', X()) setattr(workflow.source.lg, 'commit_id', '123456') setattr(workflow, 'push_conf', PushConf()) if docker_registry: docker_reg = workflow.push_conf.add_docker_registry('docker.example.com') for image in workflow.tag_conf.images: tag = image.to_str(registry=False) if pulp_registries and prefer_schema1_digest: docker_reg.digests[tag] = ManifestDigest(v1=fake_digest(image), v2='sha256:not-used') else: docker_reg.digests[tag] = ManifestDigest(v1='sha256:not-used', v2=fake_digest(image)) if has_config: docker_reg.config = { 'config': {'architecture': LOCAL_ARCH}, 'container_config': {} } for pulp_registry in range(pulp_registries): workflow.push_conf.add_pulp_registry('env', 'pulp.example.com') with open(os.path.join(str(tmpdir), 'image.tar.xz'), 'wt') as fp: fp.write('x' * 2**12) setattr(workflow, 'exported_image_sequence', [{'path': fp.name, 'type': IMAGE_TYPE_DOCKER_ARCHIVE}]) if build_process_failed: workflow.build_result = BuildResult(logs=["docker build log - \u2018 \u2017 \u2019 \n'"], fail_reason="not built") else: workflow.build_result = BuildResult(logs=["docker build log - \u2018 \u2017 \u2019 \n'"], image_id="id1234") workflow.prebuild_plugins_conf = {} workflow.image_components = parse_rpm_output([ "name1;1.0;1;" + LOCAL_ARCH + ";0;2000;" + FAKE_SIGMD5.decode() + ";23000;" "RSA/SHA256, Tue 30 Aug 2016 00:00:00, Key ID 01234567890abc;(none)", "name2;2.0;1;" + LOCAL_ARCH + ";0;3000;" + FAKE_SIGMD5.decode() + ";24000" "RSA/SHA256, Tue 30 Aug 2016 00:00:00, Key ID 01234567890abd;(none)", ]) return tasker, workflow
def prepare(v1_image_ids={}): if MOCK: mock_docker() tasker = DockerTasker() workflow = DockerBuildWorkflow(SOURCE, "test-image") setattr(workflow, 'builder', X()) setattr(workflow.builder, 'source', X()) setattr(workflow.builder.source, 'dockerfile_path', None) setattr(workflow.builder.source, 'path', None) setattr(workflow, 'tag_conf', X()) setattr(workflow.tag_conf, 'images', [ImageName(repo="image-name1")]) # 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(0)) (flexmock(dockpulp.Pulp) .should_receive('set_certs') .with_args(object, object)) (flexmock(dockpulp.Pulp) .should_receive('getRepos') .with_args(list, fields=list) .and_return([ {"id": "redhat-image-name1"}, {"id": "redhat-prefix-image-name2"} ])) (flexmock(dockpulp.Pulp) .should_receive('createRepo')) (flexmock(dockpulp.Pulp) .should_receive('upload') .with_args(unicode)).at_most().once() (flexmock(dockpulp.Pulp) .should_receive('copy') .with_args(unicode, unicode)) (flexmock(dockpulp.Pulp) .should_receive('updateRepo') .with_args('redhat-image-name1', {'tag': 'latest:ppc64le_v1_image_id'})) (flexmock(dockpulp.Pulp) .should_receive('crane') .with_args(list, wait=True) .and_return([2, 3, 4])) (flexmock(dockpulp.Pulp) .should_receive('') .with_args(object, object) .and_return([1, 2, 3])) (flexmock(dockpulp.Pulp) .should_receive('watch_tasks') .with_args(list)) annotations = { 'worker-builds': { 'x86_64': { 'build': { 'build-name': 'build-1-x64_64', }, 'metadata_fragment': 'configmap/build-1-x86_64-md', 'metadata_fragment_key': 'metadata.json', }, 'ppc64le': { 'build': { 'build-name': 'build-1-ppc64le', }, 'metadata_fragment': 'configmap/build-1-ppc64le-md', 'metadata_fragment_key': 'metadata.json', } } } workflow.build_result = BuildResult(logs=["docker build log - \u2018 \u2017 \u2019 \n'"], image_id="id1234", annotations=annotations) build_info = {} build_info['x86_64'] = BuildInfo() build_info['ppc64le'] = BuildInfo() for platform, v1_image_id in v1_image_ids.items(): build_info[platform] = BuildInfo(v1_image_id) workflow.plugin_workspace = { OrchestrateBuildPlugin.key: { WORKSPACE_KEY_BUILD_INFO: build_info } } mock_docker() return tasker, workflow
def mock_environment(tmpdir, session=None, name=None, component=None, version=None, release=None, source=None, build_process_failed=False, is_rebuild=True, docker_registry=True, pulp_registries=0, blocksize=None, task_states=None, additional_tags=None, has_config=None, logs_return_bytes=True): if session is None: session = MockedClientSession('', task_states=None) if source is None: source = GitSource('git', 'git://hostname/path') if MOCK: mock_docker() tasker = DockerTasker() workflow = DockerBuildWorkflow(SOURCE, "test-image") base_image_id = '123456parent-id' setattr(workflow, '_base_image_inspect', {'Id': base_image_id}) setattr(workflow, 'builder', X()) setattr(workflow.builder, 'image_id', '123456imageid') setattr(workflow.builder, 'base_image', ImageName(repo='Fedora', tag='22')) setattr(workflow.builder, 'source', X()) setattr(workflow.builder, 'built_image_info', {'ParentId': base_image_id}) setattr(workflow.builder.source, 'dockerfile_path', None) setattr(workflow.builder.source, 'path', None) setattr(workflow, 'tag_conf', TagConf()) with open(os.path.join(str(tmpdir), 'Dockerfile'), 'wt') as df: df.write('FROM base\n' 'LABEL BZComponent={component} com.redhat.component={component}\n' 'LABEL Version={version} version={version}\n' 'LABEL Release={release} release={release}\n' .format(component=component, version=version, release=release)) setattr(workflow.builder, 'df_path', df.name) if name and version: workflow.tag_conf.add_unique_image('user/test-image:{v}-timestamp' .format(v=version)) if name and version and release: workflow.tag_conf.add_primary_images(["{0}:{1}-{2}".format(name, version, release), "{0}:{1}".format(name, version), "{0}:latest".format(name)]) if additional_tags: workflow.tag_conf.add_primary_images(["{0}:{1}".format(name, tag) for tag in additional_tags]) flexmock(subprocess, Popen=fake_Popen) flexmock(koji, ClientSession=lambda hub, opts: session) flexmock(GitSource) if logs_return_bytes: logs = b'build logs - \xe2\x80\x98 \xe2\x80\x97 \xe2\x80\x99' else: logs = 'build logs - \u2018 \u2017 \u2019' (flexmock(OSBS) .should_receive('get_build_logs') .with_args(BUILD_ID) .and_return(logs)) (flexmock(OSBS) .should_receive('get_pod_for_build') .with_args(BUILD_ID) .and_return(MockedPodResponse())) setattr(workflow, 'source', source) setattr(workflow.source, 'lg', X()) setattr(workflow.source.lg, 'commit_id', '123456') setattr(workflow, 'push_conf', PushConf()) if docker_registry: docker_reg = workflow.push_conf.add_docker_registry('docker.example.com') for image in workflow.tag_conf.images: tag = image.to_str(registry=False) if pulp_registries: docker_reg.digests[tag] = ManifestDigest(v1=fake_digest(image), v2='sha256:not-used') else: docker_reg.digests[tag] = ManifestDigest(v1='sha256:not-used', v2=fake_digest(image)) if has_config: docker_reg.config = { 'config': {'architecture': 'x86_64'}, 'container_config': {} } for pulp_registry in range(pulp_registries): workflow.push_conf.add_pulp_registry('env', 'pulp.example.com') with open(os.path.join(str(tmpdir), 'image.tar.xz'), 'wt') as fp: fp.write('x' * 2**12) setattr(workflow, 'exported_image_sequence', [{'path': fp.name}]) annotations = { 'worker-builds': { 'x86_64': { 'build': { 'build-name': 'build-1-x64_64', }, 'metadata_fragment': 'configmap/build-1-x86_64-md', 'metadata_fragment_key': 'metadata.json', }, 'ppc64le': { 'build': { 'build-name': 'build-1-ppc64le', }, 'metadata_fragment': 'configmap/build-1-ppc64le-md', 'metadata_fragment_key': 'metadata.json', } } } if build_process_failed: workflow.build_result = BuildResult(logs=["docker build log - \u2018 \u2017 \u2019 \n'"], fail_reason="not built") else: workflow.build_result = BuildResult(logs=["docker build log - \u2018 \u2017 \u2019 \n'"], image_id="id1234", annotations=annotations) workflow.prebuild_plugins_conf = {} workflow.prebuild_results[CheckAndSetRebuildPlugin.key] = is_rebuild workflow.postbuild_results[PostBuildRPMqaPlugin.key] = [ "name1;1.0;1;x86_64;0;2000;" + FAKE_SIGMD5.decode() + ";23000;" "RSA/SHA256, Tue 30 Aug 2016 00:00:00, Key ID 01234567890abc;(none)", "name2;2.0;1;x86_64;0;3000;" + FAKE_SIGMD5.decode() + ";24000" "RSA/SHA256, Tue 30 Aug 2016 00:00:00, Key ID 01234567890abd;(none)", ] workflow.postbuild_results[FetchWorkerMetadataPlugin.key] = { 'x86_64': { 'buildroots': [ { 'container': { 'type': 'docker', 'arch': 'x86_64' }, 'extra': { 'osbs': { 'build_id': '12345', 'builder_image_id': '67890' } }, 'content_generator': { 'version': '1.6.23', 'name': 'atomic-reactor' }, 'host': { 'os': 'Red Hat Enterprise Linux Server 7.3 (Maipo)', 'arch': 'x86_64' }, 'components': [ { 'name': 'perl-Net-LibIDN', 'sigmd5': '1dba38d073ea8f3e6c99cfe32785c81e', 'arch': 'x86_64', 'epoch': None, 'version': '0.12', 'signature': '199e2f91fd431d51', 'release': '15.el7', 'type': 'rpm' }, { 'name': 'tzdata', 'sigmd5': '2255a5807ca7e4d7274995db18e52bea', 'arch': 'noarch', 'epoch': None, 'version': '2017b', 'signature': '199e2f91fd431d51', 'release': '1.el7', 'type': 'rpm' }, ], 'tools': [ { 'version': '1.12.6', 'name': 'docker' } ], 'id': 1 } ], 'metadata_version': 0, 'output': [ { 'type': 'log', 'arch': 'noarch', 'filename': 'openshift-final.log', 'filesize': 106690, 'checksum': '2efa754467c0d2ea1a98fb8bfe435955', 'checksum_type': 'md5', 'buildroot_id': 1 }, { 'type': 'log', 'arch': 'noarch', 'filename': 'build.log', 'filesize': 1660, 'checksum': '8198de09fc5940cf7495e2657039ee72', 'checksum_type': 'md5', 'buildroot_id': 1 }, { 'extra': { 'image': { 'arch': 'x86_64' }, 'docker': { 'repositories': [ 'brew-pulp-docker:8888/myproject/hello-world:0.0.1-9', ], 'parent_id': 'sha256:bf203442', 'id': '123456', } }, 'checksum': '58a52e6f3ed52818603c2744b4e2b0a2', 'filename': 'test.x86_64.tar.gz', 'buildroot_id': 1, 'components': [ { 'name': 'tzdata', 'sigmd5': 'd9dc4e4f205428bc08a52e602747c1e9', 'arch': 'noarch', 'epoch': None, 'version': '2016d', 'signature': '199e2f91fd431d51', 'release': '1.el7', 'type': 'rpm' }, { 'name': 'setup', 'sigmd5': 'b1e5ca72c71f94112cd9fb785b95d4da', 'arch': 'noarch', 'epoch': None, 'version': '2.8.71', 'signature': '199e2f91fd431d51', 'release': '6.el7', 'type': 'rpm' }, ], 'type': 'docker-image', 'checksum_type': 'md5', 'arch': 'x86_64', 'filesize': 71268781 } ] } } workflow.plugin_workspace = { OrchestrateBuildPlugin.key: { WORKSPACE_KEY_UPLOAD_DIR: 'test-dir', WORKSPACE_KEY_BUILD_INFO: { 'x86_64': BuildInfo('help.md') } } } return tasker, workflow