From 22184b7ca3f78808d8025bab5981ed92f8ad99f5 Mon Sep 17 00:00:00 2001 From: Scott Moser Date: Thu, 17 Jun 2010 22:22:39 -0400 Subject: make cloud-config modules configurable by cloud-config The list of cloud-config modules is now kept in cloud config itself. There is a builtin list in cloudinit, which is overrideable by /etc/cloud/cloud.cfg or user data cloud-config. This should make the modules more easily added or removed (as no code needs to be edited now) Basic summary of changes: - move CloudConfig.py -> cloudinit/CloudConfig/__init__.py - split cloud-config modules into their own files named cloudinit/CloudConfig/cc_.py - remove all the upstart/cloud-config-* scripts, replacing them with upstart/cloud-config.conf --- cloud-init-cfg.py | 65 +++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 54 insertions(+), 11 deletions(-) (limited to 'cloud-init-cfg.py') diff --git a/cloud-init-cfg.py b/cloud-init-cfg.py index 2ef9bb04..76f34ae0 100755 --- a/cloud-init-cfg.py +++ b/cloud-init-cfg.py @@ -28,7 +28,12 @@ def Usage(out = sys.stdout): def main(): # expect to be called with - # name freq [ args ] + # name [ args ] + # run the cloud-config job 'name' at with given args + # or + # read cloud config jobs from config (builtin -> system) + # and run all in order + if len(sys.argv) < 2: Usage(sys.stderr) sys.exit(1) @@ -40,8 +45,6 @@ def main(): log = logging.getLogger() log.info("cloud-init-cfg %s" % sys.argv[1:]) - cloud = cloudinit.CloudInit() - cfg_path = cloudinit.cloud_config cfg_env_name = cloudinit.cfg_env_name if os.environ.has_key(cfg_env_name): @@ -49,15 +52,55 @@ def main(): cc = cloudinit.CloudConfig.CloudConfig(cfg_path) - try: - cc.handle(name,run_args) - except: - import traceback - traceback.print_exc(file=sys.stderr) - sys.stderr.write("config handling of %s failed\n" % name) - sys.exit(1) + module_list = [ ] + if name == "all": + # create 'module_list', an array of arrays + # where array[0] = config + # array[1] = freq + # array[2:] = arguemnts + if "cloud_config_modules" in cc.cfg: + for item in cc.cfg["cloud_config_modules"]: + if isinstance(item,str): + module_list.append((item,)) + elif isinstance(item,list): + module_list.append(item) + else: + fail("Failed to parse cloud_config_modules",log) + else: + fail("No cloud_config_modules found in config",log) + else: + args = [ name, None ] + run_args + module_list.append = ( args ) + + failures = [] + for cfg_mod in module_list: + name = cfg_mod[0] + freq = None + run_args = [ ] + if len(cfg_mod) > 1: + freq = cfg_mod[1] + if len(cfg_mod) > 2: + run_args = cfg_mod[2:] + + try: + cc.handle(name, run_args, freq=freq) + except: + import traceback + traceback.print_exc(file=sys.stderr) + err("config handling of %s failed\n" % name,log) + failures.append(name) + sys.exit(len(failures)) + + sys.exit(len(failures)) + +def err(msg,log=None): + if log: + log.error(msg) + sys.stderr.write(msg + "\n") - sys.exit(0) +def fail(msg,log=None): + err(msg,log) + sys.exit(1) if __name__ == '__main__': main() -- cgit v1.2.3