From: Jelte Jansen Date: Thu, 19 Apr 2012 13:12:51 +0000 (+0200) Subject: [1843] move command_sets/execute initialization X-Git-Tag: trac2351_base~226^2~116^2~8^2~5 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=53a7c709b06e670dacf81907a7360ea030341b1d;p=thirdparty%2Fkea.git [1843] move command_sets/execute initialization to command_sets, so that all setup is done in one file and not 3 --- diff --git a/src/bin/bindctl/bindcmd.py b/src/bin/bindctl/bindcmd.py index 64ff878130..8952158d83 100644 --- a/src/bin/bindctl/bindcmd.py +++ b/src/bin/bindctl/bindcmd.py @@ -64,7 +64,6 @@ except ImportError: CSV_FILE_NAME = 'default_user.csv' CONFIG_MODULE_NAME = 'config' -EXECUTE_MODULE_NAME = 'execute' CONST_BINDCTL_HELP = """ usage: [param1 = value1 [, param2 = value2]] Type Tab character to get the hint of module/command/parameters. @@ -398,7 +397,7 @@ class BindCmdInterpreter(Cmd): # Convert parameter value according parameter spec file. # Ignore check for commands belongs to module 'config' or 'execute if cmd.module != CONFIG_MODULE_NAME and\ - cmd.module != EXECUTE_MODULE_NAME: + cmd.module != command_sets.EXECUTE_MODULE_NAME: for param_name in cmd.params: param_spec = command_info.get_param_with_name(param_name).param_spec try: @@ -413,7 +412,7 @@ class BindCmdInterpreter(Cmd): self._handle_help(cmd) elif cmd.module == CONFIG_MODULE_NAME: self.apply_config_cmd(cmd) - elif cmd.module == EXECUTE_MODULE_NAME: + elif cmd.module == command_sets.EXECUTE_MODULE_NAME: self.apply_execute_cmd(cmd) else: self.apply_cmd(cmd) @@ -749,8 +748,8 @@ class BindCmdInterpreter(Cmd): except IOError as ioe: print("Error: " + str(ioe)) return - elif command.command == 'init_authoritative_server': - commands = command_sets.init_auth_server + elif command_sets.has_command_set(command.command): + commands = command_sets.get_commands(command.command) else: # Should not be reachable; parser should've caught this raise Exception("Unknown execute command type " + command.command) diff --git a/src/bin/bindctl/bindctl_main.py.in b/src/bin/bindctl/bindctl_main.py.in index 25a3a446ce..c2e4cece3f 100755 --- a/src/bin/bindctl/bindctl_main.py.in +++ b/src/bin/bindctl/bindctl_main.py.in @@ -25,6 +25,7 @@ from bindctl.bindcmd import * import pprint from optparse import OptionParser, OptionValueError import isc.util.process +import command_sets isc.util.process.rename() @@ -103,33 +104,6 @@ def prepare_config_commands(tool): tool.add_module_info(module) -def prepare_execute_commands(tool): - # common parameter - param_show = ParamInfo(name="show", type="string", optional=True, - desc="Show the list of commands without executing them") - - # The command module - module = ModuleInfo(name=EXECUTE_MODULE_NAME, - desc="Execute a given set of commands") - - # Command to execute a file - cmd = CommandInfo(name="file", desc="Read commands from file") - param = ParamInfo(name="filename", type="string", optional=False, - desc="File to read the set of commands from.") - cmd.add_param(param) - cmd.add_param(param_show) - module.add_command(cmd) - - cmd = CommandInfo(name="init_authoritative_server", desc= - "Configure and run a basic Authoritative server, with default " - "SQLite3 backend, and xfrin and xfrout functionality") - cmd.add_param(param_show) - cmd.add_param(ParamInfo(name="show", type="string", optional=True, - desc="Show the list of commands without executing them")) - module.add_command(cmd) - - tool.add_module_info(module) - def check_port(option, opt_str, value, parser): if (value < 0) or (value > 65535): raise OptionValueError('%s requires a port number (0-65535)' % opt_str) @@ -173,6 +147,6 @@ if __name__ == '__main__': tool = BindCmdInterpreter(server_addr, pem_file=options.cert_chain, csv_file_dir=options.csv_file_dir) prepare_config_commands(tool) - prepare_execute_commands(tool) + command_sets.prepare_execute_commands(tool) result = tool.run() sys.exit(result) diff --git a/src/bin/bindctl/command_sets.py b/src/bin/bindctl/command_sets.py index 798e4934b3..7e9e437633 100644 --- a/src/bin/bindctl/command_sets.py +++ b/src/bin/bindctl/command_sets.py @@ -16,25 +16,77 @@ # This file provides a built-in set of 'execute' commands, for common # functions, such as adding an initial auth server # These sets must have an associated CommandInfo defined in -# bindctl_main.py.in, in prepare_execute_commands - -init_auth_server = [ -'!echo adding Authoritative server component', -'config add /Boss/components b10-auth', -'config set /Boss/components/b10-auth/kind needed', -'config set /Boss/components/b10-auth/special auth', -'!echo adding Xfrin component', -'config add /Boss/components b10-xfrin', -'config set /Boss/components/b10-xfrin/address Xfrin', -'config set /Boss/components/b10-xfrin/kind dispensable', -'!echo adding Xfrout component', -'config add /Boss/components b10-xfrout', -'config set /Boss/components/b10-xfrout/address Xfrout', -'config set /Boss/components/b10-xfrout/kind dispensable', -'!echo adding Zone Manager component', -'config add /Boss/components b10-zonemgr', -'config set /Boss/components/b10-zonemgr/address Zonemgr', -'config set /Boss/components/b10-zonemgr/kind dispensable', -'!echo Components added. Please enter "config commit" to finalize initial'+ -' setup and run the components.' -] +# bindctl_main.py.in, in prepare_execute_commands, and +# a handler in + +from bindctl.moduleinfo import * +# The name of the 'virtual' command set execution module in bindctl +EXECUTE_MODULE_NAME = 'execute' + +# This is a map of command names to lists +command_sets = { + 'init_authoritative_server': { + 'description': + 'Configure and run a basic Authoritative server, with default '+ + 'SQLite3 backend, and xfrin and xfrout functionality', + 'commands': + [ + '!echo adding Authoritative server component', + 'config add /Boss/components b10-auth', + 'config set /Boss/components/b10-auth/kind needed', + 'config set /Boss/components/b10-auth/special auth', + '!echo adding Xfrin component', + 'config add /Boss/components b10-xfrin', + 'config set /Boss/components/b10-xfrin/address Xfrin', + 'config set /Boss/components/b10-xfrin/kind dispensable', + '!echo adding Xfrout component', + 'config add /Boss/components b10-xfrout', + 'config set /Boss/components/b10-xfrout/address Xfrout', + 'config set /Boss/components/b10-xfrout/kind dispensable', + '!echo adding Zone Manager component', + 'config add /Boss/components b10-zonemgr', + 'config set /Boss/components/b10-zonemgr/address Zonemgr', + 'config set /Boss/components/b10-zonemgr/kind dispensable', + '!echo Components added. Please enter "config commit" to finalize'+ + 'initial setup and run the components.' + ] + } +} + +def has_command_set(name): + return name in command_sets + +def get_commands(name): + return command_sets[name]['commands'] + +def get_description(name): + return command_sets[name]['description'] + +# For each +def prepare_execute_commands(tool): + """This function is called by bindctl_main, and sets up the commands + defined here for use in bindctl.""" + # common parameter + param_show = ParamInfo(name="show", type="string", optional=True, + desc="Show the list of commands without executing them") + + # The command module + module = ModuleInfo(name=EXECUTE_MODULE_NAME, + desc="Execute a given set of commands") + + # Command to execute a file + cmd = CommandInfo(name="file", desc="Read commands from file") + param = ParamInfo(name="filename", type="string", optional=False, + desc="File to read the set of commands from.") + cmd.add_param(param) + cmd.add_param(param_show) + module.add_command(cmd) + + # and loop through all command sets defined above + for name in command_sets: + cmd = CommandInfo(name=name, desc=get_description(name)) + cmd.add_param(param_show) + module.add_command(cmd) + + tool.add_module_info(module) + diff --git a/src/lib/python/isc/config/tests/config_data_test.py b/src/lib/python/isc/config/tests/config_data_test.py index 864fe708ed..c295c760c5 100644 --- a/src/lib/python/isc/config/tests/config_data_test.py +++ b/src/lib/python/isc/config/tests/config_data_test.py @@ -420,7 +420,14 @@ class TestMultiConfigData(unittest.TestCase): self.mcd.set_value("Spec2/item1", 2) local_changes = self.mcd.get_local_changes() self.assertEqual({"Spec2": { "item1": 2}}, local_changes) - + + def test_set_local_changes(self): + module_spec = isc.config.module_spec_from_file(self.data_path + os.sep + "spec2.spec") + self.mcd.set_specification(module_spec) + self.assertEqual({}, self.mcd.get_local_changes()) + new_local_changes = {"Spec2": { "item1": 2}} + self.mcd.set_local_changes(new_local_changes) + self.assertEqual(new_local_changes, self.mcd.get_local_changes()) def test_clear_local_changes(self): module_spec = isc.config.module_spec_from_file(self.data_path + os.sep + "spec2.spec")