Bundle DSL
This article describes the prototypes and the domain-specific language (DSL) that are used in configuration files for creating ADCM bundles. The format of configuration (config) file is YAML.
NOTE
The config file should be named config.yaml or config.yml. Multiple config.yaml files in a bundle are allowed. The name of the config file is reserved; other files should not be called by that name.
|
ADCM objects are created from prototypes. A prototype is a description of a single ADCM object.
Every prototype has the following mandatory properties:
type
Every prototype has one of the following types:
-
cluster
-
service
-
provider
(stands for hostprovider) -
host
version
version
is a version of the prototype.
So the minimal working prototype should look like this:
---
- type: cluster
name: control
version: 1
A prototype also might have the optional properties:
actions
An action is an entity that can be used to describe an action on an ADCM object. Such an action is ultimately an Ansible playbook run with certain parameters under certain conditions.
You can describe special actions to bind their invocation to specific endpoints and UI buttons. You can choose from one of the four special actions names:
-
adcm_turn_on_maintenance_mode
-
adcm_turn_off_maintenance_mode
-
adcm_host_turn_on_maintenance_mode
-
adcm_host_turn_off_maintenance_mode
Special actions are specified as follows:
actions:
adcm_turn_on_maintenance_mode
Special actions should be described in the matching prototypes.
Name | Type of the prototype | Description |
---|---|---|
adcm_turn_on_maintenance_mode |
Service/component |
Turns on maintenance mode on an object via the corresponding UI element |
adcm_turn_off_maintenance_mode |
Service/component |
Turns off maintenance mode on an object via the corresponding UI element |
adcm_host_turn_on_maintenance_mode |
Cluster |
Turns on maintenance mode on a cluster host via the corresponding UI element |
adcm_host_turn_off_maintenance_mode |
Cluster |
Turns off maintenance mode on a cluster host via the corresponding UI element |
adcm_delete_service |
Service |
Deletes service via the corresponding UI element |
Special actions that are described in a cluster prototype (adcm_host_turn_on_maintenance_mode
, adcm_host_turn_off_maintenance_mode
) should be host actions (the value of the host_action
parameter should be true
). Special actions are not supported for config
, hc_acl
, and ui_options
.
Every prototype might have actions
. Actions should be described as follows:
---
- type: cluster
name: control
version: 1
description: "Monitoring and Control Software"
actions:
install:
display_name: "Install Monitor Server"
description: |
By click on this button you install monitoring and controlling server ...
type: job
script_type: ansible
script: ansible/site.yaml
allow_to_terminate: true
params:
ansible_tags: install
jinja2_native: true
states:
available:
- created
on_success: installed
on_fail: created
config:
quorum:
type: integer
log_files:
- check
The install
action from the example above has a job
type and its script
property specifies an Ansible playbook that resides in the <bundle_root>/ansible/site.yaml directory.
You can use a special dot syntax to point out a path to a script file. In this case a script file will be searched in the same directory as config.yaml.
script: ./site.yaml
name
is a short name that is unique for the given prototype.
display_name
is a short human-readable name.
Action has a type
statement. It defines the job
and task
clauses.
job
is the type of action that starts a single script. Job is specified via the following statements:
-
script
-
script_type
-
params
task
is the type of action that is a chain of jobs. The sequence of jobs to be executed is specified via the scripts
parameter. The jobs sequence is executed according to how it is written in scripts
. If any script fails, the execution is stopped and the state of object is set to the value of on_fail
.
actions:
install:
type: task
scripts:
-
name: prepare
display_name: Prepare to install
script_type: ansible
script: ansible/prepare.yaml
on_fail: created
-
name: install
display_name: Actual install
script_type: ansible
script: ansible/install.yaml
on_fail: prepare
states:
available:
- created
- prepare
on_success: installed
script
is a parameter that takes it value depending on the script_type
value.
In case of script_type = ansible
, the script
parameter denotes the path to the script file.
In case of script_type = internal
, the script
parameter can take the value from one of the three ADCM functions:
-
bundle_revert
— this function returns the state of the cluster as it was before the upgrade. Cluster state includes its configuration, the set of all cluster services, hosts, and components, as well as the host component mapping. -
hc_apply
— this function is useful when action includeshc_acl
. In this case, thehc_apply
function specifies the moment when the host component map received fromhc_acl
should be applied during cluster expansion or reduction operations. -
bundle_switch
— this function upgrades all prototypes to their new versions. The function can be used only forupgrade
, it cannot be used in the common actions.
script
is a mandatory parameter if type = job
.
script_type
is a parameter that denotes the type of the script, either ansible
or internal
.
script_type
is a mandatory parameter if type = job
.
scripts
is a parameter that denotes the sequence of jobs to be executed.
scripts
is a mandatory parameter if type = task
.
You can also pass any additional parameter to the Ansible call. They will be used in ansible-playbook
calls.
One special case is parameter ansible_tags
. That parameter turns to be --tags
parameter of an ansible-playbook
call.
You can also pass the jinja2_native
parameter. This parameter will be written to the ansible.cfg file. This option preserves variable types during template operations.
Action might have a states
optional statement. It defines three clauses:
-
available
— list of states of object for which action will be available; -
on_success
— state in which object will be set in case of actions success; -
on_fail
— state in which object will be set in case of actions fail.
The on_success
and on_fail
states are optional. If they are missed, the state of an object is not changed after actions success or/and fail, respectively.
The states
statement also has two reserved values:
-
created
— the primary state in which objects are immediately after creation; -
upgrading
— the state to which the cluster can be put into. In this state, actions such as removing a host or service from the cluster are not available to the user.
masking
is a new DSL for state and multistate operation.
IMPORTANT
DSL masking is not compatible with the states DSL provided above.
|
---
actions:
install:
display_name: "Install Monitor Server"
type: job
masking:
# Action will be shown if both condition under state and multi_state are met.
state:
available:
# If the state equal to any of this, then condition is true
- "state_value1"
- "state_value2"
unavailable:
# If you place unavailable, then no available should be there
- "state_value1"
- "state_value2"
multi_state:
available:
# If we have any of this multistate, then condition is true
- "multi_state_1"
- "multi_state_2"
unavailable:
# If you place unavailable, then no available should be there
- "multi_state_3"
- "multi_state_4"
on_fail:
state: "new_sate_value"
multi_state:
set:
- "multi_state3"
unset:
- "multi_state4"
on_success:
state: "new_sate_value"
multi_state:
set:
- "multi_state3"
unset:
- "multi_state4"
To simplify the rule description, you could use the any
scalar that selects all possible values.
---
masking:
state:
available: "any"
unavailable: "any"
multi_state:
available: "any"
unavailable: "any"
If the masking
state is omitted, than we think that the action is available on every state
or multi_state
. Hence the following variants are equal:
---
masking:
---
masking:
state:
---
masking:
state:
available: "any"
The following variants are equal too:
---
masking:
---
masking:
multi_state:
---
masking:
multi_state:
available: "any"
Action might have a config
optional statement. It can define a list of values as in config parameters. When the action is run via UI, all those values will be prompted by the user before the action starts.
You can later refer those values in the Ansible script:
{{ job.config.quorum }}
The config
statement works with static configuration parameters that are displayed the same way every time an action is started. If you want to work with dynamic configuration parameters, use the config_jinja
statement.
Action might have a config_jinja
optional statement. This statement points to the file of the jinja format (ADCM uses the 2.xx version).
config_jinja
is designed to work with dynamic configuration parameters. In this case, dynamism is understood as the ability to display (or hide) a certain set of parameters depending on the conditions. Before the action starts, a file of the jinja format (jinja template) is rendered. The values generated as a result are similar to the values that are included in the inventory file.
---
actions:
- name: Restart and Reboot
type: job
script_type: ansible
script: ansible/restart.yaml
config_jinja: config_jinja/restart.j2
The restart.j2 file:
- reboot_servers:
type: boolean
default: false
display_name: Reboot servers
{% if cluster.state == 'created' %}
- configure_etc:
type: boolean
default: false
display_name: Configure /etc/hosts
{% end %}
Action might have a log_files
optional statement. It defines the list of log tags. Currently, a check
log tag is supported, and you can use the adcm_check Ansible module with it.
Action might have an allow_to_terminate
optional statement. This is a Boolean value. If the value is not explicitly set, then the default value is false
. If allow_to_terminate
is true
, then it is possible to cancel the running Ansible playbook and stop the action, otherwise it is not possible.
The allow_to_terminate
statement is also applied to all jobs the action consists of. When one of such jobs is stopped the action continues to run, starting with the job that follows the stopped one. Essentially, allow_to_terminate
being specified for an action means allow_to_terminate
being specified for all jobs of that action.
Action might have an allow_in_maintenance_mode
optional statement. This is a Boolean value. If the value is not explicitly set, then the default value is false
. If allow_in_maintenance_mode
is true
and allow_maintenance_mode
in the prototype is also true
, then it is possible to run an action even in case of object or just one of its hosts being in maintenance mode.
This block allows you to tweak how UI displays and performs an action. When you hover the cursor over an action in the UI, the popup message specified in the disclaimer
field is displayed.
actions:
install:
type: job
script_type: ansible
script: ansible/site.yaml
ui_options:
disclaimer: "Enter your disclaimer"
Action might have a host_action
optional statement. This is a Boolean value. If the value is not explicitly set, the default value is false
. If the value is true
, then the action is performed on the selected host and a target group that includes the one selected host is created.
actions:
install:
type: job
script_type: ansible
script: action.yaml
host_action: true
Action might have a hc_acl
optional statement. If hc_acl
is present when an action is run via UI, then a new host component map will be asked from the user before the action starts.
actions:
expand:
type: job
script_type: ansible
script: ansible/site.yaml
states:
available: all
hc_acl:
-
service: hadoop
component: datanode
action: add
-
service: hadoop
component: server
action: remove
hc_acl
defines the list of 3 clauses that specify operations to modify the components distribution at hosts:
-
service
— name of service to work with. -
component
— name of component to work with. -
action
— operation type. Can beadd
orremove
.
There is a way to specify the Ansible version for the ansible
script type actions via the venv
optional statement.
Valid values:
-
default
— launch action in Ansible 2.8 environment; -
2.9
— launch action in Ansible 2.9 environment.
The default value is default
.
Change the default environment for all actions on an object:
---
- type: cluster # service component hostprovider host
name: control
version: 1
venv: "2.9"
You also have a way to tweak venv
for any actions:
actions:
install:
type: job
script_type: ansible
script: action.yaml
venv: "2.9"
adcm_min_version
Any cluster or hostprovider prototype might have an optional adcm_min_version
property. This field defines the minimal version of ADCM that is required for this bundle to work correctly. If the installed ADCM instance version is less than adcm_min_version
(defined in bundle), then the load of this bundle will cause an error.
allow_maintenance_mode
Every cluster prototype might have an optional allow_maintenance_mode
property. This option enables support of the maintenance mode for all prototypes in a bundle. The default value is false
.
---
- type: cluster
name: control
version: 1
adcm_min_version: 2019.05.01.00
allow_maintenance_mode: true
components
Service prototype might have components. Component itself is a prototype, so a component description also can contain config
or action
sections.
components
is a way of placing service components on hosts in a cluster.
---
- type: service
name: server
version: 1
components:
master:
display_name: "Master Node"
description: "This node control all data nodes (see below)"
constraint: [1,2]
node:
display_name: "Data Node"
constraint: [+]
client:
monitoring: passive
Every component might have an optional constraint
property. It describes how many instances of this component should be installed in one cluster:
-
[1]
— exactly one component should be installed. -
[0,1]
— one or zero components should be installed. -
[1,2]
— one or two components should be installed. -
[0,+]
— zero or any more components should be installed (default value). -
[1,odd]
— one or more components should be installed; the total amount should be odd. -
[0,odd]
— zero or more components should be installed; if more than zero, the total amount should be odd. -
[odd]
— same as[1,odd]
. -
[1,+]
— one or more components should be installed. -
[+]
— component should be installed on all hosts of a cluster.
Every service/component might have an optional monitoring
property. It defines if the service/component should be monitored. The default value is active
. If you want to exclude a service/component from the monitoring system, set it to passive
.
---
- type: service
name: server
version: 1
components:
client:
monitoring: passive
Components might have an optional requires
property that describes dependencies between the components, i.e. which components need another components or services to be installed simultaneously.
Each component might require one or more components in the same service or in another service of this cluster. Also a component may need one or more services. If your component requires another component that is absent from a host component map, you cannot add your component to a host component map as well. In some cases all required components should be installed simultaneously. Dependencies defined at the component level affect the validation of the host component map.
Dependencies can be viewed as another type of constraints (or meta constraints) for a component.
The example below considers the Hive
service with three components: HiveServer
, Metastore
, and TezUI
. The HiveServer
component needs the HDFS
service, while the information about the HDFS
service components is not required. The TezUI
component needs the TimeLineServer
component of the YARN
service.
---
- type: service
name: Hive
version: 1.0
components:
HiveServer:
requires:
- service: HDFS
Metastore:
constraint: [0,1]
TezUI:
requires:
- service: YARN
component: TimeLineServer
constraint: [0,1]
Components might have an optional bound_to
property. Those components should be located on the same hosts as the components they are bound to.
For example, the server
component of the pxf
service should be installed only on all those hosts where the segment
components of the gpdb
service are installed. It means the server
component requires the segment
component and cannot be installed separately.
Hence bound_to
is yet another type of constraints (or meta constraints) for a component.
---
- type: service
name: GPDB
version: 1.0
components:
Segment:
- type: service
name: PXF
version: 2.0
components:
Server:
bound_to:
service: GPDB
component: Segment
config
Config is a general description of object configuration parameters. Configuration parameters can be combined into groups.
There is a number of user-editable values that are related to every object and can be represented in UI.
---
- type: cluster
name: control
version: 1
description: "Monitoring and Control Software"
config:
- name: repos
type: group
subs:
- name: ads
display_name: "ADS repository URL"
type: string
default: https://ci.arenadata.io/artifactory/list/ads-centos7-x64-ads/
required: no
In the above example you can see the ads
parameter in the repos
group. The ads
parameter is not required. This means that it is possible for the user to leave it empty.
Group is not mandatory, so you can place your parameter at the highest level:
---
- type: cluster
name: control
version: 1
description: "Monitoring and Control Software"
config:
- name: ads
type: string
default: https://ci.arenadata.io/artifactory/list/ads-centos7-x64-ads/
required: no
Group is just a visual representation in UI.
Name | Mandatory | Values | Default | Description |
---|---|---|---|---|
type |
Yes |
See below |
— |
Type of a configuration parameter. For more information, see the separate Types of configuration parameters section below |
display_name |
No |
User defined |
— |
A readable name that is displayed in UI |
description |
No |
User defined |
— |
Allows to give the parameter a description |
default |
No |
User defined |
— |
Allows to set a default value |
required |
No |
yes/no |
Yes |
If set to |
read_only |
No |
See below |
No |
Makes a parameter read-only (protected from change) under certain conditions |
writable |
No |
See below |
Yes |
Makes a parameter writable (available for changes) under certain conditions |
ui_options |
No |
See below |
No |
Allows to adjust the visual representation of a parameter in UI |
group_customization |
No |
yes/no |
No |
Makes a parameter available to be changed via config groups |
pattern |
No |
User defined |
— |
A validation rule for the entered configuration parameter value |
The ui_options
parameter allows you to tweak how UI depicts config.
The following options are available:
-
Invisible
Add
invisible: true
to your config to hide the config from UI.This option doesn’t hide information from API and doesn’t disable
read_only
/writable
logic. This is simply an UI tweak.int: type: integer default: 1 required: no ui_options: invisible: true
-
Advanced
There is a new checkbox that allows you to hide some parameters via labeling them
advanced
.Parameter labeled as
advanced
is not searchable.float: type: float default: 1.0 required: no ui_options: advanced: true
The group_customization
parameter allows you to customize a parameter at the configuration group level.
---
- name: ads
type: string
group_customization: true/false
The read_only
parameter allows you to make any config parameter read-only (protected from change by the user or API) for the specified cluster/host/service states. The writable
parameter removes the write protection.
The quorum
parameter is read-only if a service state is installed
or running
:
config:
quorum:
type: integer
read_only: [installed, running]
The quorum
parameter is read-only for all service states except created
:
config:
quorum:
type: integer
writable: [created]
The quorum
parameter is read-only for all service states:
config:
quorum:
type: integer
default: 4
read_only: any
With the pattern
parameter, you can set a validation rule for the configuration parameter value according to a regular expression. Parameter is supported for the config parameters of the password
, string
, text
, and secrettext
types.
The value of the pattern
parameter must be a string that is a valid regular expression, according to the ECMA 262 regular expression dialect. The rules are outlined below:
-
A single Unicode character (other than the special characters below) matches itself.
-
.
— matches any character except line break characters. -
^
— matches only at the beginning of the string. -
$
— matches only at the end of the string. -
(…)
— groups a series of regular expressions into a single regular expression. -
|
— matches either the regular expression preceding or following the|
symbol. -
[abc]
— matches any of the characters inside the square brackets. -
[a-z]
— matches the range of characters. -
[^abc]
— matches any character not listed. -
[^a-z]
— matches any character outside of the range. -
+
— matches one or more repetitions of the preceding regular expression. -
*
— matches zero or more repetitions of the preceding regular expression. -
?
— matches zero or one repetitions of the preceding regular expression. -
+?
,*?
,??
— the*
,+
, and?
qualifiers are all greedy; they match as much text as possible. Sometimes this behavior isn’t desired and you want to match as few characters as possible. -
(?!x)
,(?=x)
— negative and positive lookahead. -
{x}
— matches exactlyx
occurrences of the preceding regular expression. -
{x,y}
— matches at leastx
and at mosty
occurrences of the preceding regular expression. -
{x,}
— matchesx
occurrences or more of the preceding regular expression. -
{x,y}?
,{x,}?
— non-greedy versions of the above expressions.
Use only standard escapes like \n
, \r
, \t
and notice that you also need to do JSON escaping.
When the pattern
parameter is added, consider the upgrade procedure for the current bundle for an existing cluster:
-
Check if the config parameter value matches the
pattern
and fail the upgrade if it does not match. -
Check if the config parameter value matches the
pattern
and migrate its value if necessary. -
Check if the config parameter value matches the
pattern
and raise a flag to notify the user to change the config parameter themselves.
Additionally, for config parameters where the pattern
parameter is present, it is recommended to reword the description
parameter. You can add examples of characters the value can consist of.
config:
- name: example
type: password
display_name: "Example password"
description: "Use uppercase and lowercase letters, as well as numbers"
default: "qwerty56"
pattern: "[a-z][A-Z][0-9]*?"
-
boolean
— boolean value:True
orFalse
. -
file
— the content of this property is stored as a file on a file system. When you reference this variable in an Ansible script, it returns a full path to that file.If the default value is set, it should be the path to the file relative to the bundle root directory.
User can edit the content of this file via UI. The file is updated every time after config is saved.
It can be used to store SSH private keys for an Ansible script:
- type: host name: ssh version: 1 config: ansible_private_key_file: type: file default: host/ssh.key
You can use the special dot syntax to point out a path to the default file. In this case the default file is expected to be in the same directory as the config.yaml file:
config: ansible_private_key_file: type: file default: ./ssh.key
-
float
— float number. If the default value is not explicitly set, then it will be0.0
. You can use the optionalmin
andmax
parameters to limit the values:config: average_load: type: float default: 1.0 min: 0.5 max: 3.5
-
integer
— integer number. If the default value is not explicitly set, then it will be0
. You can use the optionalmin
andmax
parameters to limit the values:config: memory_size: type: integer default: 16 min: 2 max: 64
-
json
— this type stores arbitrary JSON data. The JSON structure is not preserved and can be modified during every config update:config: population: type: json default: - country: Russia cities: - name: Moscow population: 9 - country: USA cities: - name: LA population: 5
-
list
— dynamic array of arbitrary length. Array elements should be strings. Any element can be added, deleted, or modified on every config update:config: mount_points: type: list default: - /dev/rdisk0s1 - /dev/rdisk0s2 - /dev/rdisk0s3
-
map
— dynamic key/value dictionary of arbitrary length. Keys and values should be strings. Any key or value can be added, deleted, or modified on every config update:config: person: type: map default: name: Joe age: "24" sex: m
-
option
— key/value dictionary type. The keys are showed in UI while the corresponding values are stored in DB:config: protocol: type: option option: {http: 80, https: 443} default: 80
-
password
— same as thestring
type, yet displayed as a password field in UI. -
secretfile
— obfuscates parameter and its value in UI. -
secretmap
— obfuscates the value that parameter takes in UI. -
string
— arbitrary string. The size is not limited. If the default value is not explicitly set, then it will be an empty string""
. -
structure
— this type is intended for describing multi-level configurations. The number of levels is unlimited. Configurations are described according to the specification outlined below. Upon each configuration update, new data is compared against the specification. If the input data does not match the specification, ADCM issues an error.The root configuration element, which should be the first one described in the specification, is named
root
. For further attribute description, thematch
element is used, which can be equated to a data type. Possible values formatch
at this level includedict
andlist
. Depending on thematch
value, attributes of the next level are added —items
(fordict
) oritem
(forlist
). Then, the composition of elements included initem
oritems
is listed.You can see available attributes in the table below.
Name Type Required Description match
string
Yes
The rule according to which every other rule performs its checks
item
string
Yes, for
list
typeThe rule according to which every object is checked in case of
list
typeitems
key/value pairs
Yes, for
dict
typeThe rule according to which every object is checked in case of
dict
typerequired_items
list
No
List of mandatory object elements. Only for
dict
typeinvisible_items
list
No
Contains elements that can be used for operational purposes and cannot be seen by the user
default_item
string
No
The rule according to which the user-created element in the object is additionally checked. Only for
dict
typeYou can view the available
match
values (element types) in the table below.Type Description string
Simple type. Designed for strings
boolean
Simple type. Designed for boolean operations
integer
Simple type. Designed for integers
float
Simple type. Designed for floats
list
Recursive type. Checks itself first according to
item
, then applies rules to all its elementsdict
Recursive type. Checks itself first, then applies rules to its values according to
default_item
andrequired_items
Below is a configuration example.
config: - name: country_codes: type: structure yspec: codes/schema.yaml default: - country: Greece code: 30 - country: France code: 33 - country: Spain code: 34 regions: - Andalusia - Andalusia - Cantabria - Catalonia - Valencia
The schema.yaml specification file:
--- root: match: list item: country_code country_code: match: dict items: country: some_string code: some_integer regions: list_of_string comment: some_string uid: some_string required_items: - code - country invisible_items: - uid list_of_string: match: list item: some_string some_string: match: string some_integer: match: int
You can use the dot syntax to point out a path to the specification file. In this case the specification file is expected to be in the same directory as the config.yaml file:
yspec: ./schema.yaml
-
text
— same asstring
, yet is displayed as multiline text in UI. -
variant
— a type where the user can select a single value from the list of options in UI. The sources for that can be different. You can get a list of variants from another config parameter (the type of this config parameter should belist
):config: - name: mount type: variant source: type: config name: mount_points - name: mount_points type: list default: - /dev/rdisk0s1 - /dev/rdisk0s2 - /dev/rdisk0s3 read_only: any ui_options: invisible: true
Also you can get a list of variants from the built-in ADCM functions, such as
cluster_hosts
, that returns the list of all hosts in a current cluster:config: - name: cluster_host type: variant source: type: builtin name: host_in_cluster
Built-in ADCM functions:
-
host_in_cluster
— returns the list of all hosts in current cluster. -
host_not_in_clusters
— returns the list of all hosts not included in any cluster. -
service_in_cluster
— returns the list of all services installed in current cluster. -
service_to_add
— returns the list of all services not installed in current cluster. -
host
— receives arguments aspredicate
andargs
:predicate
is a name of internal host function;args
are arguments for this function. All internal functions return the list of hosts (the list can be empty):config: - name: vhost type: variant source: type: builtin name: host args: predicate: and args: - predicate: in_service args: service: UBER - predicate: or args: - predicate: in_component args: service: UBER component: UBER_SERVER - predicate: in_cluster args:
List of internal host functions:
-
in_cluster
— returns the list of all hosts in the current cluster; -
in_service
— returns the list of all hosts in the specified service; -
not_in_service
— returns the list of all hosts that are not in the specified service; -
in_component
— returns the list of all hosts in the specified component; -
not_in_component
— returns the list of all hosts that are not in the specified component; -
in_hc
— returns the list of all hosts in a host component map of this cluster; -
not_in_hc
— returns the list of all hosts that are not in a host component map of this cluster; -
and
— returns the union of sets of its arguments; -
or
— returns the intersection of sets of its arguments.You can list the variants simply in a bundle:
config: - name: city type: variant source: type: inline strict: False value: - Moscow - Voronez - Ufa default: Samara
You can also specify an optional argument
strict
for the variants source. Ifstrict
is set toFalse
, then users can not only select the value from the predefined list, but also enter their own values in UI.
-
-
group
— a type that allows you to combine configuration parameters into groups. Group can be activatable. This means that you can switch that group on and off via UI. When a group is switched off (active = false
), you don’t need to fill in its subvalues in UI. Group value in the Ansible inventory file would be null as well.--- - type: cluster name: Kafka version: 1 config: - name: grafana type: group activatable: true active: false subs: - name: endpoint type: string - name: port type: integer
config_group_customization
Every cluster prototype might have an optional config_group_customization
property. This property allows the user to customize all cluster (service, component) parameters on some group of hosts. This functionality is disabled by default. The default value is false
.
---
- type: cluster # service component
name: control
version: 1
config_group_customization: true
If you want to change the behaviour of a certain parameter, you can use the group_customization
option of the corresponding configuration parameter.
description
description
is a detailed description of your prototype.
---
- type: cluster
name: control
version: 1
display_name: "Controlling Software"
description: |
This software is intended for monitoring and controlling
you cluster and does it by ...
display_name
display_name
is a short human-readable name.
---
- type: cluster
name: control
version: 1
display_name: "Controlling Software"
description: |
This software is intended for monitoring and controlling
you cluster and does it by ...
edition
Every cluster or hostprovider prototype might have an optional edition
property that corresponds to the bundle type (cluster or host, respectively).
Default value of edition
is community
. Value of edition
can be used in upgrade definition.
---
- type: cluster
name: adh
display_name: Arenadata Hadoop
version: 1
edition: enterprise
export
Export is a way to specify settings that a cluster or service is able to transfer to other clusters.
If you want to share some parts of your config with other clusters, you can use the export
statement. In export
you can specify any number of the first level config
entries. You can export a config in a cluster or/and in a service:
---
- type: service
name: Hadoop
version: 2.1
config:
core-site:
param1:
type: string
param2:
type: integer
quorum:
type: integer
default: 3
export:
- core-site
- quorum
flag_autogeneration
NOTE
Some of this attribute’s functionality was represented by the allow_flags parameter prior to the 2.2.0 release. The allow_flags parameter is no longer supported.
|
This statement is designed for automatic creation of the embedded flags. The statement can be defined on any prototype. The statement can be switched on and off on any prototype as well. If flag_autogeneration
is defined both on a child object and its parent object, then the child object attribute is of higher priority.
Currently, only the adcm_outdated_config
embedded flag is supported. This flag is raised automatically when object’s configuration is changed. To enable the automatic creation of this embedded flag when the object’s configuration changes, set the enable_outdated_config
parameter to True
.
---
- type: cluster
name: adpg
flag_autogeneration:
enable_outdated_config: True
import
Import is a way to specify service settings and versions for a cluster or service to be able to receive them from other clusters.
To use the config
parts exported from other cluster, you should use the import
statement in your cluster. You should specify the name and acceptable versions of an exported cluster (or a service in a cluster):
---
-
type: cluster
name: Hive
version: 4
import:
Hadoop:
versions:
min: 1.8
max: 2.5
When you bind your cluster and another cluster or service via UI, you can use the exported config
parameters in your Ansible scripts like this:
{{ cluster.import.Hadoop.core-site.param2 }}
{{ cluster.import.Hadoop.quorum }}
-
required
— theimport
statement might have an optionalrequired
parameter. Ifrequired
is set totrue
the cluster or service will raise issue and block any action before the required import is properly binded with export cluster or service. The default value forrequired
isfalse
. -
default
— theimport
statement might have an optionaldefault
parameter. Thedefault
parameter should be an array of config group names of this cluster or service. If this cluster/service is not binded with any export cluster/service import section, the Ansible inventory file will be filled with values from the specified config group.It’s recommended to make default group names the same as export group names.
-
multibind
— import statement might have an optionalmultibind
parameter. If it is set totrue
, you can bind many instances of a cluster or a service to the same cluster/service. In Ansible inventory file the import values are represented as an array. The default value ofmultibind
isfalse
.
license
Every cluster, service, or hostprovider prototype might have an optional license
property that corresponds to the bundle type. The value of a license
property is a path to the licence file relative to a bundle root.
If a prototype of a cluster or a service has a license
property, a user of ADCM will be asked to accept a license after the bundle is loaded or the service is added. Before the user accepts a license any action with the bundle or service is blocked.
---
- type: cluster
name: adh
display_name: Arenadata Hadoop
version: 1
license: misc/license.txt
---
- type: service
name: hdfs
display_name: HDFS
version: 1
license: misc/license.txt
NOTE
You can use a special dot syntax to point out a path to a license file. In this case a license file will be searched in the directory that contains config.yaml:
|
monitoring
Every service or component prototype might have an optional monitoring
property. It defines if the service/component should be monitored. Default value is active
. If you want to exclude service/component from monitoring system, set it to passive
.
required
Every service prototype might have an optional required
property. Default value is false
. If cluster cannot work without this service, set it to true
. When required service is not added to cluster, cluster will have an issue.
requires
Every service prototype might have an optional requires
property.
This parameter defines dependencies between the services, i.e. which services need other services or components to be installed simultaneously.
By default a service does not depend on any other service or component. However, if a dependent service is specified for a service, then when adding that service without the dependent service, an issue is generated in ADCM. Thus the dependency of a service on another service is checked at the stage of adding it. The dependency of a service on a component is checked at the stage of the host-component mapping being saved.
---
- type: service
name: Hive
version: 1.0
requires:
- service: HDFS
- service: YARN
component: TimeLineServer
upgrade
Upgrade is an operation available from a particular state of an object (cluster or hostprovider) that updates the meta-information about that object and moves it to another state. There are two types of upgrades:
-
Switching the prototypes of the current bundle to the prototypes of the new one.
-
Performing some kind of action that may consist of several subactions (including switching the prototypes).
Cluster or host prototype might have an upgrade
statement. This statement describes how to perform an upgrade from one version of bundle to another. A prototype might have a few upgrade items to describe upgrades from different versions.
---
- type: cluster
name: control
version: 2.4
description: "Monitoring and Control Software"
upgrade:
-
name: Upgrade 1
versions:
min: 0.4
max: 2.0
description: New cool upgrade
states:
available: any
on_success: upgradable
-
name: Upgrade 2
versions:
min: 1.0
max_strict: 3.0
scripts:
- name: pre check
display_name: Some pre-check before upgrade prototypes
script_type: ansible
script: ansible/pre-check.yaml
- name: bundle upgrade
display_name: Upgrade bundle
script_type: internal
script: bundle_switch
- name: post tasks
display_name: Some operation after prototype upgrades
script_type: ansible
script: ansible/post-task.yaml
from_edition: community
states:
available:
- installed
on_success: upgradable
upgrade
should have a versions
property. versions
is the interval of the versions appropriate for upgrade.
upgrade:
-
name: Upgrade
versions:
min: 0.4
max: 2.0
states:
available: any
on_success: upgradable
NOTE
min and max use non-strict comparison (i.e. boundaries include the version of cluster/host). If you want the comparison to be strict, you can use the min_strict and/or the max_strict instead of the min /max .
|
upgrade
should have a name
property. name
is the object name.
upgrade
should have a display_name
property. display_name
is the object name that is shown to user via UI.
upgrade
might have an optional description
property. description
allows you to write description for an upgrade.
upgrade
should have a states
property. states
defines two clauses:
-
available
— lists the cluster states that allow upgrade. Special valueany
can be used for upgrade that is available in any state. -
on_success
— cluster state after upgrade.
upgrade:
-
name: Upgrade 1
versions:
min: 0.4
max: 2.0
description: New cool upgrade
states:
available: [created, installed]
on_success: upgradable
upgrade
might have an optional from_edition
property. from_edition
is the list of editions that allow upgrades.
Special value any
can be used to specify the permission to upgrade from bundles with any edition. The default value of from_edition
is community
.
upgrade:
-
name: Upgrade 1
versions:
min: 0.4
max: 2.0
description: New cool upgrade
states:
available: [created, installed]
on_success: upgradable
from_edition:
- community
- enterprise