forked from ungleich-public/cdist
Redefine/reimplement CDIST_ORDER_DEPENDENCY
Update documentation.
This commit is contained in:
parent
da274e5ef3
commit
332f5dcff9
4 changed files with 126 additions and 90 deletions
|
@ -226,8 +226,8 @@ and also to store all important files in one
|
||||||
repository.
|
repository.
|
||||||
|
|
||||||
|
|
||||||
Perils of CDIST_ORDER_DEPENDENCY
|
Notes on CDIST_ORDER_DEPENDENCY
|
||||||
--------------------------------
|
-------------------------------
|
||||||
With CDIST_ORDER_DEPENDENCY all types are executed in the order in which they
|
With CDIST_ORDER_DEPENDENCY all types are executed in the order in which they
|
||||||
are created in the manifest. The current created object automatically depends
|
are created in the manifest. The current created object automatically depends
|
||||||
on the previously created object.
|
on the previously created object.
|
||||||
|
@ -235,96 +235,11 @@ on the previously created object.
|
||||||
It essentially helps you to build up blocks of code that build upon each other
|
It essentially helps you to build up blocks of code that build upon each other
|
||||||
(like first creating the directory xyz than the file below the directory).
|
(like first creating the directory xyz than the file below the directory).
|
||||||
|
|
||||||
This can be helpful, but it can also be the source of *evil*.
|
This can be helpful, but one must be aware of its side effects.
|
||||||
|
|
||||||
|
|
||||||
CDIST_ORDER_DEPENDENCY easily causes unobvious dependency cycles
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Let's see an example. Suppose you have special init manifest where among other
|
|
||||||
things you are assuring that remote host has packages `sudo` and `curl`
|
|
||||||
installed.
|
|
||||||
|
|
||||||
**init1**
|
|
||||||
|
|
||||||
.. code-block:: sh
|
|
||||||
|
|
||||||
CDIST_ORDER_DEPENDENCY=1
|
|
||||||
export CDIST_ORDER_DEPENDENCY
|
|
||||||
|
|
||||||
for p in sudo curl
|
|
||||||
do
|
|
||||||
__package "${p}"
|
|
||||||
done
|
|
||||||
|
|
||||||
Then you have some other special init manifest where among other things you are
|
|
||||||
assuring `sudo` package is installed.
|
|
||||||
|
|
||||||
**init2**
|
|
||||||
|
|
||||||
.. code-block:: sh
|
|
||||||
|
|
||||||
CDIST_ORDER_DEPENDENCY=1
|
|
||||||
export CDIST_ORDER_DEPENDENCY
|
|
||||||
|
|
||||||
__package sudo
|
|
||||||
|
|
||||||
Then you have third init manifest where you combine those two init manifests,
|
|
||||||
by including them:
|
|
||||||
|
|
||||||
**init**
|
|
||||||
|
|
||||||
.. code-block:: sh
|
|
||||||
|
|
||||||
sh -e "$__manifest/init1"
|
|
||||||
sh -e "$__manifest/init2"
|
|
||||||
|
|
||||||
The resulting init manifest is then equal to:
|
|
||||||
|
|
||||||
.. code-block:: sh
|
|
||||||
|
|
||||||
CDIST_ORDER_DEPENDENCY=1
|
|
||||||
export CDIST_ORDER_DEPENDENCY
|
|
||||||
|
|
||||||
for p in sudo curl
|
|
||||||
do
|
|
||||||
__package "${p}"
|
|
||||||
done
|
|
||||||
|
|
||||||
CDIST_ORDER_DEPENDENCY=1
|
|
||||||
export CDIST_ORDER_DEPENDENCY
|
|
||||||
|
|
||||||
__package sudo
|
|
||||||
|
|
||||||
In the end you get the following dependencies:
|
|
||||||
|
|
||||||
* `__package/curl` depends on `__package/sudo`
|
|
||||||
* `__package/sudo` depends on `__package/curl`
|
|
||||||
|
|
||||||
And here you have a circular dependency!
|
|
||||||
|
|
||||||
In the real world manifest can be quite complex, dependencies can become
|
|
||||||
complicated and circual dependencies are not so obvious. Resolving it can
|
|
||||||
become cumbersome.
|
|
||||||
|
|
||||||
**Practical solution?**
|
|
||||||
|
|
||||||
Instead of managing complex init manifests you can write custom types.
|
|
||||||
Each custom type can do one thing, it has well defined dependencies that will
|
|
||||||
not leak into init manifest. In custom type you can also add special explorers
|
|
||||||
and gencode.
|
|
||||||
|
|
||||||
Then, in init manifest you combine your complex types. It is:
|
|
||||||
|
|
||||||
* cleaner
|
|
||||||
* easier to follow
|
|
||||||
* easier to maintain
|
|
||||||
* easier to debug.
|
|
||||||
|
|
||||||
|
|
||||||
CDIST_ORDER_DEPENDENCY kills parallelization
|
CDIST_ORDER_DEPENDENCY kills parallelization
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Suppose you have defined CDIST_ORDER_DEPENDENCY and then, among other things,
|
Suppose you have defined CDIST_ORDER_DEPENDENCY and then, among other things,
|
||||||
you specify creation of three, by nature independent, files.
|
you specify creation of three, by nature independent, files.
|
||||||
|
|
||||||
|
|
|
@ -163,7 +163,126 @@ automatically depends on the previously created object.
|
||||||
It essentially helps you to build up blocks of code that build upon each other
|
It essentially helps you to build up blocks of code that build upon each other
|
||||||
(like first creating the directory xyz than the file below the directory).
|
(like first creating the directory xyz than the file below the directory).
|
||||||
|
|
||||||
Read also about `perils of CDIST_ORDER_DEPENDENCY <cdist-best-practice.html#perils-of-cdist-order-dependency>`_.
|
Read also about `notes on CDIST_ORDER_DEPENDENCY <cdist-best-practice.html#notes-on-cdist-order-dependency>`_.
|
||||||
|
|
||||||
|
In version 6.2.0 semantic CDIST_ORDER_DEPENDENCY is finally fixed and well defined.
|
||||||
|
|
||||||
|
CDIST_ORDER_DEPENDENCY defines type order dependency context. Order dependency context
|
||||||
|
starts when CDIST_ORDER_DEPENDENCY is set, and ends when it is unset. After each
|
||||||
|
manifest execution finishes, any existing order dependency context is automatically
|
||||||
|
unset. This ensures that CDIST_ORDER_DEPENDENCY is valid within the manifest where it
|
||||||
|
is used. When order dependency context is defined then cdist executes types in the
|
||||||
|
order in which they are created in the manifest inside order dependency context.
|
||||||
|
|
||||||
|
Sometimes the best way to see how something works is to see examples.
|
||||||
|
|
||||||
|
Suppose you have defined **initial manifest**:
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
__cycle1 cycle1
|
||||||
|
export CDIST_ORDER_DEPENDENCY=1
|
||||||
|
__cycle2 cycle2
|
||||||
|
__cycle3 cycle3
|
||||||
|
|
||||||
|
with types **__cycle1**:
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
export CDIST_ORDER_DEPENDENCY=1
|
||||||
|
__file /tmp/cycle11
|
||||||
|
__file /tmp/cycle12
|
||||||
|
__file /tmp/cycle13
|
||||||
|
|
||||||
|
**__cycle2**:
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
__file /tmp/cycle21
|
||||||
|
export CDIST_ORDER_DEPENDENCY=1
|
||||||
|
__file /tmp/cycle22
|
||||||
|
__file /tmp/cycle23
|
||||||
|
unset CDIST_ORDER_DEPENDENCY
|
||||||
|
__file /tmp/cycle24
|
||||||
|
|
||||||
|
**__cycle3**:
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
__file /tmp/cycle31
|
||||||
|
__file /tmp/cycle32
|
||||||
|
export CDIST_ORDER_DEPENDENCY=1
|
||||||
|
__file /tmp/cycle33
|
||||||
|
__file /tmp/cycle34
|
||||||
|
|
||||||
|
For the above config, cdist results in the following expected *dependency graph*
|
||||||
|
(type *__cycleX* is shown as *cX*, *__file/tmp/cycleXY* is shown as *fcXY*):
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
c1---->fc11
|
||||||
|
| /\
|
||||||
|
| |
|
||||||
|
+----->fc12
|
||||||
|
| /\
|
||||||
|
| |
|
||||||
|
+----->fc13
|
||||||
|
|
||||||
|
c2--+--->fc21
|
||||||
|
/\ |
|
||||||
|
| |
|
||||||
|
| +----->fc22
|
||||||
|
| | /\
|
||||||
|
| | |
|
||||||
|
| +----->fc23
|
||||||
|
| |
|
||||||
|
| |
|
||||||
|
| +----->fc24
|
||||||
|
|
|
||||||
|
|
|
||||||
|
c3---->fc31
|
||||||
|
|
|
||||||
|
|
|
||||||
|
+----->fc32
|
||||||
|
|
|
||||||
|
|
|
||||||
|
+----->fc33
|
||||||
|
| /\
|
||||||
|
| |
|
||||||
|
+----->fc34
|
||||||
|
|
||||||
|
Before version 6.2.0 the above configuration would result in cycle:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
ERROR: 185.203.112.26: Cycle detected in object dependencies:
|
||||||
|
__file/tmp/cycle11 -> __cycle3/cycle3 -> __cycle2/cycle2 -> __cycle1/cycle1 -> __file/tmp/cycle11!
|
||||||
|
|
||||||
|
The following manifest shows an example for order dependency contexts:
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
__file /tmp/fileA
|
||||||
|
export CDIST_ORDER_DEPENDENCY=1
|
||||||
|
__file /tmp/fileB
|
||||||
|
__file /tmp/fileC
|
||||||
|
__file /tmp/fileD
|
||||||
|
unset CDIST_ORDER_DEPENDENCY
|
||||||
|
__file /tmp/fileE
|
||||||
|
__file /tmp/fileF
|
||||||
|
export CDIST_ORDER_DEPENDENCY=1
|
||||||
|
__file /tmp/fileG
|
||||||
|
__file /tmp/fileH
|
||||||
|
unset CDIST_ORDER_DEPENDENCY
|
||||||
|
__file /tmp/fileI
|
||||||
|
|
||||||
|
This means:
|
||||||
|
|
||||||
|
* C depends on B
|
||||||
|
* D depends on C
|
||||||
|
* H depends on G
|
||||||
|
|
||||||
|
and there are no other dependencies from this manifest.
|
||||||
|
|
||||||
|
|
||||||
Overrides
|
Overrides
|
||||||
|
|
|
@ -330,7 +330,7 @@ CDIST_OVERRIDE
|
||||||
|
|
||||||
CDIST_ORDER_DEPENDENCY
|
CDIST_ORDER_DEPENDENCY
|
||||||
Create dependencies based on the execution order (see \`cdist manifest <cdist-manifest.html>\`_).
|
Create dependencies based on the execution order (see \`cdist manifest <cdist-manifest.html>\`_).
|
||||||
Read also about \`perils of CDIST_ORDER_DEPENDENCY <cdist-best-practice.html#perils-of-cdist-order-dependency>\`_.
|
Note that in version 6.2.0 semantic of this processing mode is finally fixed and well defined.
|
||||||
|
|
||||||
CDIST_REMOTE_EXEC
|
CDIST_REMOTE_EXEC
|
||||||
Use this command for remote execution (should behave like ssh).
|
Use this command for remote execution (should behave like ssh).
|
||||||
|
|
|
@ -827,6 +827,8 @@ CDIST_OVERRIDE
|
||||||
|
|
||||||
CDIST_ORDER_DEPENDENCY
|
CDIST_ORDER_DEPENDENCY
|
||||||
Create dependencies based on the execution order.
|
Create dependencies based on the execution order.
|
||||||
|
Note that in version 6.2.0 semantic of this processing mode is
|
||||||
|
finally fixed and well defined.
|
||||||
|
|
||||||
CDIST_REMOTE_EXEC
|
CDIST_REMOTE_EXEC
|
||||||
Use this command for remote execution (should behave like ssh).
|
Use this command for remote execution (should behave like ssh).
|
||||||
|
|
Loading…
Reference in a new issue