Move base environment directory to an argument

In preparation for moving the current code into a new file but retaining
the existing dynamic_inventory.py entry-point, this change modifies the
main function so that can generate inventory without having to be in the
same directory as the env.d dir.

An initial attempt to move the `main` function of dynamic_inventory into a
structure like this:

    playbooks/
        inventory/
            env.d/
                <env files>
            dynamic_inventory.py
            lib/
                generate.py (contents of dynamic_inventory moved here)

resulted in errors when trying to access env.d due to using
os.path.join(__file__) inside the function. Also, incorporating this
change with the move would have resulted in a harder-to-review patch.

Instead, the `args` function will be left inside of dynamic_inventory.py
when `main` is moved out, so that the CLI-facing code is grouped
together.

Since the base environment was moved to a command line argument,
documentation was added as to its function, as well as the differences
from the --config argument.

As a side effect, this opens the door to running tests with multiple
environment layouts. However, none is added with this review.

Change-Id: Ie690f31b64c7381257634a9dbb2ee5b4197fd9bf
This commit is contained in:
Nolan Brubaker 2016-09-23 18:18:38 -04:00
parent ca7df2fa3f
commit 57fef57868
3 changed files with 36 additions and 8 deletions

View File

@ -35,12 +35,17 @@ This invocation is useful when testing changes to the dynamic inventory script.
Inputs
^^^^^^
The ``dynamic_inventory.py`` script takes a single argument, ``--config``. If
not specified, the default is ``/etc/openstack_deploy/``.
The ``dynamic_inventory.py`` takes the ``--config`` argument for the directory
holding configuration from which to create the inventory. If not specified,
the default is ``/etc/openstack_deploy/``.
In addition to this argument, the base environment skeleton is provided in the
``playbooks/inventory/env.d`` directory of the OpenStack-Ansible codebase.
Should an ``env.d`` directory be found in the directory specified by
``--config``, it's contents will be added to the base environment, overriding
any previous contents in the event of conflicts.
.. note:: In all versions prior to |previous_release_formal_name|, this argument was ``--file``.
The following file must be present in the configuration directory:
@ -101,6 +106,17 @@ The same JSON structure is printed to stdout, which is consumed by Ansible as
the inventory for the playbooks.
Changing the Base Environment Directory
---------------------------------------
The ``--environment/-e`` argument will take the path to a directory containing
an ``env.d`` directory. This defaults to ``playbooks/inventory/`` in the
OpenStack-Ansible codebase.
Contents of this directory are populated into the environment *before* the
``env.d`` found in the directory specified by ``--config``.
Checking Inventory Configuration for Errors
-------------------------------------------

View File

@ -158,6 +158,15 @@ def args(arg_list):
default=False,
)
parser.add_argument(
'-e',
'--environment',
help=('Directory that contains the base env.d directory.\n'
'Defaults to <OSA_ROOT>/playbooks/inventory/.'),
required=False,
default=os.path.dirname(__file__),
)
return vars(parser.parse_args(arg_list))
@ -1166,7 +1175,7 @@ def get_inventory(config_path, inventory_file_path):
return dynamic_inventory
def main(config=None, check=False, debug=False, **kwargs):
def main(config=None, check=False, debug=False, environment=None, **kwargs):
"""Run the main application.
:param config: ``str`` Directory from which to pull configs and overrides
@ -1175,6 +1184,7 @@ def main(config=None, check=False, debug=False, **kwargs):
:param kwargs: ``dict`` Dictionary of arbitrary arguments; mostly for
catching Ansible's required `--list` parameter without name shadowing
the `list` built-in.
:param environment: ``str`` Directory containing the base env.d
"""
if debug:
log_fmt = "%(lineno)d - %(funcName)s: %(message)s"
@ -1188,8 +1198,8 @@ def main(config=None, check=False, debug=False, **kwargs):
)
user_defined_config = load_user_configuration(config_path)
base_env = load_environment(os.path.dirname(__file__), {})
base_env_dir = environment
base_env = load_environment(base_env_dir, {})
environment = load_environment(config_path, base_env)
# Load existing inventory file if found

View File

@ -91,7 +91,8 @@ def get_inventory(clean=True, extra_args=None):
"Return the inventory mapping in a dict."
# Use the list argument to more closely mirror
# Ansible's use of the callable.
args = {'config': TARGET_DIR, 'list': True}
args = {'config': TARGET_DIR, 'list': True,
'environment': BASE_ENV_DIR}
if extra_args:
args.update(extra_args)
try:
@ -1108,14 +1109,15 @@ class TestConfigCheckFunctional(TestConfigCheckBase):
self.user_defined_config['log_hosts']['bogus'] = ip
def test_checking_good_config(self):
output = di.main(config=TARGET_DIR, check=True)
output = di.main(config=TARGET_DIR, check=True,
environment=BASE_ENV_DIR)
self.assertEqual(output, 'Configuration ok!')
def test_duplicated_ip(self):
self.duplicate_ip()
self.write_config()
with self.assertRaises(di.MultipleHostsWithOneIPError) as context:
di.main(config=TARGET_DIR, check=True)
di.main(config=TARGET_DIR, check=True, environment=BASE_ENV_DIR)
self.assertEqual(context.exception.ip, '172.29.236.100')