def assembly_group_config(releases_config: Model, assembly: str, group_config: Model) -> Model: """ Returns a group config based on the assembly information and the input group config. :param releases_config: A Model for releases.yaml. :param assembly: The name of the assembly :param group_config: The group config to merge into a new group config (original Model will not be altered) :param _visited: Keeps track of visited assembly definitions to prevent infinite recursion. """ if not assembly or not isinstance(releases_config, Model): return group_config _check_recursion(releases_config, assembly) target_assembly = releases_config.releases[assembly].assembly if target_assembly.basis.assembly: # Does this assembly inherit from another? # Recursively apply ancestor assemblies group_config = assembly_group_config(releases_config, target_assembly.basis.assembly, group_config) target_assembly_group = target_assembly.group if not target_assembly_group: return group_config return Model(dict_to_model=merger(target_assembly_group.primitive(), group_config.primitive()))
def assembly_metadata_config(releases_config: Model, assembly: str, meta_type: str, distgit_key: str, meta_config: Model) -> Model: """ Returns a group member's metadata configuration based on the assembly information and the initial file-based config. :param releases_config: A Model for releases.yaml. :param assembly: The name of the assembly :param meta_type: 'rpm' or 'image' :param distgit_key: The member's distgit_key :param meta_config: The meta's config object :return: Returns a computed config for the metadata (e.g. value for meta.config). """ if not assembly or not isinstance(releases_config, Model): return meta_config _check_recursion(releases_config, assembly) target_assembly = releases_config.releases[assembly].assembly if target_assembly.basis.assembly: # Does this assembly inherit from another? # Recursive apply ancestor assemblies meta_config = assembly_metadata_config(releases_config, target_assembly.basis.assembly, meta_type, distgit_key, meta_config) config_dict = meta_config.primitive() component_list = target_assembly.members[f'{meta_type}s'] for component_entry in component_list: if component_entry.distgit_key == '*' or component_entry.distgit_key == distgit_key and component_entry.metadata: config_dict = merger(component_entry.metadata.primitive(), config_dict) return Model(dict_to_model=config_dict)
def get_group_config(self): # group.yml can contain a `vars` section which should be a # single level dict containing keys to str.format(**dict) replace # into the YAML content. If `vars` found, the format will be # preformed and the YAML model will reloaded from that result tmp_config = Model(self.gitdata.load_data(key='group').data) replace_vars = tmp_config.vars or Model() if self.assembly: replace_vars['runtime_assembly'] = self.assembly try: group_yml = yaml.safe_dump(tmp_config.primitive(), default_flow_style=False) tmp_config = Model(yaml.safe_load(group_yml.format(**replace_vars))) except KeyError as e: raise ValueError('group.yml contains template key `{}` but no value was provided'.format(e.args[0])) return assembly_group_config(self.get_releases_config(), self.assembly, tmp_config)