diff --git a/doc/README.md b/doc/README.md
index c822e8569..0e8c5a8ce 100644
--- a/doc/README.md
+++ b/doc/README.md
@@ -25,6 +25,7 @@ Rougail est un bibliothèque python3 qui permet de charger des dictionnaires (fi
### Les services
- [La gestion d'un fichier](service/file.md)
+ - [La gestion d'un certificat](service/certificate.md)
- [La gestion d'un fichier de service systemd](service/override.md)
- [La gestion d'une ip](service/ip.md)
diff --git a/doc/dev/config.md b/doc/dev/config.md
index b343f6949..bda0d2a8f 100644
--- a/doc/dev/config.md
+++ b/doc/dev/config.md
@@ -132,7 +132,7 @@ Le moteur de template est géré dans la clef "default_files_engine" et a comme
### Les droits par défaut des fichiers
-Les droits des fichiers générés est géré dans la clef "default_files_mode" et a comme valeur par défaut : "0644".
+Les droits des fichiers générés est géré dans la clef "default_files_mode" (valeur de type nombre) et a comme valeur par défaut : 644.
### Le propriétaire par défaut des fichiers
diff --git a/doc/service/README.md b/doc/service/README.md
index 18e697f80..c796b46e2 100644
--- a/doc/service/README.md
+++ b/doc/service/README.md
@@ -4,7 +4,7 @@
Un service est inclut dans un conteneur [services](../services.md).
-Cette balise permet de définir tous les éléments ([fichier](file.md), [IP](ip.md) et [réécriture](override.md)) liés à un service ou à démon.
+Cette balise permet de définir tous les éléments ([fichier](file.md), [certificat](certificate.md), [IP](ip.md) et [réécriture](override.md)) liés à un service ou à démon.
Il faut, à la création du service, préciser son nom :
@@ -122,7 +122,7 @@ En YAML :
disabled: true
```
-Dans ce cas, le service et les éléments qu'il compose ([fichier](file.md), [IP](ip.md) et [réécriture](override.md) seront désactivés.
+Dans ce cas, le service et les éléments qu'il compose ([fichier](file.md), [certificat](certificate.md), [IP](ip.md) et [réécriture](override.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 :
diff --git a/doc/service/certificate.md b/doc/service/certificate.md
new file mode 100644
index 000000000..6febbb399
--- /dev/null
+++ b/doc/service/certificate.md
@@ -0,0 +1,163 @@
+# La gestion d'un certificat
+
+## La balise certificate
+
+La gestion des certificats se fait dans un conteneur de [service](README.md).
+
+La déclaration du certificat permet d'associer un certificat à un service. Attention, Rougail ne permet que de déclarer ces certificats. Il n'y a pas de gestion du certification dans la bibliothèque.
+
+Pour déclarer un certificat :
+
+```xml
+
+
+ /etc/pki/tls/certs/squid.crt
+
+
+```
+
+En YAML :
+
+```yml
+services:
+- service:
+ - name: squid
+ certificate:
+ - private: /etc/pki/tls/private/squid.key
+ authority: /etc/pki/ca-trust/source/anchors/ca_squid.crt
+ text: /etc/pki/tls/certs/squid.crt
+```
+
+Les trois informations a donner sont donc :
+
+- le nom du certificat
+- le nom de la clef privée
+- le nom de certificat de l'autorité de certification
+
+## Les noms de fichiers dynamique
+
+Il est possible également de définir le nom des fichiers dans des variables :
+
+```xml
+
+
+ certificate
+
+
+
+
+ /etc/pki/tls/certs/squid.crt
+
+
+ /etc/pki/tls/private/squid.key
+
+
+ /etc/pki/ca-trust/source/anchors/ca_squid.crt
+
+
+```
+
+En YAML :
+
+```yml
+services:
+- service:
+ - name: squid
+ certificate:
+ - private: private
+ private_type: variable
+ authority: authority
+ authority_type: variable
+ certificate_type: variable
+ text: certificate
+variables:
+- variable:
+ - name: certificate
+ type: filename
+ value:
+ - text: /etc/pki/tls/certs/squid.crt
+ - name: private
+ type: filename
+ value:
+ - text: /etc/pki/tls/private/squid.key
+ - name: authority
+ type: filename
+ value:
+ - text: /etc/pki/ca-trust/source/anchors/ca_squid.crt
+```
+
+Attention, les variables doivent être de type "filename".
+
+## Le propriétaire de la clef privée
+
+Le certificat et le certificat de l'autorité de certification n'ont pas besoin d'être privés.
+Par contre, seul le service qui doit avoir accès à la clef privée.
+
+Par défaut seul utilisateur "root" et groupe "root" peuvent y accéder.
+
+Il est possible de définir l'utilisateur ou le groupe de la clef privée générée :
+
+```xml
+
+
+ /etc/pki/tls/certs/squid.crt
+
+
+```
+
+En YAML :
+
+```yml
+services:
+- service:
+ - name: squid
+ certificate:
+ - private: /etc/pki/tls/private/squid.key
+ authority: /etc/pki/ca-trust/source/anchors/ca_squid.crt
+ owner: squid
+ group: squid
+ text: /etc/pki/tls/certs/squid.crt
+```
+
+L'utilisateur et le groupe peuvent être défini dans une variable :
+
+```xml
+
+
+ /etc/pki/tls/certs/squid.crt
+
+
+
+ squid
+
+
+ squid
+
+
+```
+
+En YAML :
+
+```yml
+services:
+- service:
+ - name: squid
+ certificate:
+ - private: /etc/pki/tls/private/squid.key
+ authority: /etc/pki/ca-trust/source/anchors/ca_squid.crt
+ owner: owner
+ owner_type: variable
+ group: group
+ group_type: variable
+ text: /etc/pki/tls/certs/squid.crt
+variables:
+- variable:
+ - name: owner
+ type: unix_user
+ value:
+ - text: squid
+ - name: group
+ type: unix_user
+ value:
+ - text: squid
+```
diff --git a/src/rougail/annotator/service.py b/src/rougail/annotator/service.py
index 4b6616e5d..295d26407 100644
--- a/src/rougail/annotator/service.py
+++ b/src/rougail/annotator/service.py
@@ -33,11 +33,17 @@ from typing import Tuple
from rougail.i18n import _
from rougail.utils import normalize_family
from rougail.error import DictConsistencyError
+from rougail.annotator.variable import CONVERT_OPTION
+try:
+ import tiramisu3 as tiramisu
+except ModuleNotFoundError:
+ import tiramisu
# a object's attribute has some annotations
# that shall not be present in the exported (flatened) XML
ERASED_ATTRIBUTES = ('redefine', 'namespace', 'xmlfiles', 'disabled', 'name', 'manage')
ERASED_ATTRIBUTES2 = ('redefine', 'namespace', 'xmlfiles', 'disabled')
ALLOW_ATTRIBUT_NOT_MANAGE = ['file', 'engine', 'target']
+FORCE_INFORMATIONS = ['mode']
class Annotator:
@@ -221,6 +227,12 @@ class Annotator:
dtd_key_type = key + '_type'
elt_type = getattr(elt, dtd_key_type, None)
if elt_type:
+ try:
+ value = CONVERT_OPTION.get(elt_type, {}).get('func', str)(value)
+ except ValueError as err:
+ msg = _(f'"{value}" is not a valid "{elttype}": {err}')
+ raise DictConsistencyError(msg, 93, elt.xmlfiles)
+ if key not in FORCE_INFORMATIONS and elt_type:
if elt_type == 'variable':
elt_type = 'symlink'
family.variable.append(self._generate_element(elt_type,
@@ -381,3 +393,78 @@ class Annotator:
if netmask.type != 'netmask':
msg = _(f'netmask in ip must have type "netmask", not "{netmask.type}"')
raise DictConsistencyError(msg, 65, ip.xmlfiles)
+
+ def _update_certificate(self,
+ certificate,
+ certificate_name,
+ path_prefix,
+ ) -> None:
+ if hasattr(certificate, 'certificate_type') and certificate.certificate_type == 'variable':
+ variable = self.objectspace.paths.get_variable(certificate.name,
+ certificate.namespace,
+ xmlfiles=certificate.xmlfiles,
+ force_path_prefix=path_prefix,
+ add_path_prefix=True,
+ )
+ if variable.type != 'filename':
+ msg = _(f'certificate cannot be linked to "{variable.type}" variable "{certificate.name}"')
+ raise DictConsistencyError(msg, 90, certificate.xmlfiles)
+ else:
+ option = CONVERT_OPTION['filename']
+ value = certificate.name
+ try:
+ value = option.get('func', str)(value)
+ getattr(tiramisu, option['opttype'])('test',
+ 'Object to valid value',
+ value,
+ **option.get('initkwargs', {}),
+ )
+ except ValueError as err:
+ msg = _(f'certificate "{value}" is not a valid "filename"')
+ raise DictConsistencyError(msg, 94, certificate.xmlfiles) from err
+ if hasattr(certificate, 'private_type') and certificate.private_type == 'variable':
+ variable = self.objectspace.paths.get_variable(certificate.private,
+ certificate.namespace,
+ xmlfiles=certificate.xmlfiles,
+ force_path_prefix=path_prefix,
+ add_path_prefix=True,
+ )
+ if variable.type != 'filename':
+ msg = _(f'private cannot be linked to "{variable.type}" variable "{certificate.private}" for certificate "{certificate.name}"')
+ raise DictConsistencyError(msg, 91, certificate.xmlfiles)
+ else:
+ option = CONVERT_OPTION['filename']
+ value = certificate.private
+ try:
+ value = option.get('func', str)(value)
+ getattr(tiramisu, option['opttype'])('test',
+ 'Object to valid value',
+ value,
+ **option.get('initkwargs', {}),
+ )
+ except ValueError as err:
+ msg = _(f'authority "{value}" is not a valid "filename"')
+ raise DictConsistencyError(msg, 95, certificate.xmlfiles) from err
+ if hasattr(certificate, 'authority_type') and certificate.authority_type == 'variable':
+ variable = self.objectspace.paths.get_variable(certificate.authority,
+ certificate.namespace,
+ xmlfiles=certificate.xmlfiles,
+ force_path_prefix=path_prefix,
+ add_path_prefix=True,
+ )
+ if variable.type != 'filename':
+ msg = _(f'authority cannot be linked to "{variable.type}" variable "{certificate.authority}" for certificate "{certificate.name}"')
+ raise DictConsistencyError(msg, 92, certificate.xmlfiles)
+ else:
+ option = CONVERT_OPTION['filename']
+ value = certificate.authority
+ try:
+ value = option.get('func', str)(value)
+ getattr(tiramisu, option['opttype'])('test',
+ 'Object to valid value',
+ value,
+ **option.get('initkwargs', {}),
+ )
+ except ValueError as err:
+ msg = _(f'private "{value}" is not a valid "filename"')
+ raise DictConsistencyError(msg, 96, certificate.xmlfiles) from err
diff --git a/src/rougail/config.py b/src/rougail/config.py
index 2c2524c46..8b906834f 100644
--- a/src/rougail/config.py
+++ b/src/rougail/config.py
@@ -63,7 +63,7 @@ RougailConfig = {'dictionaries_dir': [join(ROUGAILROOT, 'dictionaries')],
'default_family_mode': 'basic',
'default_variable_mode': 'normal',
'default_files_engine': 'cheetah',
- 'default_files_mode': '0644',
+ 'default_files_mode': 644,
'default_files_owner': 'root',
'default_files_group': 'root',
'default_files_included': 'no',
diff --git a/src/rougail/data/rougail.dtd b/src/rougail/data/rougail.dtd
index 0858b510f..21706d226 100644
--- a/src/rougail/data/rougail.dtd
+++ b/src/rougail/data/rougail.dtd
@@ -49,7 +49,7 @@
-
+
@@ -71,6 +71,7 @@
+
@@ -86,6 +87,17 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/rougail/data/rougail.yml b/src/rougail/data/rougail.yml
index 8a9e517eb..e60196eee 100644
--- a/src/rougail/data/rougail.yml
+++ b/src/rougail/data/rougail.yml
@@ -81,7 +81,7 @@ mapping:
owner:
type: str
mode:
- type: str
+ type: int
source_type:
type: str
enum:
@@ -109,6 +109,48 @@ mapping:
- "none"
- "cheetah"
- "jinja"
+ certificate:
+ required: false
+ type: seq
+ sequence:
+ - type: map
+ mapping:
+ text:
+ required: false
+ type: str
+ certificate_type:
+ type: str
+ enum:
+ - "filename"
+ - "variable"
+ group_type:
+ type: str
+ enum:
+ - "unix_user"
+ - "variable"
+ group:
+ type: str
+ owner_type:
+ type: str
+ enum:
+ - "unix_user"
+ - "variable"
+ owner:
+ type: str
+ authority:
+ type: str
+ authority_type:
+ type: str
+ enum:
+ - "filename"
+ - "variable"
+ private:
+ type: str
+ private_type:
+ type: str
+ enum:
+ - "filename"
+ - "variable"
name:
type: str
undisable:
diff --git a/src/rougail/template/base.py b/src/rougail/template/base.py
index deb8966fc..bb12cdaa9 100644
--- a/src/rougail/template/base.py
+++ b/src/rougail/template/base.py
@@ -633,11 +633,11 @@ class RougailBaseTemplate:
)
variables[await option.option.name()] = subfamilies
else:
- if is_variable_namespace:
- value = await option.value.get()
- self.rougail_variables_dict[await option.option.name()] = value
+ name = await option.option.name()
value = await option.value.get()
- variables[await option.option.name()] = value
+ if is_variable_namespace:
+ self.rougail_variables_dict[name] = value
+ variables[name] = value
if isinstance(is_service_namespace, str) and is_service_namespace + 's' in INFORMATIONS:
self.get_default(is_service_namespace + 's',
variables,
diff --git a/src/rougail/template/systemd.py b/src/rougail/template/systemd.py
index 8d7f9cd82..c8060630c 100644
--- a/src/rougail/template/systemd.py
+++ b/src/rougail/template/systemd.py
@@ -59,7 +59,7 @@ class RougailSystemdTemplate(RougailBaseTemplate):
%if {self.rougailconfig['systemd_tmpfile_delete_before_create']}
r %%filename
%end if
-C %%filename %%file.mode %%file.owner %%file.group - {self.rougailconfig['systemd_tmpfile_factory_dir']}%%filename
+C %%filename 0%%file.mode %%file.owner %%file.group - {self.rougailconfig['systemd_tmpfile_factory_dir']}%%filename
%end if
%end def
%for %%service in %%services
diff --git a/tests/dictionaries/01base_certificate/__init__.py b/tests/dictionaries/01base_certificate/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/dictionaries/01base_certificate/makedict/after.json b/tests/dictionaries/01base_certificate/makedict/after.json
new file mode 100644
index 000000000..034988e52
--- /dev/null
+++ b/tests/dictionaries/01base_certificate/makedict/after.json
@@ -0,0 +1,26 @@
+{
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.authority": {
+ "owner": "default",
+ "value": "/etc/pki/ca-trust/source/anchors/ca_example.crt"
+ },
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.name": {
+ "owner": "default",
+ "value": "/etc/pki/tls/certs/example.crt"
+ },
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.private": {
+ "owner": "default",
+ "value": "/etc/pki/tls/private/example.key"
+ },
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.activate": {
+ "owner": "default",
+ "value": true
+ },
+ "services.test_service.activate": {
+ "owner": "default",
+ "value": true
+ },
+ "services.test_service.manage": {
+ "owner": "default",
+ "value": true
+ }
+}
diff --git a/tests/dictionaries/01base_certificate/makedict/base.json b/tests/dictionaries/01base_certificate/makedict/base.json
new file mode 100644
index 000000000..3d1864ca5
--- /dev/null
+++ b/tests/dictionaries/01base_certificate/makedict/base.json
@@ -0,0 +1,8 @@
+{
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.authority": "/etc/pki/ca-trust/source/anchors/ca_example.crt",
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.name": "/etc/pki/tls/certs/example.crt",
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.private": "/etc/pki/tls/private/example.key",
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.activate": true,
+ "services.test_service.activate": true,
+ "services.test_service.manage": true
+}
diff --git a/tests/dictionaries/01base_certificate/makedict/before.json b/tests/dictionaries/01base_certificate/makedict/before.json
new file mode 100644
index 000000000..034988e52
--- /dev/null
+++ b/tests/dictionaries/01base_certificate/makedict/before.json
@@ -0,0 +1,26 @@
+{
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.authority": {
+ "owner": "default",
+ "value": "/etc/pki/ca-trust/source/anchors/ca_example.crt"
+ },
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.name": {
+ "owner": "default",
+ "value": "/etc/pki/tls/certs/example.crt"
+ },
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.private": {
+ "owner": "default",
+ "value": "/etc/pki/tls/private/example.key"
+ },
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.activate": {
+ "owner": "default",
+ "value": true
+ },
+ "services.test_service.activate": {
+ "owner": "default",
+ "value": true
+ },
+ "services.test_service.manage": {
+ "owner": "default",
+ "value": true
+ }
+}
diff --git a/tests/dictionaries/01base_certificate/tiramisu/base.py b/tests/dictionaries/01base_certificate/tiramisu/base.py
new file mode 100644
index 000000000..219477cad
--- /dev/null
+++ b/tests/dictionaries/01base_certificate/tiramisu/base.py
@@ -0,0 +1,32 @@
+from importlib.machinery import SourceFileLoader as _SourceFileLoader
+from importlib.util import spec_from_loader as _spec_from_loader, module_from_spec as _module_from_spec
+class func:
+ pass
+
+def _load_functions(path):
+ global _SourceFileLoader, _spec_from_loader, _module_from_spec, func
+ loader = _SourceFileLoader('func', path)
+ spec = _spec_from_loader(loader.name, loader)
+ func_ = _module_from_spec(spec)
+ loader.exec_module(func_)
+ for function in dir(func_):
+ if function.startswith('_'):
+ continue
+ setattr(func, function, getattr(func_, function))
+_load_functions('tests/dictionaries/../eosfunc/test.py')
+try:
+ from tiramisu3 import *
+except:
+ from tiramisu import *
+option_5 = FilenameOption(name="authority", doc="authority", default="/etc/pki/ca-trust/source/anchors/ca_example.crt")
+option_6 = FilenameOption(name="name", doc="name", default="/etc/pki/tls/certs/example.crt")
+option_7 = FilenameOption(name="private", doc="private", default="/etc/pki/tls/private/example.key")
+option_4 = BoolOption(name="activate", doc="activate", default=True)
+optiondescription_3 = OptionDescription(name="/etc/pki/tls/certs/example_crt", doc="/etc/pki/tls/certs/example.crt", children=[option_5, option_6, option_7, option_4])
+optiondescription_2 = OptionDescription(name="certificates", doc="certificates", children=[optiondescription_3])
+option_1 = BoolOption(name="activate", doc="activate", default=True)
+option_8 = BoolOption(name="manage", doc="manage", default=True)
+optiondescription_10 = OptionDescription(name="test_service", doc="test.service", children=[optiondescription_2, option_1, option_8])
+optiondescription_10.impl_set_information('type', "service")
+optiondescription_9 = OptionDescription(name="services", doc="services", children=[optiondescription_10], properties=frozenset({"hidden"}))
+option_0 = OptionDescription(name="baseoption", doc="baseoption", children=[optiondescription_9])
diff --git a/tests/dictionaries/01base_certificate/tiramisu/multi.py b/tests/dictionaries/01base_certificate/tiramisu/multi.py
new file mode 100644
index 000000000..4bcd94783
--- /dev/null
+++ b/tests/dictionaries/01base_certificate/tiramisu/multi.py
@@ -0,0 +1,45 @@
+from importlib.machinery import SourceFileLoader as _SourceFileLoader
+from importlib.util import spec_from_loader as _spec_from_loader, module_from_spec as _module_from_spec
+class func:
+ pass
+
+def _load_functions(path):
+ global _SourceFileLoader, _spec_from_loader, _module_from_spec, func
+ loader = _SourceFileLoader('func', path)
+ spec = _spec_from_loader(loader.name, loader)
+ func_ = _module_from_spec(spec)
+ loader.exec_module(func_)
+ for function in dir(func_):
+ if function.startswith('_'):
+ continue
+ setattr(func, function, getattr(func_, function))
+_load_functions('tests/dictionaries/../eosfunc/test.py')
+try:
+ from tiramisu3 import *
+except:
+ from tiramisu import *
+option_5 = FilenameOption(name="authority", doc="authority", default="/etc/pki/ca-trust/source/anchors/ca_example.crt")
+option_6 = FilenameOption(name="name", doc="name", default="/etc/pki/tls/certs/example.crt")
+option_7 = FilenameOption(name="private", doc="private", default="/etc/pki/tls/private/example.key")
+option_4 = BoolOption(name="activate", doc="activate", default=True)
+optiondescription_3 = OptionDescription(name="/etc/pki/tls/certs/example_crt", doc="/etc/pki/tls/certs/example.crt", children=[option_5, option_6, option_7, option_4])
+optiondescription_2 = OptionDescription(name="certificates", doc="certificates", children=[optiondescription_3])
+option_1 = BoolOption(name="activate", doc="activate", default=True)
+option_8 = BoolOption(name="manage", doc="manage", default=True)
+optiondescription_19 = OptionDescription(name="test_service", doc="test.service", children=[optiondescription_2, option_1, option_8])
+optiondescription_19.impl_set_information('type', "service")
+optiondescription_18 = OptionDescription(name="services", doc="services", children=[optiondescription_19], properties=frozenset({"hidden"}))
+optiondescription_17 = OptionDescription(name="1", doc="1", children=[optiondescription_18])
+option_13 = FilenameOption(name="authority", doc="authority", default="/etc/pki/ca-trust/source/anchors/ca_example.crt")
+option_14 = FilenameOption(name="name", doc="name", default="/etc/pki/tls/certs/example.crt")
+option_15 = FilenameOption(name="private", doc="private", default="/etc/pki/tls/private/example.key")
+option_12 = BoolOption(name="activate", doc="activate", default=True)
+optiondescription_11 = OptionDescription(name="/etc/pki/tls/certs/example_crt", doc="/etc/pki/tls/certs/example.crt", children=[option_13, option_14, option_15, option_12])
+optiondescription_10 = OptionDescription(name="certificates", doc="certificates", children=[optiondescription_11])
+option_9 = BoolOption(name="activate", doc="activate", default=True)
+option_16 = BoolOption(name="manage", doc="manage", default=True)
+optiondescription_22 = OptionDescription(name="test_service", doc="test.service", children=[optiondescription_10, option_9, option_16])
+optiondescription_22.impl_set_information('type', "service")
+optiondescription_21 = OptionDescription(name="services", doc="services", children=[optiondescription_22], properties=frozenset({"hidden"}))
+optiondescription_20 = OptionDescription(name="2", doc="2", children=[optiondescription_21])
+option_0 = OptionDescription(name="baseoption", doc="baseoption", children=[optiondescription_17, optiondescription_20])
diff --git a/tests/dictionaries/01base_certificate/xml/00-base.xml b/tests/dictionaries/01base_certificate/xml/00-base.xml
new file mode 100644
index 000000000..83db92cc7
--- /dev/null
+++ b/tests/dictionaries/01base_certificate/xml/00-base.xml
@@ -0,0 +1,8 @@
+
+
+
+
+ /etc/pki/tls/certs/example.crt
+
+
+
diff --git a/tests/dictionaries/01base_certificate/yml/00-base.yml b/tests/dictionaries/01base_certificate/yml/00-base.yml
new file mode 100644
index 000000000..e89f38387
--- /dev/null
+++ b/tests/dictionaries/01base_certificate/yml/00-base.yml
@@ -0,0 +1,8 @@
+version: '0.10'
+services:
+- service:
+ - name: test
+ certificate:
+ - private: /etc/pki/tls/private/example.key
+ authority: /etc/pki/ca-trust/source/anchors/ca_example.crt
+ text: /etc/pki/tls/certs/example.crt
diff --git a/tests/dictionaries/01base_certificate_group_variable_wrong/__init__.py b/tests/dictionaries/01base_certificate_group_variable_wrong/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/dictionaries/01base_certificate_group_variable_wrong/errno_58 b/tests/dictionaries/01base_certificate_group_variable_wrong/errno_58
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/dictionaries/01base_certificate_group_variable_wrong/xml/00-base.xml b/tests/dictionaries/01base_certificate_group_variable_wrong/xml/00-base.xml
new file mode 100644
index 000000000..176b4508c
--- /dev/null
+++ b/tests/dictionaries/01base_certificate_group_variable_wrong/xml/00-base.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ /etc/pki/tls/certs/example.crt
+
+
+
+
+ example
+
+
+ example
+
+
+
diff --git a/tests/dictionaries/01base_certificate_group_variable_wrong/yml/00-base.yml b/tests/dictionaries/01base_certificate_group_variable_wrong/yml/00-base.yml
new file mode 100644
index 000000000..68a8652f0
--- /dev/null
+++ b/tests/dictionaries/01base_certificate_group_variable_wrong/yml/00-base.yml
@@ -0,0 +1,21 @@
+version: '0.10'
+services:
+- service:
+ - name: test
+ certificate:
+ - private: /etc/pki/tls/private/example.key
+ authority: /etc/pki/ca-trust/source/anchors/ca_example.crt
+ owner: owner
+ owner_type: variable
+ group: group
+ group_type: variable
+ text: /etc/pki/tls/certs/example.crt
+variables:
+- variable:
+ - name: owner
+ type: unix_user
+ value:
+ - text: example
+ - name: group
+ value:
+ - text: example
diff --git a/tests/dictionaries/01base_certificate_owner/__init__.py b/tests/dictionaries/01base_certificate_owner/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/dictionaries/01base_certificate_owner/makedict/after.json b/tests/dictionaries/01base_certificate_owner/makedict/after.json
new file mode 100644
index 000000000..c60a5df75
--- /dev/null
+++ b/tests/dictionaries/01base_certificate_owner/makedict/after.json
@@ -0,0 +1,34 @@
+{
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.authority": {
+ "owner": "default",
+ "value": "/etc/pki/ca-trust/source/anchors/ca_example.crt"
+ },
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.group": {
+ "owner": "default",
+ "value": "example"
+ },
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.name": {
+ "owner": "default",
+ "value": "/etc/pki/tls/certs/example.crt"
+ },
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.owner": {
+ "owner": "default",
+ "value": "example"
+ },
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.private": {
+ "owner": "default",
+ "value": "/etc/pki/tls/private/example.key"
+ },
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.activate": {
+ "owner": "default",
+ "value": true
+ },
+ "services.test_service.activate": {
+ "owner": "default",
+ "value": true
+ },
+ "services.test_service.manage": {
+ "owner": "default",
+ "value": true
+ }
+}
diff --git a/tests/dictionaries/01base_certificate_owner/makedict/base.json b/tests/dictionaries/01base_certificate_owner/makedict/base.json
new file mode 100644
index 000000000..bac2a7b7c
--- /dev/null
+++ b/tests/dictionaries/01base_certificate_owner/makedict/base.json
@@ -0,0 +1,10 @@
+{
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.authority": "/etc/pki/ca-trust/source/anchors/ca_example.crt",
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.group": "example",
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.name": "/etc/pki/tls/certs/example.crt",
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.owner": "example",
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.private": "/etc/pki/tls/private/example.key",
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.activate": true,
+ "services.test_service.activate": true,
+ "services.test_service.manage": true
+}
diff --git a/tests/dictionaries/01base_certificate_owner/makedict/before.json b/tests/dictionaries/01base_certificate_owner/makedict/before.json
new file mode 100644
index 000000000..c60a5df75
--- /dev/null
+++ b/tests/dictionaries/01base_certificate_owner/makedict/before.json
@@ -0,0 +1,34 @@
+{
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.authority": {
+ "owner": "default",
+ "value": "/etc/pki/ca-trust/source/anchors/ca_example.crt"
+ },
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.group": {
+ "owner": "default",
+ "value": "example"
+ },
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.name": {
+ "owner": "default",
+ "value": "/etc/pki/tls/certs/example.crt"
+ },
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.owner": {
+ "owner": "default",
+ "value": "example"
+ },
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.private": {
+ "owner": "default",
+ "value": "/etc/pki/tls/private/example.key"
+ },
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.activate": {
+ "owner": "default",
+ "value": true
+ },
+ "services.test_service.activate": {
+ "owner": "default",
+ "value": true
+ },
+ "services.test_service.manage": {
+ "owner": "default",
+ "value": true
+ }
+}
diff --git a/tests/dictionaries/01base_certificate_owner/tiramisu/base.py b/tests/dictionaries/01base_certificate_owner/tiramisu/base.py
new file mode 100644
index 000000000..e77bfc8ad
--- /dev/null
+++ b/tests/dictionaries/01base_certificate_owner/tiramisu/base.py
@@ -0,0 +1,34 @@
+from importlib.machinery import SourceFileLoader as _SourceFileLoader
+from importlib.util import spec_from_loader as _spec_from_loader, module_from_spec as _module_from_spec
+class func:
+ pass
+
+def _load_functions(path):
+ global _SourceFileLoader, _spec_from_loader, _module_from_spec, func
+ loader = _SourceFileLoader('func', path)
+ spec = _spec_from_loader(loader.name, loader)
+ func_ = _module_from_spec(spec)
+ loader.exec_module(func_)
+ for function in dir(func_):
+ if function.startswith('_'):
+ continue
+ setattr(func, function, getattr(func_, function))
+_load_functions('tests/dictionaries/../eosfunc/test.py')
+try:
+ from tiramisu3 import *
+except:
+ from tiramisu import *
+option_5 = FilenameOption(name="authority", doc="authority", default="/etc/pki/ca-trust/source/anchors/ca_example.crt")
+option_6 = UsernameOption(name="group", doc="group", default="example")
+option_7 = FilenameOption(name="name", doc="name", default="/etc/pki/tls/certs/example.crt")
+option_8 = UsernameOption(name="owner", doc="owner", default="example")
+option_9 = FilenameOption(name="private", doc="private", default="/etc/pki/tls/private/example.key")
+option_4 = BoolOption(name="activate", doc="activate", default=True)
+optiondescription_3 = OptionDescription(name="/etc/pki/tls/certs/example_crt", doc="/etc/pki/tls/certs/example.crt", children=[option_5, option_6, option_7, option_8, option_9, option_4])
+optiondescription_2 = OptionDescription(name="certificates", doc="certificates", children=[optiondescription_3])
+option_1 = BoolOption(name="activate", doc="activate", default=True)
+option_10 = BoolOption(name="manage", doc="manage", default=True)
+optiondescription_12 = OptionDescription(name="test_service", doc="test.service", children=[optiondescription_2, option_1, option_10])
+optiondescription_12.impl_set_information('type', "service")
+optiondescription_11 = OptionDescription(name="services", doc="services", children=[optiondescription_12], properties=frozenset({"hidden"}))
+option_0 = OptionDescription(name="baseoption", doc="baseoption", children=[optiondescription_11])
diff --git a/tests/dictionaries/01base_certificate_owner/tiramisu/multi.py b/tests/dictionaries/01base_certificate_owner/tiramisu/multi.py
new file mode 100644
index 000000000..a1bc010f0
--- /dev/null
+++ b/tests/dictionaries/01base_certificate_owner/tiramisu/multi.py
@@ -0,0 +1,49 @@
+from importlib.machinery import SourceFileLoader as _SourceFileLoader
+from importlib.util import spec_from_loader as _spec_from_loader, module_from_spec as _module_from_spec
+class func:
+ pass
+
+def _load_functions(path):
+ global _SourceFileLoader, _spec_from_loader, _module_from_spec, func
+ loader = _SourceFileLoader('func', path)
+ spec = _spec_from_loader(loader.name, loader)
+ func_ = _module_from_spec(spec)
+ loader.exec_module(func_)
+ for function in dir(func_):
+ if function.startswith('_'):
+ continue
+ setattr(func, function, getattr(func_, function))
+_load_functions('tests/dictionaries/../eosfunc/test.py')
+try:
+ from tiramisu3 import *
+except:
+ from tiramisu import *
+option_5 = FilenameOption(name="authority", doc="authority", default="/etc/pki/ca-trust/source/anchors/ca_example.crt")
+option_6 = UsernameOption(name="group", doc="group", default="example")
+option_7 = FilenameOption(name="name", doc="name", default="/etc/pki/tls/certs/example.crt")
+option_8 = UsernameOption(name="owner", doc="owner", default="example")
+option_9 = FilenameOption(name="private", doc="private", default="/etc/pki/tls/private/example.key")
+option_4 = BoolOption(name="activate", doc="activate", default=True)
+optiondescription_3 = OptionDescription(name="/etc/pki/tls/certs/example_crt", doc="/etc/pki/tls/certs/example.crt", children=[option_5, option_6, option_7, option_8, option_9, option_4])
+optiondescription_2 = OptionDescription(name="certificates", doc="certificates", children=[optiondescription_3])
+option_1 = BoolOption(name="activate", doc="activate", default=True)
+option_10 = BoolOption(name="manage", doc="manage", default=True)
+optiondescription_23 = OptionDescription(name="test_service", doc="test.service", children=[optiondescription_2, option_1, option_10])
+optiondescription_23.impl_set_information('type', "service")
+optiondescription_22 = OptionDescription(name="services", doc="services", children=[optiondescription_23], properties=frozenset({"hidden"}))
+optiondescription_21 = OptionDescription(name="1", doc="1", children=[optiondescription_22])
+option_15 = FilenameOption(name="authority", doc="authority", default="/etc/pki/ca-trust/source/anchors/ca_example.crt")
+option_16 = UsernameOption(name="group", doc="group", default="example")
+option_17 = FilenameOption(name="name", doc="name", default="/etc/pki/tls/certs/example.crt")
+option_18 = UsernameOption(name="owner", doc="owner", default="example")
+option_19 = FilenameOption(name="private", doc="private", default="/etc/pki/tls/private/example.key")
+option_14 = BoolOption(name="activate", doc="activate", default=True)
+optiondescription_13 = OptionDescription(name="/etc/pki/tls/certs/example_crt", doc="/etc/pki/tls/certs/example.crt", children=[option_15, option_16, option_17, option_18, option_19, option_14])
+optiondescription_12 = OptionDescription(name="certificates", doc="certificates", children=[optiondescription_13])
+option_11 = BoolOption(name="activate", doc="activate", default=True)
+option_20 = BoolOption(name="manage", doc="manage", default=True)
+optiondescription_26 = OptionDescription(name="test_service", doc="test.service", children=[optiondescription_12, option_11, option_20])
+optiondescription_26.impl_set_information('type', "service")
+optiondescription_25 = OptionDescription(name="services", doc="services", children=[optiondescription_26], properties=frozenset({"hidden"}))
+optiondescription_24 = OptionDescription(name="2", doc="2", children=[optiondescription_25])
+option_0 = OptionDescription(name="baseoption", doc="baseoption", children=[optiondescription_21, optiondescription_24])
diff --git a/tests/dictionaries/01base_certificate_owner/xml/00-base.xml b/tests/dictionaries/01base_certificate_owner/xml/00-base.xml
new file mode 100644
index 000000000..979e5463b
--- /dev/null
+++ b/tests/dictionaries/01base_certificate_owner/xml/00-base.xml
@@ -0,0 +1,8 @@
+
+
+
+
+ /etc/pki/tls/certs/example.crt
+
+
+
diff --git a/tests/dictionaries/01base_certificate_owner/yml/00-base.yml b/tests/dictionaries/01base_certificate_owner/yml/00-base.yml
new file mode 100644
index 000000000..0dee3a4c4
--- /dev/null
+++ b/tests/dictionaries/01base_certificate_owner/yml/00-base.yml
@@ -0,0 +1,10 @@
+version: '0.10'
+services:
+- service:
+ - name: test
+ certificate:
+ - private: /etc/pki/tls/private/example.key
+ authority: /etc/pki/ca-trust/source/anchors/ca_example.crt
+ owner: example
+ group: example
+ text: /etc/pki/tls/certs/example.crt
diff --git a/tests/dictionaries/01base_certificate_owner_variable/__init__.py b/tests/dictionaries/01base_certificate_owner_variable/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/dictionaries/01base_certificate_owner_variable/makedict/after.json b/tests/dictionaries/01base_certificate_owner_variable/makedict/after.json
new file mode 100644
index 000000000..ab27ebd51
--- /dev/null
+++ b/tests/dictionaries/01base_certificate_owner_variable/makedict/after.json
@@ -0,0 +1,42 @@
+{
+ "rougail.owner": {
+ "owner": "default",
+ "value": "example"
+ },
+ "rougail.group": {
+ "owner": "default",
+ "value": "example"
+ },
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.authority": {
+ "owner": "default",
+ "value": "/etc/pki/ca-trust/source/anchors/ca_example.crt"
+ },
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.group": {
+ "owner": "default",
+ "value": "example"
+ },
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.name": {
+ "owner": "default",
+ "value": "/etc/pki/tls/certs/example.crt"
+ },
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.owner": {
+ "owner": "default",
+ "value": "example"
+ },
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.private": {
+ "owner": "default",
+ "value": "/etc/pki/tls/private/example.key"
+ },
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.activate": {
+ "owner": "default",
+ "value": true
+ },
+ "services.test_service.activate": {
+ "owner": "default",
+ "value": true
+ },
+ "services.test_service.manage": {
+ "owner": "default",
+ "value": true
+ }
+}
diff --git a/tests/dictionaries/01base_certificate_owner_variable/makedict/base.json b/tests/dictionaries/01base_certificate_owner_variable/makedict/base.json
new file mode 100644
index 000000000..cf539a159
--- /dev/null
+++ b/tests/dictionaries/01base_certificate_owner_variable/makedict/base.json
@@ -0,0 +1,12 @@
+{
+ "rougail.owner": "example",
+ "rougail.group": "example",
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.authority": "/etc/pki/ca-trust/source/anchors/ca_example.crt",
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.group": "example",
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.name": "/etc/pki/tls/certs/example.crt",
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.owner": "example",
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.private": "/etc/pki/tls/private/example.key",
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.activate": true,
+ "services.test_service.activate": true,
+ "services.test_service.manage": true
+}
diff --git a/tests/dictionaries/01base_certificate_owner_variable/makedict/before.json b/tests/dictionaries/01base_certificate_owner_variable/makedict/before.json
new file mode 100644
index 000000000..ab27ebd51
--- /dev/null
+++ b/tests/dictionaries/01base_certificate_owner_variable/makedict/before.json
@@ -0,0 +1,42 @@
+{
+ "rougail.owner": {
+ "owner": "default",
+ "value": "example"
+ },
+ "rougail.group": {
+ "owner": "default",
+ "value": "example"
+ },
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.authority": {
+ "owner": "default",
+ "value": "/etc/pki/ca-trust/source/anchors/ca_example.crt"
+ },
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.group": {
+ "owner": "default",
+ "value": "example"
+ },
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.name": {
+ "owner": "default",
+ "value": "/etc/pki/tls/certs/example.crt"
+ },
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.owner": {
+ "owner": "default",
+ "value": "example"
+ },
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.private": {
+ "owner": "default",
+ "value": "/etc/pki/tls/private/example.key"
+ },
+ "services.test_service.certificates./etc/pki/tls/certs/example_crt.activate": {
+ "owner": "default",
+ "value": true
+ },
+ "services.test_service.activate": {
+ "owner": "default",
+ "value": true
+ },
+ "services.test_service.manage": {
+ "owner": "default",
+ "value": true
+ }
+}
diff --git a/tests/dictionaries/01base_certificate_owner_variable/tiramisu/base.py b/tests/dictionaries/01base_certificate_owner_variable/tiramisu/base.py
new file mode 100644
index 000000000..2bd4fddaf
--- /dev/null
+++ b/tests/dictionaries/01base_certificate_owner_variable/tiramisu/base.py
@@ -0,0 +1,37 @@
+from importlib.machinery import SourceFileLoader as _SourceFileLoader
+from importlib.util import spec_from_loader as _spec_from_loader, module_from_spec as _module_from_spec
+class func:
+ pass
+
+def _load_functions(path):
+ global _SourceFileLoader, _spec_from_loader, _module_from_spec, func
+ loader = _SourceFileLoader('func', path)
+ spec = _spec_from_loader(loader.name, loader)
+ func_ = _module_from_spec(spec)
+ loader.exec_module(func_)
+ for function in dir(func_):
+ if function.startswith('_'):
+ continue
+ setattr(func, function, getattr(func_, function))
+_load_functions('tests/dictionaries/../eosfunc/test.py')
+try:
+ from tiramisu3 import *
+except:
+ from tiramisu import *
+option_1 = UsernameOption(name="owner", doc="owner", default="example", properties=frozenset({"mandatory", "normal"}))
+option_2 = UsernameOption(name="group", doc="group", default="example", properties=frozenset({"mandatory", "normal"}))
+optiondescription_13 = OptionDescription(name="rougail", doc="Rougail", children=[option_1, option_2])
+option_7 = FilenameOption(name="authority", doc="authority", default="/etc/pki/ca-trust/source/anchors/ca_example.crt")
+option_8 = SymLinkOption(name="group", opt=option_2)
+option_9 = FilenameOption(name="name", doc="name", default="/etc/pki/tls/certs/example.crt")
+option_10 = SymLinkOption(name="owner", opt=option_1)
+option_11 = FilenameOption(name="private", doc="private", default="/etc/pki/tls/private/example.key")
+option_6 = BoolOption(name="activate", doc="activate", default=True)
+optiondescription_5 = OptionDescription(name="/etc/pki/tls/certs/example_crt", doc="/etc/pki/tls/certs/example.crt", children=[option_7, option_8, option_9, option_10, option_11, option_6])
+optiondescription_4 = OptionDescription(name="certificates", doc="certificates", children=[optiondescription_5])
+option_3 = BoolOption(name="activate", doc="activate", default=True)
+option_12 = BoolOption(name="manage", doc="manage", default=True)
+optiondescription_15 = OptionDescription(name="test_service", doc="test.service", children=[optiondescription_4, option_3, option_12])
+optiondescription_15.impl_set_information('type', "service")
+optiondescription_14 = OptionDescription(name="services", doc="services", children=[optiondescription_15], properties=frozenset({"hidden"}))
+option_0 = OptionDescription(name="baseoption", doc="baseoption", children=[optiondescription_13, optiondescription_14])
diff --git a/tests/dictionaries/01base_certificate_owner_variable/tiramisu/multi.py b/tests/dictionaries/01base_certificate_owner_variable/tiramisu/multi.py
new file mode 100644
index 000000000..94725228d
--- /dev/null
+++ b/tests/dictionaries/01base_certificate_owner_variable/tiramisu/multi.py
@@ -0,0 +1,55 @@
+from importlib.machinery import SourceFileLoader as _SourceFileLoader
+from importlib.util import spec_from_loader as _spec_from_loader, module_from_spec as _module_from_spec
+class func:
+ pass
+
+def _load_functions(path):
+ global _SourceFileLoader, _spec_from_loader, _module_from_spec, func
+ loader = _SourceFileLoader('func', path)
+ spec = _spec_from_loader(loader.name, loader)
+ func_ = _module_from_spec(spec)
+ loader.exec_module(func_)
+ for function in dir(func_):
+ if function.startswith('_'):
+ continue
+ setattr(func, function, getattr(func_, function))
+_load_functions('tests/dictionaries/../eosfunc/test.py')
+try:
+ from tiramisu3 import *
+except:
+ from tiramisu import *
+option_1 = UsernameOption(name="owner", doc="owner", default="example", properties=frozenset({"mandatory", "normal"}))
+option_2 = UsernameOption(name="group", doc="group", default="example", properties=frozenset({"mandatory", "normal"}))
+optiondescription_26 = OptionDescription(name="rougail", doc="Rougail", children=[option_1, option_2])
+option_9 = FilenameOption(name="authority", doc="authority", default="/etc/pki/ca-trust/source/anchors/ca_example.crt")
+option_10 = SymLinkOption(name="group", opt=option_2)
+option_11 = FilenameOption(name="name", doc="name", default="/etc/pki/tls/certs/example.crt")
+option_12 = SymLinkOption(name="owner", opt=option_1)
+option_13 = FilenameOption(name="private", doc="private", default="/etc/pki/tls/private/example.key")
+option_8 = BoolOption(name="activate", doc="activate", default=True)
+optiondescription_7 = OptionDescription(name="/etc/pki/tls/certs/example_crt", doc="/etc/pki/tls/certs/example.crt", children=[option_9, option_10, option_11, option_12, option_13, option_8])
+optiondescription_6 = OptionDescription(name="certificates", doc="certificates", children=[optiondescription_7])
+option_5 = BoolOption(name="activate", doc="activate", default=True)
+option_14 = BoolOption(name="manage", doc="manage", default=True)
+optiondescription_28 = OptionDescription(name="test_service", doc="test.service", children=[optiondescription_6, option_5, option_14])
+optiondescription_28.impl_set_information('type', "service")
+optiondescription_27 = OptionDescription(name="services", doc="services", children=[optiondescription_28], properties=frozenset({"hidden"}))
+optiondescription_25 = OptionDescription(name="1", doc="1", children=[optiondescription_26, optiondescription_27])
+option_3 = UsernameOption(name="owner", doc="owner", default="example", properties=frozenset({"mandatory", "normal"}))
+option_4 = UsernameOption(name="group", doc="group", default="example", properties=frozenset({"mandatory", "normal"}))
+optiondescription_30 = OptionDescription(name="rougail", doc="Rougail", children=[option_3, option_4])
+option_19 = FilenameOption(name="authority", doc="authority", default="/etc/pki/ca-trust/source/anchors/ca_example.crt")
+option_20 = SymLinkOption(name="group", opt=option_4)
+option_21 = FilenameOption(name="name", doc="name", default="/etc/pki/tls/certs/example.crt")
+option_22 = SymLinkOption(name="owner", opt=option_3)
+option_23 = FilenameOption(name="private", doc="private", default="/etc/pki/tls/private/example.key")
+option_18 = BoolOption(name="activate", doc="activate", default=True)
+optiondescription_17 = OptionDescription(name="/etc/pki/tls/certs/example_crt", doc="/etc/pki/tls/certs/example.crt", children=[option_19, option_20, option_21, option_22, option_23, option_18])
+optiondescription_16 = OptionDescription(name="certificates", doc="certificates", children=[optiondescription_17])
+option_15 = BoolOption(name="activate", doc="activate", default=True)
+option_24 = BoolOption(name="manage", doc="manage", default=True)
+optiondescription_32 = OptionDescription(name="test_service", doc="test.service", children=[optiondescription_16, option_15, option_24])
+optiondescription_32.impl_set_information('type', "service")
+optiondescription_31 = OptionDescription(name="services", doc="services", children=[optiondescription_32], properties=frozenset({"hidden"}))
+optiondescription_29 = OptionDescription(name="2", doc="2", children=[optiondescription_30, optiondescription_31])
+option_0 = OptionDescription(name="baseoption", doc="baseoption", children=[optiondescription_25, optiondescription_29])
diff --git a/tests/dictionaries/01base_certificate_owner_variable/xml/00-base.xml b/tests/dictionaries/01base_certificate_owner_variable/xml/00-base.xml
new file mode 100644
index 000000000..53ea98215
--- /dev/null
+++ b/tests/dictionaries/01base_certificate_owner_variable/xml/00-base.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ /etc/pki/tls/certs/example.crt
+
+
+
+
+ example
+
+
+ example
+
+
+
diff --git a/tests/dictionaries/01base_certificate_owner_variable/yml/00-base.yml b/tests/dictionaries/01base_certificate_owner_variable/yml/00-base.yml
new file mode 100644
index 000000000..282027c83
--- /dev/null
+++ b/tests/dictionaries/01base_certificate_owner_variable/yml/00-base.yml
@@ -0,0 +1,22 @@
+version: '0.10'
+services:
+- service:
+ - name: test
+ certificate:
+ - private: /etc/pki/tls/private/example.key
+ authority: /etc/pki/ca-trust/source/anchors/ca_example.crt
+ owner: owner
+ owner_type: variable
+ group: group
+ group_type: variable
+ text: /etc/pki/tls/certs/example.crt
+variables:
+- variable:
+ - name: owner
+ type: unix_user
+ value:
+ - text: example
+ - name: group
+ type: unix_user
+ value:
+ - text: example
diff --git a/tests/dictionaries/01base_certificate_owner_variable_wrong/__init__.py b/tests/dictionaries/01base_certificate_owner_variable_wrong/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/dictionaries/01base_certificate_owner_variable_wrong/errno_58 b/tests/dictionaries/01base_certificate_owner_variable_wrong/errno_58
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/dictionaries/01base_certificate_owner_variable_wrong/xml/00-base.xml b/tests/dictionaries/01base_certificate_owner_variable_wrong/xml/00-base.xml
new file mode 100644
index 000000000..0a09eb03f
--- /dev/null
+++ b/tests/dictionaries/01base_certificate_owner_variable_wrong/xml/00-base.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ /etc/pki/tls/certs/example.crt
+
+
+
+
+ example
+
+
+ example
+
+
+
diff --git a/tests/dictionaries/01base_certificate_owner_variable_wrong/yml/00-base.yml b/tests/dictionaries/01base_certificate_owner_variable_wrong/yml/00-base.yml
new file mode 100644
index 000000000..8e2114cd3
--- /dev/null
+++ b/tests/dictionaries/01base_certificate_owner_variable_wrong/yml/00-base.yml
@@ -0,0 +1,21 @@
+version: '0.10'
+services:
+- service:
+ - name: test
+ certificate:
+ - private: /etc/pki/tls/private/example.key
+ authority: /etc/pki/ca-trust/source/anchors/ca_example.crt
+ owner: owner
+ owner_type: variable
+ group: group
+ group_type: variable
+ text: /etc/pki/tls/certs/example.crt
+variables:
+- variable:
+ - name: owner
+ value:
+ - text: example
+ - name: group
+ type: unix_user
+ value:
+ - text: example
diff --git a/tests/dictionaries/01base_certificate_variable/__init__.py b/tests/dictionaries/01base_certificate_variable/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/dictionaries/01base_certificate_variable/makedict/after.json b/tests/dictionaries/01base_certificate_variable/makedict/after.json
new file mode 100644
index 000000000..1d7cca464
--- /dev/null
+++ b/tests/dictionaries/01base_certificate_variable/makedict/after.json
@@ -0,0 +1,38 @@
+{
+ "rougail.certificate": {
+ "owner": "default",
+ "value": "/etc/pki/tls/certs/example.crt"
+ },
+ "rougail.private": {
+ "owner": "default",
+ "value": "/etc/pki/tls/private/example.key"
+ },
+ "rougail.authority": {
+ "owner": "default",
+ "value": "/etc/pki/ca-trust/source/anchors/ca_example.crt"
+ },
+ "services.test_service.certificates.certificate.authority": {
+ "owner": "default",
+ "value": "/etc/pki/ca-trust/source/anchors/ca_example.crt"
+ },
+ "services.test_service.certificates.certificate.name": {
+ "owner": "default",
+ "value": "/etc/pki/tls/certs/example.crt"
+ },
+ "services.test_service.certificates.certificate.private": {
+ "owner": "default",
+ "value": "/etc/pki/tls/private/example.key"
+ },
+ "services.test_service.certificates.certificate.activate": {
+ "owner": "default",
+ "value": true
+ },
+ "services.test_service.activate": {
+ "owner": "default",
+ "value": true
+ },
+ "services.test_service.manage": {
+ "owner": "default",
+ "value": true
+ }
+}
diff --git a/tests/dictionaries/01base_certificate_variable/makedict/base.json b/tests/dictionaries/01base_certificate_variable/makedict/base.json
new file mode 100644
index 000000000..a4c8a74eb
--- /dev/null
+++ b/tests/dictionaries/01base_certificate_variable/makedict/base.json
@@ -0,0 +1,11 @@
+{
+ "rougail.certificate": "/etc/pki/tls/certs/example.crt",
+ "rougail.private": "/etc/pki/tls/private/example.key",
+ "rougail.authority": "/etc/pki/ca-trust/source/anchors/ca_example.crt",
+ "services.test_service.certificates.certificate.authority": "/etc/pki/ca-trust/source/anchors/ca_example.crt",
+ "services.test_service.certificates.certificate.name": "/etc/pki/tls/certs/example.crt",
+ "services.test_service.certificates.certificate.private": "/etc/pki/tls/private/example.key",
+ "services.test_service.certificates.certificate.activate": true,
+ "services.test_service.activate": true,
+ "services.test_service.manage": true
+}
diff --git a/tests/dictionaries/01base_certificate_variable/makedict/before.json b/tests/dictionaries/01base_certificate_variable/makedict/before.json
new file mode 100644
index 000000000..1d7cca464
--- /dev/null
+++ b/tests/dictionaries/01base_certificate_variable/makedict/before.json
@@ -0,0 +1,38 @@
+{
+ "rougail.certificate": {
+ "owner": "default",
+ "value": "/etc/pki/tls/certs/example.crt"
+ },
+ "rougail.private": {
+ "owner": "default",
+ "value": "/etc/pki/tls/private/example.key"
+ },
+ "rougail.authority": {
+ "owner": "default",
+ "value": "/etc/pki/ca-trust/source/anchors/ca_example.crt"
+ },
+ "services.test_service.certificates.certificate.authority": {
+ "owner": "default",
+ "value": "/etc/pki/ca-trust/source/anchors/ca_example.crt"
+ },
+ "services.test_service.certificates.certificate.name": {
+ "owner": "default",
+ "value": "/etc/pki/tls/certs/example.crt"
+ },
+ "services.test_service.certificates.certificate.private": {
+ "owner": "default",
+ "value": "/etc/pki/tls/private/example.key"
+ },
+ "services.test_service.certificates.certificate.activate": {
+ "owner": "default",
+ "value": true
+ },
+ "services.test_service.activate": {
+ "owner": "default",
+ "value": true
+ },
+ "services.test_service.manage": {
+ "owner": "default",
+ "value": true
+ }
+}
diff --git a/tests/dictionaries/01base_certificate_variable/tiramisu/base.py b/tests/dictionaries/01base_certificate_variable/tiramisu/base.py
new file mode 100644
index 000000000..48117d63a
--- /dev/null
+++ b/tests/dictionaries/01base_certificate_variable/tiramisu/base.py
@@ -0,0 +1,36 @@
+from importlib.machinery import SourceFileLoader as _SourceFileLoader
+from importlib.util import spec_from_loader as _spec_from_loader, module_from_spec as _module_from_spec
+class func:
+ pass
+
+def _load_functions(path):
+ global _SourceFileLoader, _spec_from_loader, _module_from_spec, func
+ loader = _SourceFileLoader('func', path)
+ spec = _spec_from_loader(loader.name, loader)
+ func_ = _module_from_spec(spec)
+ loader.exec_module(func_)
+ for function in dir(func_):
+ if function.startswith('_'):
+ continue
+ setattr(func, function, getattr(func_, function))
+_load_functions('tests/dictionaries/../eosfunc/test.py')
+try:
+ from tiramisu3 import *
+except:
+ from tiramisu import *
+option_1 = FilenameOption(name="certificate", doc="certificate", default="/etc/pki/tls/certs/example.crt", properties=frozenset({"mandatory", "normal"}))
+option_2 = FilenameOption(name="private", doc="private", default="/etc/pki/tls/private/example.key", properties=frozenset({"mandatory", "normal"}))
+option_3 = FilenameOption(name="authority", doc="authority", default="/etc/pki/ca-trust/source/anchors/ca_example.crt", properties=frozenset({"mandatory", "normal"}))
+optiondescription_12 = OptionDescription(name="rougail", doc="Rougail", children=[option_1, option_2, option_3])
+option_8 = SymLinkOption(name="authority", opt=option_3)
+option_9 = SymLinkOption(name="name", opt=option_1)
+option_10 = SymLinkOption(name="private", opt=option_2)
+option_7 = BoolOption(name="activate", doc="activate", default=True)
+optiondescription_6 = OptionDescription(name="certificate", doc="certificate", children=[option_8, option_9, option_10, option_7])
+optiondescription_5 = OptionDescription(name="certificates", doc="certificates", children=[optiondescription_6])
+option_4 = BoolOption(name="activate", doc="activate", default=True)
+option_11 = BoolOption(name="manage", doc="manage", default=True)
+optiondescription_14 = OptionDescription(name="test_service", doc="test.service", children=[optiondescription_5, option_4, option_11])
+optiondescription_14.impl_set_information('type', "service")
+optiondescription_13 = OptionDescription(name="services", doc="services", children=[optiondescription_14], properties=frozenset({"hidden"}))
+option_0 = OptionDescription(name="baseoption", doc="baseoption", children=[optiondescription_12, optiondescription_13])
diff --git a/tests/dictionaries/01base_certificate_variable/tiramisu/multi.py b/tests/dictionaries/01base_certificate_variable/tiramisu/multi.py
new file mode 100644
index 000000000..7834fd585
--- /dev/null
+++ b/tests/dictionaries/01base_certificate_variable/tiramisu/multi.py
@@ -0,0 +1,53 @@
+from importlib.machinery import SourceFileLoader as _SourceFileLoader
+from importlib.util import spec_from_loader as _spec_from_loader, module_from_spec as _module_from_spec
+class func:
+ pass
+
+def _load_functions(path):
+ global _SourceFileLoader, _spec_from_loader, _module_from_spec, func
+ loader = _SourceFileLoader('func', path)
+ spec = _spec_from_loader(loader.name, loader)
+ func_ = _module_from_spec(spec)
+ loader.exec_module(func_)
+ for function in dir(func_):
+ if function.startswith('_'):
+ continue
+ setattr(func, function, getattr(func_, function))
+_load_functions('tests/dictionaries/../eosfunc/test.py')
+try:
+ from tiramisu3 import *
+except:
+ from tiramisu import *
+option_1 = FilenameOption(name="certificate", doc="certificate", default="/etc/pki/tls/certs/example.crt", properties=frozenset({"mandatory", "normal"}))
+option_2 = FilenameOption(name="private", doc="private", default="/etc/pki/tls/private/example.key", properties=frozenset({"mandatory", "normal"}))
+option_3 = FilenameOption(name="authority", doc="authority", default="/etc/pki/ca-trust/source/anchors/ca_example.crt", properties=frozenset({"mandatory", "normal"}))
+optiondescription_24 = OptionDescription(name="rougail", doc="Rougail", children=[option_1, option_2, option_3])
+option_11 = SymLinkOption(name="authority", opt=option_3)
+option_12 = SymLinkOption(name="name", opt=option_1)
+option_13 = SymLinkOption(name="private", opt=option_2)
+option_10 = BoolOption(name="activate", doc="activate", default=True)
+optiondescription_9 = OptionDescription(name="certificate", doc="certificate", children=[option_11, option_12, option_13, option_10])
+optiondescription_8 = OptionDescription(name="certificates", doc="certificates", children=[optiondescription_9])
+option_7 = BoolOption(name="activate", doc="activate", default=True)
+option_14 = BoolOption(name="manage", doc="manage", default=True)
+optiondescription_26 = OptionDescription(name="test_service", doc="test.service", children=[optiondescription_8, option_7, option_14])
+optiondescription_26.impl_set_information('type', "service")
+optiondescription_25 = OptionDescription(name="services", doc="services", children=[optiondescription_26], properties=frozenset({"hidden"}))
+optiondescription_23 = OptionDescription(name="1", doc="1", children=[optiondescription_24, optiondescription_25])
+option_4 = FilenameOption(name="certificate", doc="certificate", default="/etc/pki/tls/certs/example.crt", properties=frozenset({"mandatory", "normal"}))
+option_5 = FilenameOption(name="private", doc="private", default="/etc/pki/tls/private/example.key", properties=frozenset({"mandatory", "normal"}))
+option_6 = FilenameOption(name="authority", doc="authority", default="/etc/pki/ca-trust/source/anchors/ca_example.crt", properties=frozenset({"mandatory", "normal"}))
+optiondescription_28 = OptionDescription(name="rougail", doc="Rougail", children=[option_4, option_5, option_6])
+option_19 = SymLinkOption(name="authority", opt=option_6)
+option_20 = SymLinkOption(name="name", opt=option_4)
+option_21 = SymLinkOption(name="private", opt=option_5)
+option_18 = BoolOption(name="activate", doc="activate", default=True)
+optiondescription_17 = OptionDescription(name="certificate", doc="certificate", children=[option_19, option_20, option_21, option_18])
+optiondescription_16 = OptionDescription(name="certificates", doc="certificates", children=[optiondescription_17])
+option_15 = BoolOption(name="activate", doc="activate", default=True)
+option_22 = BoolOption(name="manage", doc="manage", default=True)
+optiondescription_30 = OptionDescription(name="test_service", doc="test.service", children=[optiondescription_16, option_15, option_22])
+optiondescription_30.impl_set_information('type', "service")
+optiondescription_29 = OptionDescription(name="services", doc="services", children=[optiondescription_30], properties=frozenset({"hidden"}))
+optiondescription_27 = OptionDescription(name="2", doc="2", children=[optiondescription_28, optiondescription_29])
+option_0 = OptionDescription(name="baseoption", doc="baseoption", children=[optiondescription_23, optiondescription_27])
diff --git a/tests/dictionaries/01base_certificate_variable/xml/00-base.xml b/tests/dictionaries/01base_certificate_variable/xml/00-base.xml
new file mode 100644
index 000000000..c86ae46b0
--- /dev/null
+++ b/tests/dictionaries/01base_certificate_variable/xml/00-base.xml
@@ -0,0 +1,19 @@
+
+
+
+
+ certificate
+
+
+
+
+ /etc/pki/tls/certs/example.crt
+
+
+ /etc/pki/tls/private/example.key
+
+
+ /etc/pki/ca-trust/source/anchors/ca_example.crt
+
+
+
diff --git a/tests/dictionaries/01base_certificate_variable/yml/00-base.yml b/tests/dictionaries/01base_certificate_variable/yml/00-base.yml
new file mode 100644
index 000000000..1f56ab46c
--- /dev/null
+++ b/tests/dictionaries/01base_certificate_variable/yml/00-base.yml
@@ -0,0 +1,25 @@
+version: '0.10'
+services:
+- service:
+ - name: test
+ certificate:
+ - private: private
+ private_type: variable
+ authority: authority
+ authority_type: variable
+ certificate_type: variable
+ text: certificate
+variables:
+- variable:
+ - name: certificate
+ type: filename
+ value:
+ - text: /etc/pki/tls/certs/example.crt
+ - name: private
+ type: filename
+ value:
+ - text: /etc/pki/tls/private/example.key
+ - name: authority
+ type: filename
+ value:
+ - text: /etc/pki/ca-trust/source/anchors/ca_example.crt
diff --git a/tests/dictionaries/01base_file_mode/__init__.py b/tests/dictionaries/01base_file_mode/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/dictionaries/01base_file_mode/makedict/after.json b/tests/dictionaries/01base_file_mode/makedict/after.json
new file mode 100644
index 000000000..05af219b0
--- /dev/null
+++ b/tests/dictionaries/01base_file_mode/makedict/after.json
@@ -0,0 +1,22 @@
+{
+ "services.test_service.files.file.name": {
+ "owner": "default",
+ "value": "/etc/file"
+ },
+ "services.test_service.files.file.source": {
+ "owner": "default",
+ "value": "file"
+ },
+ "services.test_service.files.file.activate": {
+ "owner": "default",
+ "value": true
+ },
+ "services.test_service.activate": {
+ "owner": "default",
+ "value": true
+ },
+ "services.test_service.manage": {
+ "owner": "default",
+ "value": true
+ }
+}
diff --git a/tests/dictionaries/01base_file_mode/makedict/base.json b/tests/dictionaries/01base_file_mode/makedict/base.json
new file mode 100644
index 000000000..2296bda68
--- /dev/null
+++ b/tests/dictionaries/01base_file_mode/makedict/base.json
@@ -0,0 +1,7 @@
+{
+ "services.test_service.files.file.name": "/etc/file",
+ "services.test_service.files.file.source": "file",
+ "services.test_service.files.file.activate": true,
+ "services.test_service.activate": true,
+ "services.test_service.manage": true
+}
diff --git a/tests/dictionaries/01base_file_mode/makedict/before.json b/tests/dictionaries/01base_file_mode/makedict/before.json
new file mode 100644
index 000000000..05af219b0
--- /dev/null
+++ b/tests/dictionaries/01base_file_mode/makedict/before.json
@@ -0,0 +1,22 @@
+{
+ "services.test_service.files.file.name": {
+ "owner": "default",
+ "value": "/etc/file"
+ },
+ "services.test_service.files.file.source": {
+ "owner": "default",
+ "value": "file"
+ },
+ "services.test_service.files.file.activate": {
+ "owner": "default",
+ "value": true
+ },
+ "services.test_service.activate": {
+ "owner": "default",
+ "value": true
+ },
+ "services.test_service.manage": {
+ "owner": "default",
+ "value": true
+ }
+}
diff --git a/tests/dictionaries/01base_file_mode/result/etc/file b/tests/dictionaries/01base_file_mode/result/etc/file
new file mode 100644
index 000000000..9daeafb98
--- /dev/null
+++ b/tests/dictionaries/01base_file_mode/result/etc/file
@@ -0,0 +1 @@
+test
diff --git a/tests/dictionaries/01base_file_mode/result/tmpfiles.d/0rougail.conf b/tests/dictionaries/01base_file_mode/result/tmpfiles.d/0rougail.conf
new file mode 100644
index 000000000..f397d988d
--- /dev/null
+++ b/tests/dictionaries/01base_file_mode/result/tmpfiles.d/0rougail.conf
@@ -0,0 +1 @@
+C /etc/file 0755 root root - /usr/local/lib/etc/file
diff --git a/tests/dictionaries/01base_file_mode/tiramisu/base.py b/tests/dictionaries/01base_file_mode/tiramisu/base.py
new file mode 100644
index 000000000..c017f3881
--- /dev/null
+++ b/tests/dictionaries/01base_file_mode/tiramisu/base.py
@@ -0,0 +1,32 @@
+from importlib.machinery import SourceFileLoader as _SourceFileLoader
+from importlib.util import spec_from_loader as _spec_from_loader, module_from_spec as _module_from_spec
+class func:
+ pass
+
+def _load_functions(path):
+ global _SourceFileLoader, _spec_from_loader, _module_from_spec, func
+ loader = _SourceFileLoader('func', path)
+ spec = _spec_from_loader(loader.name, loader)
+ func_ = _module_from_spec(spec)
+ loader.exec_module(func_)
+ for function in dir(func_):
+ if function.startswith('_'):
+ continue
+ setattr(func, function, getattr(func_, function))
+_load_functions('tests/dictionaries/../eosfunc/test.py')
+try:
+ from tiramisu3 import *
+except:
+ from tiramisu import *
+option_5 = FilenameOption(name="name", doc="name", default="/etc/file")
+option_6 = StrOption(name="source", doc="source", default="file")
+option_4 = BoolOption(name="activate", doc="activate", default=True)
+optiondescription_3 = OptionDescription(name="file", doc="file", children=[option_5, option_6, option_4])
+optiondescription_3.impl_set_information('mode', 755)
+optiondescription_2 = OptionDescription(name="files", doc="files", children=[optiondescription_3])
+option_1 = BoolOption(name="activate", doc="activate", default=True)
+option_7 = BoolOption(name="manage", doc="manage", default=True)
+optiondescription_9 = OptionDescription(name="test_service", doc="test.service", children=[optiondescription_2, option_1, option_7])
+optiondescription_9.impl_set_information('type', "service")
+optiondescription_8 = OptionDescription(name="services", doc="services", children=[optiondescription_9], properties=frozenset({"hidden"}))
+option_0 = OptionDescription(name="baseoption", doc="baseoption", children=[optiondescription_8])
diff --git a/tests/dictionaries/01base_file_mode/tiramisu/multi.py b/tests/dictionaries/01base_file_mode/tiramisu/multi.py
new file mode 100644
index 000000000..ba5749785
--- /dev/null
+++ b/tests/dictionaries/01base_file_mode/tiramisu/multi.py
@@ -0,0 +1,45 @@
+from importlib.machinery import SourceFileLoader as _SourceFileLoader
+from importlib.util import spec_from_loader as _spec_from_loader, module_from_spec as _module_from_spec
+class func:
+ pass
+
+def _load_functions(path):
+ global _SourceFileLoader, _spec_from_loader, _module_from_spec, func
+ loader = _SourceFileLoader('func', path)
+ spec = _spec_from_loader(loader.name, loader)
+ func_ = _module_from_spec(spec)
+ loader.exec_module(func_)
+ for function in dir(func_):
+ if function.startswith('_'):
+ continue
+ setattr(func, function, getattr(func_, function))
+_load_functions('tests/dictionaries/../eosfunc/test.py')
+try:
+ from tiramisu3 import *
+except:
+ from tiramisu import *
+option_5 = FilenameOption(name="name", doc="name", default="/etc/file")
+option_6 = StrOption(name="source", doc="source", default="file")
+option_4 = BoolOption(name="activate", doc="activate", default=True)
+optiondescription_3 = OptionDescription(name="file", doc="file", children=[option_5, option_6, option_4])
+optiondescription_3.impl_set_information('mode', 755)
+optiondescription_2 = OptionDescription(name="files", doc="files", children=[optiondescription_3])
+option_1 = BoolOption(name="activate", doc="activate", default=True)
+option_7 = BoolOption(name="manage", doc="manage", default=True)
+optiondescription_17 = OptionDescription(name="test_service", doc="test.service", children=[optiondescription_2, option_1, option_7])
+optiondescription_17.impl_set_information('type', "service")
+optiondescription_16 = OptionDescription(name="services", doc="services", children=[optiondescription_17], properties=frozenset({"hidden"}))
+optiondescription_15 = OptionDescription(name="1", doc="1", children=[optiondescription_16])
+option_12 = FilenameOption(name="name", doc="name", default="/etc/file")
+option_13 = StrOption(name="source", doc="source", default="file")
+option_11 = BoolOption(name="activate", doc="activate", default=True)
+optiondescription_10 = OptionDescription(name="file", doc="file", children=[option_12, option_13, option_11])
+optiondescription_10.impl_set_information('mode', 755)
+optiondescription_9 = OptionDescription(name="files", doc="files", children=[optiondescription_10])
+option_8 = BoolOption(name="activate", doc="activate", default=True)
+option_14 = BoolOption(name="manage", doc="manage", default=True)
+optiondescription_20 = OptionDescription(name="test_service", doc="test.service", children=[optiondescription_9, option_8, option_14])
+optiondescription_20.impl_set_information('type', "service")
+optiondescription_19 = OptionDescription(name="services", doc="services", children=[optiondescription_20], properties=frozenset({"hidden"}))
+optiondescription_18 = OptionDescription(name="2", doc="2", children=[optiondescription_19])
+option_0 = OptionDescription(name="baseoption", doc="baseoption", children=[optiondescription_15, optiondescription_18])
diff --git a/tests/dictionaries/01base_file_mode/tmpl/file b/tests/dictionaries/01base_file_mode/tmpl/file
new file mode 100644
index 000000000..9daeafb98
--- /dev/null
+++ b/tests/dictionaries/01base_file_mode/tmpl/file
@@ -0,0 +1 @@
+test
diff --git a/tests/dictionaries/01base_file_mode/xml/00-base.xml b/tests/dictionaries/01base_file_mode/xml/00-base.xml
new file mode 100644
index 000000000..eeb2f1a04
--- /dev/null
+++ b/tests/dictionaries/01base_file_mode/xml/00-base.xml
@@ -0,0 +1,8 @@
+
+
+
+
+ /etc/file
+
+
+
diff --git a/tests/dictionaries/01base_file_mode/yml/00-base.yml b/tests/dictionaries/01base_file_mode/yml/00-base.yml
new file mode 100644
index 000000000..6039dad21
--- /dev/null
+++ b/tests/dictionaries/01base_file_mode/yml/00-base.yml
@@ -0,0 +1,7 @@
+version: '0.10'
+services:
+- service:
+ - name: test
+ file:
+ - mode: 755
+ text: /etc/file
diff --git a/tests/dictionaries/70container_files/tmpl/rougail.conf b/tests/dictionaries/70container_files/tmpl/rougail.conf
index cd853a0e9..b023342ea 100644
--- a/tests/dictionaries/70container_files/tmpl/rougail.conf
+++ b/tests/dictionaries/70container_files/tmpl/rougail.conf
@@ -2,7 +2,7 @@
%if %%hasattr(%%service, 'files')
%for %%file in %%service.files
%if %%file.name != %%rougail_filename and %%hasattr(%%file, 'activate') and %%file.activate == True
-C %%file.name %%file.mode %%file.owner %%file.group - /usr/local/share/factory%%file.name
+C %%file.name 0%%file.mode %%file.owner %%file.group - /usr/local/share/factory%%file.name
z %%file.name - - - - -
%end if
%end for
diff --git a/tests/dictionaries/80base_certificate_wrong_value_authority/__init__.py b/tests/dictionaries/80base_certificate_wrong_value_authority/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/dictionaries/80base_certificate_wrong_value_authority/errno_96 b/tests/dictionaries/80base_certificate_wrong_value_authority/errno_96
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/dictionaries/80base_certificate_wrong_value_authority/xml/00-base.xml b/tests/dictionaries/80base_certificate_wrong_value_authority/xml/00-base.xml
new file mode 100644
index 000000000..bfb3a45af
--- /dev/null
+++ b/tests/dictionaries/80base_certificate_wrong_value_authority/xml/00-base.xml
@@ -0,0 +1,8 @@
+
+
+
+
+ /example.crt
+
+
+
diff --git a/tests/dictionaries/80base_certificate_wrong_value_authority/yml/00-base.yml b/tests/dictionaries/80base_certificate_wrong_value_authority/yml/00-base.yml
new file mode 100644
index 000000000..1704b0baa
--- /dev/null
+++ b/tests/dictionaries/80base_certificate_wrong_value_authority/yml/00-base.yml
@@ -0,0 +1,8 @@
+version: '0.10'
+services:
+- service:
+ - name: test
+ certificate:
+ - private: /example.key
+ authority: ca_example.crt
+ text: /example.crt
diff --git a/tests/dictionaries/80base_certificate_wrong_value_authority_variable/__init__.py b/tests/dictionaries/80base_certificate_wrong_value_authority_variable/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/dictionaries/80base_certificate_wrong_value_authority_variable/errno_92 b/tests/dictionaries/80base_certificate_wrong_value_authority_variable/errno_92
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/dictionaries/80base_certificate_wrong_value_authority_variable/xml/00-base.xml b/tests/dictionaries/80base_certificate_wrong_value_authority_variable/xml/00-base.xml
new file mode 100644
index 000000000..ba87bb642
--- /dev/null
+++ b/tests/dictionaries/80base_certificate_wrong_value_authority_variable/xml/00-base.xml
@@ -0,0 +1,19 @@
+
+
+
+
+ certificate
+
+
+
+
+ /etc/pki/tls/certs/example.crt
+
+
+ /etc/pki/tls/private/example.key
+
+
+ /etc/pki/ca-trust/source/anchors/ca_example.crt
+
+
+
diff --git a/tests/dictionaries/80base_certificate_wrong_value_authority_variable/yml/00-base.yml b/tests/dictionaries/80base_certificate_wrong_value_authority_variable/yml/00-base.yml
new file mode 100644
index 000000000..8f7f4c35f
--- /dev/null
+++ b/tests/dictionaries/80base_certificate_wrong_value_authority_variable/yml/00-base.yml
@@ -0,0 +1,24 @@
+version: '0.10'
+services:
+- service:
+ - name: test
+ certificate:
+ - private: private
+ private_type: variable
+ authority: authority
+ authority_type: variable
+ certificate_type: variable
+ text: certificate
+variables:
+- variable:
+ - name: certificate
+ type: filename
+ value:
+ - text: /etc/pki/tls/certs/example.crt
+ - name: private
+ type: filename
+ value:
+ - text: /etc/pki/tls/private/example.key
+ - name: authority
+ value:
+ - text: /etc/pki/ca-trust/source/anchors/ca_example.crt
diff --git a/tests/dictionaries/80base_certificate_wrong_value_certificate/__init__.py b/tests/dictionaries/80base_certificate_wrong_value_certificate/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/dictionaries/80base_certificate_wrong_value_certificate/errno_94 b/tests/dictionaries/80base_certificate_wrong_value_certificate/errno_94
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/dictionaries/80base_certificate_wrong_value_certificate/xml/00-base.xml b/tests/dictionaries/80base_certificate_wrong_value_certificate/xml/00-base.xml
new file mode 100644
index 000000000..d8f5282d0
--- /dev/null
+++ b/tests/dictionaries/80base_certificate_wrong_value_certificate/xml/00-base.xml
@@ -0,0 +1,8 @@
+
+
+
+
+ example.crt
+
+
+
diff --git a/tests/dictionaries/80base_certificate_wrong_value_certificate/yml/00-base.yml b/tests/dictionaries/80base_certificate_wrong_value_certificate/yml/00-base.yml
new file mode 100644
index 000000000..f4e92cf3e
--- /dev/null
+++ b/tests/dictionaries/80base_certificate_wrong_value_certificate/yml/00-base.yml
@@ -0,0 +1,8 @@
+version: '0.10'
+services:
+- service:
+ - name: test
+ certificate:
+ - private: /example.key
+ authority: /ca_example.crt
+ text: example.crt
diff --git a/tests/dictionaries/80base_certificate_wrong_value_certificate_variable/__init__.py b/tests/dictionaries/80base_certificate_wrong_value_certificate_variable/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/dictionaries/80base_certificate_wrong_value_certificate_variable/errno_90 b/tests/dictionaries/80base_certificate_wrong_value_certificate_variable/errno_90
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/dictionaries/80base_certificate_wrong_value_certificate_variable/xml/00-base.xml b/tests/dictionaries/80base_certificate_wrong_value_certificate_variable/xml/00-base.xml
new file mode 100644
index 000000000..e5bb581b5
--- /dev/null
+++ b/tests/dictionaries/80base_certificate_wrong_value_certificate_variable/xml/00-base.xml
@@ -0,0 +1,19 @@
+
+
+
+
+ certificate
+
+
+
+
+ /etc/pki/tls/certs/example.crt
+
+
+ /etc/pki/tls/private/example.key
+
+
+ /etc/pki/ca-trust/source/anchors/ca_example.crt
+
+
+
diff --git a/tests/dictionaries/80base_certificate_wrong_value_certificate_variable/yml/00-base.yml b/tests/dictionaries/80base_certificate_wrong_value_certificate_variable/yml/00-base.yml
new file mode 100644
index 000000000..239d96c7a
--- /dev/null
+++ b/tests/dictionaries/80base_certificate_wrong_value_certificate_variable/yml/00-base.yml
@@ -0,0 +1,24 @@
+version: '0.10'
+services:
+- service:
+ - name: test
+ certificate:
+ - private: private
+ private_type: variable
+ authority: authority
+ authority_type: variable
+ certificate_type: variable
+ text: certificate
+variables:
+- variable:
+ - name: certificate
+ value:
+ - text: /etc/pki/tls/certs/example.crt
+ - name: private
+ type: filename
+ value:
+ - text: /etc/pki/tls/private/example.key
+ - name: authority
+ type: filename
+ value:
+ - text: /etc/pki/ca-trust/source/anchors/ca_example.crt
diff --git a/tests/dictionaries/80base_certificate_wrong_value_private/__init__.py b/tests/dictionaries/80base_certificate_wrong_value_private/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/dictionaries/80base_certificate_wrong_value_private/errno_95 b/tests/dictionaries/80base_certificate_wrong_value_private/errno_95
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/dictionaries/80base_certificate_wrong_value_private/xml/00-base.xml b/tests/dictionaries/80base_certificate_wrong_value_private/xml/00-base.xml
new file mode 100644
index 000000000..e6ab2d2df
--- /dev/null
+++ b/tests/dictionaries/80base_certificate_wrong_value_private/xml/00-base.xml
@@ -0,0 +1,8 @@
+
+
+
+
+ /example.crt
+
+
+
diff --git a/tests/dictionaries/80base_certificate_wrong_value_private/yml/00-base.yml b/tests/dictionaries/80base_certificate_wrong_value_private/yml/00-base.yml
new file mode 100644
index 000000000..c3327727a
--- /dev/null
+++ b/tests/dictionaries/80base_certificate_wrong_value_private/yml/00-base.yml
@@ -0,0 +1,8 @@
+version: '0.10'
+services:
+- service:
+ - name: test
+ certificate:
+ - private: example.key
+ authority: /ca_example.crt
+ text: /example.crt
diff --git a/tests/dictionaries/80base_certificate_wrong_value_private_variable/__init__.py b/tests/dictionaries/80base_certificate_wrong_value_private_variable/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/dictionaries/80base_certificate_wrong_value_private_variable/errno_91 b/tests/dictionaries/80base_certificate_wrong_value_private_variable/errno_91
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/dictionaries/80base_certificate_wrong_value_private_variable/xml/00-base.xml b/tests/dictionaries/80base_certificate_wrong_value_private_variable/xml/00-base.xml
new file mode 100644
index 000000000..3caea9ee2
--- /dev/null
+++ b/tests/dictionaries/80base_certificate_wrong_value_private_variable/xml/00-base.xml
@@ -0,0 +1,19 @@
+
+
+
+
+ certificate
+
+
+
+
+ /etc/pki/tls/certs/example.crt
+
+
+ /etc/pki/tls/private/example.key
+
+
+ /etc/pki/ca-trust/source/anchors/ca_example.crt
+
+
+
diff --git a/tests/dictionaries/80base_certificate_wrong_value_private_variable/yml/00-base.yml b/tests/dictionaries/80base_certificate_wrong_value_private_variable/yml/00-base.yml
new file mode 100644
index 000000000..424d8248f
--- /dev/null
+++ b/tests/dictionaries/80base_certificate_wrong_value_private_variable/yml/00-base.yml
@@ -0,0 +1,24 @@
+version: '0.10'
+services:
+- service:
+ - name: test
+ certificate:
+ - private: private
+ private_type: variable
+ authority: authority
+ authority_type: variable
+ certificate_type: variable
+ text: certificate
+variables:
+- variable:
+ - name: certificate
+ type: filename
+ value:
+ - text: /etc/pki/tls/certs/example.crt
+ - name: private
+ value:
+ - text: /etc/pki/tls/private/example.key
+ - name: authority
+ type: filename
+ value:
+ - text: /etc/pki/ca-trust/source/anchors/ca_example.crt
diff --git a/tests/dictionaries/80base_file_mode_wrong_type/__init__.py b/tests/dictionaries/80base_file_mode_wrong_type/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/dictionaries/80base_file_mode_wrong_type/errno_43 b/tests/dictionaries/80base_file_mode_wrong_type/errno_43
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/dictionaries/80base_file_mode_wrong_type/errno_93 b/tests/dictionaries/80base_file_mode_wrong_type/errno_93
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/dictionaries/80base_file_mode_wrong_type/xml/00-base.xml b/tests/dictionaries/80base_file_mode_wrong_type/xml/00-base.xml
new file mode 100644
index 000000000..57b9e7339
--- /dev/null
+++ b/tests/dictionaries/80base_file_mode_wrong_type/xml/00-base.xml
@@ -0,0 +1,8 @@
+
+
+
+
+ /etc/file
+
+
+
diff --git a/tests/dictionaries/80base_file_mode_wrong_type/yml/00-base.yml b/tests/dictionaries/80base_file_mode_wrong_type/yml/00-base.yml
new file mode 100644
index 000000000..6cf06f91e
--- /dev/null
+++ b/tests/dictionaries/80base_file_mode_wrong_type/yml/00-base.yml
@@ -0,0 +1,7 @@
+version: '0.10'
+services:
+- service:
+ - name: test
+ file:
+ - mode: "wrong_mode"
+ text: /etc/file
diff --git a/tests/dictionaries/80file_group_wrong_type/__init__.py b/tests/dictionaries/80file_group_wrong_type/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/dictionaries/80file_group_wrong_type/errno_58 b/tests/dictionaries/80file_group_wrong_type/errno_58
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/dictionaries/80file_group_wrong_type/xml/00-base.xml b/tests/dictionaries/80file_group_wrong_type/xml/00-base.xml
new file mode 100644
index 000000000..93210b284
--- /dev/null
+++ b/tests/dictionaries/80file_group_wrong_type/xml/00-base.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ /etc/file
+
+
+
+
+ nobody
+
+
+
diff --git a/tests/dictionaries/80file_group_wrong_type/yml/00-base.yml b/tests/dictionaries/80file_group_wrong_type/yml/00-base.yml
new file mode 100644
index 000000000..f0a5162b0
--- /dev/null
+++ b/tests/dictionaries/80file_group_wrong_type/yml/00-base.yml
@@ -0,0 +1,14 @@
+version: '0.10'
+services:
+- service:
+ - name: test
+ file:
+ - group_type: variable
+ group: group
+ text: /etc/file
+variables:
+- variable:
+ - name: group
+ type: string
+ value:
+ - text: nobody
diff --git a/tests/dictionaries/80file_owner_wrong_type/__init__.py b/tests/dictionaries/80file_owner_wrong_type/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/dictionaries/80file_owner_wrong_type/errno_58 b/tests/dictionaries/80file_owner_wrong_type/errno_58
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/dictionaries/80file_owner_wrong_type/xml/00-base.xml b/tests/dictionaries/80file_owner_wrong_type/xml/00-base.xml
new file mode 100644
index 000000000..6bce4260c
--- /dev/null
+++ b/tests/dictionaries/80file_owner_wrong_type/xml/00-base.xml
@@ -0,0 +1,15 @@
+
+
+
+
+ /etc/file
+
+
+
+
+
+ nobody
+
+
+
+
diff --git a/tests/dictionaries/80file_owner_wrong_type/yml/00-base.yml b/tests/dictionaries/80file_owner_wrong_type/yml/00-base.yml
new file mode 100644
index 000000000..2b0a52d53
--- /dev/null
+++ b/tests/dictionaries/80file_owner_wrong_type/yml/00-base.yml
@@ -0,0 +1,17 @@
+version: '0.10'
+services:
+- service:
+ - name: test
+ file:
+ - owner_type: variable
+ owner: owner
+ text: /etc/file
+variables:
+- family:
+ - name: general
+ variables:
+ - variable:
+ - name: owner
+ type: string
+ value:
+ - text: nobody
diff --git a/tests/test_1_flattener.py b/tests/test_1_flattener.py
index 6bed1ffb8..0edcda80f 100644
--- a/tests/test_1_flattener.py
+++ b/tests/test_1_flattener.py
@@ -35,7 +35,7 @@ excludes = set([])
#excludes = set(['45multi_family_order'])
test_ok -= excludes
test_raise -= excludes
-#test_ok = ['01base_multi_notuniq']
+#test_ok = ['01base_file_mode']
#test_ok = []
#test_raise = ['80auto_autofreeze']
#test_raise = []
@@ -264,20 +264,18 @@ def test_error_dictionary(test_dir_error):
ext, test_dir = test_dir_error
assert getcwd() == ORI_DIR
test_dir = join(dico_dirs, test_dir)
- errno = 0
+ errno = []
eolobj = load_rougail_object(test_dir, ext)
if eolobj is None:
return
for i in listdir(test_dir):
if i.startswith('errno_'):
- if errno:
- raise Exception('multiple errno')
- errno = int(i.split('_')[1])
+ errno.append(int(i.split('_')[1]))
+ if not errno:
+ errno.append(0)
with raises(DictConsistencyError) as err:
launch_flattener(eolobj)
save(test_dir, eolobj)
- if err.value.errno != errno:
- print(f'expected errno: {errno}, errno: {err.value.errno}')
- launch_flattener(eolobj)
- save(test_dir, eolobj)
+ msg = str(err)
+ assert err.value.errno in errno, f'expected errno: {errno}, errno: {err.value.errno}, msg: {err}'
assert getcwd() == ORI_DIR
diff --git a/tests/test_3_template.py b/tests/test_3_template.py
index b53bc8ff9..1e44e1e57 100644
--- a/tests/test_3_template.py
+++ b/tests/test_3_template.py
@@ -17,7 +17,7 @@ test_ok = {f for f in listdir(template_dirs) if not f.startswith('_') and isdir(
test_ok -= excludes
test_ok = list(test_ok)
test_ok.sort()
-#test_ok = ['70service_servicelist_file']
+#test_ok = ['70container_files']
@fixture(scope="module", params=test_ok)
diff --git a/tests/test_others.py b/tests/test_others.py
index b86d0aada..36a0fce69 100644
--- a/tests/test_others.py
+++ b/tests/test_others.py
@@ -27,6 +27,8 @@ def parse_dtd_subelement(obj_name, content, default_required=False):
if content.occur == 'once':
if content.right and content.right.name:
yield {'name': content.right.name, 'type': None, 'required': default_required}
+ else:
+ yield from parse_dtd_subelement(obj_name, content.right, default_required=False)
elif content.occur == 'mult':
yield from parse_dtd_subelement(obj_name, content.right, default_required=False)
elif content.occur == 'plus':
@@ -72,17 +74,21 @@ def parse_dtd(elt_name, elts, space=0):
schema += " " * subspace + 'type: ' + subelt['type'] + "\n"
if subelt['name'] != 'family' or subspace < 26:
schema += parse_dtd(subelt['name'], elts, subspace)
- for dtd_attr in elt['elt'].iterattributes():
- schema += " " * space + dtd_attr.name + ':\n'
+ attributes = {attr.name: attr for attr in elt['elt'].iterattributes()}
+ for name, dtd_attr in attributes.items():
enum = list(dtd_attr.itervalues())
- type_ = 'str'
if set(enum) == {'True', 'False'} or set(enum) == {'True', 'False', 'nil'}:
# it's a boolean
type_ = 'bool'
+ elif enum == ['number']:
+ continue
+ elif f'{name}_type' in attributes and list(attributes[f'{name}_type'].itervalues()) == ['number']:
+ type_ = 'int'
else:
type_ = 'str'
+ schema += " " * space + name + ':\n'
subspace = space + 2
- schema += " " * subspace + "type: " + type_ + '\n'
+ schema += " " * subspace + "type: " + type_ + '\n'
if type_ != 'bool' and enum:
enumspace = subspace + 2
schema += " " * subspace + 'enum:\n'