#!/usr/bin/env python # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import os import sys import six import yaml def os_family(distro): "Given a distribution, returns a operating system family." family = None if distro in ['centos', 'centos7', '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. 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 six.iteritems(source): 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: if not element.strip(): continue 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(os.environ['TMP_MOUNT_PATH'], 'tmp', 'svc-map-services')) if __name__ == "__main__": main()