Compare commits

..

7 Commits

141 changed files with 1206 additions and 800 deletions

View File

@ -1,5 +1,4 @@
# Les vérifications des valeurs
- [Fonction de vérification](function.md)
- [Les variables à choix](valid_enum.md)
- [Réfinition](redefine.md)

View File

@ -1,46 +0,0 @@
# Les variables à choix
Une variable à choix est d'abord une variable avec une [fonction check](function.md).
## Les variables à choix simple
Il est possible d'imposer une liste de valeur pour une variable particulière :
```
<check name="valid_enum">
<param>yes</param>
<param>no</param>
<param>maybe</param>
<target>my_variable</target>
</check>
```
Dans ce cas, seule les valeurs proposés sont possible pour cette variable.
Par défaut, cette variable est obligatoire. Cela signifie qu'il n'est pas possible de spécifier "None" à cette variable.
## Les variables à choix avec valeur None
Il y a deux possibilités pour avoir une valeur "None" dans les choix :
- rendre la variable non obligatoire, cela va ajouter un choix "None" dans la liste :
```
<variable name="my_variable" mandatory="False">
```
Ou en ajoutant le paramètre "None" :
```
<check name="valid_enum">
<param>yes</param>
<param>no</param>
<param type='nil'/>
<param>maybe</param>
<target>my_variable</target>
</check>
```
## La valeur par défaut
Si aucune valeur n'est spécifié pour la variable, automatiquement le premier choix va est placé comme valeur par défaut.

View File

@ -29,6 +29,16 @@ Un service non géré ne peut conteneur que des fichiers.
## Désactiver la génération d'un service
Il est possible de désactiver un service. Pour cela il faut rajouter l'attribut "disabled" à True :
```
<services>
<service name="test" disabled="True"/>
</services>
```
Dans ce cas, tous les services et les éléments qu'il compose ([fichier](file.md), ...) seront désactivés.
Il est possible de définir une [condition](../condition/README.md) de type "disabled_if_in" ou "disabled_if_not_in" sur une balise service :
```

View File

@ -116,7 +116,6 @@ Les variables booléans sont par défaut obligatoire. Pour qu'une variable bool
```
Les variables avec une valeur par défaut (non calculée) sont également automatiquement obligatoire.
[Les variables à choix](../check/valid_enum.md) sans choix "None" sont également automatiquement obligatoire.
## Valeur par défaut d'une variable

91
doc/variable/choice.md Normal file
View File

@ -0,0 +1,91 @@
# Les variables à choix
## Une variable à choix
Il est possible d'imposer une liste de valeur pour une variable particulière :
```
<variable name="my_variable" type="choice">
<choice>val1</choice>
<choice>val2</choice>
<choice>val3</choice>
</variable>
```
Dans ce cas, seules les valeurs proposées sont possibles pour cette variable.
Cette variable n'est pas obligatoire dont il est possible de mettre la valeur "None".
Si la variable est obligatoire ou si une valeur est précisée (la variable passe obligatoire) alors la valeur "None" n'est plus autorisé :
```
<variable name="my_variable" type="choice">
<choice>val1</choice>
<choice>val2</choice>
<choice>val3</choice>
<value>val1</value>
</variable>
```
## Un variable à choix typée
Par défaut les choix sont de type "string". Il est possible de préciser des nombres, des booléens ou la valeur None :
```
<variable name="my_variable" type="choice">
<choice>val1</choice>
<choice type="string">val2</choice>
<choice type="number">3</choice>
<choice type="boolean">True</choice>
<choice type="nil"/>
</variable>
```
Comme vu précédement ajouter la valeur None n'est pas utile parce qu'elle est automatiquement ajouté si la variable n'est pas obligatoire.
## Ajouter une option à une variable à choix existante
Pour ajouter un choix à une variable à choix existante, rien de plus simple, juste redéfinir la variable en ajoutant le choix voulu :
```
<variable name="my_variable" redefine="True">
<choice>val4</choice>
</variable>
```
## Redéfinir une option à choix
Si on veut supprimer un choix ou redéfinir complètement la liste, il faut redéfinir cette variable et ajouter l'attribut "remove_choice" à "True" :
```
<variable name="my_variable" redefine="True" remove_choice="True">
<choice>val1</choice>
<choice>val2</choice>
</variable>
```
Dans ce cas toutes les anciens choix ne seront plus possible. Seuls les nouveaux le seront.
## Un variable à choix provenant d'une variable
Une variable à valeur multiple peut servir de source des choix :
```
<variable name="my_variable" type="choice">
<choice type="variable">other_variable</choice>
</variable>
```
Dans ce cas, toutes les valeurs de la variable seront des choix utilisables par l'utilisateur.
Seul un choice de type "variable" est possible par variable.
## Un variable à choix provenant d'une fonction
```
<variable name="my_variable" type="choice">
<choice type="function" name="trange">
<param type="number">0</param>
<param type="number">10</param>
</choice>
<value type="number">9</value>
</variable>
```

View File

