diff options
-rw-r--r-- | Makefile | 5 | ||||
-rw-r--r-- | cloudinit/config/cc_grub_dpkg.py | 8 | ||||
-rw-r--r-- | cloudinit/helpers.py | 82 | ||||
-rw-r--r-- | cloudinit/sources/DataSourceOVF.py | 2 | ||||
-rw-r--r-- | cloudinit/stages.py | 59 | ||||
-rw-r--r-- | cloudinit/util.py | 2 | ||||
-rwxr-xr-x | tools/run-pep8 | 28 | ||||
-rwxr-xr-x | tools/run-pylint | 13 |
8 files changed, 135 insertions, 64 deletions
@@ -4,6 +4,9 @@ PY_FILES+="bin/cloud-init" all: test +pep8: + $(CWD)/tools/run-pep8 $(PY_FILES) + pylint: $(CWD)/tools/run-pylint $(PY_FILES) @@ -20,5 +23,5 @@ clean: rm -rf /var/log/cloud-init.log \ /var/lib/cloud/ -.PHONY: test pylint pyflakes 2to3 clean +.PHONY: test pylint pyflakes 2to3 clean pep8 diff --git a/cloudinit/config/cc_grub_dpkg.py b/cloudinit/config/cc_grub_dpkg.py index 02f05ce3..b3ce6fb6 100644 --- a/cloudinit/config/cc_grub_dpkg.py +++ b/cloudinit/config/cc_grub_dpkg.py @@ -37,14 +37,14 @@ def handle(_name, cfg, _cloud, log, _args): if ((os.path.exists("/dev/sda1") and not os.path.exists("/dev/sda")) or (os.path.exists("/dev/xvda1") and not os.path.exists("/dev/xvda"))): - if idevs == None: + if idevs is None: idevs = "" - if idevs_empty == None: + if idevs_empty is None: idevs_empty = "true" else: - if idevs_empty == None: + if idevs_empty is None: idevs_empty = "false" - if idevs == None: + if idevs is None: idevs = "/dev/sda" for dev in ("/dev/sda", "/dev/vda", "/dev/sda1", "/dev/vda1"): if os.path.exists(dev): diff --git a/cloudinit/helpers.py b/cloudinit/helpers.py index 7a2ac6b8..0f86285f 100644 --- a/cloudinit/helpers.py +++ b/cloudinit/helpers.py @@ -28,7 +28,8 @@ import os from ConfigParser import (NoSectionError, NoOptionError, RawConfigParser) -from cloudinit.settings import (PER_INSTANCE, PER_ALWAYS, PER_ONCE) +from cloudinit.settings import (PER_INSTANCE, PER_ALWAYS, PER_ONCE, + CFG_ENV_NAME) from cloudinit import log as logging from cloudinit import util @@ -176,6 +177,85 @@ class Runners(object): return (True, results) +class ConfigMerger(object): + def __init__(self, paths=None, datasource=None, + additional_fns=None, base_cfg=None): + self._paths = paths + self._ds = datasource + self._fns = additional_fns + self._base_cfg = base_cfg + # Created on first use + self._cfg = None + + def _get_datasource_configs(self): + d_cfgs = [] + if self._ds: + try: + ds_cfg = self._ds.get_config_obj() + if ds_cfg and isinstance(ds_cfg, (dict)): + d_cfgs.append(ds_cfg) + except: + util.logexc(LOG, ("Failed loading of datasource" + " config object from %s"), self._ds) + return d_cfgs + + def _get_env_configs(self): + e_cfgs = [] + if CFG_ENV_NAME in os.environ: + e_fn = os.environ[CFG_ENV_NAME] + try: + e_cfgs.append(util.read_conf(e_fn)) + except: + util.logexc(LOG, ('Failed loading of env. config' + ' from %s'), e_fn) + return e_cfgs + + def _get_instance_configs(self): + i_cfgs = [] + # If cloud-config was written, pick it up as + # a configuration file to use when running... + if not self._paths: + return i_cfgs + cc_fn = self._paths.get_ipath_cur('cloud_config') + if cc_fn and os.path.isfile(cc_fn): + try: + i_cfgs.append(util.read_conf(cc_fn)) + except: + util.logexc(LOG, ('Failed loading of cloud-config' + ' from %s'), cc_fn) + return i_cfgs + + def _read_cfg(self): + # Input config files override + # env config files which + # override instance configs + # which override datasource + # configs which override + # base configuration + cfgs = [] + if self._fns: + for c_fn in self._fns: + try: + cfgs.append(util.read_conf(c_fn)) + except: + util.logexc(LOG, ("Failed loading of configuration" + " from %s"), c_fn) + + cfgs.extend(self._get_env_configs()) + cfgs.extend(self._get_instance_configs()) + cfgs.extend(self._get_datasource_configs()) + if self._base_cfg: + cfgs.append(self._base_cfg) + return util.mergemanydict(cfgs) + + @property + def cfg(self): + # None check to avoid empty case causing re-reading + if self._cfg is None: + self._cfg = self._read_cfg() + return self._cfg + + class ContentHandlers(object): def __init__(self): diff --git a/cloudinit/sources/DataSourceOVF.py b/cloudinit/sources/DataSourceOVF.py index f38fb4b9..7728b36f 100644 --- a/cloudinit/sources/DataSourceOVF.py +++ b/cloudinit/sources/DataSourceOVF.py @@ -186,7 +186,7 @@ def transport_iso9660(require_iso=True): fstype = info['fstype'] if fstype != "iso9660" and require_iso: continue - if cdmatch.match(dev[5:]) == None: # take off '/dev/' + if cdmatch.match(dev[5:]) is None: # take off '/dev/' continue mp = info['mountpoint'] (fname, contents) = get_ovf_env(mp) diff --git a/cloudinit/stages.py b/cloudinit/stages.py index 3ed13009..47f6e188 100644 --- a/cloudinit/stages.py +++ b/cloudinit/stages.py @@ -147,23 +147,16 @@ class Init(object): LOG.debug("Loaded 'init' config %s", self._cfg) def _read_cfg(self, extra_fns): - # Read extra files provided (if any) - i_cfgs = [] - if extra_fns: - for fn in extra_fns: - try: - fn_cfg = util.read_conf(fn) - i_cfgs.append(fn_cfg) - except: - util.logexc(LOG, ("Failed loading of additional" - " configuration from %s"), fn) - # Now read in the built-in + base try: - conf = util.get_base_cfg(builtin=util.get_builtin_cfg()) + base_conf = util.get_base_cfg(builtin=util.get_builtin_cfg()) except Exception: - conf = util.get_builtin_cfg() - i_cfgs.append(conf) - return util.mergemanydict(i_cfgs) + base_conf = util.get_builtin_cfg() + no_cfg_pths = helpers.Paths({}, self.datasource) + merger = helpers.ConfigMerger(paths=no_cfg_pths, + datasource=self.datasource, + additional_fns=extra_fns, + base_cfg=base_conf) + return merger.cfg def _restore_from_cache(self): pickled_fn = self.paths.get_ipath_cur('obj_pkl') @@ -396,46 +389,24 @@ class Init(object): class Modules(object): def __init__(self, init, cfg_files=None): - self.datasource = init.datasource - self.cfg_files = cfg_files - self.base_cfg = init.cfg self.init = init + self.cfg_files = cfg_files # Created on first use self._cached_cfg = None @property def cfg(self): - # None check to avoid empty case + # None check to avoid empty case causing re-reading if self._cached_cfg is None: - self._cached_cfg = self._get_config() + merger = helpers.ConfigMerger(paths=self.init.paths, + datasource=self.init.datasource, + fns=self.cfg_files, + base_cfg=self.init.cfg) + self._cached_cfg = merger.cfg LOG.debug("Loading 'module' config %s", self._cached_cfg) # Only give out a copy so that others can't modify this... return copy.deepcopy(self._cached_cfg) - def _get_config(self): - t_cfgs = [] - if self.cfg_files: - for fn in self.cfg_files: - try: - t_cfgs.append(util.read_conf(fn)) - except: - util.logexc(LOG, ("Failed loading of configuration" - " from %s"), fn) - - if self.datasource: - try: - d_cfg = self.datasource.get_config_obj() - if d_cfg: - t_cfgs.append(d_cfg) - except: - util.logexc(LOG, ("Failed loading of datasource" - " config object from %s"), self.datasource) - - if self.base_cfg: - t_cfgs.append(self.base_cfg) - - return util.mergemanydict(t_cfgs) - def _read_modules(self, name): module_list = [] if name not in self.cfg: diff --git a/cloudinit/util.py b/cloudinit/util.py index 6cdf9ff3..2f5ed275 100644 --- a/cloudinit/util.py +++ b/cloudinit/util.py @@ -908,7 +908,7 @@ def pipe_in_out(in_fh, out_fh, chunk_size=1024, chunk_cb=None): def chownbyid(fname, uid=None, gid=None): - if uid == None and gid == None: + if uid is None and gid is None: return LOG.debug("Changing the ownership of %s to %s:%s", fname, uid, gid) os.chown(fname, uid, gid) diff --git a/tools/run-pep8 b/tools/run-pep8 new file mode 100755 index 00000000..e7707985 --- /dev/null +++ b/tools/run-pep8 @@ -0,0 +1,28 @@ +#!/bin/bash + +ci_files='cloud*.py cloudinit/*.py cloudinit/config/*.py' +test_files=$(find tests -name "*.py") +def_files="$ci_files $test_files" + +if [ $# -eq 0 ]; then + files=( ) + for f in $def_files; do + [ -f "$f" ] || { echo "failed, $f not a file" 1>&2; exit 1; } + files[${#files[@]}]=${f} + done +else + files=( "$@" ); +fi + +cmd=( + pep8 + + --ignore=E501 # Line too long (these are caught by pylint) + + "${files[@]}" +) + +echo -e "\nRunning pep8:" +echo "${cmd[@]}" +"${cmd[@]}" + diff --git a/tools/run-pylint b/tools/run-pylint index 46748ffb..dd6369aa 100755 --- a/tools/run-pylint +++ b/tools/run-pylint @@ -1,6 +1,6 @@ #!/bin/bash -ci_files='cloud*.py cloudinit/*.py cloudinit/CloudConfig/*.py' +ci_files='cloud*.py cloudinit/*.py cloudinit/config/*.py' test_files=$(find tests -name "*.py") def_files="$ci_files $test_files" @@ -38,14 +38,3 @@ echo -e "\nRunning pylint:" echo "${cmd[@]}" "${cmd[@]}" -cmd=( - pep8 - - --ignore=E501 # Line too long (these are caught by pylint above) - - "${files[@]}" -) - -echo -e "\nRunning pep8:" -echo "${cmd[@]}" -"${cmd[@]}" |