support leadership name in extra

This commit is contained in:
Emmanuel Garette 2021-04-12 15:04:15 +02:00
parent 3999969aa0
commit b7cedd85fb
14 changed files with 290 additions and 7 deletions

View file

@ -74,15 +74,15 @@ Voici un exemple de définition d'une variable meneuse et de deux variables mene
</variables> </variables>
<constraints> <constraints>
<group leader="example.family.leader"> <group leader="example.family.leader">
<follower>example.family.follower1</follower> <follower>follower1</follower>
<follower>example.family.follower2</follower> <follower>follower2</follower>
</group> </group>
</constraints> </constraints>
``` ```
Le chemin de la variable meneuse est traditionnel, par contre le chemin des variables suiveuses n'est pas le chemin définitif de la variable. Le chemin de la variable meneuse est traditionnel, par contre le chemin des variables suiveuses est le chemin relatif de la variable.
Le chemin d'une variable suiveuse est normalement "example.family.leader.follower1" mais la variable n'est pas encore une variable suiveuse à ce moment là du traitement. C'est pour cela qu'il ne faut, uniquement dans les groupes, mettre le nom de la variable meneuse dans le chemin. Le chemin d'une variable suiveuse est normalement "example.family.leader.follower1" mais la variable n'est pas encore une variable suiveuse à ce moment là du traitement. C'est pour cela qu'il ne faut, uniquement dans les groupes, mettre le nom de la variable suiveuse.
## Ajout d'une nouvelle variable suiveuse ## Ajout d'une nouvelle variable suiveuse

View file

@ -122,10 +122,11 @@ class RougailLeader:
For examples: %%leader, %%leader[0].follower1 For examples: %%leader, %%leader[0].follower1
""" """
def __init__(self, def __init__(self,
leader_name,
value, value,
) -> None: ) -> None:
self._value = value self._value = value
self._follower = {} self._follower = {leader_name: value}
def __getitem__(self, index): def __getitem__(self, index):
"""Get a leader.follower at requested index. """Get a leader.follower at requested index.
@ -393,8 +394,9 @@ class RougailBaseTemplate:
if await option.option.isleadership(): if await option.option.isleadership():
for idx, suboption in enumerate(await option.list('all')): for idx, suboption in enumerate(await option.list('all')):
if idx == 0: if idx == 0:
leader = RougailLeader(await suboption.value.get())
leader_name = await suboption.option.name() leader_name = await suboption.option.name()
leader = RougailLeader(leader_name, await suboption.value.get())
leadership_name = await option.option.name()
if is_variable_namespace: if is_variable_namespace:
self.rougail_variables_dict[await suboption.option.name()] = leader self.rougail_variables_dict[await suboption.option.name()] = leader
else: else:
@ -402,7 +404,7 @@ class RougailBaseTemplate:
await suboption.option.name(), await suboption.option.name(),
await suboption.option.path(), await suboption.option.path(),
) )
variables[leader_name] = leader variables[leadership_name] = leader
else: else:
if is_service_namespace == 'root': if is_service_namespace == 'root':
new_is_service_namespace = 'service_name' new_is_service_namespace = 'service_name'

View file

@ -0,0 +1,19 @@
<?xml version='1.0' encoding='UTF-8'?>
<rougail version="0.9">
<services>
<service name='test'>
<file>/etc/mailname</file>
<file engine="jinja2">/etc/mailname2</file>
</service>
</services>
<variables>
<family name="general" description="général">
<variable name="mode_conteneur_actif" type="string" description="No change" hidden="True">
<value>non</value>
</variable>
<variable name="activer_ejabberd" type="string" description="No change" hidden="True">
<value>non</value>
</variable>
</family>
</variables>
</rougail>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<rougail version="0.9">
<variables>
<family name='ejabberd'>
<variable name="description" type="string" multi="True">
<value>test</value>
</variable>
<variable name="mode" type="string">
<value>pre</value>
</variable>
</family>
</variables>
<constraints>
<group leader="extra.ejabberd.description" name="new_name">
<follower>mode</follower>
</group>
</constraints>
</rougail>

View file

@ -0,0 +1,48 @@
{
"rougail.general.mode_conteneur_actif": {
"owner": "default",
"value": "non"
},
"rougail.general.activer_ejabberd": {
"owner": "default",
"value": "non"
},
"extra.ejabberd.new_name.description": {
"owner": "default",
"value": [
"test"
]
},
"extra.ejabberd.new_name.mode": {
"owner": [
"default"
],
"value": [
"pre"
]
},
"services.test.files.mailname.name": {
"owner": "default",
"value": "/etc/mailname"
},
"services.test.files.mailname.activate": {
"owner": "default",
"value": true
},
"services.test.files.mailname2.name": {
"owner": "default",
"value": "/etc/mailname2"
},
"services.test.files.mailname2.activate": {
"owner": "default",
"value": true
},
"services.test.activate": {
"owner": "default",
"value": true
},
"services.test.manage": {
"owner": "default",
"value": true
}
}

View file

@ -0,0 +1,16 @@
{
"rougail.general.mode_conteneur_actif": "non",
"rougail.general.activer_ejabberd": "non",
"extra.ejabberd.new_name.description": [
{
"extra.ejabberd.new_name.description": "test",
"extra.ejabberd.new_name.mode": "pre"
}
],
"services.test.files.mailname.name": "/etc/mailname",
"services.test.files.mailname.activate": true,
"services.test.files.mailname2.name": "/etc/mailname2",
"services.test.files.mailname2.activate": true,
"services.test.activate": true,
"services.test.manage": true
}

View file