@ -33,7 +33,7 @@ from rougail.utils import load_modules
from rougail.i18n import _
from rougail.error import DictConsistencyError, display_xmlfiles
INTERNAL_FUNCTIONS = ['valid_enum', 'valid_in_network', 'valid_differ', 'valid_entier']
INTERNAL_FUNCTIONS = ['valid_in_network', 'valid_differ', 'valid_entier']
class Annotator(TargetAnnotator, ParamAnnotator):
"""Annotate check
@ -58,21 +58,11 @@ class Annotator(TargetAnnotator, ParamAnnotator):
self.convert_target(self.objectspace.space.constraints.check)
self.convert_param(self.objectspace.space.constraints.check)
self.check_check()
self.check_valid_enum()
self.check_change_warning()
self.convert_valid_entier()
self.convert_check()
del objectspace.space.constraints.check
def valid_type_validation(self,
obj,
) -> None:
variable_type = None
if obj.name == 'valid_enum':
for target in obj.target:
variable_type = target.name.type
return variable_type
def check_check(self): # pylint: disable=R0912
"""valid and manage <check>
"""
@ -87,119 +77,6 @@ class Annotator(TargetAnnotator, ParamAnnotator):
for idx in remove_indexes:
del self.objectspace.space.constraints.check[idx]
def check_valid_enum(self):
"""verify valid_enum
"""
remove_indexes = []
for idx, check in enumerate(self.objectspace.space.constraints.check):
if check.name != 'valid_enum':
continue
for target in check.target:
if target.name.path in self.objectspace.valid_enums:
check_xmlfiles = display_xmlfiles(self.objectspace.valid_enums\
[target.name.path]['xmlfiles'])
msg = _(f'valid_enum already set in {check_xmlfiles} '
f'for "{target.name.name}", you may have forget remove_check')
raise DictConsistencyError(msg, 3, check.xmlfiles)
if not hasattr(check, 'param'):
msg = _(f'param is mandatory for a valid_enum of variable "{target.name.name}"')
raise DictConsistencyError(msg, 4, check.xmlfiles)
variable_type = target.name.type
values = self._set_valid_enum(target.name,
check,
)
if values:
if hasattr(target.name, 'value'):
# check value
self.check_valid_enum_value(target.name, values)
else:
# no value, set the first choice as default value
new_value = self.objectspace.value(check.xmlfiles)
new_value.name = values[0]
new_value.type = variable_type
target.name.value = [new_value]
remove_indexes.append(idx)
remove_indexes.sort(reverse=True)
for idx in remove_indexes:
del self.objectspace.space.constraints.check[idx]
def _set_valid_enum(self,
variable,
check,
) -> List[Any]:
# build choice
variable.values = []
variable.ori_type = variable.type
variable.type = 'choice'
has_variable = False
values = []
has_nil = False
is_function = False
for param in check.param:
if has_variable:
msg = _(f'only one "variable" parameter is allowed for valid_enum '
f'of variable "{variable.name}"')
raise DictConsistencyError(msg, 5, param.xmlfiles)
if param.type == 'function':
is_function = True
choice = self.objectspace.choice(variable.xmlfiles)
choice.name = param.text
choice.type = 'function'
choice.param = []
variable.values.append(choice)
continue
if is_function:
variable.values[0].param.append(param)
continue
param_type = variable.ori_type
if param.type == 'variable':
has_variable = True
if param.optional is True:
msg = _(f'optional parameter in valid_enum for variable "{variable.name}" '
f'is not allowed')
raise DictConsistencyError(msg, 14, param.xmlfiles)
if not param.text.multi:
msg = _(f'only multi "variable" parameter is allowed for valid_enum '
f'of variable "{variable.name}"')
raise DictConsistencyError(msg, 6, param.xmlfiles)
param_type = 'variable'
elif param.type == 'nil':
has_nil = True
values.append(param.text)
choice = self.objectspace.choice(variable.xmlfiles)
choice.name = param.text
choice.type = param_type
variable.values.append(choice)
if is_function:
return None
if 'mandatory' not in vars(variable):
variable.mandatory = not has_nil
elif variable.mandatory is False:
choice = self.objectspace.choice(variable.xmlfiles)
choice.name = None
choice.type = 'nil'
variable.values.append(choice)
if has_variable:
return None
self.objectspace.valid_enums[variable.path] = {'type': variable.ori_type,
'values': values,
'xmlfiles': check.xmlfiles,
}
return values
@staticmethod
def check_valid_enum_value(variable,
values,
) -> None:
"""check that values in valid_enum are valid
"""
for value in variable.value:
if value.name not in values:
msg = _(f'value "{value.name}" of variable "{variable.name}" is not in list '
f'of all expected values ({values})')
raise DictConsistencyError(msg, 15, value.xmlfiles)
def check_change_warning(self):
"""convert level to "warnings_only"
"""

View File

@ -67,7 +67,7 @@ class Annotator(TargetAnnotator, ParamAnnotator, Walk):
obj,
) -> None:
if obj.source.type == 'choice':
return obj.source.ori_type
return None
return obj.source.type
def convert_auto_freeze(self):

View File

@ -132,16 +132,17 @@ class ParamAnnotator:
msg = _(f'parameter has incompatible type "{param.type}" '
f'with type "{variable_type}"')
raise DictConsistencyError(msg, 7, param.xmlfiles)
try:
option = CONVERT_OPTION[variable_type]
param.text = option.get('func', str)(param.text)
getattr(tiramisu, option['opttype'])('test',
'Object to valid value',
param.text,
**option.get('initkwargs', {}),
)
except ValueError as err:
msg = _(f'unable to change type of value "{param.text}" '
f'is not a valid "{variable_type}"')
raise DictConsistencyError(msg, 13, param.xmlfiles) from err
if variable_type != 'choice':
try:
option = CONVERT_OPTION[variable_type]
param.text = option.get('func', str)(param.text)
getattr(tiramisu, option['opttype'])('test',
'Object to valid value',
param.text,
**option.get('initkwargs', {}),
)
except ValueError as err:
msg = _(f'unable to change type of value "{param.text}" '
f'is not a valid "{variable_type}"')
raise DictConsistencyError(msg, 13, param.xmlfiles) from err
param.type = variable_type

View File

@ -28,15 +28,13 @@ from os.path import basename
from typing import Tuple
from rougail.i18n import _
from rougail.utils import normalize_family
from rougail.utils import normalize_family, valid_variable_family_name
from rougail.error import DictConsistencyError
# a object's attribute has some annotations
# that shall not be present in the exported (flatened) XML
ERASED_ATTRIBUTES = ('redefine', 'exists', 'optional', 'remove_check', 'namespace',
'remove_condition', 'path', 'instance_mode', 'index',
'level', 'remove_fill', 'xmlfiles', 'type', 'reflector_name',
'reflector_object',)
ALLOW_ATTRIBUT_NOT_MANAGE = ['file']
ERASED_ATTRIBUTES = ('redefine', 'namespace', 'xmlfiles', 'disabled', 'name', 'manage')
ERASED_ATTRIBUTES2 = ('redefine', 'namespace', 'xmlfiles')
ALLOW_ATTRIBUT_NOT_MANAGE = ['file', 'engine', 'target']
class Annotator:
@ -72,14 +70,16 @@ class Annotator:
self.objectspace.space.services.doc = 'services'
self.objectspace.space.services.path = 'services'
for service_name, service in self.objectspace.space.services.service.items():
valid_variable_family_name(service_name, service.xmlfiles)
activate_obj = self._generate_element('boolean',
None,
None,
'activate',
True,
not service.disabled,
service,
'.'.join(['services', normalize_family(service_name), 'activate']),
)
service.disabled = None
for elttype, values in dict(vars(service)).items():
if elttype == 'servicelist':
self.objectspace.list_conditions.setdefault('servicelist',
@ -87,29 +87,34 @@ class Annotator:
values,
[]).append(activate_obj)
continue
if not isinstance(values, (dict, list)) or elttype in ERASED_ATTRIBUTES:
if elttype in ERASED_ATTRIBUTES:
continue
if not service.manage and elttype not in ALLOW_ATTRIBUT_NOT_MANAGE:
msg = _(f'unmanage service cannot have "{elttype}"')
raise DictConsistencyError(msg, 66, service.xmlfiles)
if elttype != 'ip':
eltname = elttype + 's'
if isinstance(values, (dict, list)):
if elttype != 'ip':
eltname = elttype + 's'
else:
eltname = elttype
path = '.'.join(['services', normalize_family(service_name), eltname])
family = self._gen_family(eltname,
path,
service.xmlfiles,
with_informations=False,
)
if isinstance(values, dict):
values = list(values.values())
family.family = self.make_group_from_elts(service_name,
elttype,
values,
path,
)
setattr(service, elttype, family)
else:
eltname = elttype
path = '.'.join(['services', normalize_family(service_name), eltname])
family = self._gen_family(eltname,
path,
service.xmlfiles,
with_informations=False,
)
if isinstance(values, dict):
values = list(values.values())
family.family = self.make_group_from_elts(service_name,
elttype,
values,
path,
)
setattr(service, elttype, family)
if not hasattr(service, 'information'):
service.information = self.objectspace.information(service.xmlfiles)
setattr(service.information, elttype, values)
manage = self._generate_element('boolean',
None,
None,
@ -156,7 +161,7 @@ class Annotator:
'.'.join([subpath, 'activate']),
)
for key in dir(elt):
if key.startswith('_') or key.endswith('_type') or key in ERASED_ATTRIBUTES:
if key.startswith('_') or key.endswith('_type') or key in ERASED_ATTRIBUTES2:
continue
value = getattr(elt, key)
if key == listname:

View File

@ -41,6 +41,7 @@ class Annotator(Walk): # pylint: disable=R0903
return
self.objectspace = objectspace
self.convert_value()
self.add_choice_nil()
def convert_value(self) -> None:
"""convert value
@ -83,8 +84,22 @@ class Annotator(Walk): # pylint: disable=R0903
variable.default_multi = variable.value[0].name
else:
if len(variable.value) > 1:
msg = _(f'the non multi variable "{variable.name}" cannot have '
msg = _(f'the none multi variable "{variable.name}" cannot have '
'more than one value')
raise DictConsistencyError(msg, 68, variable.xmlfiles)
variable.default = variable.value[0].name
del variable.value
def add_choice_nil(self) -> None:
for variable in self.get_variables():
if variable.type != 'choice':
continue
is_none = False
for choice in variable.choice:
if choice.type == 'nil':
is_none = True
if not variable.mandatory and not is_none:
choice = self.objectspace.choice(variable.xmlfiles)
choice.name = None
choice.type = 'nil'
variable.choice.append(choice)

View File

@ -62,11 +62,6 @@ CONVERT_OPTION = {'number': dict(opttype="IntOption", func=int),
}
FORCE_CHOICE = {'schedule': ['none', 'daily', 'weekly', 'monthly'],
'schedulemod': ['pre', 'post'],
}
class Walk:
"""Walk to objectspace to find variable or family
"""
@ -154,36 +149,49 @@ class Annotator(Walk): # pylint: disable=R0903
del variable.value[idx]
if not variable.value:
del variable.value
if hasattr(variable, 'choice'):
if variable.type != 'choice':
msg = _(f'choice for the variable "{variable.name}" not allowed with "{variable.type}" type')
raise DictConsistencyError(msg, 3, variable.xmlfiles)
values = []
choice_type = None
for choice in variable.choice:
if choice_type == 'variable':
msg = _(f'only one "variable" choice is allowed '
f'the variable "{variable.name}"')
raise DictConsistencyError(msg, 5, choice.xmlfiles)
if choice.type == 'nil':
choice.name = None
elif choice.type == 'variable':
choice.name = self.objectspace.paths.get_variable(choice.name)
if not choice.name.multi:
msg = _(f'only multi "variable" is allowed for a choice '
f'of variable "{variable.name}"')
raise DictConsistencyError(msg, 6, choice.xmlfiles)
else:
if not hasattr(choice, 'name'):
msg = _(f'choice for variable "{variable.name}" must have a value')
raise DictConsistencyError(msg, 14, choice.xmlfiles)
choice.name = CONVERT_OPTION.get(choice.type, {}).get('func', str)(choice.name)
if choice_type is None:
choice_type = choice.type
values.append(choice.name)
if choice_type not in ['function', 'variable'] and hasattr(variable, 'value'):
for value in variable.value:
if value.name not in values:
msg = _(f'value "{value.name}" of variable "{variable.name}" is not in list '
f'of all expected values ({values})')
raise DictConsistencyError(msg, 15, value.xmlfiles)
ref_choice = variable.choice[0]
self.objectspace.valid_enums[variable.path] = {'type': ref_choice.type,
'values': values,
'xmlfiles': ref_choice.xmlfiles,
}
elif variable.type == 'choice':
msg = _(f'choice is mandatory for the variable "{variable.name}" with choice type')
raise DictConsistencyError(msg, 4, variable.xmlfiles)
variable.doc = variable.description
del variable.description
self._convert_valid_enum(variable)
def _convert_valid_enum(self,
variable,
):
"""some types are, in fact, choices
convert this kind of variables into choice
"""
if variable.type in FORCE_CHOICE:
if not hasattr(self.objectspace.space, 'constraints'):
xmlfiles = variable.xmlfiles
self.objectspace.space.constraints = self.objectspace.constraints(xmlfiles)
self.objectspace.space.constraints.namespace = variable.namespace
if not hasattr(self.objectspace.space.constraints, 'check'):
self.objectspace.space.constraints.check = []
check = self.objectspace.check(variable.xmlfiles)
check.name = 'valid_enum'
target = self.objectspace.target(variable.xmlfiles)
target.name = variable.path
check.target = [target]
check.namespace = variable.namespace
check.param = []
for value in FORCE_CHOICE[variable.type]:
param = self.objectspace.param(variable.xmlfiles)
param.text = value
check.param.append(param)
self.objectspace.space.constraints.check.append(check)
variable.type = 'string'
def convert_test(self):
"""Convert variable tests value

View File

@ -50,6 +50,10 @@
<!ATTLIST service name CDATA #REQUIRED>
<!ATTLIST service manage (True|False) "True">
<!ATTLIST service servicelist CDATA #IMPLIED>
<!ATTLIST service disabled (True|False) "False">
<!ATTLIST service engine (none|creole|jinja2) #IMPLIED>
<!ATTLIST service target CDATA #IMPLIED>
<!ATTLIST service type (service|mount) "service">
<!ELEMENT ip (#PCDATA)>
<!ATTLIST ip iplist CDATA #IMPLIED>
@ -86,9 +90,9 @@
<!ATTLIST family leadership (True|False) "False">
<!ATTLIST family provider CDATA #IMPLIED>
<!ELEMENT variable (value*)>
<!ELEMENT variable ((choice*|value*)*)>
<!ATTLIST variable name CDATA #REQUIRED>
<!ATTLIST variable type (number|float|string|password|mail|boolean|filename|date|unix_user|ip|local_ip|netmask|network|broadcast|netbios|domainname|hostname|web_address|port|mac|cidr|network_cidr|schedule|schedulemod) "string">
<!ATTLIST variable type (number|float|string|password|mail|boolean|filename|date|unix_user|ip|local_ip|netmask|network|broadcast|netbios|domainname|hostname|web_address|port|mac|cidr|network_cidr|choice) "string">
<!ATTLIST variable description CDATA #IMPLIED>
<!ATTLIST variable help CDATA #IMPLIED>
<!ATTLIST variable hidden (True|False) "False">
@ -100,6 +104,7 @@
<!ATTLIST variable auto_freeze (True|False) "False">
<!ATTLIST variable auto_save (True|False) "False">
<!ATTLIST variable mode CDATA #IMPLIED>
<!ATTLIST variable remove_choice (True|False) "False">
<!ATTLIST variable remove_check (True|False) "False">
<!ATTLIST variable remove_condition (True|False) "False">
<!ATTLIST variable remove_fill (True|False) "False">
@ -107,6 +112,11 @@
<!ATTLIST variable test CDATA #IMPLIED>
<!ELEMENT value (#PCDATA)>
<!ATTLIST value type (string|number|nil|boolean) #IMPLIED>
<!ELEMENT choice (#PCDATA | param)*>
<!ATTLIST choice type (string|number|nil|boolean|function|variable) "string">
<!ATTLIST choice name CDATA #IMPLIED>
<!ELEMENT constraints ((fill*|check*|condition*)*)>

View File

@ -40,7 +40,7 @@ FORCE_UNREDEFINABLES = ('value',)
# RougailObjSpace's elements that shall not be modify
UNREDEFINABLE = ('multi', 'type',)
# RougailObjSpace's elements that did not created automaticly
FORCE_ELEMENTS = ('choice', 'property_', 'information')
FORCE_ELEMENTS = ('property_', 'information')
# XML text are convert has name
FORCED_TEXT_ELTS_AS_NAME = ('choice', 'property', 'value',)
@ -393,7 +393,7 @@ class RougailObjSpace:
for attr, val in child.attrib.items():
if redefine and attr in UNREDEFINABLE:
msg = _(f'cannot redefine attribute "{attr}" for variable "{child.attrib["name"]}"'
f' in "{xmlfile}", already defined')
f' already defined')
raise DictConsistencyError(msg, 48, variableobj.xmlfiles[:-1])
if attr in self.booleans_attributs:
val = convert_boolean(val)
@ -410,6 +410,12 @@ class RougailObjSpace:
"""Rougail object tree manipulations
"""
if child.tag == 'variable':
if child.attrib.get('remove_choice', False):
if variableobj.type != 'choice':
msg = _(f'cannot remove choices for variable "{variableobj.path}"'
f' the variable has type "{variableobj.type}"')
raise DictConsistencyError(msg, 33, variableobj.xmlfiles)
variableobj.choice = []
if child.attrib.get('remove_check', False):
self.remove_check(variableobj.name)
if child.attrib.get('remove_condition', False):
@ -424,14 +430,15 @@ class RougailObjSpace:
def remove_check(self, name):
"""Remove a check with a specified target
"""
remove_checks = []
for idx, check in enumerate(self.space.constraints.check): # pylint: disable=E1101
for target in check.target:
if target.name == name:
remove_checks.append(idx)
remove_checks.sort(reverse=True)
for idx in remove_checks:
self.space.constraints.check.pop(idx) # pylint: disable=E1101
if hasattr(self.space.constraints, 'check'):
remove_checks = []
for idx, check in enumerate(self.space.constraints.check): # pylint: disable=E1101
for target in check.target:
if target.name == name:
remove_checks.append(idx)
remove_checks.sort(reverse=True)
for idx in remove_checks:
self.space.constraints.check.pop(idx) # pylint: disable=E1101
def remove_condition(self,
name: str,

View File

@ -255,6 +255,7 @@ class RougailBaseTemplate:
filevar: Dict,
type_: str,
service_name: str,
service_type: str,
) -> None:
"""Run templatisation on one file
"""
@ -275,10 +276,11 @@ class RougailBaseTemplate:
var = variable[idx]
else:
var = None
func = f'_instance_{type_}'
func = f'get_data_{type_}'
data = getattr(self, func)(filevar,
filename,
service_name,
service_type,
variable,
idx,
)
@ -319,10 +321,26 @@ class RougailBaseTemplate:
for included in (True, False):
for service_obj in await self.config.option('services').list('all'):
service_name = await service_obj.option.name()
service_type = await service_obj.information.get('type', 'service')
if await service_obj.option('activate').value.get() is False:
if included is False:
self.desactive_service(service_name)
self.desactive_service(service_name, service_type)
continue
if not included:
engine = await service_obj.information.get('engine', None)
if engine:
self.instance_file({'engine': engine},
'service',
service_name,
service_type,
)
target_name = await service_obj.information.get('target', None)
if target_name:
self.target_service(service_name,
target_name,
service_type,
engine is None,
)
for fills in await service_obj.list('optiondescription'):
type_ = await fills.option.name()
for fill_obj in await fills.list('all'):
@ -335,10 +353,14 @@ class RougailBaseTemplate:
elif included is True:
continue
if fill['activate']:
self.instance_file(fill, type_, service_name)
self.instance_file(fill,
type_,
service_name,
service_type,
)
else:
self.log.debug(_("Instantiation of file '{filename}' disabled"))
self.post_instance_service(service_name)
self.post_instance_service(service_name, service_type)
self.post_instance()
chdir(ori_dir)
@ -356,29 +378,42 @@ class RougailBaseTemplate:
dico[key] = await obj.information.get(key, default_value)
def desactive_service(self,
service_name: str,
*args,
):
raise NotImplementedError(_('cannot desactivate a service'))
def post_instance_service(self, service_name): # pragma: no cover
def target_service(self,
service_name: str,
*args,
):
raise NotImplementedError(_('cannot use target for the service {service_name}'))
def post_instance_service(self,
*args,
): # pragma: no cover
pass
def post_instance(self): # pragma: no cover
pass
def _instance_ip(self,
*args,
) -> None: # pragma: no cover
def get_data_ip(self,
*args,
) -> None: # pragma: no cover
raise NotImplementedError(_('cannot instanciate this service type ip'))
def _instance_files(self,
*args,
) -> None: # pragma: no cover
def get_data_files(self,
*args,
) -> None: # pragma: no cover
raise NotImplementedError(_('cannot instanciate this service type file'))
def _instance_overrides(self,
*args,
) -> None: # pragma: no cover
def get_data_service(self,
*args,
) -> None: # pragma: no cover
raise NotImplementedError(_('cannot instanciate this service'))
def get_data_overrides(self,
*args,
) -> None: # pragma: no cover
raise NotImplementedError(_('cannot instanciate this service type override'))
async def load_variables(self,

View File

@ -38,9 +38,13 @@ IPAddressDeny=any
"""
ROUGAIL_TMPL_TEMPLATE = """%def display(%%file, %%filename)
ROUGAIL_DEST = '/usr/local/lib'
ROUGAIL_GLOBAL_SYSTEMD_FILE = '/usr/lib/systemd/system'
ROUGAIL_TMPL_TEMPLATE = f"""%def display(%%file, %%filename)
%if %%filename.startswith('/etc/') or %%filename.startswith('/var/') or %%filename.startswith('/srv/')
C %%filename %%file.mode %%file.owner %%file.group - /usr/local/lib%%filename
C %%filename %%file.mode %%file.owner %%file.group - {ROUGAIL_DEST}%%filename
z %%filename - - - - -
%end if
%end def
@ -70,13 +74,14 @@ class RougailSystemdTemplate(RougailBaseTemplate):
self.ip_per_service = None
super().__init__(config, rougailconfig)
def _instance_files(self,
filevar: Dict,
destfile: str,
service_name: str,
variable,
idx: int,
) -> tuple:
def get_data_files(self,
filevar: Dict,
destfile: str,
service_name: str,
service_type: str,
variable,
idx: int,
) -> tuple:
source = filevar['source']
if not isfile(source): # pragma: no cover
raise FileNotFound(_(f"File {source} does not exist."))
@ -88,27 +93,30 @@ class RougailSystemdTemplate(RougailBaseTemplate):
var = None
return tmp_file, None, destfile, var
def _instance_overrides(self,
filevar: Dict,
destfile,
service_name: str,
*args,
) -> tuple:
def get_data_overrides(self,
filevar: Dict,
destfile,
service_name: str,
service_type: str,
*args,
) -> tuple:
source = filevar['source']
if not isfile(source): # pragma: no cover
raise FileNotFound(_(f"File {source} does not exist."))
tmp_file = join(self.tmp_dir, source)
service_name = filevar['name']
return tmp_file, None, f'/systemd/system/{service_name}.service.d/rougail.conf', None
destfile = f'/systemd/system/{service_name}.{service_type}.d/rougail.conf'
return tmp_file, None, destfile, None
def _instance_ip(self,
filevar: Dict,
ip,
service_name: str,
var: Any,
idx: int,
*args,
) -> tuple:
def get_data_ip(self,
filevar: Dict,
ip,
service_name: str,
service_type: str,
var: Any,
idx: int,
*args,
) -> tuple:
if self.ip_per_service is None:
self.ip_per_service = []
if 'netmask' in filevar:
@ -120,19 +128,49 @@ class RougailSystemdTemplate(RougailBaseTemplate):
elif ip:
self.ip_per_service.append(ip)
def get_data_service(self,
servicevar: Dict,
info,
service_name: str,
service_type: str,
*args,
):
filename = f'{service_name}.{service_type}'
tmp_file = join(self.tmp_dir, filename)
var = None
destfile = f'/systemd/system/{filename}'
return tmp_file, None, destfile, var
def desactive_service(self,
service_name: str,
service_type: str,
):
filename = f'{self.destinations_dir}/systemd/system/{service_name}.service'
filename = f'{self.destinations_dir}/systemd/system/{service_name}.{service_type}'
makedirs(dirname(filename), exist_ok=True)
symlink('/dev/null', filename)
def target_service(self,
service_name: str,
target_name: str,
service_type: str,
global_service: str,
):
filename = f'{self.destinations_dir}/systemd/system/{target_name}.target.wants/{service_name}.{service_type}'
makedirs(dirname(filename), exist_ok=True)
if global_service:
source_filename = f'{ROUGAIL_GLOBAL_SYSTEMD_FILE}/{service_name}.{service_type}'
else:
source_filename = f'{ROUGAIL_DEST}/systemd/system/{service_name}.{service_type}'
symlink(source_filename, filename)
def post_instance_service(self,
service_name: str,
service_type: str,
) -> None: # pragma: no cover
if self.ip_per_service is None:
return
destfile = f'/systemd/system/{service_name}.service.d/rougail_ip.conf'
destfile = f'/systemd/system/{service_name}.{service_type}.d/rougail_ip.conf'
destfilename = join(self.destinations_dir, destfile[1:])
makedirs(dirname(destfilename), exist_ok=True)
self.log.info(_(f"creole processing: '{destfilename}'"))

View File

@ -243,7 +243,7 @@ class Common:
):
"""Populate variable parameters
"""
if param.type in ['number', 'boolean', 'nil', 'string', 'port']:
if param.type in ['number', 'boolean', 'nil', 'string', 'port', 'choice']:
value = param.text
if param.type == 'string' and value is not None:
value = self.convert_str(value)
@ -298,13 +298,13 @@ class Variable(Common):
):
if hasattr(self.elt, 'opt'):
keys['opt'] = self.elt.opt.reflector_object.get()
if hasattr(self.elt, 'values'):
values = self.elt.values
if hasattr(self.elt, 'choice'):
values = self.elt.choice
if values[0].type == 'variable':
value = values[0].name.reflector_object.get()
keys['values'] = f"Calculation(func.calc_value, Params((ParamOption({value}))))"
elif values[0].type == 'function':
keys['values'] = self.calculation_value(self.elt.values[0], [])
keys['values'] = self.calculation_value(values[0], [])
else:
keys['values'] = str(tuple([val.name for val in values]))
if hasattr(self.elt, 'multi') and self.elt.multi:

