forked from ungleich-public/cdist
Merge branch 'feature_boolean_parameter' of https://github.com/asteven/cdist
This commit is contained in:
commit
27fb4374d3
11 changed files with 135 additions and 11 deletions
|
@ -101,12 +101,15 @@ conf/type/<name>/gencode-local::
|
||||||
conf/type/<name>/gencode-remote::
|
conf/type/<name>/gencode-remote::
|
||||||
Used to generate code to be executed on the client.
|
Used to generate code to be executed on the client.
|
||||||
|
|
||||||
conf/type/<name>/parameters/required::
|
conf/type/<name>/parameter/required::
|
||||||
Parameters required by type, \n seperated list.
|
Parameters required by type, \n seperated list.
|
||||||
|
|
||||||
conf/type/<name>/parameters/optional::
|
conf/type/<name>/parameter/optional::
|
||||||
Parameters optionally accepted by type, \n seperated list.
|
Parameters optionally accepted by type, \n seperated list.
|
||||||
|
|
||||||
|
conf/type/<name>/parameter/boolean::
|
||||||
|
Boolean parameters accepted by type, \n seperated list.
|
||||||
|
|
||||||
conf/type/<name>/explorer::
|
conf/type/<name>/explorer::
|
||||||
Location of the type specific explorers.
|
Location of the type specific explorers.
|
||||||
This directory is referenced by the variable __type_explorer (see below).
|
This directory is referenced by the variable __type_explorer (see below).
|
||||||
|
|
|
@ -40,7 +40,7 @@ A list of supported types can be found in the cdist-reference(7) manpage.
|
||||||
|
|
||||||
SINGLETON TYPES
|
SINGLETON TYPES
|
||||||
---------------
|
---------------
|
||||||
If a type is flagged as a singleton, it may be used only
|
If a type is flagged as a singleton, it may be used only
|
||||||
once per host. This is useful for types which can be used only once on a
|
once per host. This is useful for types which can be used only once on a
|
||||||
system. Singleton types do not take an object name as argument.
|
system. Singleton types do not take an object name as argument.
|
||||||
|
|
||||||
|
@ -72,15 +72,42 @@ To begin a new type, just create the directory **conf/type/__NAME**.
|
||||||
|
|
||||||
DEFINING PARAMETERS
|
DEFINING PARAMETERS
|
||||||
-------------------
|
-------------------
|
||||||
Every type consists of optional and required parameters, which must
|
Every type consists of required, optional and boolean parameters, which must
|
||||||
be created in a newline seperated file in ***parameters/required*** and
|
be created in a newline seperated file in ***parameter/required***,
|
||||||
***parameters/optional***. If either or both missing, the type will have
|
***parameter/optional*** and ***parameter/boolean***. If either is missing,
|
||||||
no required, no optional or no parameters at all.
|
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 use_ssl >> conf/type/__nginx_vhost/parameter/boolean
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
USING PARAMETERS
|
||||||
|
----------------
|
||||||
|
The parameters given to a type can be accessed and used in all type scripts
|
||||||
|
(e.g manifest, gencode-*, explorer/*). Note that boolean parameters are
|
||||||
|
represented by file existence. File exists -> True,
|
||||||
|
file does not exist -> False
|
||||||
|
|
||||||
|
Example: (e.g. in conf/type/__nginx_vhost/manifest)
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
# required parameter
|
||||||
|
servername="$(cat "$__object/parameter/servername")"
|
||||||
|
|
||||||
|
# optional parameter
|
||||||
|
if [ -f "$__object/parameter/logdirectory" ]; then
|
||||||
|
logdirectory="$(cat "$__object/parameter/logdirectory")"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# boolean parameter
|
||||||
|
if [ -f "$__object/parameter/use_ssl" ]; then
|
||||||
|
# file exists -> True
|
||||||
|
# do some fancy ssl stuff
|
||||||
|
fi
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
@ -116,7 +143,7 @@ SINGLETON - ONLY INSTANCE ONLY
|
||||||
------------------------------
|
------------------------------
|
||||||
If you want to ensure that a type can only be used once per target, you can
|
If you want to ensure that a type can only be used once per target, you can
|
||||||
mark it as a singleton: Just create the (empty) file "singleton" in your type
|
mark it as a singleton: Just create the (empty) file "singleton" in your type
|
||||||
directory:
|
directory:
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
touch conf/type/__NAME/singleton
|
touch conf/type/__NAME/singleton
|
||||||
|
@ -128,7 +155,7 @@ This will also change the way your type must be called:
|
||||||
__YOURTYPE --parameter value
|
__YOURTYPE --parameter value
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
As you can see, the object ID is omitted, because it does not make any sense,
|
As you can see, the object ID is omitted, because it does not make any sense,
|
||||||
if your type can be used only once.
|
if your type can be used only once.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -82,6 +82,7 @@ class CdistType(object):
|
||||||
self.__explorers = None
|
self.__explorers = None
|
||||||
self.__required_parameters = None
|
self.__required_parameters = None
|
||||||
self.__optional_parameters = None
|
self.__optional_parameters = None
|
||||||
|
self.__boolean_parameters = None
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return '<CdistType %s>' % self.name
|
return '<CdistType %s>' % self.name
|
||||||
|
@ -144,3 +145,19 @@ class CdistType(object):
|
||||||
finally:
|
finally:
|
||||||
self.__optional_parameters = parameters
|
self.__optional_parameters = parameters
|
||||||
return self.__optional_parameters
|
return self.__optional_parameters
|
||||||
|
|
||||||
|
@property
|
||||||
|
def boolean_parameters(self):
|
||||||
|
"""Return a list of boolean parameters"""
|
||||||
|
if not self.__boolean_parameters:
|
||||||
|
parameters = []
|
||||||
|
try:
|
||||||
|
with open(os.path.join(self.absolute_path, "parameter", "boolean")) as fd:
|
||||||
|
for line in fd:
|
||||||
|
parameters.append(line.strip())
|
||||||
|
except EnvironmentError:
|
||||||
|
# error ignored
|
||||||
|
pass
|
||||||
|
finally:
|
||||||
|
self.__boolean_parameters = parameters
|
||||||
|
return self.__boolean_parameters
|
||||||
|
|
|
@ -87,7 +87,7 @@ class Emulator(object):
|
||||||
def commandline(self):
|
def commandline(self):
|
||||||
"""Parse command line"""
|
"""Parse command line"""
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(add_help=False)
|
parser = argparse.ArgumentParser(add_help=False, argument_default=argparse.SUPPRESS)
|
||||||
|
|
||||||
for parameter in self.cdist_type.optional_parameters:
|
for parameter in self.cdist_type.optional_parameters:
|
||||||
argument = "--" + parameter
|
argument = "--" + parameter
|
||||||
|
@ -95,6 +95,9 @@ class Emulator(object):
|
||||||
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.boolean_parameters:
|
||||||
|
argument = "--" + parameter
|
||||||
|
parser.add_argument(argument, dest=parameter, action='store_const', const='')
|
||||||
|
|
||||||
# If not singleton support one positional parameter
|
# If not singleton support one positional parameter
|
||||||
if not self.cdist_type.is_singleton:
|
if not self.cdist_type.is_singleton:
|
||||||
|
|
|
@ -126,7 +126,7 @@ class AutoRequireEmulatorTestCase(test.CdistTestCase):
|
||||||
self.assertEqual(sorted(cdist_object.requirements), sorted(expected))
|
self.assertEqual(sorted(cdist_object.requirements), sorted(expected))
|
||||||
|
|
||||||
|
|
||||||
class ArgumentsWithDashesTestCase(test.CdistTestCase):
|
class ArgumentsTestCase(test.CdistTestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.temp_dir = self.mkdtemp()
|
self.temp_dir = self.mkdtemp()
|
||||||
|
@ -159,3 +159,59 @@ class ArgumentsWithDashesTestCase(test.CdistTestCase):
|
||||||
cdist_type = core.CdistType(self.local.type_path, '__arguments_with_dashes')
|
cdist_type = core.CdistType(self.local.type_path, '__arguments_with_dashes')
|
||||||
cdist_object = core.CdistObject(cdist_type, self.local.object_path, 'some-id')
|
cdist_object = core.CdistObject(cdist_type, self.local.object_path, 'some-id')
|
||||||
self.assertTrue('with-dash' in cdist_object.parameters)
|
self.assertTrue('with-dash' in cdist_object.parameters)
|
||||||
|
|
||||||
|
def test_boolean(self):
|
||||||
|
type_name = '__arguments_boolean'
|
||||||
|
object_id = 'some-id'
|
||||||
|
argv = [type_name, object_id, '--boolean1']
|
||||||
|
os.environ.update(self.env)
|
||||||
|
emu = emulator.Emulator(argv)
|
||||||
|
emu.run()
|
||||||
|
|
||||||
|
cdist_type = core.CdistType(self.local.type_path, type_name)
|
||||||
|
cdist_object = core.CdistObject(cdist_type, self.local.object_path, object_id)
|
||||||
|
self.assertTrue('boolean1' in cdist_object.parameters)
|
||||||
|
self.assertFalse('boolean2' in cdist_object.parameters)
|
||||||
|
# empty file -> True
|
||||||
|
self.assertTrue(cdist_object.parameters['boolean1'] == '')
|
||||||
|
|
||||||
|
def test_required(self):
|
||||||
|
type_name = '__arguments_required'
|
||||||
|
object_id = 'some-id'
|
||||||
|
value = 'some value'
|
||||||
|
argv = [type_name, object_id, '--required1', value, '--required2', value]
|
||||||
|
os.environ.update(self.env)
|
||||||
|
emu = emulator.Emulator(argv)
|
||||||
|
emu.run()
|
||||||
|
|
||||||
|
cdist_type = core.CdistType(self.local.type_path, type_name)
|
||||||
|
cdist_object = core.CdistObject(cdist_type, self.local.object_path, object_id)
|
||||||
|
self.assertTrue('required1' in cdist_object.parameters)
|
||||||
|
self.assertTrue('required2' in cdist_object.parameters)
|
||||||
|
self.assertEqual(cdist_object.parameters['required1'], value)
|
||||||
|
self.assertEqual(cdist_object.parameters['required2'], value)
|
||||||
|
|
||||||
|
# def test_required_missing(self):
|
||||||
|
# type_name = '__arguments_required'
|
||||||
|
# object_id = 'some-id'
|
||||||
|
# value = 'some value'
|
||||||
|
# argv = [type_name, object_id, '--required1', value]
|
||||||
|
# os.environ.update(self.env)
|
||||||
|
# emu = emulator.Emulator(argv)
|
||||||
|
#
|
||||||
|
# self.assertRaises(SystemExit, emu.run)
|
||||||
|
|
||||||
|
def test_optional(self):
|
||||||
|
type_name = '__arguments_optional'
|
||||||
|
object_id = 'some-id'
|
||||||
|
value = 'some value'
|
||||||
|
argv = [type_name, object_id, '--optional1', value]
|
||||||
|
os.environ.update(self.env)
|
||||||
|
emu = emulator.Emulator(argv)
|
||||||
|
emu.run()
|
||||||
|
|
||||||
|
cdist_type = core.CdistType(self.local.type_path, type_name)
|
||||||
|
cdist_object = core.CdistObject(cdist_type, self.local.object_path, object_id)
|
||||||
|
self.assertTrue('optional1' in cdist_object.parameters)
|
||||||
|
self.assertFalse('optional2' in cdist_object.parameters)
|
||||||
|
self.assertEqual(cdist_object.parameters['optional1'], value)
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
boolean1
|
||||||
|
boolean2
|
|
@ -0,0 +1 @@
|
||||||
|
optional1
|
|
@ -0,0 +1,2 @@
|
||||||
|
required1
|
||||||
|
required2
|
|
@ -145,3 +145,14 @@ class TypeTestCase(test.CdistTestCase):
|
||||||
base_path = fixtures
|
base_path = fixtures
|
||||||
cdist_type = core.CdistType(base_path, '__without_optional_parameters')
|
cdist_type = core.CdistType(base_path, '__without_optional_parameters')
|
||||||
self.assertEqual(cdist_type.optional_parameters, [])
|
self.assertEqual(cdist_type.optional_parameters, [])
|
||||||
|
|
||||||
|
def test_with_boolean_parameters(self):
|
||||||
|
base_path = fixtures
|
||||||
|
cdist_type = core.CdistType(base_path, '__with_boolean_parameters')
|
||||||
|
self.assertEqual(cdist_type.boolean_parameters, ['boolean1', 'boolean2'])
|
||||||
|
|
||||||
|
def test_without_boolean_parameters(self):
|
||||||
|
base_path = fixtures
|
||||||
|
cdist_type = core.CdistType(base_path, '__without_boolean_parameters')
|
||||||
|
self.assertEqual(cdist_type.boolean_parameters, [])
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
boolean1
|
||||||
|
boolean2
|
Loading…
Reference in a new issue