#!/usr/bin/env python3 import argparse import yaml import subprocess import sys import os def convert_data(systemconfig): """ Converts system-config data """ if not isinstance(systemconfig['environment']['ssl']['root'], dict): print('system-config not in known format probably already converted') sys.exit(1) certificates = {} systemconfig['certificates'] = certificates newssl = {} for certtype, certinfo in systemconfig['environment']['ssl'].items(): newssl[certtype] = certinfo['name'] if certinfo['name'] in certificates: continue certdata = {} for filetype in ['key', 'crt']: path = '/var/ovc/ssl/{}.{}'.format(certinfo['name'], filetype) with open(path) as fd: certdata[filetype] = fd.read() certificates[certinfo['name']] = certdata systemconfig['environment']['ssl'] = newssl def migrate(dry_run, filepath): if filepath: with open(filepath, 'r') as fd: data = yaml.load(fd) else: config = subprocess.check_output(['kubectl', 'get', 'configmap', 'system-config', '-o', 'json']) data = yaml.load(yaml.load(config)['data']['system-config.yaml']) convert_data(data) if dry_run: sdata = yaml.safe_dump(data, encoding='utf-8', default_flow_style=False, default_style="|") print(sdata) else: if filepath: with open(filepath, 'w+') as fd: yaml.safe_dump(data, fd, encoding='utf-8', default_flow_style=False, default_style="|") else: proc = subprocess.Popen(['kubectl', 'create', 'configmap', 'system-config', '--dry-run', '--from-file=system-config.yaml=/dev/stdin', '-o', 'json'], stdin=subprocess.PIPE, stdout=subprocess.PIPE) applyproc = subprocess.Popen(['kubectl', 'apply', '-f', '-'], stdin=proc.stdout) yaml.safe_dump(data, proc.stdin, encoding='utf-8', default_flow_style=False, default_style="|") proc.stdin.close() proc.stdout.close() applyproc.communicate() if applyproc.returncode != 0: raise RuntimeError("Failed to apply converted config") if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('-d', '--dry-run', default=False, action='store_true') parser.add_argument('-f', '--file', default=None, help='If file is given file will be converted, if ommited kube configmap will be migrated') options = parser.parse_args() migrate(options.dry_run, options.file)