View File

@ -115,42 +115,64 @@ class RougailUpgrade:
variables = root.find('variables')
if variables is None:
return root
constraints = root.find('constraints')
if constraints is None:
return root
groups = []
for constraint in constraints:
if constraint.tag == 'group':
constraints.remove(constraint)
groups.append(constraint)
if not groups:
return root
paths = self._get_path_variables(variables,
namespace == self.rougailconfig['variable_namespace'],
namespace,
)
constraints = root.find('constraints')
# convert schedule and schedulemod
for variable in paths.values():
variable = variable['variable']
if variable.tag != 'variable':
continue
if 'type' in variable.attrib and variable.attrib['type'] in ['schedule', 'schedulemod']:
if variable.attrib['type'] == 'schedule':
choices = ('none', 'daily', 'weekly', 'monthly')
else:
choices = ('pre', 'post')
variable.attrib['type'] = 'choice'
has_value = False
for value in variable:
if value.tag == 'value':
has_value = True
break
for name in choices:
choice = SubElement(variable, 'choice')
choice.text = name
if not has_value:
value = SubElement(variable, 'value')
value.text = choices[0]
variable.attrib['mandatory'] = 'True'
# convert group to leadership
groups = []
if constraints is not None:
for constraint in constraints:
if constraint.tag == 'group':
constraints.remove(constraint)
groups.append(constraint)
for group in groups:
if group.attrib['leader'] in paths:
leader_obj = paths[group.attrib['leader']]
#FIXME name peut avoir "." il faut le virer
#FIXME si extra c'est un follower !
if 'name' in group.attrib:
name = group.attrib['name']
grpname = group.attrib['name']
if 'description' in group.attrib:
description = group.attrib['description']
else:
description = name
description = grpname
else:
name = leader_obj['variable'].attrib['name']
if '.' in name:
name = name.rsplit('.', 1)[-1]
grpname = leader_obj['variable'].attrib['name']
if '.' in grpname:
grpname = grpname.rsplit('.', 1)[-1]
if 'description' in group.attrib:
description = group.attrib['description']
elif 'description' in leader_obj['variable'].attrib:
description = leader_obj['variable'].attrib['description']
else:
description = name
family = SubElement(leader_obj['parent'], 'family', name=name, description=description, leadership="True")
description = grpname
family = SubElement(leader_obj['parent'], 'family', name=grpname, description=description, leadership="True")
leader_obj['parent'].remove(leader_obj['variable'])
family.append(leader_obj['variable'])
else:
@ -164,6 +186,7 @@ class RougailUpgrade:
follower_path = follower.text
obj = paths[follower_path]
family = SubElement(obj['parent'], 'family', name=leader_name, leadership="True")
grpname = leader_name
for follower in group:
leader_name = group.attrib['leader']
if '.' in leader_name:
@ -174,6 +197,73 @@ class RougailUpgrade:
follower_obj = paths[follower_path]
follower_obj['parent'].remove(follower_obj['variable'])
family.append(follower_obj['variable'])
if '.' in follower_path:
new_path = follower_path.rsplit('.', 1)[0] + '.' + grpname + '.' + follower_path.rsplit('.', 1)[1]
paths[new_path] = paths[follower_path]
# convert choice option
valid_enums = []
if constraints is not None:
for constraint in constraints:
if constraint.tag == 'check' and constraint.attrib['name'] == 'valid_enum':
constraints.remove(constraint)
valid_enums.append(constraint)
for valid_enum in valid_enums:
targets = []
for target in valid_enum:
if target.tag != 'target':
continue
if target.text in paths:
# not in paths if it's optional
# but not check it
targets.append(paths[target.text]['variable'])
params = []
function_param = None
for param in valid_enum:
if param.tag != 'param':
continue
if 'type' in param.attrib and param.attrib['type'] == 'function':
function_param = param.text
continue
params.append(param)
first_choice = None
for target in targets:
if function_param is not None:
function = SubElement(target, 'choice', type='function', name=function_param)
for param in params:
if function_param is not None:
function.append(param)
else:
choice = SubElement(target, 'choice')
if first_choice is None:
first_choice = choice
choice.text = param.text
if 'type' not in param.attrib and param.text is None:
choice_type = 'nil'
elif 'type' in param.attrib:
choice_type = param.attrib['type']
elif 'type' in target.attrib:
choice_type = target.attrib['type']
else:
choice_type = 'string'
choice.attrib['type'] = choice_type
has_value = False
for target in targets:
if 'remove_check' in target.attrib:
target.attrib['remove_choice'] = target.attrib['remove_check']
for target in targets:
for value in target:
if value.tag == 'value':
has_value = True
if 'type' in target.attrib:
value.attrib['type'] = target.attrib['type']
if first_choice is not None and not has_value:
value = SubElement(target, 'value')
value.attrib['type'] = first_choice.attrib['type']
value.text = first_choice.text
for target in targets:
if 'remove_choice' not in target.attrib or target.attrib['remove_choice'] != 'True':
target.attrib['type'] = 'choice'
return root
def _get_path_variables(self, variables, is_variable_namespace, path, dico=None):
@ -184,6 +274,8 @@ class RougailUpgrade:
subpath = path + '.'
else:
subpath = ''
if variable.tag not in ['variable', 'family']:
continue
subpath += variable.attrib['name']
if variable.tag == 'family':
self._get_path_variables(variable, is_variable_namespace, subpath, dico)

