class MetaTraitTransformer(TraitTransformer): name = 'meta' def inject_steps(self): self.meta_step = PipelineStep( name='meta', raw_dict={}, is_synthetic=True, notification_policy=StepNotificationPolicy.NO_NOTIFICATION, script_type=ScriptType.PYTHON3, ) self.meta_step.add_output(name=META_INFO_DIR_NAME, variable_name=META_INFO_ENV_VAR_NAME) yield self.meta_step def process_pipeline_args(self, pipeline_args: JobVariant): # All steps depend on meta step and receive an input from it for step in pipeline_args.steps(): if step == self.meta_step: continue step._add_dependency(self.meta_step) step.add_input(name=META_INFO_DIR_NAME, variable_name=META_INFO_ENV_VAR_NAME) if pipeline_args.has_trait('version'): # All steps depend on version. Remove ourself to avoid circular dependency version_step = pipeline_args.step('version') self.meta_step._remove_dependency(version_step) self.meta_step.remove_input('version_path')
class VersionTraitTransformer(TraitTransformer): name = 'version' def inject_steps(self): self.version_step = PipelineStep( name='version', raw_dict={}, is_synthetic=True, notification_policy=StepNotificationPolicy.NO_NOTIFICATION, pull_request_notification_policy=PullRequestNotificationPolicy. NO_NOTIFICATION, injecting_trait_name=self.name, script_type=ScriptType.PYTHON3, ) self.version_step.add_output(name=DIR_NAME, variable_name=ENV_VAR_NAME) self.version_step.set_timeout(duration_string='5m') yield self.version_step def process_pipeline_args(self, pipeline_args: JobVariant): # all steps depend from us and may consume our output for step in pipeline_args.steps(): if step == self.version_step: continue step._add_dependency(self.version_step) step.add_input(variable_name=ENV_VAR_NAME, name=DIR_NAME)
class ComponentDescriptorTraitTransformer(TraitTransformer): name = 'component_descriptor' def __init__(self, trait: ComponentDescriptorTrait, *args, **kwargs): super().__init__(*args, **kwargs) self.trait = not_none(trait) def inject_steps(self): self.descriptor_step = PipelineStep( name=self.trait.step_name(), raw_dict={}, is_synthetic=True, notification_policy=StepNotificationPolicy.NO_NOTIFICATION, script_type=ScriptType.PYTHON3, ) self.descriptor_step.add_output( name=DIR_NAME, variable_name=ENV_VAR_NAME, ) self.descriptor_step.set_timeout(duration_string='30m') yield self.descriptor_step def process_pipeline_args(self, pipeline_args: 'JobVariant'): if pipeline_args.has_step('release'): release_step = pipeline_args.step('release') release_step.add_input( name=DIR_NAME, variable_name=ENV_VAR_NAME, ) # inject component_name if not configured if not self.trait.raw.get('component_name'): main_repo = pipeline_args.main_repository() component_name = '/'.join(( main_repo.repo_hostname(), main_repo.repo_path(), )) self.trait.raw['component_name'] = component_name @classmethod def dependencies(cls): return {'version'} @classmethod def order_dependencies(cls): # dependency is required, as we need to patch the 'release' step return {'release'}
class ComponentDescriptorTraitTransformer(TraitTransformer): name = 'component_descriptor' def __init__(self, trait: ComponentDescriptorTrait, *args, **kwargs): super().__init__(*args, **kwargs) self.trait = not_none(trait) def inject_steps(self): self.descriptor_step = PipelineStep( name=self.trait.step_name(), raw_dict={}, is_synthetic=True, notification_policy=StepNotificationPolicy.NO_NOTIFICATION, injected_by_trait=self.name, script_type=ScriptType.PYTHON3, ) self.descriptor_step.add_output( name=DIR_NAME, variable_name=ENV_VAR_NAME, ) self.descriptor_step.set_timeout(duration_string='45m') yield self.descriptor_step def process_pipeline_args(self, pipeline_args: 'JobVariant'): if pipeline_args.has_step('release'): release_step = pipeline_args.step('release') release_step.add_input( name=DIR_NAME, variable_name=ENV_VAR_NAME, ) if pipeline_args.has_trait('draft_release'): draft_release_step = pipeline_args.step( 'create_draft_release_notes') draft_release_step.add_input( name=DIR_NAME, variable_name=ENV_VAR_NAME, ) # inject component_name if not configured if not self.trait.raw.get('component_name'): main_repo = pipeline_args.main_repository() component_name = '/'.join(( main_repo.repo_hostname(), main_repo.repo_path(), )) self.trait.raw['component_name'] = component_name # add configured (step-)inputs for step_input in self.trait.inputs(): if not step_input.type == 'step': raise NotImplementedError(step_input.type) try: step: PipelineStep = pipeline_args.step(step_input.step_name) except KeyError as ke: raise ValueError( f'no such step: {step_input.step_name=}') from ke self.descriptor_step._add_dependency(step) if step_input.output_name: output_name = step_input.output_name else: # choose only output if omitted outputs = { name: v for name, v in step.outputs().items() if not name == 'on_error_dir' # XXX hack hack hack } if len(outputs) < 1: raise ValueError(f'{step.name=} does not have any outputs') elif len(outputs) > 1: raise ValueError( f'{step.name=} has more than one output (need to tell step_name)' ) output_name = next(outputs.keys().__iter__()) self.descriptor_step.add_input( name=output_name, variable_name=output_name, ) @classmethod def dependencies(cls): return {'version'} @classmethod def order_dependencies(cls): # dependency is required, as we need to patch the 'release' step return {'release'}