def run(self): """ Run the plugin. """ if ((self.koji_principal and not self.koji_keytab) or (self.koji_keytab and not self.koji_principal)): raise RuntimeError("specify both koji_principal and koji_keytab " "or neither") # Only run if the build was successful if self.workflow.build_process_failed: self.log.info("Not importing failed build to koji") return session = self.login() server_dir = get_koji_upload_dir(self.workflow) koji_metadata = self.combine_metadata_fragments() try: build_info = session.CGImport(koji_metadata, server_dir) except Exception: self.log.debug("metadata: %r", koji_metadata) raise # Older versions of CGImport do not return a value. build_id = build_info.get("id") if build_info else None self.log.debug("Build information: %s", json.dumps(build_info, sort_keys=True, indent=4)) return build_id
def get_koji_operator_manifest_url(self): """Construct URL for downloading manifest from koji task work server_dir :rtype: str :return: URL of koji operator manifests archive """ server_dir = get_koji_upload_dir(self.workflow) pathinfo = get_koji_path_info(self.workflow, NO_FALLBACK) file_url = "{}/work/{}/{}".format(pathinfo.topdir, server_dir, OPERATOR_MANIFESTS_ARCHIVE) return file_url
def run(self): """ Run the plugin. """ if ((self.koji_principal and not self.koji_keytab) or (self.koji_keytab and not self.koji_principal)): raise RuntimeError("specify both koji_principal and koji_keytab " "or neither") # Only run if the build was successful if self.workflow.build_process_failed: self.log.info("Not importing failed build to koji") return self.session = self.login() server_dir = get_koji_upload_dir(self.workflow) koji_metadata, output_files = self.combine_metadata_fragments() try: for output in output_files: if output.file: self.upload_file(self.session, output, server_dir) finally: for output in output_files: if output.file: output.file.close() try: build_info = self.session.CGImport(koji_metadata, server_dir) except Exception: self.log.debug("metadata: %r", koji_metadata) raise # Older versions of CGImport do not return a value. build_id = build_info.get("id") if build_info else None self.log.debug("Build information: %s", json.dumps(build_info, sort_keys=True, indent=4)) return build_id
def run(self): """ Run the plugin. """ # Only run if the build was successful if self.workflow.build_process_failed: self.log.info("Not importing failed build to koji") return self.session = get_koji_session(self.workflow, self.koji_fallback) server_dir = get_koji_upload_dir(self.workflow) koji_metadata, output_files = self.combine_metadata_fragments() if is_scratch_build(): self.upload_scratch_metadata(koji_metadata, server_dir, self.session) return try: for output in output_files: if output.file: self.upload_file(self.session, output, server_dir) finally: for output in output_files: if output.file: output.file.close() try: build_info = self.session.CGImport(koji_metadata, server_dir) except Exception: self.log.debug("metadata: %r", koji_metadata) raise # Older versions of CGImport do not return a value. build_id = build_info.get("id") if build_info else None self.log.debug("Build information: %s", json.dumps(build_info, sort_keys=True, indent=4)) return build_id
def run(self): """ Run the plugin. """ # Only run if the build was successful if self.workflow.build_process_failed: self.log.info("Not importing failed build to koji") return self.session = get_koji_session(self.workflow, self.koji_fallback) server_dir = get_koji_upload_dir(self.workflow) koji_metadata, output_files = self.combine_metadata_fragments() try: for output in output_files: if output.file: self.upload_file(self.session, output, server_dir) finally: for output in output_files: if output.file: output.file.close() try: build_info = self.session.CGImport(koji_metadata, server_dir) except Exception: self.log.debug("metadata: %r", koji_metadata) raise # Older versions of CGImport do not return a value. build_id = build_info.get("id") if build_info else None self.log.debug("Build information: %s", json.dumps(build_info, sort_keys=True, indent=4)) return build_id
def get_server_dir(self): """ Obtain koji_upload_dir value used for worker builds. """ return get_koji_upload_dir(self.workflow)
def test_orchestrate_build_annotations_and_labels(tmpdir, metadata_fragment): workflow = mock_workflow(tmpdir) mock_osbs() md = { 'metadata_fragment': 'configmap/spam-md', 'metadata_fragment_key': 'metadata.json' } def mock_wait_for_build_to_finish(build_name): annotations = { 'repositories': json.dumps({ 'unique': ['{}-unique'.format(build_name)], 'primary': ['{}-primary'.format(build_name)], }), 'digests': json.dumps([ { 'digest': 'sha256:{}-digest'.format(build_name), 'tag': '{}-latest'.format(build_name), 'registry': '{}-registry'.format(build_name), 'repository': '{}-repository'.format(build_name), }, ]), } if metadata_fragment: annotations.update(md) labels = {'koji-build-id': 'koji-build-id'} return make_build_response(build_name, 'Complete', annotations, labels) (flexmock(OSBS) .should_receive('wait_for_build_to_finish') .replace_with(mock_wait_for_build_to_finish)) mock_reactor_config(tmpdir) runner = BuildStepPluginsRunner( workflow.builder.tasker, workflow, [{ 'name': OrchestrateBuildPlugin.key, 'args': { 'platforms': ['x86_64', 'ppc64le'], 'build_kwargs': make_worker_build_kwargs(), 'osbs_client_config': str(tmpdir), } }] ) build_result = runner.run() assert not build_result.is_failed() expected = { 'worker-builds': { 'x86_64': { 'build': { 'build-name': 'worker-build-x86_64', 'cluster-url': 'https://worker_x86_64.com/', 'namespace': 'worker_x86_64_namespace' }, 'digests': [ { 'digest': 'sha256:worker-build-x86_64-digest', 'tag': 'worker-build-x86_64-latest', 'registry': 'worker-build-x86_64-registry', 'repository': 'worker-build-x86_64-repository', }, ], 'plugins-metadata': {} }, 'ppc64le': { 'build': { 'build-name': 'worker-build-ppc64le', 'cluster-url': 'https://worker_ppc64le.com/', 'namespace': 'worker_ppc64le_namespace' }, 'digests': [ { 'digest': 'sha256:worker-build-ppc64le-digest', 'tag': 'worker-build-ppc64le-latest', 'registry': 'worker-build-ppc64le-registry', 'repository': 'worker-build-ppc64le-repository', }, ], 'plugins-metadata': {} }, }, 'repositories': { 'unique': [ 'worker-build-ppc64le-unique', 'worker-build-x86_64-unique', ], 'primary': [ 'worker-build-ppc64le-primary', 'worker-build-x86_64-primary', ], }, } if metadata_fragment: expected['worker-builds']['x86_64'].update(md) expected['worker-builds']['ppc64le'].update(md) assert (build_result.annotations == expected) assert (build_result.labels == {'koji-build-id': 'koji-build-id'}) build_info = get_worker_build_info(workflow, 'x86_64') assert build_info.osbs koji_upload_dir = get_koji_upload_dir(workflow) assert koji_upload_dir
def run(self): """ Run the plugin. """ # get the session and token information in case we need to refund a failed build self.session = get_koji_session(self.workflow, self.koji_fallback) build_token = self.workflow.reserved_token build_id = self.workflow.reserved_build_id # Only run if the build was successful if self.workflow.build_process_failed: self.log.info("Not importing %s build to koji", "canceled" if self.workflow.build_canceled else "failed") if self.reserve_build and build_token is not None: state = koji.BUILD_STATES['FAILED'] if self.workflow.build_canceled: state = koji.BUILD_STATES['CANCELED'] self.session.CGRefundBuild(PROG, build_id, build_token, state) return if self.source_build: server_dir = generate_koji_upload_dir() else: server_dir = get_koji_upload_dir(self.workflow) koji_metadata, output_files = self.combine_metadata_fragments() if is_scratch_build(): self.upload_scratch_metadata(koji_metadata, server_dir, self.session) return try: for output in output_files: if output.file: self.upload_file(self.session, output, server_dir) finally: for output in output_files: if output.file: output.file.close() if build_id is not None and build_token is not None: koji_metadata['build']['build_id'] = build_id try: if build_token: build_info = self.session.CGImport(koji_metadata, server_dir, token=build_token) else: build_info = self.session.CGImport(koji_metadata, server_dir) except Exception: self.log.debug("metadata: %r", koji_metadata) raise # Older versions of CGImport do not return a value. build_id = build_info.get("id") if build_info else None self.log.debug("Build information: %s", json.dumps(build_info, sort_keys=True, indent=4)) return build_id
def test_orchestrate_build_annotations_and_labels(tmpdir, metadata_fragment): workflow = mock_workflow(tmpdir) mock_osbs() md = { 'metadata_fragment': 'configmap/spam-md', 'metadata_fragment_key': 'metadata.json' } def mock_wait_for_build_to_finish(build_name): annotations = { 'repositories': json.dumps({ 'unique': ['{}-unique'.format(build_name)], 'primary': ['{}-primary'.format(build_name)], }), 'digests': json.dumps([ { 'digest': 'sha256:{}-digest'.format(build_name), 'tag': '{}-latest'.format(build_name), 'registry': '{}-registry'.format(build_name), 'repository': '{}-repository'.format(build_name), }, ]), } if metadata_fragment: annotations.update(md) labels = {'koji-build-id': 'koji-build-id'} return make_build_response(build_name, 'Complete', annotations, labels) (flexmock(OSBS) .should_receive('wait_for_build_to_finish') .replace_with(mock_wait_for_build_to_finish)) mock_reactor_config(tmpdir) runner = BuildStepPluginsRunner( workflow.builder.tasker, workflow, [{ 'name': OrchestrateBuildPlugin.key, 'args': { 'platforms': ['x86_64', 'ppc64le'], 'build_kwargs': make_worker_build_kwargs(), 'osbs_client_config': str(tmpdir), 'max_cluster_fails': 2, 'unreachable_cluster_retry_delay': .1 } }] ) build_result = runner.run() assert not build_result.is_failed() expected = { 'worker-builds': { 'x86_64': { 'build': { 'build-name': 'worker-build-x86_64', 'cluster-url': 'https://worker_x86_64.com/', 'namespace': 'worker_x86_64_namespace' }, 'digests': [ { 'digest': 'sha256:worker-build-x86_64-digest', 'tag': 'worker-build-x86_64-latest', 'registry': 'worker-build-x86_64-registry', 'repository': 'worker-build-x86_64-repository', }, ], 'plugins-metadata': {} }, 'ppc64le': { 'build': { 'build-name': 'worker-build-ppc64le', 'cluster-url': 'https://worker_ppc64le.com/', 'namespace': 'worker_ppc64le_namespace' }, 'digests': [ { 'digest': 'sha256:worker-build-ppc64le-digest', 'tag': 'worker-build-ppc64le-latest', 'registry': 'worker-build-ppc64le-registry', 'repository': 'worker-build-ppc64le-repository', }, ], 'plugins-metadata': {} }, }, 'repositories': { 'unique': [ 'worker-build-ppc64le-unique', 'worker-build-x86_64-unique', ], 'primary': [ 'worker-build-ppc64le-primary', 'worker-build-x86_64-primary', ], }, } if metadata_fragment: expected['worker-builds']['x86_64'].update(md) expected['worker-builds']['ppc64le'].update(md) assert (build_result.annotations == expected) assert (build_result.labels == {'koji-build-id': 'koji-build-id'}) build_info = get_worker_build_info(workflow, 'x86_64') assert build_info.osbs koji_upload_dir = get_koji_upload_dir(workflow) assert koji_upload_dir