View File

@ -7,17 +7,16 @@
</variable>
</family>
<family name="enumfam" mode="expert">
<variable name="enumvar" type="number" description="enumvar" help="bla bla bla"/>
<variable name="enumvar" type="choice" description="enumvar" help="bla bla bla">
<choice type="number">1</choice>
<choice type="number">2</choice>
<choice type="number">3</choice>
<value type="number">1</value>
</variable>
<variable name="test_variable" type="number" description="test variable"/>
</family>
</variables>
<constraints>
<check name="valid_enum">
<param>1</param>
<param>2</param>
<param>3</param>
<target>enumvar</target>
</check>
<condition name="hidden_if_in" source="enumvar">
<param>4</param>
<target type="variable">test_variable</target>

View File

@ -2,8 +2,11 @@
<rougail version="0.10">
<variables>
<family name="general">
<variable name="condition" type="string" description="No change">
<value>tous</value>
<variable name="condition" type="choice" description="No change">
<value type="string">tous</value>
<choice type="string">tous</choice>
<choice type="string">authentifié</choice>
<choice type="string">aucun</choice>
</variable>
<variable name="mode_conteneur_actif" type="string" description="No change">
<value>tous</value>
@ -14,12 +17,6 @@
</family>
</variables>
<constraints>
<check name="valid_enum">
<param>tous</param>
<param>authentifié</param>
<param>aucun</param>
<target>condition</target>
</check>
<condition name="disabled_if_in" source="condition">
<param type="variable">mode_conteneur_actif</param>
<target type="variable">mode_conteneur_actif2</target>

