From dc5e7116e663d3b5cad165fcac8b3141f8ffbc05 Mon Sep 17 00:00:00 2001 From: Scott Moser Date: Wed, 26 Jan 2011 18:43:50 +0000 Subject: rework of DataSource loading. The DataSources that are loaded are now controlled entirely via configuration file of 'datasource_list', like: datasource_list: [ "NoCloud", "OVF", "Ec2" ] Each item in that list is a "DataSourceCollection". for each item in the list, cloudinit will attempt to load: cloudinit.DataSource and, failing that, DataSource The module is required to have a method named 'get_datasource_list' in it that takes a single list of "dependencies" and returns a list of python classes inside the collection that can run needing only those dependencies. The dependencies are defines in DataSource.py. Currently: DEP_FILESYSTEM = "FILESYSTEM" DEP_NETWORK = "NETWORK" When 'get_datasource_list' is called for the DataSourceOVF module with [DEP_FILESYSTEM], then DataSourceOVF returns a single item list with a reference to the 'DataSourceOVF' class. When 'get_datasource_list' is called for the DataSourceOVF module with [DEP_FILESYSTEM, DEP_NETWORK], it will return a single item list with a reference to 'DataSourceOVFNet'. cloudinit will then instanciate the class and call its 'get_data' method. if the get_data method returns 'True', then it selects this class as the selected Datasource. --- cloud-init.py | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) (limited to 'cloud-init.py') diff --git a/cloud-init.py b/cloud-init.py index 92d8a091..0902d966 100755 --- a/cloud-init.py +++ b/cloud-init.py @@ -23,6 +23,7 @@ import sys import cloudinit import cloudinit.util as util import cloudinit.CloudConfig as CC +import cloudinit.DataSource as ds import time import logging import errno @@ -32,10 +33,19 @@ def warn(wstr): def main(): cmds = ( "start", "start-local" ) + deps = { "start" : ( ds.DEP_FILESYSTEM, ds.DEP_NETWORK ), + "start-local" : ( ds.DEP_FILESYSTEM, ) } + cmd = "" if len(sys.argv) > 1: cmd = sys.argv[1] + cfg_path = None + if len(sys.argv) > 2: + # this is really for debugging only + # but you can invoke on development system with ./config/cloud.cfg + cfg_path = sys.argv[2] + if not cmd in cmds: sys.stderr.write("bad command %s. use one of %s\n" % (cmd, cmds)) sys.exit(1) @@ -49,12 +59,17 @@ def main(): warn("unable to open /proc/uptime\n") uptime = "na" - source_type = "all" - if cmd == "start-local": - source_type = "local" + try: + cfg = cloudinit.get_base_cfg(cfg_path) + except Exception as e: + warn("Failed to get base config. falling back to builtin: %s\n" % e) + try: + cfg = cloudinit.get_builtin_cfg() + except Exception as e: + warn("Unable to load builtin config\n") + raise try: - cfg = cloudinit.get_base_cfg() (outfmt, errfmt) = CC.get_output_cfg(cfg,"init") CC.redirect_output(outfmt, errfmt) except Exception as e: @@ -80,7 +95,7 @@ def main(): if cmd == "start-local": cloudinit.purge_cache() - cloud = cloudinit.CloudInit(source_type=source_type) + cloud = cloudinit.CloudInit(ds_deps=deps[cmd]) try: cloud.get_data_source() -- cgit v1.2.3