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…
	
	Add table
		Add a link
		
	
		Reference in a new issue