View File

@ -2,8 +2,11 @@
<rougail version="0.10">
<variables>
<family name="general">
<variable name="condition" type="string" description="No change">
<value>tous</value>
<variable name="condition" type="choice" description="No change">
<value type="string">tous</value>
<choice type="string">tous</choice>
<choice type="string">authentifié</choice>
<choice type="string">aucun</choice>
</variable>
<variable name="mode_conteneur_actif" type="string" description="No change">
<value>aucun</value>
@ -14,12 +17,6 @@
</family>
</variables>
<constraints>
<check name="valid_enum">
<param>tous</param>
<param>authentifié</param>
<param>aucun</param>
<target>condition</target>
</check>
<condition name="disabled_if_in" source="condition">
<param type="variable">mode_conteneur_actif</param>
<target type="variable">mode_conteneur_actif2</target>

View File

@ -2,8 +2,11 @@
<rougail version="0.10">
<variables>
<family name="general">
<variable name="condition" type="string" description="No change">
<value>tous</value>
<variable name="condition" type="choice" description="No change">
<value type="string">tous</value>
<choice type="string">tous</choice>
<choice type="string">authentifié</choice>
<choice type="string">aucun</choice>
</variable>
<variable name="mode_conteneur_actif" type="string" description="No change">
<value>non</value>
@ -14,12 +17,6 @@
</family>
</variables>
<constraints>
<check name="valid_enum">
<param>tous</param>
<param>authentifié</param>
<param>aucun</param>
<target>condition</target>
</check>
<condition name="hidden_if_in" source="condition">
<param>tous</param>
<param>authentifié</param>

View File

@ -2,8 +2,11 @@
<rougail version="0.10">
<variables>
<family name="general">
<variable name="condition" type="string" description="No change">
<value>tous</value>
<variable name="condition" type="choice" description="No change">
<value type="string">tous</value>
<choice type="string">tous</choice>
<choice type="string">authentifié</choice>
<choice type="string">aucun</choice>
</variable>
<variable name="mode_conteneur_actif" type="string" description="No change" hidden="True">
<value>non</value>
@ -14,12 +17,6 @@
</family>
</variables>
<constraints>
<check name="valid_enum">
<param>tous</param>
<param>authentifié</param>
<param>aucun</param>
<target>condition</target>
</check>
<condition name="hidden_if_in" source="condition">
<param>oui</param>
<param>non</param>

View File

@ -2,8 +2,11 @@
<rougail version="0.10">
<variables>
<family name="general">
<variable name="condition" type="string" description="No change">
<value>tous</value>
<variable name="condition" type="choice" description="No change">
<value type="string">tous</value>
<choice type="string">tous</choice>
<choice type="string">authentifié</choice>
<choice type="string">aucun</choice>
</variable>
<variable name="mode_conteneur_actif" type="string" description="No change">
<value>tous</value>
@ -14,12 +17,6 @@
</family>
</variables>
<constraints>
<check name="valid_enum">
<param>tous</param>
<param>authentifié</param>
<param>aucun</param>
<target>condition</target>
</check>
<condition name="hidden_if_in" source="condition">
<param type="variable">mode_conteneur_actif</param>
<target type="variable">mode_conteneur_actif2</target>

View File

@ -2,8 +2,11 @@
<rougail version="0.10">
<variables>
<family name="general">
<variable name="condition" type="string" description="No change">
<value>tous</value>
<variable name="condition" type="choice" description="No change">
<value type="string">tous</value>
<choice type="string">tous</choice>
<choice type="string">authentifié</choice>
<choice type="string">aucun</choice>
</variable>
<variable name="mode_conteneur_actif" type="string" description="No change">
<value>non</value>
@ -14,12 +17,6 @@
</family>
</variables>
<constraints>
<check name="valid_enum">
<param>tous</param>
<param>authentifié</param>
<param>aucun</param>
<target>condition</target>
</check>
<condition name="hidden_if_not_in" source="condition">
<param>oui</param>
<param>non</param>

View File

@ -2,8 +2,11 @@
<rougail version="0.10">
<variables>
<family name="general">
<variable name="condition" type="string" description="No change">
<value>tous</value>
<variable name="condition" type="choice" description="No change">
<value type="string">tous</value>
<choice type="string">tous</choice>
<choice type="string">authentifié</choice>
<choice type="string">aucun</choice>
</variable>
<variable name="mode_conteneur_actif" type="string" description="No change" hidden="True">
<value>non</value>
@ -14,12 +17,6 @@
</family>
</variables>
<constraints>
<check name="valid_enum">
<param>tous</param>
<param>authentifié</param>
<param>aucun</param>
<target>condition</target>
</check>
<condition name="mandatory_if_not_in" source="condition">
<param>oui</param>
<param>non</param>

View File

@ -7,18 +7,14 @@
</variable>
</family>
<family name="enumfam" mode="expert">
<variable name="enumvar" type="string" description="multi" help="bla bla bla">
<value>c</value>
<variable name="enumvar" type="choice" description="multi" help="bla bla bla">
<value type="string">c</value>
<choice type="string">a</choice>
<choice type="string">b</choice>
<choice type="string">c</choice>
<choice type="string">é</choice>
</variable>
</family>
</variables>
<constraints>
<check name="valid_enum">
<param>a</param>
<param>b</param>
<param>c</param>
<param>é</param>
<target>enumvar</target>
</check>
</constraints>
<constraints/>
</rougail>

View File

@ -7,15 +7,12 @@
</variable>
</family>
<family name="enumfam" mode="expert">
<variable name="enumvar" type="string" description="enumvar">
<value>non</value>
<variable name="enumvar" type="choice" description="multi" help="bla bla bla">
<value type="string">b</value>
<choice type="string">a</choice>
<choice type="string">b</choice>
</variable>
</family>
</variables>
<constraints>
<check name="valid_enum">
<param type="number">1</param>
<target>enumvar</target>
</check>
</constraints>
<constraints/>
</rougail>

View File

@ -0,0 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<rougail version="0.10">
<variables>
<family name="enumfam">
<variable name="enumvar" redefine="True">
<value type="string">c</value>
<choice type="string">c</choice>
</variable>
</family>
</variables>
<constraints/>
</rougail>

View File

@ -2,5 +2,9 @@
"rougail.general.mode_conteneur_actif": {
"owner": "default",
"value": "non"
},
"rougail.enumfam.enumvar": {
"owner": "default",
"value": "c"
}
}

View File

@ -0,0 +1,4 @@
{
"rougail.general.mode_conteneur_actif": "non",
"rougail.enumfam.enumvar": "c"
}

View File

@ -2,5 +2,9 @@
"rougail.general.mode_conteneur_actif": {
"owner": "default",
"value": "non"
},
"rougail.enumfam.enumvar": {
"owner": "default",
"value": "c"
}
}

View File

@ -11,7 +11,10 @@ try:
from tiramisu3 import *
except:
from tiramisu import *
option_3 = StrOption(name="mode_conteneur_actif", doc="No change", default="non", properties=frozenset({"force_default_on_freeze", "frozen", "hidden", "mandatory", "normal"}))
option_2 = OptionDescription(name="general", doc="general", children=[option_3], properties=frozenset({"normal"}))
option_1 = OptionDescription(name="rougail", doc="rougail", children=[option_2])
option_3 = StrOption(name="mode_conteneur_actif", doc="No change", default="non", properties=frozenset({"expert", "mandatory"}))
option_2 = OptionDescription(name="general", doc="general", children=[option_3], properties=frozenset({"expert"}))
option_5 = ChoiceOption(name="enumvar", doc="multi", values=('a', 'b', 'c'), default="c", properties=frozenset({"expert", "mandatory"}))
option_5.impl_set_information('help', "bla bla bla")
option_4 = OptionDescription(name="enumfam", doc="enumfam", children=[option_5], properties=frozenset({"expert"}))
option_1 = OptionDescription(name="rougail", doc="rougail", children=[option_2, option_4])
option_0 = OptionDescription(name="baseoption", doc="baseoption", children=[option_1])

View File

@ -7,17 +7,13 @@
</variable>
</family>
<family name="enumfam" mode="expert">
<variable name="enumvar" type="string" description="multi" help="bla bla bla">
<value>c</value>
<variable name="enumvar" type="choice" description="multi" help="bla bla bla">
<value type="string">c</value>
<choice type="string">a</choice>
<choice type="string">b</choice>
<choice type="string">c</choice>
</variable>
</family>
</variables>
<constraints>
<check name="valid_enum">
<param>a</param>
<param>b</param>
<param>c</param>
<target>enumvar</target>
</check>
</constraints>
<constraints/>
</rougail>

