diskimage-builder/elements/svc-map/extra-data.d/10-merge-svc-map-files
Michael Kerrin 730e7bd76e Handle extra spaces in merge-svc-map-files
During internal testing we are getting the following error from
merge-svc-map-files
File "/tmp/image.K2MYCphY/hooks/extra-data.d/10-merge-svc-map-files", line 54, in main
    with open(data_path, 'r') as dataFile:
IOError: [Errno 21] Is a directory: '...diskimage-builder/elements/svc-map'

Somehow IMAGE_ELEMENT contains a extra white space that manifests itself
as an element without a name. It is very hard to find where this is coming from so
instead this patch makes merge-svc-map-files more robost to this situation

Change-Id: Id1500ead8a77d691408617dcdc4e095bc5775be8
2014-10-20 18:16:39 +01:00

73 lines
2.3 KiB
Python
Executable File

#!/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 ['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, 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:
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("/tmp", 'svc-map-services'))
if __name__ == "__main__":
main()