Calculated default values
Synopsis
A value can be calculated. In this case we have four possibilities:
calculation via Jinja
calculation via a variable
calculation via information
calculation via a suffix: in the case of a variable in a dynamic family
calculation via an index: in the case of a follower variable
If the user modifies the value of the variable, the default value is no longer used, so the calculation is no longer carried out. This is also the case if the variable has the auto_save
attribute.
On the other hand, if the variable is hidden (with the hidden
parameter), it is the default value that is used and not the value customized by the user.
Note
A follower variable cannot be calculated automatically.
Parameters
Depending on the types of calculation, the parameters will be different:
Calculation type |
Parameter |
Comments |
Sample |
---|---|---|---|
type
|
Type of calculation, possible values are: jinja, variable, information, suffix or index |
jinja |
|
Jinja |
jinja
|
Template Jinja. For a multiple variable, each line represents a value. |
|
Jinja |
params
|
Additional parameters passed to the Jinja template |
|
Variable ( Information |
variable
|
Name of associated variable |
rougail.variable |
Variable |
propertyerror
|
If access to the variable is not possible due to a property (for example Default value: |
false |
Information |
information
|
Name of the information whose value we want to retrieve. |
doc |
In the case of a Jinja type calculation, it is possible to have parameters.
There are two types of parameter:
the standard parameters (string, boolean, integer, null), in this case just do: “key: value”
the advanced settings:
parameter via a variable
parameter via an information
parameter via a suffix: in the case of a variable in a dynamic family
parameter via an index: in the case of a follower variable
Parameter type |
Parameter |
Comments |
Sample |
---|---|---|---|
name
|
parameter’s name |
my_param |
|
type
|
parameter’s type, possible values are: variable, information, suffix or index |
suffix |
|
Variable |
variable
|
Variable’s name |
rougail.variable |
Variable ( |
propertyerror
|
If access to the variable is not possible due to a property (for example |
Default value: |
Variable |
optional
|
The variable may not exist depending on YAML file imports.
If the optional parameter is Default value : |
True |
Information |
information
|
Name of the information whose value we want to retrieve. |
doc |
The variable path
Normal family
The default namespace is defined in RougailConfig[“variable_namespace”] with the default value “rougail”. In addition, there are extras namespaces defined with in RougailConfig[“extra_dictionaries”].
Inside those namespaces we can add families and variables.
Here is an hierarchic examples:
rougail
├── variable1
├── family1
│ ├── variable2
│ └── variable3
└── family2
└── subfamily1
└── variable4
extra1
└── family3
├── variable5
└── variable6
In calculation
we can use other variables.
Here is all paths:
rougail.variable1
rougail.family1.variable2
rougail.family1.variable3
rougail.family2.subfamily1.variable4
extra1.family3.variable5
extra1.family3.variable6
Inside a variable’s calculation
we can use relative path. “_” means that other variable is in same family. “__” means that other variables are in parent family, and so on…
For example, in variable2’s calculation
, we can use relative path:
__.variable1
_.variable3
__.family2.subfamily1.variable4
But we cannot access to extra1 variables with relative path.
Dynamic family
Hire is a dynamic family “{{ suffix }}”:
rougail
├── variable1: ["val1", "val2"]
├── {{ suffix }}
│ ├── variable2
│ └── variable3
└── family
└── variable4
For variable2’s calculation, we can use:
rougail.{{ suffix }}.variable3
_.variable3
In this case, we get value for “variable3” with the same suffix as “variable2”.
For variable4’s calculation, we have two possibility:
retrieves all values with all suffixes:
rougail.{{ suffix }}.variable3
__.{{ suffix }}.variable3
retrieves a value for a specified suffix:
rougail.val1.variable3
__.val1.variable3
Examples
Calculation via a Jinja template
Let’s start with an example from a simple Jinja template:
---
version: '1.1'
my_calculated_variable:
default:
type: jinja
jinja: 'no'
Here is a second example with a boolean variable:
---
version: '1.1'
my_calculated_variable:
type: boolean
default:
type: jinja
jinja: 'false'
And a multiple value of the number type:
---
version: '1.1'
my_calculated_variable:
type: number
multi: true
default:
type: jinja
jinja: |
1
2
3
Let’s create a variable whose value is returned by a python function:
---
version: '1.1'
my_calculated_variable:
default:
type: jinja
jinja: '{{ return_no() }}'
Then let’s create the return_no
function:
def return_no():
return 'no'
An example with parameters:
---
version: '1.1'
my_calculated_variable:
description: my description
default:
type: jinja
jinja: |
{{ param1 }}{% if param2 is defined %}_{{ param2 }}{% endif %}_{{ param3 }}
params:
param1: value
param2:
type: variable
variable: _.unknown_variable
optional: true
param3:
type: information
information: doc
variable: _.my_calculated_variable
An example with a suffix
type parameter:
---
version: '1.1'
varname:
multi: true
default:
- val1
- val2
my_dyn_family_:
type: dynamic
dynamic:
type: variable
variable: _.varname
description: 'Describe '
my_dyn_var:
type: string
default:
type: jinja
jinja: 'the suffix is: {{ param1 }}'
params:
param1:
type: suffix
In this example, we see a dynamic family. Two families will be created: rougail.my_dyn_family_val1.my_dyn_var
and rougail.my_dyn_family_val2.my_dyn_var
.
The value of the variable inside this family ‘this suffix is: ‘ + the value of the suffix (val1
and val2
respectively).
An example with an index type parameter:
---
version: '1.1'
family:
type: leadership
leader:
multi: true
default:
- val1
- val2
follower1:
default:
type: jinja
jinja: 'the index is: {{ param1 }}'
params:
param1:
type: index
Calculation via a variable
Copy a variable in another:
---
version: '1.1'
my_variable:
multi: true
default:
- val1
- val2
my_calculated_variable:
multi: true
default:
type: variable
variable: _.my_variable
Copy the default value from a variable, means copy type, params and multi attribute too if not define in second variable.
---
version: 1.1
my_variable:
multi: true
type: domainname
params:
allow_ip: true
my_calculated_variable:
default:
type: variable
variable: _.var1
Here my_calculated_variable is a domainname variable with parameter allow_ip=True and multi to true.
Copy one variable to another if the source has no property
problem:
---
version: '1.1'
my_variable:
default: val1
disabled: true
my_calculated_variable:
multi: true
default:
type: variable
variable: _.my_variable
propertyerror: false
Copy two non-multiple variables into a multiple variable:
---
version: '1.1'
my_variable_1:
default: val1
my_variable_2:
default: val2
my_calculated_variable:
multi: true
default:
- type: variable
variable: _.my_variable_1
- type: variable
variable: _.my_variable_2
A variable in a dynamic family can also be used in a calculation.
For example using the variable for a particular suffix:
---
version: '1.1'
varname:
multi: true
default:
- val1
- val2
my_dyn_family_:
type: dynamic
dynamic:
type: variable
variable: _.varname
description: 'Describe '
my_dyn_var_:
type: string
default:
type: suffix
all_dyn_var:
default:
type: variable
variable: _.my_dyn_family_val1.my_dyn_var_val1
In this case, we recover the value val1
.
Second example using the variable for all suffixes:
---
version: '1.1'
varname:
multi: true
default:
- val1
- val2
my_dyn_family_:
type: dynamic
dynamic:
type: variable
variable: _.varname
description: 'Describe '
my_dyn_var_:
type: string
default:
type: suffix
all_dyn_var:
multi: true
default:
type: variable
variable: _.my_dyn_family_.my_dyn_var_
In this case, we recover the val1
and val2
list.
Calculation via a suffix
---
version: '1.1'
varname:
multi: true
default:
- val1
- val2
my_dyn_family_:
type: dynamic
dynamic:
type: variable
variable: _.varname
description: 'Describe '
my_dyn_var_:
type: string
default:
type: suffix
Calculation via an index
---
version: '1.1'
family:
type: leadership
leader:
multi: true
default:
- val1
- val2
follower1:
type: number
default:
type: index
Redefinition
In a first dictionary, let’s declare our variable and our calculation:
---
version: '1.1'
my_calculated_variable:
default:
type: jinja
jinja: 'the value is calculated'
In a second dictionary, it is possible to redefine the calculation:
---
version: '1.1'
my_calculated_variable:
redefine: true
default:
type: jinja
jinja: 'the value is redefined'
In a third dictionary, we even can delete the calculation if needed:
---
version: '1.1'
my_calculated_variable:
redefine: true
default: null