implement multiple parameters based on https://github.com/telmich/cdist/pull/71 by Sébastien Gross

Signed-off-by: Steven Armstrong <steven@icarus.ethz.ch>
This commit is contained in:
Steven Armstrong 2012-06-04 22:01:32 +02:00
parent f087057c98
commit 36513997d9
4 changed files with 64 additions and 7 deletions

View file

@ -74,14 +74,19 @@ DEFINING PARAMETERS
------------------- -------------------
Every type consists of required, optional and boolean parameters, which must Every type consists of required, optional and boolean parameters, which must
be created in a newline seperated file in ***parameter/required***, be created in a newline seperated file in ***parameter/required***,
***parameter/optional*** and ***parameter/boolean***. If either is missing, ***parameter/required_multiple***, ***parameter/optional***,
the type will have no required, no optional, no boolean or no parameters at ***parameter/optional_multiple*** and ***parameter/boolean***.
all. Parameters which are allowed multiple times should be listed in
required_multiple or optional_multiple respectively. For all other parameters
the standard unix behaviour of the last given wins is applied.
If either is missing, the type will have no required, no optional, no boolean
or no parameters at all.
Example: Example:
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
echo servername >> conf/type/__nginx_vhost/parameter/required echo servername >> conf/type/__nginx_vhost/parameter/required
echo logdirectory >> conf/type/__nginx_vhost/parameter/optional echo logdirectory >> conf/type/__nginx_vhost/parameter/optional
echo server_alias >> conf/type/__nginx_vhost/parameter/optional_multiple
echo use_ssl >> conf/type/__nginx_vhost/parameter/boolean echo use_ssl >> conf/type/__nginx_vhost/parameter/boolean
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
@ -108,6 +113,14 @@ if [ -f "$__object/parameter/use_ssl" ]; then
# file exists -> True # file exists -> True
# do some fancy ssl stuff # do some fancy ssl stuff
fi fi
# parameter with multiple values
if [ -f "$__object/parameter/server_alias" ]; then
for alias in $(cat "$__object/parameter/server_alias"); do
echo $alias > /some/where/usefull
done
fi
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------

View file

@ -81,7 +81,9 @@ class CdistType(object):
self.__explorers = None self.__explorers = None
self.__required_parameters = None self.__required_parameters = None
self.__required_multiple_parameters = None
self.__optional_parameters = None self.__optional_parameters = None
self.__optional_multiple_parameters = None
self.__boolean_parameters = None self.__boolean_parameters = None
def __repr__(self): def __repr__(self):
@ -130,6 +132,22 @@ class CdistType(object):
self.__required_parameters = parameters self.__required_parameters = parameters
return self.__required_parameters return self.__required_parameters
@property
def required_multiple_parameters(self):
"""Return a list of required multiple parameters"""
if not self.__required_multiple_parameters:
parameters = []
try:
with open(os.path.join(self.absolute_path, "parameter", "required_multiple")) as fd:
for line in fd:
parameters.append(line.strip())
except EnvironmentError:
# error ignored
pass
finally:
self.__required_multiple_parameters = parameters
return self.__required_multiple_parameters
@property @property
def optional_parameters(self): def optional_parameters(self):
"""Return a list of optional parameters""" """Return a list of optional parameters"""
@ -146,6 +164,22 @@ class CdistType(object):
self.__optional_parameters = parameters self.__optional_parameters = parameters
return self.__optional_parameters return self.__optional_parameters
@property
def optional_multiple_parameters(self):
"""Return a list of optional multiple parameters"""
if not self.__optional_multiple_parameters:
parameters = []
try:
with open(os.path.join(self.absolute_path, "parameter", "optional_multiple")) as fd:
for line in fd:
parameters.append(line.strip())
except EnvironmentError:
# error ignored
pass
finally:
self.__optional_multiple_parameters = parameters
return self.__optional_multiple_parameters
@property @property
def boolean_parameters(self): def boolean_parameters(self):
"""Return a list of boolean parameters""" """Return a list of boolean parameters"""

View file

@ -89,12 +89,18 @@ class Emulator(object):
parser = argparse.ArgumentParser(add_help=False, argument_default=argparse.SUPPRESS) parser = argparse.ArgumentParser(add_help=False, argument_default=argparse.SUPPRESS)
for parameter in self.cdist_type.optional_parameters:
argument = "--" + parameter
parser.add_argument(argument, dest=parameter, action='store', required=False)
for parameter in self.cdist_type.required_parameters: for parameter in self.cdist_type.required_parameters:
argument = "--" + parameter argument = "--" + parameter
parser.add_argument(argument, dest=parameter, action='store', required=True) parser.add_argument(argument, dest=parameter, action='store', required=True)
for parameter in self.cdist_type.required_multiple_parameters:
argument = "--" + parameter
parser.add_argument(argument, dest=parameter, action='append', required=True)
for parameter in self.cdist_type.optional_parameters:
argument = "--" + parameter
parser.add_argument(argument, dest=parameter, action='store', required=False)
for parameter in self.cdist_type.optional_multiple_parameters:
argument = "--" + parameter
parser.add_argument(argument, dest=parameter, action='append', required=False)
for parameter in self.cdist_type.boolean_parameters: for parameter in self.cdist_type.boolean_parameters:
argument = "--" + parameter argument = "--" + parameter
parser.add_argument(argument, dest=parameter, action='store_const', const='') parser.add_argument(argument, dest=parameter, action='store_const', const='')

View file

@ -134,7 +134,11 @@ class DirectoryDict(collections.MutableMapping):
def __setitem__(self, key, value): def __setitem__(self, key, value):
try: try:
with open(os.path.join(self.path, key), "w") as fd: with open(os.path.join(self.path, key), "w") as fd:
fd.write(str(value)) if type(value) == type([]):
for v in value:
fd.write(str(v) + '\n')
else:
fd.write(str(value))
except EnvironmentError as e: except EnvironmentError as e:
raise cdist.Error(str(e)) raise cdist.Error(str(e))