diskimage-builder/diskimage_builder/elements/svc-map/extra-data.d/10-merge-svc-map-files
Michael Johnson 8b08d212c3 Fix DIB scripts python version
Now that DIB is python3 only we can remove a hack that made sure
scripts outside the chroot ran with the correct version of python.
This is necessary as python3 does not resolve symbolic links to the
binary like python2.x did, which causes element scripts to fail finding
modules when DIB was run from inside a venv.

This patch does the following:
1. Reverts 9c7b8d1714 which was the
   workaround for mixed python2/3 environments.
2. Updates the scripts to use "python3" instead of "python".

Change-Id: If2402bb02fc8a4778fa9434fa167ea1fafd87c28
2020-07-07 12:53:51 -07:00

86 lines
2.8 KiB
Python
Executable file

#!/usr/bin/env python3
#
# 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 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 source.items():
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 = yaml.safe_load(os.environ.get("IMAGE_ELEMENT_YAML"))
service_names = dict()
for element, path in elements.items():
data_path = os.path.join(path, "svc-map")
if os.path.exists(data_path):
with open(data_path, 'r') as dataFile:
data = yaml.safe_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()