diff options
| author | Chad Smith <chad.smith@canonical.com> | 2017-09-07 20:03:11 (GMT) |
|---|---|---|
| committer | Chad Smith <chad.smith@canonical.com> | 2017-09-07 20:03:11 (GMT) |
| commit | 34297260006768be70904cecd2d66b2b5d97d2c4 (patch) | |
| tree | 91f2d966a0ae8b7bff25c0728947e7f8bed71ac5 | |
| parent | 5582e4a266118b63ff86b6258b23d66df6d129d5 (diff) | |
Use distros.CONFIG_MODULE_SUPPORT_ALL_DISTROS in runcmd to advertise that runcmd is supported on every distro. Add distros.get_all_distro_names() which will list all discovered distros in cloudinit.distros package. cloudinit.stages uses get_all_distro_names when determining whether to skip a given module due to lack of distro support
| -rw-r--r-- | cloudinit/config/cc_runcmd.py | 3 | ||||
| -rwxr-xr-x | cloudinit/distros/__init__.py | 18 | ||||
| -rw-r--r-- | cloudinit/stages.py | 10 |
3 files changed, 27 insertions, 4 deletions
diff --git a/cloudinit/config/cc_runcmd.py b/cloudinit/config/cc_runcmd.py index 7c3ccd4..0899d15 100644 --- a/cloudinit/config/cc_runcmd.py +++ b/cloudinit/config/cc_runcmd.py @@ -9,6 +9,7 @@ """Runcmd: run arbitrary commands at rc.local with output to the console""" from cloudinit.config.schema import validate_cloudconfig_schema +from cloudinit.distros import CONFIG_MODULE_SUPPORT_ALL_DISTROS from cloudinit.settings import PER_INSTANCE from cloudinit import util @@ -22,7 +23,7 @@ from textwrap import dedent # configuration options before actually attempting to deploy with said # configuration. -distros = ['all'] +distros = [CONFIG_MODULE_SUPPORT_ALL_DISTROS] schema = { 'id': 'cc_runcmd', diff --git a/cloudinit/distros/__init__.py b/cloudinit/distros/__init__.py index b714b9a..bfefb3d 100755 --- a/cloudinit/distros/__init__.py +++ b/cloudinit/distros/__init__.py @@ -30,6 +30,10 @@ from cloudinit import util from cloudinit.distros.parsers import hosts +# Used when a cloud-config module can be run on all cloud-init distibutions. +# The value 'all' is surfaced in module documentation for distro support. +CONFIG_MODULE_SUPPORT_ALL_DISTROS = 'all' + OSFAMILIES = { 'debian': ['debian', 'ubuntu'], 'redhat': ['centos', 'fedora', 'rhel'], @@ -742,6 +746,20 @@ def fetch(name): return cls +def get_all_distro_names(): + """Return a list of all distribution names found in cloudinit.distro.""" + distro_dir = os.path.dirname(os.path.abspath(__file__)) + potential_handlers = util.find_modules(distro_dir) + distro_names = [] + for (fname, mod_name) in potential_handlers.items(): + mod_locs, looked_locs = importer.find_module( + mod_name, [__name__], ['Distro']) + if mod_locs and '__init__' not in mod_locs[0]: + # Grab module basename e.g. ubuntu + distro_names.append(mod_locs[0].split('.')[-1]) + return distro_names + + def set_etc_timezone(tz, tz_file=None, tz_conf="/etc/timezone", tz_local="/etc/localtime"): util.write_file(tz_conf, str(tz).rstrip() + "\n") diff --git a/cloudinit/stages.py b/cloudinit/stages.py index a1c4a51..a5f88ec 100644 --- a/cloudinit/stages.py +++ b/cloudinit/stages.py @@ -821,10 +821,14 @@ class Modules(object): skipped = [] forced = [] overridden = self.cfg.get('unverified_modules', []) + all_distros = distros.get_all_distro_names() for (mod, name, _freq, _args) in mostly_mods: - worked_distros = set(mod.distros) - worked_distros.update( - distros.Distro.expand_osfamily(mod.osfamilies)) + if mod.distros == [distros.CONFIG_MODULE_SUPPORT_ALL_DISTROS]: + worked_distros = set(all_distros) + else: + worked_distros = set(mod.distros) + worked_distros.update( + distros.Distro.expand_osfamily(mod.osfamilies)) # module does not declare 'distros' or lists this distro if not worked_distros or d_name in worked_distros: |
