← Back to team overview

cloud-init-dev team mailing list archive

[Merge] lp:~craigtracey/cloud-init/osfamilies into lp:cloud-init

 

Craig Tracey has proposed merging lp:~craigtracey/cloud-init/osfamilies into lp:cloud-init.

Commit message:
add support for operating system families

often it is convenient to classify a distro as being part of an
operating system family. for instance, file templates may be
identical for both debian and ubuntu, but to support this under
the current templating code, one would need multiple templates for the
same code.

similarly, configuration handlers often fall into the same bucket: the
configuraton is known to work/has been tested on a particular family
of operating systems. right now this is handled with a declaration
like:

distros = ['fedora', 'rhel']

this fix seeks to address both of these issues. it allows for the
simplification of the above line to:

osfamilies = ['redhat']

and provides a mechanism for operating system family templates.

Requested reviews:
  cloud init development team (cloud-init-dev)
Related bugs:
  Bug #1100029 in cloud-init: "Provide support for operating system families"
  https://bugs.launchpad.net/cloud-init/+bug/1100029

For more details, see:
https://code.launchpad.net/~craigtracey/cloud-init/osfamilies/+merge/143410

add support for operating system families

often it is convenient to classify a distro as being part of an
operating system family. for instance, file templates may be
identical for both debian and ubuntu, but to support this under
the current templating code, one would need multiple templates for the
same code.

similarly, configuration handlers often fall into the same bucket: the
configuraton is known to work/has been tested on a particular family
of operating systems. right now this is handled with a declaration
like:

distros = ['fedora', 'rhel']

this fix seeks to address both of these issues. it allows for the
simplification of the above line to:

osfamilies = ['redhat']

and provides a mechanism for operating system family templates.
-- 
https://code.launchpad.net/~craigtracey/cloud-init/osfamilies/+merge/143410
Your team cloud init development team is requested to review the proposed merge of lp:~craigtracey/cloud-init/osfamilies into lp:cloud-init.
=== modified file 'cloudinit/config/__init__.py'
--- cloudinit/config/__init__.py	2012-06-29 18:20:34 +0000
+++ cloudinit/config/__init__.py	2013-01-15 21:30:33 +0000
@@ -52,5 +52,7 @@
         if freq and freq not in FREQUENCIES:
             LOG.warn("Module %s has an unknown frequency %s", mod, freq)
     if not hasattr(mod, 'distros'):
-        setattr(mod, 'distros', None)
+        setattr(mod, 'distros', [])
+    if not hasattr(mod, 'osfamilies'):
+        setattr(mod, 'osfamilies', [])
     return mod

=== modified file 'cloudinit/distros/__init__.py'
--- cloudinit/distros/__init__.py	2013-01-07 16:36:10 +0000
+++ cloudinit/distros/__init__.py	2013-01-15 21:30:33 +0000
@@ -35,6 +35,11 @@
 
 from cloudinit.distros.parsers import hosts
 
+OSFAMILIES = {
+    'debian': ['debian', 'ubuntu'],
+    'redhat': ['fedora', 'rhel']
+}
+
 LOG = logging.getLogger(__name__)
 
 
@@ -143,6 +148,16 @@
     def _select_hostname(self, hostname, fqdn):
         raise NotImplementedError()
 
+    @staticmethod
+    def expand_osfamily(family_list):
+        distros = []
+        for family in family_list:
+            if not family in OSFAMILIES:
+                raise ValueError("No distibutions found for osfamily %s"
+                                 % (family))
+            distros.extend(OSFAMILIES[family])
+        return distros
+
     def update_hostname(self, hostname, fqdn, prev_hostname_fn):
         applying_hostname = hostname
 

=== modified file 'cloudinit/distros/debian.py'
--- cloudinit/distros/debian.py	2012-11-13 23:24:53 +0000
+++ cloudinit/distros/debian.py	2013-01-15 21:30:33 +0000
@@ -48,6 +48,7 @@
         # calls from repeatly happening (when they
         # should only happen say once per instance...)
         self._runner = helpers.Runners(paths)
+        self.osfamily = 'debian'
 
     def apply_locale(self, locale, out_fn=None):
         if not out_fn:

=== modified file 'cloudinit/distros/rhel.py'
--- cloudinit/distros/rhel.py	2012-11-13 06:14:31 +0000
+++ cloudinit/distros/rhel.py	2013-01-15 21:30:33 +0000
@@ -60,6 +60,7 @@
         # calls from repeatly happening (when they
         # should only happen say once per instance...)
         self._runner = helpers.Runners(paths)
+        self.osfamily = 'redhat'
 
     def install_packages(self, pkglist):
         self.package_command('install', pkglist)

=== modified file 'cloudinit/stages.py'
--- cloudinit/stages.py	2012-12-17 13:41:11 +0000
+++ cloudinit/stages.py	2013-01-15 21:30:33 +0000
@@ -529,11 +529,16 @@
                     freq = mod.frequency
                 if not freq in FREQUENCIES:
                     freq = PER_INSTANCE
-                worked_distros = mod.distros
+
+                worked_distros = set(mod.distros)
+                worked_distros.update(
+                    distros.Distro.expand_osfamily(mod.osfamilies))
+
                 if (worked_distros and d_name not in worked_distros):
                     LOG.warn(("Module %s is verified on %s distros"
                               " but not on %s distro. It may or may not work"
-                              " correctly."), name, worked_distros, d_name)
+                              " correctly."), name, list(worked_distros),
+                              d_name)
                 # Use the configs logger and not our own
                 # TODO(harlowja): possibly check the module
                 # for having a LOG attr and just give it back