From 08aacfd0ec2dcda519b4c7d97c03a47fe5cf8699 Mon Sep 17 00:00:00 2001 From: Liam Young Date: Thu, 12 Jul 2018 12:03:12 +0100 Subject: [PATCH] Allow model settings to be added or overridden --- doc/source/runningcharmtests.rst | 15 ++++++ .../test_zaza_charm_lifecycle_prepare.py | 51 +++++++++++++++++++ zaza/charm_lifecycle/prepare.py | 19 ++++++- 3 files changed, 84 insertions(+), 1 deletion(-) diff --git a/doc/source/runningcharmtests.rst b/doc/source/runningcharmtests.rst index 1e5ec7e..5ff51a0 100644 --- a/doc/source/runningcharmtests.rst +++ b/doc/source/runningcharmtests.rst @@ -19,6 +19,21 @@ application versions, topologies or config options. functest-run-suite will run through each phase listed below in order for each bundle that is to be tested. +0) Environment Variables +~~~~~~~~~~~~~~~~~~~~~~~~ + +Optionally setting the **MODEL_SETTINGS** environment variable allows model +settings to be applied to the models created by zaza to run tests in. The +settings will be applied on top of those set +**charm_lifecycle.prepare.MODEL_DEFAULTS** so it can be used to override any +default setting. + +**MODEL_SETTINGS** should be a list of key/value pairs delimited by +semicolon e.g.:: + + export MODEL_SETTINGS="virt-type=kvm;no-proxy=jujucharms.com" + + 1) Prepare ~~~~~~~~~~ diff --git a/unit_tests/test_zaza_charm_lifecycle_prepare.py b/unit_tests/test_zaza_charm_lifecycle_prepare.py index ad54f7b..8f817f4 100644 --- a/unit_tests/test_zaza_charm_lifecycle_prepare.py +++ b/unit_tests/test_zaza_charm_lifecycle_prepare.py @@ -1,11 +1,62 @@ +import copy +import mock + import zaza.charm_lifecycle.prepare as lc_prepare import unit_tests.utils as ut_utils class TestCharmLifecyclePrepare(ut_utils.BaseTestCase): + MODEL_CONFIG_DEFAULTS = lc_prepare.MODEL_DEFAULTS + + def base_get_model_settings(self, env, expect): + with mock.patch.dict(lc_prepare.os.environ, env): + self.assertEqual(lc_prepare.get_model_settings(), expect) + + def test_get_model_settings_no_config(self): + expect_config = copy.deepcopy(self.MODEL_CONFIG_DEFAULTS) + self.base_get_model_settings({}, expect_config) + + def test_get_model_settings_empty_config(self): + expect_config = copy.deepcopy(self.MODEL_CONFIG_DEFAULTS) + self.base_get_model_settings({'MODEL_SETTINGS': ''}, expect_config) + + def test_get_model_settings_single_value(self): + expect_config = copy.deepcopy(self.MODEL_CONFIG_DEFAULTS) + expect_config.update({'virt-type': 'kvm'}) + self.base_get_model_settings( + {'MODEL_SETTINGS': 'virt-type=kvm'}, + expect_config) + + def test_get_model_settings_multiple_values(self): + expect_config = copy.deepcopy(self.MODEL_CONFIG_DEFAULTS) + expect_config.update({ + 'virt-type': 'kvm', + 'no-proxy': 'jujucharms.com'}) + self.base_get_model_settings( + {'MODEL_SETTINGS': 'virt-type=kvm;no-proxy=jujucharms.com'}, + expect_config) + + def test_get_model_settings_multiple_values_override(self): + expect_config = copy.deepcopy(self.MODEL_CONFIG_DEFAULTS) + expect_config.update({'test-mode': 'false'}) + self.base_get_model_settings( + {'MODEL_SETTINGS': 'test-mode=false'}, + expect_config) + + def test_get_model_settings_whitespace(self): + expect_config = copy.deepcopy(self.MODEL_CONFIG_DEFAULTS) + expect_config.update({ + 'test-mode': 'false', + 'virt-type': 'kvm'}) + self.base_get_model_settings( + {'MODEL_SETTINGS': ' test-mode= false ; virt-type= kvm'}, + expect_config) + def test_prepare(self): self.patch_object(lc_prepare.zaza.controller, 'add_model') + self.patch_object(lc_prepare, 'get_model_settings') + self.get_model_settings.return_value = lc_prepare.MODEL_DEFAULTS lc_prepare.prepare('newmodel') self.add_model.assert_called_once_with( 'newmodel', diff --git a/zaza/charm_lifecycle/prepare.py b/zaza/charm_lifecycle/prepare.py index 900b4ef..8734d8b 100644 --- a/zaza/charm_lifecycle/prepare.py +++ b/zaza/charm_lifecycle/prepare.py @@ -1,6 +1,8 @@ """Run prepare phase.""" import argparse +import copy import logging +import os import sys import zaza.controller @@ -21,13 +23,28 @@ MODEL_DEFAULTS = { } +def get_model_settings(): + """Construct settings for model from defaults and env variables. + + :returns: Settings to usee for model + :rtype: Dict + """ + model_settings = copy.deepcopy(MODEL_DEFAULTS) + for setting in os.environ.get('MODEL_SETTINGS', '').split(';'): + if not setting: + continue + key, value = setting.split('=') + model_settings[key.strip()] = value.strip() + return model_settings + + def prepare(model_name): """Run all steps to prepare the environment before a functional test run. :param model: Name of model to add :type bundle: str """ - zaza.controller.add_model(model_name, config=MODEL_DEFAULTS) + zaza.controller.add_model(model_name, config=get_model_settings()) def parse_args(args):