summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChad Smith <chad.smith@canonical.com>2017-09-07 20:03:11 (GMT)
committerChad Smith <chad.smith@canonical.com>2017-09-07 20:03:11 (GMT)
commit34297260006768be70904cecd2d66b2b5d97d2c4 (patch)
tree91f2d966a0ae8b7bff25c0728947e7f8bed71ac5
parent5582e4a266118b63ff86b6258b23d66df6d129d5 (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.py3
-rwxr-xr-xcloudinit/distros/__init__.py18
-rw-r--r--cloudinit/stages.py10
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: