From 5548d3b9642e7830354b3d00778a96ad8eab7c77 Mon Sep 17 00:00:00 2001 From: Nolan Brubaker Date: Tue, 1 Nov 2016 16:26:41 -0400 Subject: [PATCH] Add command to create consolidated AIO config With the AIO configuration spread amongst several different files, it may be hard to see how they fit together. This command provides a way to generate a single, combined configuration to see what it would look like prior to being fed to the dynamic inventory. Also, it can serve as a starting point for projects working on OSA integration. A new script, gen-config.py, is introduced to expose this functionality to end users. Parent-Id: I577cdbf4aadfcce846412edd7e2a394c257c0243 Change-Id: I4ffa621e72483957bbce0057b05a9e5b33d27b7c --- lib/tools.py | 53 +++++++++++++++++++++++++++++++++ scripts/gen-config.py | 65 +++++++++++++++++++++++++++++++++++++++++ tests/test_inventory.py | 14 ++------- 3 files changed, 121 insertions(+), 11 deletions(-) create mode 100644 lib/tools.py create mode 100755 scripts/gen-config.py diff --git a/lib/tools.py b/lib/tools.py new file mode 100644 index 0000000000..3172cb9a87 --- /dev/null +++ b/lib/tools.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python +# Copyright 2016, Rackspace US, Inc. +# +# 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. +# +# (c) 2016, Nolan Brubaker +import glob +import os +from os import path +import yaml + +CONFIGS_DIR = path.join(os.getcwd(), 'etc', 'openstack_deploy') +AIO_CONFIG_FILE = path.join(CONFIGS_DIR, 'openstack_user_config.yml.aio') +CONFD = path.join(CONFIGS_DIR, 'conf.d') + + +def make_example_config(aio_config_file, configs_dir): + """Build an inventory configuration based on example AIO files + + :param aio_config_file: ``str`` Master AIO configuration example file + :param configs_dir: ``str`` Directory containing independent conf.d files + """ + config = {} + + files = glob.glob(os.path.join(configs_dir, '*.aio')) + for file_name in files: + with open(file_name, 'r') as f: + config.update(yaml.safe_load(f.read())) + + with open(aio_config_file, 'r') as f: + config.update(yaml.safe_load(f.read())) + + return config + + +def write_example_config(filename, config): + """Dump generated configuration to a file. + + :param filename: ``str`` The filename which to write to. + :param config: ``dict`` Dictionary containing the config which to write. + """ + with open(os.path.realpath(filename), 'w') as f: + f.write(yaml.dump(config, default_flow_style=False)) diff --git a/scripts/gen-config.py b/scripts/gen-config.py new file mode 100755 index 0000000000..c222c8d75d --- /dev/null +++ b/scripts/gen-config.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python +# +# Copyright 2016, Rackspace US, Inc. +# +# 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. +# +# (c) 2014, Nolan Brubaker +import argparse +import os +import sys + +cwd = os.path.abspath(os.path.dirname(__file__)) +import_path = os.path.join(cwd, '..', 'lib') +sys.path.append(import_path) + +import tools + + +def args(arg_list): + parser = argparse.ArgumentParser( + usage='%(prog)s', + description='OpenStack Ansible Configuration Generator', + epilog='Licensed "Apache2.0"', + ) + + parser.add_argument( + '--base', + '-b', + help="Base file to be used.", + ) + + parser.add_argument( + '--conf_dir', + '-c', + help=("Directory of service-specific configuration files.\n" + "Only files ending in *.aio will be processed"), + ) + + parser.add_argument( + '--output', + '-o', + help=("Path to combined output file, defaults to " + "./openstack_user_config.yml"), + default=os.path.join(os.getcwd(), 'openstack_user_config.yml') + ) + + return vars(parser.parse_args(arg_list)) + +if __name__ == "__main__": + script_args = args(sys.argv[1:]) + config = tools.make_example_config( + script_args['base'], + script_args['conf_dir'] + ) + tools.write_example_config(script_args['output'], config) diff --git a/tests/test_inventory.py b/tests/test_inventory.py index aabdf0b4fd..bba0ca0486 100644 --- a/tests/test_inventory.py +++ b/tests/test_inventory.py @@ -2,7 +2,6 @@ import collections import copy -import glob import json import mock import os @@ -22,6 +21,7 @@ sys.path.append(path.join(os.getcwd(), INV_DIR)) import dynamic_inventory import filesystem as fs import generate as di +import tools TARGET_DIR = path.join(os.getcwd(), 'tests', 'inventory') BASE_ENV_DIR = INV_DIR @@ -58,18 +58,10 @@ def make_config(): """ # Allow access here so we can populate the dictionary. global _BASE_CONFIG - config = _BASE_CONFIG - files = glob.glob(os.path.join(CONFD, '*.aio')) - for file_name in files: - with open(file_name, 'r') as f: - config.update(yaml.safe_load(f.read())) + _BASE_CONFIG = tools.make_example_config(AIO_CONFIG_FILE, CONFD) - with open(AIO_CONFIG_FILE, 'r') as f: - config.update(yaml.safe_load(f.read())) - - with open(USER_CONFIG_FILE, 'w') as f: - f.write(yaml.dump(config)) + tools.write_example_config(USER_CONFIG_FILE, _BASE_CONFIG) def setUpModule():