View File

@ -7,17 +7,13 @@
</variable>
</family>
<family name="enumfam" mode="expert">
<variable name="enumvar" mandatory="False">
<variable name="enumvar" mandatory="False" type="choice">
<value>c</value>
<choice type="string">a</choice>
<choice type="string">b</choice>
<choice type="string">c</choice>
</variable>
</family>
</variables>
<constraints>
<check name="valid_enum">
<param>a</param>
<param>b</param>
<param>c</param>
<target>enumvar</target>
</check>
</constraints>
<constraints/>
</rougail>

View File

@ -7,26 +7,19 @@
</variable>
</family>
<family name="enumfam" mode="expert">
<variable name="enumvar2" type="string" description="multi">
<value>c</value>
<variable name="enumvar2" type="choice" description="multi">
<value type="string">c</value>
<choice type="string">a</choice>
<choice type="string">b</choice>
<choice type="string">c</choice>
</variable>
<variable name="enumvar" type="string" description="multi" help="bla bla bla">
<value>c</value>
<variable name="enumvar" type="choice" description="multi" help="bla bla bla">
<value type="string">c</value>
<choice type="string">a</choice>
<choice type="string">b</choice>
<choice type="string">c</choice>
</variable>
</family>
</variables>
<constraints>
<check name="valid_enum">
<param>a</param>
<param>b</param>
<param>c</param>
<target>enumvar</target>
</check>
<check name="valid_enum">
<param>a</param>
<param>b</param>
<param>c</param>
<target>enumvar2</target>
</check>
</constraints>
<constraints/>
</rougail>

View File

@ -2,16 +2,12 @@
<rougail version="0.10">
<variables>
<family name="enumfam" mode="expert">
<variable name="enumvar" redefine="True" remove_check="True">
<variable name="enumvar" redefine="True" remove_check="True" remove_choice="True">
<value>c</value>
<choice type="string">a</choice>
<choice type="string">c</choice>
</variable>
</family>
</variables>
<constraints>
<check name="valid_enum">
<param>a</param>
<param>c</param>
<target>enumvar</target>
</check>
</constraints>
<constraints/>
</rougail>

View File

@ -7,17 +7,15 @@
</variable>
<family name="leader" description="leader" leadership="True">
<variable name="leader" type="string" description="leader" multi="True"/>
<variable name="follower1" type="string" description="follower1"/>
<variable name="follower1" type="choice" description="follower1">
<choice type="string">a</choice>
<choice type="string">b</choice>
<choice type="string">c</choice>
<value type="string">a</value>
</variable>
<variable name="follower2" type="string" description="follower2"/>
</family>
</family>
</variables>
<constraints>
<check name="valid_enum">
<param>a</param>
<param>b</param>
<param>c</param>
<target>follower1</target>
</check>
</constraints>
<constraints/>
</rougail>

View File

@ -8,15 +8,13 @@
</variable>
</family>
<family name="enumfam" mode="expert">
<variable name="enumvar" type="string" description="multi" mandatory="True"/>
<variable name="enumvar" type="choice" description="multi" mandatory="True">
<choice type="string">a</choice>
<choice type="string">b</choice>
<choice type="string">c</choice>
<value type="string">a</value>
</variable>
</family>
</variables>
<constraints>
<check name="valid_enum">
<param>a</param>
<param>b</param>
<param>c</param>
<target>enumvar</target>
</check>
</constraints>
<constraints/>
</rougail>

View File

@ -5,15 +5,13 @@
<variable name="mode_conteneur_actif" type="string" description="No change">
<value>non</value>
</variable>
<variable name="multi" type="string" description="multi" multi="True"/>
<variable name="multi" type="choice" description="multi" multi="True">
<choice type="string">a</choice>
<choice type="string">b</choice>
<choice type="string">c</choice>
<value type="string">a</value>
</variable>
</family>
</variables>
<constraints>
<check name="valid_enum">
<param>a</param>
<param>b</param>
<param>c</param>
<target>multi</target>
</check>
</constraints>
<constraints/>
</rougail>

View File

@ -7,17 +7,13 @@
</variable>
</family>
<family name="enumfam" mode="expert">
<variable name="enumvar" type="string" description="multi" help="bla bla bla" mandatory="False">
<value>b</value>
<variable name="enumvar" type="choice" description="multi" help="bla bla bla" mandatory="False">
<value type="string">b</value>
<choice type="string">a</choice>
<choice type="string">b</choice>
<choice type="nil"/>
</variable>
</family>
</variables>
<constraints>
<check name="valid_enum">
<param>a</param>
<param>b</param>
<param/>
<target>enumvar</target>
</check>
</constraints>
<constraints/>
</rougail>

View File

@ -13,7 +13,7 @@ except:
from tiramisu import *
option_3 = StrOption(name="mode_conteneur_actif", doc="No change", default="non", properties=frozenset({"expert", "mandatory"}))
option_2 = OptionDescription(name="general", doc="general", children=[option_3], properties=frozenset({"expert"}))
option_5 = ChoiceOption(name="enumvar", doc="multi", values=('a', 'b', '', None), default="b", properties=frozenset({"expert"}))
option_5 = ChoiceOption(name="enumvar", doc="multi", values=('a', 'b', None), default="b", properties=frozenset({"expert"}))
option_5.impl_set_information('help', "bla bla bla")
option_4 = OptionDescription(name="enumfam", doc="enumfam", children=[option_5], properties=frozenset({"expert"}))
option_1 = OptionDescription(name="rougail", doc="rougail", children=[option_2, option_4])

View File

@ -7,15 +7,13 @@
</variable>
</family>
<family name="enumfam" mode="expert">
<variable name="enumvar" type="number" description="enumvar" help="bla bla bla"/>
<variable name="enumvar" type="choice" description="enumvar" help="bla bla bla">
<choice type="number">1</choice>
<choice type="number">2</choice>
<choice type="number">3</choice>
<value type="number">1</value>
</variable>
</family>
</variables>
<constraints>
<check name="valid_enum">
<param>1</param>
<param>2</param>
<param>3</param>
<target>enumvar</target>
</check>
</constraints>
<constraints/>
</rougail>

View File

@ -7,17 +7,13 @@
</variable>
</family>
<family name="enumfam" mode="expert">
<variable name="enumvar" type="number" description="enumvar" help="bla bla bla">
<value>3</value>
<variable name="enumvar" type="choice" description="enumvar" help="bla bla bla">
<value type="number">3</value>
<choice type="number">1</choice>
<choice type="number">2</choice>
<choice type="number">3</choice>
</variable>
</family>
</variables>
<constraints>
<check name="valid_enum">
<param>1</param>
<param>2</param>
<param>3</param>
<target>enumvar</target>
</check>
</constraints>
<constraints/>
</rougail>

View File

@ -7,13 +7,11 @@
</variable>
</family>
<family name="enumfam" mode="expert">
<variable name="enumvar" type="string" description="multi" help="bla bla bla"/>
<variable name="enumvar" type="choice" description="multi" help="bla bla bla">
<choice type="nil"/>
<value type="nil"/>
</variable>
</family>
</variables>
<constraints>
<check name="valid_enum">
<param type="nil"/>
<target>enumvar</target>
</check>
</constraints>
<constraints/>
</rougail>

View File

@ -7,13 +7,11 @@
</variable>
</family>
<family name="enumfam" mode="expert">
<variable name="enumvar" type="string" description="multi" help="bla bla bla"/>
<variable name="enumvar" type="choice" description="multi" help="bla bla bla">
<choice type="nil"/>
<value type="nil"/>
</variable>
</family>
</variables>
<constraints>
<check name="valid_enum">
<param type="nil"/>
<target>enumvar</target>
</check>
</constraints>
<constraints/>
</rougail>

View File

@ -7,15 +7,13 @@
</variable>
</family>
<family name="enumfam" mode="expert">
<variable name="enumvar" type="string" description="multi" help="bla bla bla"/>
<variable name="enumvar" type="choice" description="multi" help="bla bla bla">
<choice type="string">quote'</choice>
<choice type="string">quote"</choice>
<choice type="string">quote"'</choice>
<value type="string">quote'</value>
</variable>
</family>
</variables>
<constraints>
<check name="valid_enum">
<param>quote'</param>
<param>quote"</param>
<param>quote"'</param>
<target>enumvar</target>
</check>
</constraints>
<constraints/>
</rougail>

View File

@ -2,17 +2,13 @@
<rougail version="0.10">
<variables>
<family name="general">
<variable name="mode_conteneur_actif" type="string" description="No change">
<value>b</value>
<variable name="mode_conteneur_actif" type="choice" description="No change">
<value type="string">b</value>
<choice type="string">a</choice>
<choice type="string">b</choice>
<choice type="string">c</choice>
</variable>
</family>
</variables>
<constraints>
<check name="valid_enum">
<param>a</param>
<param>b</param>
<param>c</param>
<target>mode_conteneur_actif</target>
</check>
</constraints>
<constraints/>
</rougail>

View File

