mooli tayer has uploaded a new change for review. Change subject: vdsm-tool: suppoort dependencies between ModuleConfigure ......................................................................
vdsm-tool: suppoort dependencies between ModuleConfigure Change-Id: Ibf63ce9aa3ca8edb82091d09b976e8e23896524e Signed-off-by: Mooli Tayer <[email protected]> --- M lib/vdsm/tool/configurator.py M lib/vdsm/tool/configurators/__init__.py M tests/toolTests.py 3 files changed, 126 insertions(+), 9 deletions(-) git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/23/31423/1 diff --git a/lib/vdsm/tool/configurator.py b/lib/vdsm/tool/configurator.py index 50bdc53..608dbbf 100644 --- a/lib/vdsm/tool/configurator.py +++ b/lib/vdsm/tool/configurator.py @@ -31,7 +31,7 @@ sanlock -__configurers = ( +_configurers = ( libvirt.Libvirt(), sanlock.Sanlock(), ) @@ -48,7 +48,7 @@ configurer_to_trigger = [] sys.stdout.write("\nChecking configuration status...\n\n") - for c in __configurers: + for c in _configurers: if c.getName() in args.modules: isconfigured = c.isconfigured() override = args.force and isconfigured != CONFIGURED @@ -74,7 +74,7 @@ for s in services: service.service_stop(s) - sys.stdout.write("\nRunning configure...\n") + sys.stdout.write("\nRunning configure on:%s...\n") for c in configurer_to_trigger: c.configure() sys.stdout.write("Reconfiguration of %s is done.\n" % (c.getName(),)) @@ -95,7 +95,7 @@ args = _parse_args(*args) m = [ - c.getName() for c in __configurers + c.getName() for c in _configurers if c.getName() in args.modules and c.isconfigured() == NOT_CONFIGURED ] @@ -132,7 +132,7 @@ args = _parse_args(*args) m = [ - c.getName() for c in __configurers + c.getName() for c in _configurers if c.getName() in args.modules and not c.validate() ] @@ -153,8 +153,8 @@ """ args = _parse_args(*args) failed = False - for c in __configurers: - if c.getName() in args.modules: + for c in _configurers: + if c.getName() in reversed(args.modules): try: c.removeConf() sys.stderr.write( @@ -173,9 +173,36 @@ raise InvalidRun("Remove configuration failed") +def _add_dependencies(modules): + with_dep = set(modules) + for c in _configurers: + if c.getName() in modules: + with_dep.update(c.requires()) + return list(with_dep) + + +def _sort_modules(modules): + sortedModules = [] + while modules: + foundNext = False + + for c in _configurers: + if c.getName() in modules: + if not c.requires() or c.requires().issubset(sortedModules): + foundNext = True + modules.remove(c.getName()) + sortedModules.append(c.getName()) + break + + if not foundNext: + raise RuntimeError("Dependency circle found!") + + return sortedModules + + def _parse_args(action, *args): parser = argparse.ArgumentParser('vdsm-tool %s' % (action)) - allModules = [n.getName() for n in __configurers] + allModules = [n.getName() for n in _configurers] parser.add_argument( '--module', dest='modules', @@ -199,6 +226,13 @@ help='Force configuration, trigger services restart', ) args = parser.parse_args(args) + if not args.modules: args.modules = allModules + else: + # add dependencies + args.modules = _add_dependencies(args.modules) + + args.modules = _sort_modules(args.modules) + return args diff --git a/lib/vdsm/tool/configurators/__init__.py b/lib/vdsm/tool/configurators/__init__.py index 41bc1d0..ef379ab 100644 --- a/lib/vdsm/tool/configurators/__init__.py +++ b/lib/vdsm/tool/configurators/__init__.py @@ -64,3 +64,6 @@ def removeConf(self): pass + + def requires(self): + return set() diff --git a/tests/toolTests.py b/tests/toolTests.py index ad08ba8..c80cc7c 100644 --- a/tests/toolTests.py +++ b/tests/toolTests.py @@ -17,7 +17,11 @@ # # Refer to the README and COPYING files for full details of the license # -from vdsm.tool.configurators import NOT_CONFIGURED, NOT_SURE +from vdsm.tool import configurator +from vdsm.tool.configurators import \ + ModuleConfigure, \ + NOT_CONFIGURED,\ + NOT_SURE from vdsm.tool.configurators.configfile import ConfigFile, ParserWrapper from vdsm.tool.configurators.libvirt import Libvirt from vdsm.tool import upgrade @@ -31,6 +35,82 @@ dirName = os.path.dirname(os.path.realpath(__file__)) +class MockModuleConfigurator(ModuleConfigure): + + def __init__(self, name, dependencies): + self._name = name + self._dependencies = dependencies + + def getName(self): + return self._name + + def requires(self): + return self._dependencies + + +class ConfiguratorTests(TestCase): + + @monkeypatch.MonkeyPatch( + configurator, + '_configurers', + ( + MockModuleConfigurator('a', set('b')), + MockModuleConfigurator('b', set('a')) + ) + ) + def testDependencyCircle(self): + self.assertRaises( + RuntimeError, + configurator._parse_args, + 'validate-config' + ) + + @monkeypatch.MonkeyPatch( + configurator, + '_configurers', + ( + MockModuleConfigurator('a', {'b', 'c'}), + MockModuleConfigurator('b', {'c'}), + MockModuleConfigurator('c', set()) + ) + ) + def testNormalDependencies(self): + self.assertEqual( + configurator._parse_args('validate-config').modules, + ['c', 'b', 'a'] + ) + + @monkeypatch.MonkeyPatch( + configurator, + '_configurers', + ( + MockModuleConfigurator('a', set()), + MockModuleConfigurator('b', set()), + MockModuleConfigurator('c', set()) + ) + ) + def testNoDependencies(self): + configurator._parse_args('validate-config').modules + + @monkeypatch.MonkeyPatch( + configurator, + '_configurers', + ( + MockModuleConfigurator('a', {'b', 'c'}), + MockModuleConfigurator('b', set()), + MockModuleConfigurator('c', set()) + ) + ) + def testDependenciesAddition(self): + modules = configurator._parse_args( + 'validate-config', + '--module=a' + ).modules + self.assertTrue('a' in modules) + self.assertTrue('b' in modules) + self.assertTrue('c' in modules) + + class LibvirtModuleConfigureTests(TestCase): test_env = {} -- To view, visit http://gerrit.ovirt.org/31423 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ibf63ce9aa3ca8edb82091d09b976e8e23896524e Gerrit-PatchSet: 1 Gerrit-Project: vdsm Gerrit-Branch: master Gerrit-Owner: mooli tayer <[email protected]> _______________________________________________ vdsm-patches mailing list [email protected] https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches
