allow object overrides with CDIST_ALLOW_OVERRIDE=true

This commit is contained in:
Daniel Heule 2014-01-27 16:19:01 +01:00
parent a62e4aade3
commit 4ef55ef13f
3 changed files with 32 additions and 3 deletions

View file

@ -2,6 +2,7 @@
#
# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
# 2011-2013 Nico Schottelius (nico-cdist at schottelius.org)
# 2014 Daniel Heule (hda at sfs.biz)
#
# This file is part of cdist.
#
@ -215,9 +216,10 @@ class CdistObject(object):
"""Create this cdist object on the filesystem.
"""
try:
os.makedirs(self.absolute_path, exist_ok=False)
cdexist_ok = True if os.environ.get('CDIST_ALLOW_OVERRIDE',"false") == 'true' else False
os.makedirs(self.absolute_path, exist_ok=cdexist_ok)
absolute_parameter_path = os.path.join(self.base_path, self.parameter_path)
os.makedirs(absolute_parameter_path, exist_ok=False)
os.makedirs(absolute_parameter_path, exist_ok=cdexist_ok)
except EnvironmentError as error:
raise cdist.Error('Error creating directories for cdist object: %s: %s' % (self, error))

View file

@ -2,6 +2,7 @@
#
# 2011-2013 Nico Schottelius (nico-cdist at schottelius.org)
# 2012 Steven Armstrong (steven-cdist at armstrong.cc)
# 2014 Daniel Heule (hda at sfs.biz)
#
# This file is part of cdist.
#
@ -144,12 +145,14 @@ class Emulator(object):
if value is not None:
self.parameters[key] = value
if self.cdist_object.exists:
if self.cdist_object.exists and os.environ.get('CDIST_ALLOW_OVERRIDE',"false") != 'true':
if self.cdist_object.parameters != self.parameters:
raise cdist.Error("Object %s already exists with conflicting parameters:\n%s: %s\n%s: %s"
% (self.cdist_object.name, " ".join(self.cdist_object.source), self.cdist_object.parameters, self.object_source, self.parameters)
)
else:
if self.cdist_object.exists:
self.log.debug('Object %s override forced with CDIST_ALLOW_OVERRIDE=true',self.cdist_object.name)
self.cdist_object.create()
self.cdist_object.parameters = self.parameters

View file

@ -161,6 +161,30 @@ __package lighttpd --state present
require="__package/lighttpd" __package munin --state present
--------------------------------------------------------------------------------
OVERRIDES
---------
In some special cases, you would like to create an allready defined object
with different parameters. In normal situations this leads to an error in cdist.
If you whish, you can mark this second definition of an object with
CDIST_ALLOW_OVERRIDE=true to tell cdist, that this object override is
wanted and should be accepted.
--------------------------------------------------------------------------------
# for example in the inial manifest
# reate user account foobar with some hash for password
__user foobar --password 'some_fancy_hash'
# ... many statements and includes in the manifest later ...
# somewhere in a conditionaly sourced manifest
# (e.g. for example only sourced if a special application is on the target host)
# this leads to an error ...
__user foobar --password 'some_other_hash'
# this tells cdist, that you know that this is an override and should be accepted
CDIST_ALLOW_OVERRIDE=true __user foobar --password 'some_other_hash'
--------------------------------------------------------------------------------
SEE ALSO