@ -7,8 +7,10 @@
</services>
<variables>
<family name="general">
<variable name="condition" type="string" description="No change">
<value>non</value>
<variable name="condition" type="choice" description="No change">
<value type="string">non</value>
<choice type="string">non</choice>
<choice type="string">statique</choice>
</variable>
<variable name="mode_conteneur_actif" type="string" description="No change" hidden="True">
<value>non</value>
@ -19,11 +21,6 @@
</family>
</variables>
<constraints>
<check name="valid_enum">
<param>non</param>
<param>statique</param>
<target>condition</target>
</check>
<condition name="disabled_if_not_in" source="condition">
<param>statique</param>
<target type="filelist">afilllist</target>

View File

@ -2,17 +2,14 @@
<rougail version="0.10">
<variables>
<family name="general">
<variable name="var" type="number" description="New variable">
<value>9</value>
<variable name="var" type="choice" description="New variable">
<value type="number">9</value>
<choice type="function" name="trange">
<param type="number">0</param>
<param type="number">10</param>
</choice>
</variable>
</family>
</variables>
<constraints>
<check name="valid_enum">
<param type="function">trange</param>
<param type="number">0</param>
<param type="number">10</param>
<target>var</target>
</check>
</constraints>
<constraints/>
</rougail>

View File

@ -2,8 +2,9 @@
<rougail version="0.10">
<variables>
<family name="general">
<variable name="mode_conteneur_actif" type="string" description="No change">
<value>a</value>
<variable name="mode_conteneur_actif" type="choice" description="No change">
<value type="string">a</value>
<choice type="variable">var</choice>
</variable>
<variable name="var" type="string" description="New variable" multi="True">
<value>a</value>
@ -12,10 +13,5 @@
</variable>
</family>
</variables>
<constraints>
<check name="valid_enum">
<param type="variable">var</param>
<target>mode_conteneur_actif</target>
</check>
</constraints>
<constraints/>
</rougail>

View File

@ -10,16 +10,15 @@
<variable name="mode_conteneur_actif2" type="string" description="No change">
<value>non</value>
</variable>
<variable name="mode_conteneur_actif3" type="string" description="No change"/>
<variable name="mode_conteneur_actif3" type="choice" description="No change">
<choice type="string">a</choice>
<choice type="string">b</choice>
<choice type="string">c</choice>
<value type="string">a</value>
</variable>
</family>
</variables>
<constraints>
<check name="valid_enum">
<param>a</param>
<param>b</param>
<param>c</param>
<target>mode_conteneur_actif3</target>
</check>
<condition name="disabled_if_in" source="mode_conteneur_actif3">
<param>d</param>
<target type="variable">mode_conteneur_actif</target>

View File

@ -1,16 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<rougail version="0.10">
<variables>
<family name="general">
<variable name="mode_conteneur_actif" type="string" description="No change" hidden="True"/>
</family>
</variables>
<constraints>
<check name="valid_enum">
<param>a</param>
<param>b</param>
<param>c</param>
<target>mode_conteneur_actif</target>
</check>
</constraints>
</rougail>

View File

@ -1,10 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<rougail version="0.10">
<variables>
<family name="general">
<variable name="mode_conteneur_actif" redefine="True" remove_check="True">
<value>non</value>
</variable>
</family>
</variables>
</rougail>

View File

@ -1,3 +0,0 @@
{
"rougail.general.mode_conteneur_actif": "non"
}

View File

@ -2,15 +2,13 @@
<rougail version="0.10">
<variables>
<family name="general">
<variable name="mode_conteneur_actif" type="string" description="Redefine description" hidden="True"/>
<variable name="mode_conteneur_actif" type="choice" description="Redefine description" hidden="True">
<choice type="string">a</choice>
<choice type="string">b</choice>
<choice type="string">c</choice>
<value type="string">a</value>
</variable>
</family>
</variables>
<constraints>
<check name="valid_enum">
<param>a</param>
<param>b</param>
<param>c</param>
<target>mode_conteneur_actif</target>
</check>
</constraints>
<constraints/>
</rougail>

View File

@ -2,14 +2,12 @@
<rougail version="0.10">
<variables>
<family name="general">
<variable name="mode_conteneur_actif" redefine="True" remove_check="True"/>
<variable name="mode_conteneur_actif" redefine="True" remove_check="True" remove_choice="True">
<choice type="string">a</choice>
<choice type="string">b</choice>
<value type="string">a</value>
</variable>
</family>
</variables>
<constraints>
<check name="valid_enum">
<param>a</param>
<param>b</param>
<target>mode_conteneur_actif</target>
</check>
</constraints>
<constraints/>
</rougail>

View File

@ -5,9 +5,17 @@
<variable name="description" type="string">
<value>Exportation de la base de ejabberd</value>
</variable>
<variable name="day" type="schedule"/>
<variable name="mode" type="schedulemod">
<variable name="day" type="choice" mandatory="True">
<choice>none</choice>
<choice>daily</choice>
<choice>weekly</choice>
<choice>monthly</choice>
<value>none</value>
</variable>
<variable name="mode" type="choice" mandatory="True">
<value>pre</value>
<choice>pre</choice>
<choice>post</choice>
</variable>
</family>
</variables>

View File

@ -5,9 +5,17 @@
<variable name="description" type="string">
<value>Exportation de la base de ejabberd</value>
</variable>
<variable name="day" type="schedule" help="Test help"/>
<variable name="mode" type="schedulemod">
<variable name="day" type="choice" help="Test help" mandatory="True">
<choice>none</choice>
<choice>daily</choice>
<choice>weekly</choice>
<choice>monthly</choice>
<value>none</value>
</variable>
<variable name="mode" type="choice" mandatory="True">
<value>pre</value>
<choice>pre</choice>
<choice>post</choice>
</variable>
</family>
</variables>

View File

@ -6,17 +6,12 @@
<variable name="description" type="string" multi="True">
<value>test</value>
</variable>
<variable name="mode" type="string">
<variable name="mode" type="choice">
<choice>pre</choice>
<choice>post</choice>
<value>pre</value>
</variable>
</family>
</family>
</variables>
<constraints>
<check name="valid_enum">
<param>pre</param>
<param>post</param>
<target>extra.ejabberd.description.mode</target>
</check>
</constraints>
</rougail>

View File

@ -5,9 +5,17 @@
<variable name="description" type="string">
<value>Exportation de la base de ejabberd</value>
</variable>
<variable name="day" type="schedule"/>
<variable name="mode" type="schedulemod">
<variable name="day" type="choice" mandatory="True">
<choice>none</choice>
<choice>daily</choice>
<choice>weekly</choice>
<choice>monthly</choice>
<value>none</value>
</variable>
<variable name="mode" type="choice" mandatory="True">
<value>pre</value>
<choice>pre</choice>
<choice>post</choice>
</variable>
</family>
</variables>

View File

@ -5,8 +5,18 @@
<variable name="description" type="string">
<value>Exportation de la base de ejabberd</value>
</variable>
<variable name="day" type="schedule" mandatory="True"/>
<variable name="mode" type="schedulemod" mandatory="True"/>
<variable name="day" type="choice" mandatory="True">
<choice>none</choice>
<choice>daily</choice>
<choice>weekly</choice>
<choice>monthly</choice>
<value>none</value>
</variable>
<variable name="mode" type="choice" mandatory="True">
<choice>pre</choice>
<choice>post</choice>
<value>pre</value>
</variable>
<variable name="var1" type="string" mandatory="True"/>
</family>
</variables>

View File

@ -5,9 +5,17 @@
<variable name="description" type="string">
<value>Exportation de la base de ejabberd</value>
</variable>
<variable name="day" type="schedule"/>
<variable name="mode" type="schedulemod">
<variable name="day" type="choice" mandatory="True">
<choice>none</choice>
<choice>daily</choice>
<choice>weekly</choice>
<choice>monthly</choice>
<value>none</value>
</variable>
<variable name="mode" type="choice" mandatory="True">
<value>pre</value>
<choice>pre</choice>
<choice>post</choice>
</variable>
</family>
</variables>

View File

@ -5,9 +5,17 @@
<variable name="description" type="string">
<value>Exportation de la base de ejabberd</value>
</variable>
<variable name="day" type="schedule"/>
<variable name="mode" type="schedulemod">
<variable name="day" type="choice" mandatory="True">
<choice>none</choice>
<choice>daily</choice>
<choice>weekly</choice>
<choice>monthly</choice>
<value>none</value>
</variable>
<variable name="mode" type="choice" mandatory="True">
<value>pre</value>
<choice>pre</choice>
<choice>post</choice>
</variable>
</family>
</variables>

View File

@ -5,9 +5,17 @@
<variable name="description" type="string">
<value>Exportation de la base de ejabberd</value>
</variable>
<variable name="day" type="schedule"/>
<variable name="mode" type="schedulemod">
<variable name="day" type="choice" mandatory="True">
<choice>none</choice>
<choice>daily</choice>
<choice>weekly</choice>
<choice>monthly</choice>
<value>none</value>
</variable>
<variable name="mode" type="choice" mandatory="True">
<value>pre</value>
<choice>pre</choice>
<choice>post</choice>
</variable>
</family>
</variables>

View File

@ -0,0 +1,12 @@
<?xml version='1.0' encoding='UTF-8'?>
<rougail version="0.10">
<services>
<service name="test" disabled="True">
</service>
</services>
<variables>
<variable name="condition">
<value>no</value>
</variable>
</variables>
</rougail>

View File

@ -0,0 +1,14 @@
{
"rougail.condition": {
"owner": "default",
"value": "no"
},
"services.test.activate": {
"owner": "default",
"value": false
},
"services.test.manage": {
"owner": "default",
"value": true
}
}

View File

@ -0,0 +1,5 @@
{
"rougail.condition": "no",
"services.test.activate": false,
"services.test.manage": true
}

