193 lines
5.6 KiB
ReStructuredText
193 lines
5.6 KiB
ReStructuredText
|
.. |Tiramisu| replace:: Tiramisu
|
|||
|
.. _tiramisu: https://forge.cloud.silique.fr/stove/tiramisu
|
|||
|
|
|||
|
Getting started
|
|||
|
====================
|
|||
|
|
|||
|
What is a consistency handling system ?
|
|||
|
------------------------------------------------
|
|||
|
|
|||
|
.. questions:: Question: "OK, I have understood that the Rougail stuff enables me to take advantage of |Tiramisu|. But what is all this for? What is exactly a consistency handling system? And again, what is this |Tiramisu| library used for?"
|
|||
|
|
|||
|
*Answer*: Well, let's explain what |Tiramisu| is and how we are using the |Tiramisu| library.
|
|||
|
|
|||
|
.. glossary::
|
|||
|
|
|||
|
Tiramisu
|
|||
|
|
|||
|
|Tiramisu| is a consistency handling system that was initially designed
|
|||
|
in the configuration management scope. To put it more simply,
|
|||
|
this library is generally used to handle configuration options.
|
|||
|
|
|||
|
It manages variables and group of variables. In the Tiramisu scope we call
|
|||
|
it *options* and *option descriptions*.
|
|||
|
|
|||
|
In the Rougail scope, we call it :term:`variable`\ s and :term:`families`.
|
|||
|
In Rougail, the families and variables are located in the :term:`dictionaries`.
|
|||
|
|
|||
|
And this is what we are going to explain in this page.
|
|||
|
|
|||
|
The dictionaries
|
|||
|
---------------------
|
|||
|
|
|||
|
.. glossary::
|
|||
|
|
|||
|
dictionary
|
|||
|
dictionaries
|
|||
|
|
|||
|
A dictionary in the Rougail meaning is a YAML file that describes variables
|
|||
|
and their dependencies / consistencies.
|
|||
|
There can be a lot of dictionary files located in many different folders.
|
|||
|
|
|||
|
Rougail reads all the dictionaries and loads them into a single object
|
|||
|
that handles the variables consistency.
|
|||
|
|
|||
|
.. image:: images/schema.png
|
|||
|
|
|||
|
The main advantage is that declaring variables and writing consistency is a simple
|
|||
|
as writing YAML. It is not necessary to write :term:`Tiramisu` code.
|
|||
|
It simplifies a lot of things.
|
|||
|
|
|||
|
And rather than writing :term:`Tiramisu` code, we can declare variables and describe the relationships between variables in a declarative mode.
|
|||
|
|
|||
|
Once the dictionaries are loaded by Rougail, we find all the power of the :term:`Tiramisu` configuration management tool.
|
|||
|
|
|||
|
The dictionaries YAML format
|
|||
|
---------------------------------
|
|||
|
|
|||
|
Before getting started with Rougail we need to learn the specifics of the YAML dictionaries file format (as well as some templating concepts).
|
|||
|
|
|||
|
.. FIXME parler de jinja https://jinja.palletsprojects.com
|
|||
|
|
|||
|
Here is a :term:`dictionary` example:
|
|||
|
|
|||
|
.. code-block:: yaml
|
|||
|
:linenos:
|
|||
|
|
|||
|
---
|
|||
|
version: '1.0'
|
|||
|
proxy:
|
|||
|
description: Configure Proxy Access to the Internet
|
|||
|
type: family
|
|||
|
|
|||
|
Line 3, we declare a **variable** named `proxy` with his `description` line 4 and his `type` line 5.
|
|||
|
|
|||
|
The variables
|
|||
|
-----------------
|
|||
|
|
|||
|
variable
|
|||
|
|
|||
|
Here is a second definition of a :term:`variable`: it is a declaration unit that represents a business domain metaphor,
|
|||
|
|
|||
|
the most common example is that a variable represents a configuration option
|
|||
|
in a application, but a variable represents something more that a configuration option.
|
|||
|
It provides a business domain specific representation unit.
|
|||
|
|
|||
|
.. note:: dictionaries can just define a list of variables, but we will see that
|
|||
|
we can specify a lot more. We can define variables **and** their relations,
|
|||
|
and the consistency between them.
|
|||
|
|
|||
|
In the next step, we will explain through a tutorial how to construct a list of variables.
|
|||
|
|
|||
|
Families of variables
|
|||
|
--------------------------
|
|||
|
|
|||
|
.. glossary::
|
|||
|
|
|||
|
family
|
|||
|
families
|
|||
|
|
|||
|
A family of variables is simply a collection of variables that refer to
|
|||
|
the same business model category. It's just a variables container.
|
|||
|
Think of it as a container as well as a namespace.
|
|||
|
|
|||
|
A "hello world" with Rougail
|
|||
|
------------------------------
|
|||
|
|
|||
|
We're gonna make the simplest possible example.
|
|||
|
|
|||
|
.. prerequisites:: Prerequisites
|
|||
|
|
|||
|
We assume that Rougail's library is installed on your computer (or in a virtual environment).
|
|||
|
|
|||
|
.. exercise:: Let's make a Hello world
|
|||
|
|
|||
|
Here is the tree structure we want to have::
|
|||
|
|
|||
|
workplace
|
|||
|
├── dict
|
|||
|
│ ├── hello.yml
|
|||
|
└── hello.py
|
|||
|
|
|||
|
- Let's make a :file:`workplace` directory, with a :file:`dict` subfolder.
|
|||
|
- First, we need a :term:`dictionary`, so let's make the :file:`hello.yml` file
|
|||
|
which is located in the :file:`dict` subfolder, with the following content:
|
|||
|
|
|||
|
.. code-block:: yaml
|
|||
|
:caption: The `hello.yaml` file
|
|||
|
|
|||
|
---
|
|||
|
version: '1.0'
|
|||
|
hello:
|
|||
|
default: world
|
|||
|
|
|||
|
- Then we make a :file:`hello.py` in our root :file:`workplace` directory:
|
|||
|
|
|||
|
.. code-block:: python
|
|||
|
:caption: The :file:`hello.py` file
|
|||
|
|
|||
|
from rougail import Rougail, RougailConfig
|
|||
|
|
|||
|
RougailConfig['dictionaries_dir'] = ['dict']
|
|||
|
rougail = Rougail()
|
|||
|
config = rougail.get_config()
|
|||
|
print(config.value.get())
|
|||
|
|
|||
|
.. demo:: Let's run the :file:`hello.py` script
|
|||
|
|
|||
|
We launch the script:
|
|||
|
|
|||
|
.. code-block:: bash
|
|||
|
|
|||
|
python hello.py
|
|||
|
|
|||
|
And we obtain the following result:
|
|||
|
|
|||
|
.. code-block:: python
|
|||
|
|
|||
|
{'rougail.hello': 'world'}
|
|||
|
|
|||
|
**Congratulations ! You have successfully completed your first Rougail script.**
|
|||
|
|
|||
|
A "Hello, <name> " sample with a family
|
|||
|
------------------------------------------
|
|||
|
|
|||
|
Let's continuing on our "Hello world" theme and add a :term:`family` container.
|
|||
|
|
|||
|
.. code-block:: yaml
|
|||
|
:caption: the :file:`hello.yml` file
|
|||
|
:linenos:
|
|||
|
|
|||
|
---
|
|||
|
version: '1.0'
|
|||
|
world:
|
|||
|
description: Hello world family container
|
|||
|
name:
|
|||
|
description: Somebody to say hello
|
|||
|
default: rougail
|
|||
|
|
|||
|
Here, we have a family named `world`.
|
|||
|
This family contains a variable named `name`
|
|||
|
|
|||
|
Again, let's validate this YAML file against Rougail's API:
|
|||
|
|
|||
|
.. code-block:: bash
|
|||
|
|
|||
|
python hello.py
|
|||
|
|
|||
|
We then have the output:
|
|||
|
|
|||
|
.. code-block:: python
|
|||
|
|
|||
|
{'rougail.world.name': 'rougail'}
|