From f23d273ee8eea2b377648e92217338242447cd8b Mon Sep 17 00:00:00 2001 From: Yuriy Taraday Date: Mon, 29 Aug 2016 22:07:16 +0300 Subject: [PATCH] Fetch transformations configuration from Nailgun settings Change-Id: Ic03f729c738745ff18c849cb4f3a4b5b8d3fe90c Closes-Bug: #1618177 --- README.rst | 53 +++++++++++++++++-- cluster_upgrade/tests/test_transformations.py | 36 ++++++++++--- cluster_upgrade/transformations/__init__.py | 14 +++-- 3 files changed, 91 insertions(+), 12 deletions(-) diff --git a/README.rst b/README.rst index e8a886c..76e808d 100644 --- a/README.rst +++ b/README.rst @@ -6,6 +6,53 @@ cluster upgrading. This extension used by the fuel-octane project. Instalation ----------- -After installing `fuel-nailgun-extension-cluster-upgrade` package run: -1) `nailgun_syncdb` - migrate database -2) restart nailgun service +After installing ``fuel-nailgun-extension-cluster-upgrade`` package run: + #. ``nailgun_syncdb`` - migrate database + #. restart nailgun service + +Transformer configuration +------------------------- + +Every transformation manager has default config that hardcoded, but +you can overwrite this config with your own transformations +extensions. This could be done by extending ``nailgun/settings.yaml`` +file. + +**Example** + +:: + CLUSTER_UPGRADE: + transformations: + cluster: + 7.0: [transform_vips] + 9.0: [first_transformation, second_transformation] + + ... + +In extension you should define a entrypoint is such way: + +:: + nailgun.cluster_upgrade.transformations.cluster.7.0 = + transform_vips = my_project.transformations:transform_cluster_vips + +on first line we have entripoint name where +* ``nailgun.cluster_upgrade.transformations`` - namespace where all + transformations defined. +* ``cluster`` - name of object which data transformed +* ``7.0`` - cluster version where these transformations should happen + +on the second line +* ``transform_vips`` - unique transformation name that you can use in + configuration file or in transformation manager +* ``my_project.transformations`` - module name +* ``transform_cluster_vips`` - transformer function name + + +Transformation function must take only one argument - data to +transform. When you call ``manager.apply(from_version, to_version, +data)`` all transformer functions ordered by a version called one by +one, and output of one transformer used as input to the other. + +In out example calling ``cluster_manager.apply('6.0', '9.1', data)`` +will call three functions ``transform_vips``, +``first_transformation``, ``second_transformation``. diff --git a/cluster_upgrade/tests/test_transformations.py b/cluster_upgrade/tests/test_transformations.py index 880ee2d..f970702 100644 --- a/cluster_upgrade/tests/test_transformations.py +++ b/cluster_upgrade/tests/test_transformations.py @@ -21,13 +21,36 @@ from ..transformations import cluster class TestTransformations(nailgun_test_base.BaseUnitTest): - def test_get_config(self): - config = object() - + def _test_get_config(self, def_config, settings, expected_result): class Manager(transformations.Manager): - default_config = config + default_config = def_config - self.assertIs(config, Manager.get_config('testname')) + with mock.patch("nailgun.settings.settings.config", new=settings): + result = Manager.get_config('testname') + + self.assertEqual(expected_result, result) + + @staticmethod + def _trans_settings(config): + return {'CLUSTER_UPGRADE': {'transformations': {'testname': config}}} + + def test_get_config_default(self): + config = {'9.0': []} + self._test_get_config(config, {}, config) + + def test_get_config_no_overwrite(self): + self._test_get_config( + {'9.0': ['a']}, + self._trans_settings({'8.0': ['b']}), + {'8.0': ['b'], '9.0': ['a']}, + ) + + def test_get_config_overwrite(self): + self._test_get_config( + {'9.0': ['a']}, + self._trans_settings({'8.0': ['b'], '9.0': ['c']}), + {'8.0': ['b'], '9.0': ['c']}, + ) def setup_extension_manager(self, extensions): p = mock.patch("stevedore.ExtensionManager", spec=['__call__']) @@ -153,8 +176,9 @@ class TestTransformations(nailgun_test_base.BaseUnitTest): ), ]) + @mock.patch.object(transformations.Manager, 'get_config') @mock.patch.object(transformations.Manager, 'load_transformers') - def test_apply(self, mock_load): + def test_apply(self, mock_load, mock_config): mock_trans = mock.Mock() mock_load.return_value = [ (version.StrictVersion('7.0'), [mock_trans.a, mock_trans.b]), diff --git a/cluster_upgrade/transformations/__init__.py b/cluster_upgrade/transformations/__init__.py index 7e1d861..b7d33af 100644 --- a/cluster_upgrade/transformations/__init__.py +++ b/cluster_upgrade/transformations/__init__.py @@ -15,10 +15,12 @@ import distutils.version import logging import threading -import six +import six import stevedore +from nailgun.settings import settings + LOG = logging.getLogger(__name__) @@ -37,8 +39,14 @@ class Manager(object): @classmethod def get_config(cls, name): - # TODO(yorik-sar): merge actual config with defaults - return cls.default_config + res = cls.default_config.copy() + try: + conf = settings.config['CLUSTER_UPGRADE']['transformations'][name] + except KeyError: + pass + else: + res.update(conf) + return res @staticmethod def load_transformers(name, config):