View File

@ -0,0 +1,14 @@
{
"rougail.condition": {
"owner": "default",
"value": "no"
},
"services.test.activate": {
"owner": "default",
"value": false
},
"services.test.manage": {
"owner": "default",
"value": true
}
}

View File

@ -0,0 +1 @@
/dev/null

View File

@ -0,0 +1,20 @@
from importlib.machinery import SourceFileLoader
from importlib.util import spec_from_loader, module_from_spec
loader = SourceFileLoader('func', 'tests/dictionaries/../eosfunc/test.py')
spec = spec_from_loader(loader.name, loader)
func = module_from_spec(spec)
loader.exec_module(func)
for key, value in dict(locals()).items():
if key != ['SourceFileLoader', 'func']:
setattr(func, key, value)
try:
from tiramisu3 import *
except:
from tiramisu import *
option_2 = StrOption(name="condition", doc="condition", default="no", properties=frozenset({"mandatory", "normal"}))
option_1 = OptionDescription(name="rougail", doc="rougail", children=[option_2])
option_5 = BoolOption(name="activate", doc="activate", default=False)
option_6 = BoolOption(name="manage", doc="manage", default=True)
option_4 = OptionDescription(name="test", doc="test", children=[option_5, option_6])
option_3 = OptionDescription(name="services", doc="services", children=[option_4], properties=frozenset({"hidden"}))
option_0 = OptionDescription(name="baseoption", doc="baseoption", children=[option_1, option_3])

View File

@ -0,0 +1,14 @@
<?xml version='1.0' encoding='UTF-8'?>
<rougail version="0.10">
<services>
<service name="testsrv" engine="creole">
</service>
</services>
<variables>
<family name="general" description="général">
<variable name="mode_conteneur_actif" type="string" description="No change" hidden="True">
<value>oui</value>
</variable>
</family>
</variables>
</rougail>

View File

@ -0,0 +1,14 @@
{
"rougail.general.mode_conteneur_actif": {
"owner": "default",
"value": "oui"
},
"services.testsrv.activate": {
"owner": "default",
"value": true
},
"services.testsrv.manage": {
"owner": "default",
"value": true
}
}

View File

@ -0,0 +1,5 @@
{
"rougail.general.mode_conteneur_actif": "oui",
"services.testsrv.activate": true,
"services.testsrv.manage": true
}

View File

@ -0,0 +1,14 @@
{
"rougail.general.mode_conteneur_actif": {
"owner": "default",
"value": "oui"
},
"services.testsrv.activate": {
"owner": "default",
"value": true
},
"services.testsrv.manage": {
"owner": "default",
"value": true
}
}

View File

@ -0,0 +1,22 @@
from importlib.machinery import SourceFileLoader
from importlib.util import spec_from_loader, module_from_spec
loader = SourceFileLoader('func', 'tests/dictionaries/../eosfunc/test.py')
spec = spec_from_loader(loader.name, loader)
func = module_from_spec(spec)
loader.exec_module(func)
for key, value in dict(locals()).items():
if key != ['SourceFileLoader', 'func']:
setattr(func, key, value)
try:
from tiramisu3 import *
except:
from tiramisu import *
option_3 = StrOption(name="mode_conteneur_actif", doc="No change", default="oui", properties=frozenset({"force_default_on_freeze", "frozen", "hidden", "mandatory", "normal"}))
option_2 = OptionDescription(name="general", doc="général", children=[option_3], properties=frozenset({"normal"}))
option_1 = OptionDescription(name="rougail", doc="rougail", children=[option_2])
option_6 = BoolOption(name="activate", doc="activate", default=True)
option_7 = BoolOption(name="manage", doc="manage", default=True)
option_5 = OptionDescription(name="testsrv", doc="testsrv", children=[option_6, option_7])
option_5.impl_set_information('engine', "creole")
option_4 = OptionDescription(name="services", doc="services", children=[option_5], properties=frozenset({"hidden"}))
option_0 = OptionDescription(name="baseoption", doc="baseoption", children=[option_1, option_4])

View File

@ -0,0 +1 @@
%%mode_conteneur_actif

View File

@ -0,0 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<rougail version="0.10">
<services>
<service name="testsrv" type="mount" engine="creole"/>
</services>
<variables>
<family name="general" description="général">
<variable name="mode_conteneur_actif" type="string" description="No change" hidden="True">
<value>oui</value>
</variable>
</family>
</variables>
</rougail>

View File

@ -0,0 +1,14 @@
{
"rougail.general.mode_conteneur_actif": {
"owner": "default",
"value": "oui"
},
"services.testsrv.activate": {
"owner": "default",
"value": true
},
"services.testsrv.manage": {
"owner": "default",
"value": true
}
}

View File

@ -0,0 +1,5 @@
{
"rougail.general.mode_conteneur_actif": "oui",
"services.testsrv.activate": true,
"services.testsrv.manage": true
}

View File

@ -0,0 +1,14 @@
{
"rougail.general.mode_conteneur_actif": {
"owner": "default",
"value": "oui"
},
"services.testsrv.activate": {
"owner": "default",
"value": true
},
"services.testsrv.manage": {
"owner": "default",
"value": true
}
}

View File

@ -0,0 +1,23 @@
from importlib.machinery import SourceFileLoader
from importlib.util import spec_from_loader, module_from_spec
loader = SourceFileLoader('func', 'tests/dictionaries/../eosfunc/test.py')
spec = spec_from_loader(loader.name, loader)
func = module_from_spec(spec)
loader.exec_module(func)
for key, value in dict(locals()).items():
if key != ['SourceFileLoader', 'func']:
setattr(func, key, value)
try:
from tiramisu3 import *
except:
from tiramisu import *
option_3 = StrOption(name="mode_conteneur_actif", doc="No change", default="oui", properties=frozenset({"force_default_on_freeze", "frozen", "hidden", "mandatory", "normal"}))
option_2 = OptionDescription(name="general", doc="général", children=[option_3], properties=frozenset({"normal"}))
option_1 = OptionDescription(name="rougail", doc="rougail", children=[option_2])
option_6 = BoolOption(name="activate", doc="activate", default=True)
option_7 = BoolOption(name="manage", doc="manage", default=True)
option_5 = OptionDescription(name="testsrv", doc="testsrv", children=[option_6, option_7])
option_5.impl_set_information('type', "mount")
option_5.impl_set_information('engine', "creole")
option_4 = OptionDescription(name="services", doc="services", children=[option_5], properties=frozenset({"hidden"}))
option_0 = OptionDescription(name="baseoption", doc="baseoption", children=[option_1, option_4])

View File

@ -0,0 +1 @@
%%mode_conteneur_actif

View File

@ -0,0 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<rougail version="0.10">
<services>
<service name="testsrv" target="test"/>
</services>
<variables>
<family name="general" description="général">
<variable name="mode_conteneur_actif" type="string" description="No change" hidden="True">
<value>oui</value>
</variable>
</family>
</variables>
</rougail>

View File

@ -0,0 +1,14 @@
{
"rougail.general.mode_conteneur_actif": {
"owner": "default",
"value": "oui"
},
"services.testsrv.activate": {
"owner": "default",
"value": true
},
"services.testsrv.manage": {
"owner": "default",
"value": true
}
}

View File

@ -0,0 +1,5 @@
{
"rougail.general.mode_conteneur_actif": "oui",
"services.testsrv.activate": true,
"services.testsrv.manage": true
}

View File

@ -0,0 +1,14 @@
{
"rougail.general.mode_conteneur_actif": {
"owner": "default",
"value": "oui"
},
"services.testsrv.activate": {
"owner": "default",
"value": true
},
"services.testsrv.manage": {
"owner": "default",
"value": true
}
}

View File

@ -0,0 +1 @@
/usr/lib/systemd/system/testsrv.service

View File

@ -0,0 +1,22 @@
from importlib.machinery import SourceFileLoader
from importlib.util import spec_from_loader, module_from_spec
loader = SourceFileLoader('func', 'tests/dictionaries/../eosfunc/test.py')
spec = spec_from_loader(loader.name, loader)
func = module_from_spec(spec)
loader.exec_module(func)
for key, value in dict(locals()).items():
if key != ['SourceFileLoader', 'func']:
setattr(func, key, value)
try:
from tiramisu3 import *
except:
from tiramisu import *
option_3 = StrOption(name="mode_conteneur_actif", doc="No change", default="oui", properties=frozenset({"force_default_on_freeze", "frozen", "hidden", "mandatory", "normal"}))
option_2 = OptionDescription(name="general", doc="général", children=[option_3], properties=frozenset({"normal"}))
option_1 = OptionDescription(name="rougail", doc="rougail", children=[option_2])
option_6 = BoolOption(name="activate", doc="activate", default=True)
option_7 = BoolOption(name="manage", doc="manage", default=True)
option_5 = OptionDescription(name="testsrv", doc="testsrv", children=[option_6, option_7])
option_5.impl_set_information('target', "test")
option_4 = OptionDescription(name="services", doc="services", children=[option_5], properties=frozenset({"hidden"}))
option_0 = OptionDescription(name="baseoption", doc="baseoption", children=[option_1, option_4])

View File

@ -0,0 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<rougail version="0.10">
<services>
<service name="testsrv" target="test" engine="none"/>
</services>
<variables>
<family name="general" description="général">
<variable name="mode_conteneur_actif" type="string" description="No change" hidden="True">
<value>oui</value>
</variable>
</family>
</variables>
</rougail>

Some files were not shown because too many files have changed in this diff Show More