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.
This commit is contained in:
ctracey 2013-01-15 16:08:43 -05:00
parent 738c7bf844
commit 733baf1a8b
5 changed files with 27 additions and 4 deletions

View File

@ -52,5 +52,7 @@ def fixup_module(mod, def_freq=PER_INSTANCE):
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

View File

@ -35,6 +35,11 @@ from cloudinit import util
from cloudinit.distros.parsers import hosts
OSFAMILIES = {
'debian': ['debian', 'ubuntu'],
'redhat': ['fedora', 'rhel']
}
LOG = logging.getLogger(__name__)
@ -143,6 +148,16 @@ class Distro(object):
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
@ -515,7 +530,6 @@ def _get_package_mirror_info(mirror_info, availability_zone=None,
return results
def _get_arch_package_mirror_info(package_mirrors, arch):
# pull out the specific arch from a 'package_mirrors' config option
default = None

View File

@ -48,6 +48,7 @@ class Distro(distros.Distro):
# 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:

View File

@ -60,6 +60,7 @@ class Distro(distros.Distro):
# 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)

View File

@ -529,11 +529,16 @@ class Modules(object):
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