def run(self): base_image = self.workflow.builder.base_image if base_image.namespace != 'koji' or base_image.repo != 'image-build': self.log.info('Base image not supported: %s', base_image) return image_build_conf = base_image.tag if not image_build_conf or image_build_conf == 'latest': image_build_conf = 'image-build.conf' self.session = create_koji_session(self.koji_hub, self.koji_auth_info) task_id, filesystem_regex = self.build_filesystem(image_build_conf) task = TaskWatcher(self.session, task_id, self.poll_interval) task.wait() if task.failed(): raise RuntimeError( 'Create filesystem task failed: {}'.format(task_id)) filesystem = self.download_filesystem(task_id, filesystem_regex) new_base_image = self.import_base_image(filesystem) self.workflow.builder.set_base_image(new_base_image) defer_removal(self.workflow, new_base_image) return { 'base-image-id': new_base_image, 'filesystem-koji-task-id': task_id, }
def run(self): dockerfile = DockerfileParser(self.workflow.builder.df_path) image_name = ImageName.parse(dockerfile.baseimage) if image_name.namespace != 'koji' or image_name.repo != 'image-build' : self.log.info('Base image not supported: %s', dockerfile.baseimage) return image_build_conf = image_name.tag or 'image-build.conf' self.session = create_koji_session(self.koji_hub, self.koji_auth_info) task_id, filesystem_regex = self.build_filesystem(image_build_conf) task = TaskWatcher(self.session, task_id, self.poll_interval) task.wait() if task.failed(): raise RuntimeError('Create filesystem task failed: {}' .format(task_id)) filesystem = self.download_filesystem(task_id, filesystem_regex) base_image = self.import_base_image(filesystem) dockerfile.baseimage = base_image return base_image
def run(self): base_image = self.workflow.builder.base_image if base_image.namespace != 'koji' or base_image.repo != 'image-build': self.log.info('Base image not supported: %s', base_image) return image_build_conf = base_image.tag if not image_build_conf or image_build_conf == 'latest': image_build_conf = 'image-build.conf' self.session = create_koji_session(self.koji_hub, self.koji_auth_info) task_id, filesystem_regex = self.build_filesystem(image_build_conf) task = TaskWatcher(self.session, task_id, self.poll_interval) task.wait() if task.failed(): try: # Koji may re-raise the error that caused task to fail task_result = self.session.getTaskResult(task_id) except Exception as exc: task_result = repr(exc) raise RuntimeError('image task, {}, failed: {}'.format( task_id, task_result)) filesystem = self.download_filesystem(task_id, filesystem_regex) new_base_image = self.import_base_image(filesystem) self.workflow.builder.set_base_image(new_base_image) defer_removal(self.workflow, new_base_image) return { 'base-image-id': new_base_image, 'filesystem-koji-task-id': task_id, }
def run_image_task(self, image_build_conf): task_id, filesystem_regex = self.build_filesystem(image_build_conf) try: task = TaskWatcher(self.session, task_id, self.poll_interval) task.wait() except BuildCanceledException: self.log.info("Build was canceled, canceling task %s", task_id) try: self.session.cancelTask(task_id) self.log.info('task %s canceled', task_id) except Exception as exc: self.log.info("Exception while canceling a task (ignored): %r", exc) if task.failed(): try: # Koji may re-raise the error that caused task to fail task_result = self.session.getTaskResult(task_id) except Exception as exc: task_result = repr(exc) raise RuntimeError('image task, {}, failed: {}'.format( task_id, task_result)) return task_id, filesystem_regex
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 promoting failed build to koji") return koji_metadata, output_files = self.get_metadata() try: session = self.login() server_dir = self.get_upload_server_dir() for output in output_files: if output.file: self.upload_file(session, output, server_dir) finally: for output in output_files: if output.file: output.file.close() 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)) # Tag the build if build_id is not None and self.target is not None: self.log.debug("Finding build tag for target %s", self.target) target_info = session.getBuildTarget(self.target) build_tag = target_info['dest_tag_name'] self.log.info("Tagging build with %s", build_tag) task_id = session.tagBuild(build_tag, build_id) task = TaskWatcher(session, task_id, poll_interval=self.poll_interval) task.wait() if task.failed(): raise RuntimeError("Task %s failed to tag koji build" % task_id) return build_id
def test_cancel(self): session = flexmock() task_id = 1234 (session.should_receive('taskFinished').with_args(task_id).and_raise( BuildCanceledException)) task = TaskWatcher(session, task_id, poll_interval=0) with pytest.raises(BuildCanceledException): task.wait() assert task.failed()
def test_cancel(self): session = flexmock() task_id = 1234 (session .should_receive('taskFinished') .with_args(task_id) .and_raise(BuildCanceledException)) task = TaskWatcher(session, task_id, poll_interval=0) with pytest.raises(BuildCanceledException): task.wait() assert task.failed()
def test_wait(self, finished, info, exp_state, exp_failed): session = flexmock() task_id = 1234 task_finished = ( session.should_receive('taskFinished').with_args(task_id)) for finished_value in finished: task_finished = task_finished.and_return(finished_value) (session.should_receive('getTaskInfo').with_args( task_id, request=True).once().and_return(info)) task = TaskWatcher(session, task_id, poll_interval=0) assert task.wait() == exp_state assert task.failed() == exp_failed
def test_wait(self, finished, info, exp_state, exp_failed): session = flexmock() task_id = 1234 task_finished = (session.should_receive('taskFinished') .with_args(task_id)) for finished_value in finished: task_finished = task_finished.and_return(finished_value) (session.should_receive('getTaskInfo') .with_args(task_id, request=True) .once() .and_return(info)) task = TaskWatcher(session, task_id, poll_interval=0) assert task.wait() == exp_state assert task.failed() == exp_failed
def run_image_task(self, image_build_conf): task_id, filesystem_regex = self.build_filesystem(image_build_conf) try: task = TaskWatcher(self.session, task_id, self.poll_interval) task.wait() except BuildCanceledException: self.log.info("Build was canceled, canceling task %s", task_id) try: self.session.cancelTask(task_id) self.log.info('task %s canceled', task_id) except Exception as exc: self.log.info("Exception while canceling a task (ignored): %r", exc) if task.failed(): try: # Koji may re-raise the error that caused task to fail task_result = self.session.getTaskResult(task_id) except Exception as exc: task_result = repr(exc) raise RuntimeError('image task, {}, failed: {}' .format(task_id, task_result)) return task_id, filesystem_regex