Allow model settings to be added or overridden

This commit is contained in:
Liam Young
2018-07-12 12:03:12 +01:00
parent fcac054d85
commit 08aacfd0ec
3 changed files with 84 additions and 1 deletions

View File

@@ -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
~~~~~~~~~~

View File

@@ -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',

View File

@@ -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):