diskimage-builder/elements/svc-map/extra-data.d/10-merge-svc-map-files

71 lines
2.3 KiB
Text
Raw Normal View History

#!/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()