@ -0,0 +1,48 @@
{
"rougail.general.mode_conteneur_actif": {
"owner": "default",
"value": "non"
},
"rougail.general.activer_ejabberd": {
"owner": "default",
"value": "non"
},
"extra.ejabberd.new_name.description": {
"owner": "default",
"value": [
"test"
]
},
"extra.ejabberd.new_name.mode": {
"owner": [
"default"
],
"value": [
"pre"
]
},
"services.test.files.mailname.name": {
"owner": "default",
"value": "/etc/mailname"
},
"services.test.files.mailname.activate": {
"owner": "default",
"value": true
},
"services.test.files.mailname2.name": {
"owner": "default",
"value": "/etc/mailname2"
},
"services.test.files.mailname2.activate": {
"owner": "default",
"value": true
},
"services.test.activate": {
"owner": "default",
"value": true
},
"services.test.manage": {
"owner": "default",
"value": true
}
}

View file

@ -0,0 +1,11 @@
contain test
1
leader: test
follower: pre
supeq
sup
diff
testpre
pretest
leader2: test
follower2: pre

View file

@ -0,0 +1,11 @@
contain test
1
leader: test
follower: pre
supeq
sup
diff
testpre
pretest
leader2: test
follower2: pre

View file

@ -0,0 +1,4 @@
C /etc/mailname 0644 root root - /usr/local/lib/etc/mailname
z /etc/mailname - - - - -
C /etc/mailname2 0644 root root - /usr/local/lib/etc/mailname2
z /etc/mailname2 - - - - -

View file

@ -0,0 +1,37 @@
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="non", properties=frozenset({"force_default_on_freeze", "frozen", "hidden", "mandatory", "normal"}))
option_4 = StrOption(name="activer_ejabberd", doc="No change", default="non", properties=frozenset({"force_default_on_freeze", "frozen", "hidden", "mandatory", "normal"}))
option_2 = OptionDescription(name="general", doc="général", children=[option_3, option_4], properties=frozenset({"normal"}))
option_1 = OptionDescription(name="rougail", doc="rougail", children=[option_2])
option_8 = StrOption(name="description", doc="description", multi=True, default=['test'], properties=frozenset({"mandatory"}))
option_9 = StrOption(name="mode", doc="mode", multi=True, default_multi="pre", properties=frozenset({"mandatory", "normal"}))
option_7 = Leadership(name="new_name", doc="new_name", children=[option_8, option_9], properties=frozenset({"normal"}))
option_6 = OptionDescription(name="ejabberd", doc="ejabberd", children=[option_7], properties=frozenset({"normal"}))
option_5 = OptionDescription(name="extra", doc="extra", children=[option_6])
option_14 = FilenameOption(name="name", doc="name", default="/etc/mailname")
option_15 = BoolOption(name="activate", doc="activate", default=True)
option_13 = OptionDescription(name="mailname", doc="mailname", children=[option_14, option_15])
option_13.impl_set_information('source', "mailname")
option_17 = FilenameOption(name="name", doc="name", default="/etc/mailname2")
option_18 = BoolOption(name="activate", doc="activate", default=True)
option_16 = OptionDescription(name="mailname2", doc="mailname2", children=[option_17, option_18])
option_16.impl_set_information('engine', "jinja2")
option_16.impl_set_information('source', "mailname2")
option_12 = OptionDescription(name="files", doc="files", children=[option_13, option_16])
option_19 = BoolOption(name="activate", doc="activate", default=True)
option_20 = BoolOption(name="manage", doc="manage", default=True)
option_11 = OptionDescription(name="test", doc="test", children=[option_12, option_19, option_20])
option_10 = OptionDescription(name="services", doc="services", children=[option_11], properties=frozenset({"hidden"}))
option_0 = OptionDescription(name="baseoption", doc="baseoption", children=[option_1, option_5, option_10])

View file

@ -0,0 +1,35 @@
%if 'test' in %%extra.ejabberd.new_name
contain test
%end if
%%len(%%extra.ejabberd.new_name)
%if 'a' in %%extra.ejabberd.new_name
contain a
%end if
%for %%description in %%extra.ejabberd.new_name
leader: %%description
follower: %%description.mode
%if %%description <= %%description.mode
infeq
%end if
%if %%description >= %%description.mode
supeq
%end if
%if %%description < %%description.mode
inf
%end if
%if %%description > %%description.mode
sup
%end if
%if %%description == %%description.mode
eq
%end if
%if %%description != %%description.mode
diff
%end if
%set %%var = %%description + %%description.mode
%%var
%set %%var = %%description.mode + %%description
%%var
%end for
leader2: %%extra.ejabberd.new_name[0].description
follower2: %%extra.ejabberd.new_name[0].mode

View file

@ -0,0 +1,33 @@
{% if 'test' in extra.ejabberd.new_name -%}
contain test
{% endif -%}
{{ extra.ejabberd.new_name |length }}
{% if 'a' in extra.ejabberd.new_name -%}
contain a
{% endif -%}
{% for description in extra.ejabberd.new_name -%}
leader: {{ description }}
follower: {{ description.mode }}
{% if description <= description.mode -%}
infeq
{% endif -%}
{% if description >= description.mode -%}
supeq
{% endif -%}
{% if description < description.mode -%}
inf
{% endif -%}
{% if description > description.mode -%}
sup
{% endif -%}
{% if description == description.mode -%}
eq
{% endif -%}
{% if description != description.mode -%}
diff
{% endif -%}
{{ description + description.mode }}
{{ description.mode + description }}
{% endfor -%}
leader2: {{ extra.ejabberd.new_name[0].description }}
follower2: {{ extra.ejabberd.new_name[0].mode }}