#!/usr/bin/env python import os import sys import yaml def os_family(distro): """Given a distribution, returns a operating system family.""" family = None if distro in ['centos', 'fedora', 'rhel', 'rhel7']: family = 'redhat' elif distro in ['debian', 'ubuntu']: family = 'debian' elif distro == 'opensuse': family = 'suse' return family def merge_data(source, destination, distro): """Merges two dictionaries and filters on distro, family, or default (in order).""" result = dict() result.update(destination) family = os_family(distro) for servicename, mapping in source.iteritems(): if servicename in result: raise Exception("%s already found in services list" % servicename) if distro in mapping: result[servicename] = mapping.get(distro) elif family in mapping: result[servicename] = mapping.get(family) elif 'default' in mapping: result[servicename] = mapping.get('default') else: result[servicename] = servicename return result def write_data_to_file(data, service_file_path): """Writes yaml data to a specified path.""" with open(service_file_path, 'w') as destination: yaml.dump(data, destination, default_flow_style=False) def main(): elements = os.environ.get("IMAGE_ELEMENT").split(' ') element_paths = os.environ.get("ELEMENTS_PATH").split(':') service_names = dict() for element in elements: for element_path in element_paths: data_path = os.path.join(element_path, element, "svc-map") if os.path.exists(data_path): with open(data_path, 'r') as dataFile: data = yaml.load(dataFile.read()) try: service_names = merge_data( data, service_names, os.environ.get("DISTRO_NAME")) except Exception as err: print("%s. Check %s for duplicate \ service name." % (err, element)) sys.exit(1) write_data_to_file(service_names, os.path.join("/tmp", 'svc-map-services')) if __name__ == "__main__": main()