diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index bfef0ab8151..a33a0522841 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -73,13 +73,13 @@ repos: # - id: autopep8 - repo: https://github.com/pycqa/isort - rev: 5.12.0 + rev: 5.13.2 hooks: - id: isort name: Check for changes when running isort on all python files - repo: https://github.com/psf/black - rev: 22.8.0 + rev: 23.12.1 hooks: - id: black name: Check for changes when running Black on all python files diff --git a/ansible_collections/arista/avd/docs/contribution/style-guide.md b/ansible_collections/arista/avd/docs/contribution/style-guide.md index 8931b7811c1..434919625c2 100644 --- a/ansible_collections/arista/avd/docs/contribution/style-guide.md +++ b/ansible_collections/arista/avd/docs/contribution/style-guide.md @@ -15,8 +15,8 @@ As AVD is an Ansible collection, we're required to follow guidelines from the of Furthermore, the CI Pipeline (& pre-commit) for AVD enforces the following: - Maximum line length of 160 -- [Black](https://black.readthedocs.io/en/stable/index.html) version 22.8.0 -- [isort](https://pycqa.github.io/isort/) version 5.12.0 +- [Black](https://black.readthedocs.io/en/stable/index.html) version 23.12.1 +- [isort](https://pycqa.github.io/isort/) version 5.13.2 - [Flake-8](https://flake8.pycqa.org/en/4.0.1/index.html) version 4.0.1 - [pylint](https://pylint.pycqa.org/en/2.6/) version 2.6.0 diff --git a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/add_md_toc.md b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/add_md_toc.md index 11627dde836..6f6a53a74d3 100644 --- a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/add_md_toc.md +++ b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/add_md_toc.md @@ -31,10 +31,10 @@ The below requirements are needed on the host that executes this module. | Argument | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | -| _input | string | True | None | | Markdown to process. | -| skip_lines | integer | optional | 0 | | Skip the first x lines when parsing the input Markdown. | -| toc_levels | integer | optional | 3 | | How many levels of headings will be included in the TOC. | -| toc_marker | string | optional | | | TOC will be inserted or updated between two of markers in the input Markdown. | +| _input | string | True | None | | Markdown to process. | +| skip_lines | integer | optional | 0 | | Skip the first x lines when parsing the input Markdown. | +| toc_levels | integer | optional | 3 | | How many levels of headings will be included in the TOC. | +| toc_marker | string | optional | | | TOC will be inserted or updated between two of markers in the input Markdown. | ## Examples diff --git a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/convert_dicts.md b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/convert_dicts.md index 01c63f12436..4825121436b 100644 --- a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/convert_dicts.md +++ b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/convert_dicts.md @@ -29,9 +29,9 @@ Note \- if there is a non\-dictionary value with no secondary key provided, it w | Argument | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | -| _input | any | True | None | | Dictionary to convert \- returned untouched if not a nested dictionary/list. | -| primary_key | string | optional | name | | Name of the primary key used when inserting outer dictionary keys into items. | -| secondary_key | string | optional | None | | Name of the secondary key used when inserting dictionary values which are list into items. | +| _input | any | True | None | | Dictionary to convert \- returned untouched if not a nested dictionary/list. | +| primary_key | string | optional | name | | Name of the primary key used when inserting outer dictionary keys into items. | +| secondary_key | string | optional | None | | Name of the secondary key used when inserting dictionary values which are list into items. | ## Examples diff --git a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/convert_schema.md b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/convert_schema.md index b7da90f96b6..a59f8da9def 100644 --- a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/convert_schema.md +++ b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/convert_schema.md @@ -23,8 +23,8 @@ Only for internal use. | Argument | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | -| _input | string | True | None | Valid values:
- eos_cli_config_gen
- eos_designs | ID of AVD Schema. | -| type | string | True | None | Valid values:
- documentation_tables
- jsonschema | Type of schema to convert to. | +| _input | string | True | None | Valid values:
- eos_cli_config_gen
- eos_designs | ID of AVD Schema. | +| type | string | True | None | Valid values:
- documentation_tables
- jsonschema | Type of schema to convert to. | ## Return Values diff --git a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/decrypt.md b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/decrypt.md index 09b4dd9fcbd..a6a33c54e7e 100644 --- a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/decrypt.md +++ b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/decrypt.md @@ -25,11 +25,11 @@ Note \- For now this filter only supports decryption from type 7 an | Argument | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | -| _input | string | True | None | | Encrypted EOS password. | -| passwd_type | string | True | None | Valid values:
- bgp
- ospf_simple
- ospf_message_digest | Type of password to decrypt.
bgp and ospf\_simple requires the password and key inputs.
ospf\_message\_digest requires the password, key, hash\_algorithm, key\_id inputs. | -| key | string | True | None | | Encryption key. The value depends on the type of password.
For BGP passwords the key is the Neighbor IP or the BGP Peer Group Name in EOS.
For OSPF passwords the key is the interface name \(e.g., Ethernet1\). | -| hash_algorithm | string | optional | None | Valid values:
- md5
- sha1
- sha256
- sha384
- sha512 | Hash algorithm to use with passwd\_type\=\"ospf\_message\_digest\". | -| key_id | integer | optional | None | Min value: 1
Max value: 255 | Key ID to use with passwd\_type\=\"ospf\_message\_digest\". | +| _input | string | True | None | | Encrypted EOS password. | +| passwd_type | string | True | None | Valid values:
- bgp
- ospf_simple
- ospf_message_digest | Type of password to decrypt.
bgp and ospf\_simple requires the password and key inputs.
ospf\_message\_digest requires the password, key, hash\_algorithm, key\_id inputs. | +| key | string | True | None | | Encryption key. The value depends on the type of password.
For BGP passwords the key is the Neighbor IP or the BGP Peer Group Name in EOS.
For OSPF passwords the key is the interface name \(e.g., Ethernet1\). | +| hash_algorithm | string | optional | None | Valid values:
- md5
- sha1
- sha256
- sha384
- sha512 | Hash algorithm to use with passwd\_type\=\"ospf\_message\_digest\". | +| key_id | integer | optional | None | Min value: 1
Max value: 255 | Key ID to use with passwd\_type\=\"ospf\_message\_digest\". | ## Examples diff --git a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/default.md b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/default.md index 53cc00783ba..ba373a7c7b8 100644 --- a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/default.md +++ b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/default.md @@ -27,8 +27,8 @@ As a last resort, the filter will return None. | Argument | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | -| _input | any | True | None | | Default value to check. Will be returned untouched if not undefined and not None. | -| default_values | any | optional | None | | One or more default values will be tested individually, and the first valid value will be used. | +| _input | any | True | None | | Default value to check. Will be returned untouched if not undefined and not None. | +| default_values | any | optional | None | | One or more default values will be tested individually, and the first valid value will be used. | ## Examples diff --git a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/encrypt.md b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/encrypt.md index 78a268ec758..bfe55b7d80a 100644 --- a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/encrypt.md +++ b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/encrypt.md @@ -27,11 +27,11 @@ Note \- For now this filter only supports encryption from type 7 an | Argument | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | -| _input | string | True | None | | Clear text password to be encrypted. | -| passwd_type | string | True | None | Valid values:
- bgp
- ospf_simple
- ospf_message_digest | Type of password to encrypt.
bgp and ospf\_simple requires the password and key inputs.
ospf\_message\_digest requires the password, key, hash\_algorithm, key\_id inputs. | -| key | string | True | None | | Encryption key. The value depends on the type of password.
For BGP passwords, the key is the Neighbor IP or the BGP Peer Group Name in EOS.
For OSPF passwords, the key is the interface name \(e.g., Ethernet1\). | -| hash_algorithm | string | optional | None | Valid values:
- md5
- sha1
- sha256
- sha384
- sha512 | Hash algorithm to use with passwd\_type\=\"ospf\_message\_digest\". | -| key_id | integer | optional | None | Min value: 1
Max value: 255 | Key ID to use with passwd\_type\=\"ospf\_message\_digest\". | +| _input | string | True | None | | Clear text password to be encrypted. | +| passwd_type | string | True | None | Valid values:
- bgp
- ospf_simple
- ospf_message_digest | Type of password to encrypt.
bgp and ospf\_simple requires the password and key inputs.
ospf\_message\_digest requires the password, key, hash\_algorithm, key\_id inputs. | +| key | string | True | None | | Encryption key. The value depends on the type of password.
For BGP passwords, the key is the Neighbor IP or the BGP Peer Group Name in EOS.
For OSPF passwords, the key is the interface name \(e.g., Ethernet1\). | +| hash_algorithm | string | optional | None | Valid values:
- md5
- sha1
- sha256
- sha384
- sha512 | Hash algorithm to use with passwd\_type\=\"ospf\_message\_digest\". | +| key_id | integer | optional | None | Min value: 1
Max value: 255 | Key ID to use with passwd\_type\=\"ospf\_message\_digest\". | ## Examples diff --git a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/generate_esi.md b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/generate_esi.md index 08a570f951c..fa6fdf0e317 100644 --- a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/generate_esi.md +++ b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/generate_esi.md @@ -23,8 +23,8 @@ Concatenates the given esi\_prefix and short\_esi. | Argument | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | -| _input | string | True | None | | Short ESI value as per AVD definition in eos\_designs. | -| esi_prefix | string | optional | 0000:0000: | | ESI prefix value. Will be concatenated with the short\_esi. | +| _input | string | True | None | | Short ESI value as per AVD definition in eos\_designs. | +| esi_prefix | string | optional | 0000:0000: | | ESI prefix value. Will be concatenated with the short\_esi. | ## Examples diff --git a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/generate_lacp_id.md b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/generate_lacp_id.md index c4ec1946965..c8e12041153 100644 --- a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/generate_lacp_id.md +++ b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/generate_lacp_id.md @@ -23,7 +23,7 @@ Replaces \: with . | Argument | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | -| _input | string | True | None | | Short ESI value as per AVD definition in eos\_designs. | +| _input | string | True | None | | Short ESI value as per AVD definition in eos\_designs. | ## Examples diff --git a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/generate_route_target.md b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/generate_route_target.md index 1c12dfffa2b..342a7044743 100644 --- a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/generate_route_target.md +++ b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/generate_route_target.md @@ -23,7 +23,7 @@ Removes \: and inserts new \: for each two characters. | Argument | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | -| _input | string | True | None | | Short ESI value as per AVD definition in eos\_designs. | +| _input | string | True | None | | Short ESI value as per AVD definition in eos\_designs. | ## Examples diff --git a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/hide_passwords.md b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/hide_passwords.md index 9c3887e46e3..2ddde53cdd7 100644 --- a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/hide_passwords.md +++ b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/hide_passwords.md @@ -23,8 +23,8 @@ Replace the input data by \"\\" if the hide\_passwords parameter is tr | Argument | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | -| _input | raw | True | None | | Value to replace. | -| hide_passwords | bool | True | None | | Flag to indicate whether or not the string should be replaced. | +| _input | raw | True | None | | Value to replace. | +| hide_passwords | bool | True | None | | Flag to indicate whether or not the string should be replaced. | ## Examples diff --git a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/is_in_filter.md b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/is_in_filter.md index f84e3662a3c..1e62e53a527 100644 --- a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/is_in_filter.md +++ b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/is_in_filter.md @@ -25,8 +25,8 @@ The filter matches if any filter strings are found in the input hostname. | Argument | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | -| _input | string | True | None | | One hostname to match with hostname\_filter. | -| hostname_filter | any | True | None | | Filter as a list of strings or None. | +| _input | string | True | None | | One hostname to match with hostname\_filter. | +| hostname_filter | any | True | None | | Filter as a list of strings or None. | ## Examples diff --git a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/list_compress.md b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/list_compress.md index 0130e2c83cc..2c386c6e2da 100644 --- a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/list_compress.md +++ b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/list_compress.md @@ -23,7 +23,7 @@ Provides the capability to generate a string representing ranges of VLANs or VNI | Argument | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | -| _input | list | True | None | | List of integers to compress into a range. | +| _input | list | True | None | | List of integers to compress into a range. | ## Examples diff --git a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/natural_sort.md b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/natural_sort.md index 33996a20c23..fdbf69eb60e 100644 --- a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/natural_sort.md +++ b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/natural_sort.md @@ -27,8 +27,8 @@ The filter will return an empty list if the value parsed to arista.avd.natural\_ | Argument | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | -| _input | any | True | None | | List or dictionary | -| sort_key | string | optional | None | | Key to sort on when sorting a list of dictionaries | +| _input | any | True | None | | List or dictionary | +| sort_key | string | optional | None | | Key to sort on when sorting a list of dictionaries | ## Examples diff --git a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/range_expand.md b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/range_expand.md index 3d7ee31d99c..e8f1d027430 100644 --- a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/range_expand.md +++ b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/range_expand.md @@ -27,7 +27,7 @@ Within a single range, prefixes \(ex. Ethernet, Eth, Po\) are carried over to it | Argument | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | -| _input | any | True | None | | Range as string or list of ranges. | +| _input | any | True | None | | Range as string or list of ranges. | ## Examples diff --git a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/snmp_hash.md b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/snmp_hash.md index 1c729292ce2..44e73e49762 100644 --- a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/snmp_hash.md +++ b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/snmp_hash.md @@ -23,11 +23,11 @@ Key localization as described in [RFC 2574 section 2.6](https://www.rfc-editor.o | Argument | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | -| _input | dictionary | True | None | | Dictionary with SNMP passphrase details. | -| passphrase | string | True | None | | The passphrase to localize.
This is the \"auth\" passphrase when the priv argument is not set.
If priv is set, it is the \"priv\" passphrase. | -| auth | string | True | None | Valid values:
- md5
- sha
- sha224
- sha256
- sha384
- sha512 | Auth type | -| engine_id | string | True | None | | A hexadecimal string containing the engine\_id to be used to localize the passphrase | -| priv | string | optional | None | Valid values:
- des
- aes
- aes192
- aes256 | Priv type | +| _input | dictionary | True | None | | Dictionary with SNMP passphrase details. | +|     passphrase | string | True | None | | The passphrase to localize.
This is the \"auth\" passphrase when the priv argument is not set.
If priv is set, it is the \"priv\" passphrase. | +|     auth | string | True | None | Valid values:
- md5
- sha
- sha224
- sha256
- sha384
- sha512 | Auth type | +|     engine_id | string | True | None | | A hexadecimal string containing the engine\_id to be used to localize the passphrase | +|     priv | string | optional | None | Valid values:
- des
- aes
- aes192
- aes256 | Priv type | ## Return Values diff --git a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/status_render.md b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/status_render.md index 8e677b8c66e..0fb331e5974 100644 --- a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/status_render.md +++ b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/status_render.md @@ -27,8 +27,8 @@ Returns \:white\_check\_mark\: if input status string is PASS | Argument | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | -| _input | string | True | None | | Text to convert to EMOJI. | -| rendering | string | True | None | | Markdown Flavor to use for Emoji rendering. Only \"github\" is supported. | +| _input | string | True | None | | Text to convert to EMOJI. | +| rendering | string | True | None | | Markdown Flavor to use for Emoji rendering. Only \"github\" is supported. | ## Return Values diff --git a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/batch_template.md b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/batch_template.md index 9116c771a08..90307b95f8d 100644 --- a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/batch_template.md +++ b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/batch_template.md @@ -25,9 +25,9 @@ Destination file mode is hardcoded to 0o664. | Argument | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | -| template | str | True | None | | Path to Jinja2 Template file | -| dest_format_string | str | True | None | | Format string used to specify target file for each item. \'item\' is the current item from \'items\'. Like \"mypath/\{item\}.md\" | -| items | list | True | None | | List of strings. Each list item is passed to \'dest\_format\_string\' as \'item\' and passed to templater as \'item\' | +| template | str | True | None | | Path to Jinja2 Template file | +| dest_format_string | str | True | None | | Format string used to specify target file for each item. \'item\' is the current item from \'items\'. Like \"mypath/\{item\}.md\" | +| items | list | True | None | | List of strings. Each list item is passed to \'dest\_format\_string\' as \'item\' and passed to templater as \'item\' | ## Examples diff --git a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/configlet_build_config.md b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/configlet_build_config.md index d5afc84d64e..28011eaea67 100644 --- a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/configlet_build_config.md +++ b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/configlet_build_config.md @@ -23,10 +23,10 @@ Build configuration to publish configlets to Cloudvision. | Argument | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | -| configlet_dir | str | True | None | | Directory where configlets are located. | -| configlet_prefix | str | True | None | | Prefix to append on configlet. | -| destination | str | False | None | | File where to save information. | -| configlet_extension | str | False | conf | | File extension to look for. | +| configlet_dir | str | True | None | | Directory where configlets are located. | +| configlet_prefix | str | True | None | | Prefix to append on configlet. | +| destination | str | False | None | | File where to save information. | +| configlet_extension | str | False | conf | | File extension to look for. | ## Examples diff --git a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/eos_designs_facts.md b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/eos_designs_facts.md index 2f7436d53ca..1737b5a5432 100644 --- a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/eos_designs_facts.md +++ b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/eos_designs_facts.md @@ -35,10 +35,10 @@ The module is used in \`arista.avd.eos\_designs\` to set facts for devices, whic | Argument | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | -| template_output | bool | False | None | | If true, the output data will be run through another jinja2 rendering before returning. This is to resolve any input values with inline jinja using variables/facts set by the input templates. | -| conversion_mode | str | False | debug | Valid values:
- error
- warning
- info
- debug
- quiet
- disabled | Run data conversion in either \"error\", \"warning\", \"info\", \"debug\", \"quiet\" or \"disabled\" mode.
Conversion will perform type conversion of input variables as defined in the schema.
Conversion is intended to help the user to identify minor issues with the input data, while still allowing the data to be validated.
During conversion, messages will be generated with information about the host\(s\) and key\(s\) which required conversion.
conversion\_mode\:disabled means that conversion will not run.
conversion\_mode\:error will produce error messages and fail the task.
conversion\_mode\:warning will produce warning messages.
conversion\_mode\:info will produce regular log messages.
conversion\_mode\:debug will produce hidden messages viewable with \-v.
conversion\_mode\:quiet will not produce any messages. | -| validation_mode | str | False | warning | Valid values:
- error
- warning
- info
- debug
- disabled | Run validation in either \"error\", \"warning\", \"info\", \"debug\" or \"disabled\" mode.
Validation will validate the input variables according to the schema.
During validation, messages will be generated with information about the host\(s\) and key\(s\) which failed validation.
validation\_mode\:disabled means that validation will not run.
validation\_mode\:error will produce error messages and fail the task.
validation\_mode\:warning will produce warning messages.
validation\_mode\:info will produce regular log messages.
validation\_mode\:debug will produce hidden messages viewable with \-v. | -| cprofile_file | str | False | None | | Filename for storing cprofile data used to debug performance issues.
Running cprofile will slow down performance in it self, so only set this while troubleshooting. | +| template_output | bool | False | None | | If true, the output data will be run through another jinja2 rendering before returning. This is to resolve any input values with inline jinja using variables/facts set by the input templates. | +| conversion_mode | str | False | debug | Valid values:
- error
- warning
- info
- debug
- quiet
- disabled | Run data conversion in either \"error\", \"warning\", \"info\", \"debug\", \"quiet\" or \"disabled\" mode.
Conversion will perform type conversion of input variables as defined in the schema.
Conversion is intended to help the user to identify minor issues with the input data, while still allowing the data to be validated.
During conversion, messages will be generated with information about the host\(s\) and key\(s\) which required conversion.
conversion\_mode\:disabled means that conversion will not run.
conversion\_mode\:error will produce error messages and fail the task.
conversion\_mode\:warning will produce warning messages.
conversion\_mode\:info will produce regular log messages.
conversion\_mode\:debug will produce hidden messages viewable with \-v.
conversion\_mode\:quiet will not produce any messages. | +| validation_mode | str | False | warning | Valid values:
- error
- warning
- info
- debug
- disabled | Run validation in either \"error\", \"warning\", \"info\", \"debug\" or \"disabled\" mode.
Validation will validate the input variables according to the schema.
During validation, messages will be generated with information about the host\(s\) and key\(s\) which failed validation.
validation\_mode\:disabled means that validation will not run.
validation\_mode\:error will produce error messages and fail the task.
validation\_mode\:warning will produce warning messages.
validation\_mode\:info will produce regular log messages.
validation\_mode\:debug will produce hidden messages viewable with \-v. | +| cprofile_file | str | False | None | | Filename for storing cprofile data used to debug performance issues.
Running cprofile will slow down performance in it self, so only set this while troubleshooting. | ## Examples diff --git a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/eos_designs_structured_config.md b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/eos_designs_structured_config.md index 85b5cafbe62..86628bfdc54 100644 --- a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/eos_designs_structured_config.md +++ b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/eos_designs_structured_config.md @@ -30,18 +30,18 @@ The \`arista.avd.eos\_designs\_facts\` module is an Ansible Action Plugin provid | Argument | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | -| eos_designs_custom_templates | list | False | None | | List of dicts for Jinja2 templates to be run after generating the structured configuration | -| template | str | True | None | | Template file. +| eos_designs_custom_templates | list | False | None | | List of dicts for Jinja2 templates to be run after generating the structured configuration | +|     template | str | True | None | | Template file. | -| options | dict | False | None | | Template options | -| list_merge | str | False | append | | Merge strategy for lists | -| strip_empty_keys | bool | False | True | | Filter out keys from the generated output if value is null/none/undefined
Only applies to templates. | -| dest | str | False | None | | Destination path. If set, the output facts will also be written to this path.
Autodetects data format based on file suffix. \'.yml\', \'.yaml\' \-\> YAML, default \-\> JSON | -| mode | str | False | None | | File mode \(ex. 0664\) for dest file. See \'ansible.builtin.copy\' module for details. | -| template_output | bool | False | None | | If true, the output data will be run through another jinja2 rendering before returning.
This is to resolve any input values with inline jinja using variables/facts set by the input templates. | -| conversion_mode | str | False | debug | Valid values:
- error
- warning
- info
- debug
- quiet
- disabled | Run data conversion in either \"error\", \"warning\", \"info\", \"debug\", \"quiet\" or \"disabled\" mode.
Conversion will perform type conversion of input variables as defined in the schema.
Conversion is intended to help the user to identify minor issues with the input data, while still allowing the data to be validated.
During conversion, messages will be generated with information about the host\(s\) and key\(s\) which required conversion.
conversion\_mode\:disabled means that conversion will not run.
conversion\_mode\:error will produce error messages and fail the task.
conversion\_mode\:warning will produce warning messages.
conversion\_mode\:info will produce regular log messages.
conversion\_mode\:debug will produce hidden messages viewable with \-v.
conversion\_mode\:quiet will not produce any messages. | -| validation_mode | str | False | warning | Valid values:
- error
- warning
- info
- debug
- disabled | Run validation in either \"error\", \"warning\", \"info\", \"debug\" or \"disabled\" mode.
Validation will validate the input variables according to the schema.
During validation, messages will be generated with information about the host\(s\) and key\(s\) which failed validation.
validation\_mode\:disabled means that validation will not run.
validation\_mode\:error will produce error messages and fail the task.
validation\_mode\:warning will produce warning messages.
validation\_mode\:info will produce regular log messages.
validation\_mode\:debug will produce hidden messages viewable with \-v. | -| cprofile_file | str | False | None | | Filename for storing cprofile data used to debug performance issues.
Running cprofile will slow down performance in it self, so only set this while troubleshooting. | +|     options | dict | False | None | | Template options | +|         list_merge | str | False | append | | Merge strategy for lists | +|         strip_empty_keys | bool | False | True | | Filter out keys from the generated output if value is null/none/undefined
Only applies to templates. | +| dest | str | False | None | | Destination path. If set, the output facts will also be written to this path.
Autodetects data format based on file suffix. \'.yml\', \'.yaml\' \-\> YAML, default \-\> JSON | +| mode | str | False | None | | File mode \(ex. 0664\) for dest file. See \'ansible.builtin.copy\' module for details. | +| template_output | bool | False | None | | If true, the output data will be run through another jinja2 rendering before returning.
This is to resolve any input values with inline jinja using variables/facts set by the input templates. | +| conversion_mode | str | False | debug | Valid values:
- error
- warning
- info
- debug
- quiet
- disabled | Run data conversion in either \"error\", \"warning\", \"info\", \"debug\", \"quiet\" or \"disabled\" mode.
Conversion will perform type conversion of input variables as defined in the schema.
Conversion is intended to help the user to identify minor issues with the input data, while still allowing the data to be validated.
During conversion, messages will be generated with information about the host\(s\) and key\(s\) which required conversion.
conversion\_mode\:disabled means that conversion will not run.
conversion\_mode\:error will produce error messages and fail the task.
conversion\_mode\:warning will produce warning messages.
conversion\_mode\:info will produce regular log messages.
conversion\_mode\:debug will produce hidden messages viewable with \-v.
conversion\_mode\:quiet will not produce any messages. | +| validation_mode | str | False | warning | Valid values:
- error
- warning
- info
- debug
- disabled | Run validation in either \"error\", \"warning\", \"info\", \"debug\" or \"disabled\" mode.
Validation will validate the input variables according to the schema.
During validation, messages will be generated with information about the host\(s\) and key\(s\) which failed validation.
validation\_mode\:disabled means that validation will not run.
validation\_mode\:error will produce error messages and fail the task.
validation\_mode\:warning will produce warning messages.
validation\_mode\:info will produce regular log messages.
validation\_mode\:debug will produce hidden messages viewable with \-v. | +| cprofile_file | str | False | None | | Filename for storing cprofile data used to debug performance issues.
Running cprofile will slow down performance in it self, so only set this while troubleshooting. | ## Examples diff --git a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/eos_validate_state_reports.md b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/eos_validate_state_reports.md index 8f3f4b3f9de..7b938a9c6a1 100644 --- a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/eos_validate_state_reports.md +++ b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/eos_validate_state_reports.md @@ -33,13 +33,13 @@ The plugin offers the following functionalities\: | Argument | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | -| validation_report_csv | bool | optional | True | | Indicates whether a CSV report should be generated. | -| validation_report_md | bool | optional | True | | Indicates whether a Markdown report should be generated. | -| only_failed_tests | bool | optional | False | | Determines if the generated reports should include only the failed tests. | -| csv_report_path | str | optional | None | | The absolute path where the CSV report will be saved.
Required if validation\_report\_csv is set to True. | -| md_report_path | str | optional | None | | The absolute path where the Markdown report will be saved.
Required if validation\_report\_md is set to True. | -| test_results_dir | any | optional | None | | The directory where the test results JSON file for each host will be saved. | -| cprofile_file | any | optional | None | | The filename for storing cProfile data, useful for debugging performance issues.
Be aware that enabling cProfile can affect performance, so use it only for troubleshooting. | +| validation_report_csv | bool | optional | True | | Indicates whether a CSV report should be generated. | +| validation_report_md | bool | optional | True | | Indicates whether a Markdown report should be generated. | +| only_failed_tests | bool | optional | False | | Determines if the generated reports should include only the failed tests. | +| csv_report_path | str | optional | None | | The absolute path where the CSV report will be saved.
Required if validation\_report\_csv is set to True. | +| md_report_path | str | optional | None | | The absolute path where the Markdown report will be saved.
Required if validation\_report\_md is set to True. | +| test_results_dir | any | optional | None | | The directory where the test results JSON file for each host will be saved. | +| cprofile_file | any | optional | None | | The filename for storing cProfile data, useful for debugging performance issues.
Be aware that enabling cProfile can affect performance, so use it only for troubleshooting. | ## Notes diff --git a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/eos_validate_state_runner.md b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/eos_validate_state_runner.md index 542994001bd..f0359776963 100644 --- a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/eos_validate_state_runner.md +++ b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/eos_validate_state_runner.md @@ -35,14 +35,14 @@ The plugin offers the following capabilities\: | Argument | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | -| logging_level | str | optional | WARNING | Valid values:
- CRITICAL
- ERROR
- WARNING
- INFO
- DEBUG | Sets the log level for the ANTA library. Defaults to \"WARNING\" if not specified. | -| save_catalog | bool | optional | False | | Indicates whether to save the test catalog for each device. | -| device_catalog_path | str | optional | None | | The absolute path where the device test catalog will be saved.
Required if save\_catalog is set to True. | -| test_results_dir | str | optional | None | | The directory where the test results JSON file for each host will be saved. | -| skipped_tests | list | optional | None | | A list of dictionaries specifying categories and, optionally, tests to skip.
Each dictionary must have a key category and can optionally include a tests key. | -| category | str | optional | None | | The name of an AvdTest category \(e.g., AvdTestHardware\). | -| tests | list | optional | None | | An optional list of specific tests in the category to skip \(e.g., VerifyRoutingProtocolModel in AvdTestBGP\).
If not specified, all tests in the category are considered.
For a complete list of available tests, see \[link to the test list\]\(https\://avd.sh/en/stable/roles/eos\_validate\_state/ANTA\-Preview.html\#test\-categories\). | -| cprofile_file | any | optional | None | | The filename for storing cProfile data, useful for debugging performance issues.
Be aware that enabling cProfile can affect performance, so use it only for troubleshooting. | +| logging_level | str | optional | WARNING | Valid values:
- CRITICAL
- ERROR
- WARNING
- INFO
- DEBUG | Sets the log level for the ANTA library. Defaults to \"WARNING\" if not specified. | +| save_catalog | bool | optional | False | | Indicates whether to save the test catalog for each device. | +| device_catalog_path | str | optional | None | | The absolute path where the device test catalog will be saved.
Required if save\_catalog is set to True. | +| test_results_dir | str | optional | None | | The directory where the test results JSON file for each host will be saved. | +| skipped_tests | list | optional | None | | A list of dictionaries specifying categories and, optionally, tests to skip.
Each dictionary must have a key category and can optionally include a tests key. | +|     category | str | optional | None | | The name of an AvdTest category \(e.g., AvdTestHardware\). | +|     tests | list | optional | None | | An optional list of specific tests in the category to skip \(e.g., VerifyRoutingProtocolModel in AvdTestBGP\).
If not specified, all tests in the category are considered.
For a complete list of available tests, see \[link to the test list\]\(https\://avd.sh/en/stable/roles/eos\_validate\_state/ANTA\-Preview.html\#test\-categories\). | +| cprofile_file | any | optional | None | | The filename for storing cProfile data, useful for debugging performance issues.
Be aware that enabling cProfile can affect performance, so use it only for troubleshooting. | ## Notes diff --git a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/inventory_to_container.md b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/inventory_to_container.md index 80c42a6c3c2..628e4d1786b 100644 --- a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/inventory_to_container.md +++ b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/inventory_to_container.md @@ -23,12 +23,12 @@ Transform information from ansible inventory to be able to provision CloudVision | Argument | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | -| inventory | str | False | None | | Optional YAML inventory file to parse. If not set the loaded inventory will be parsed. | -| container_root | str | True | None | | Ansible group name to consider to be Root of our topology. | -| configlet_dir | str | False | None | | Directory where intended configurations are located. | -| configlet_prefix | str | False | AVD | | Prefix to put on configlet. | -| destination | str | False | None | | Optional path to save variable. | -| device_filter | list | False | ['all'] | | Filter to apply intended mode on a set of configlet. If not used, then module only uses ADD mode. device\_filter list devices that can be modified or deleted based on configlets entries. | +| inventory | str | False | None | | Optional YAML inventory file to parse. If not set the loaded inventory will be parsed. | +| container_root | str | True | None | | Ansible group name to consider to be Root of our topology. | +| configlet_dir | str | False | None | | Directory where intended configurations are located. | +| configlet_prefix | str | False | AVD | | Prefix to put on configlet. | +| destination | str | False | None | | Optional path to save variable. | +| device_filter | list | False | ['all'] | | Filter to apply intended mode on a set of configlet. If not used, then module only uses ADD mode. device\_filter list devices that can be modified or deleted based on configlets entries. | ## Examples diff --git a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/validate_and_template.md b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/validate_and_template.md index e18c2d4f2f8..2cda8bfec5b 100644 --- a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/validate_and_template.md +++ b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/validate_and_template.md @@ -29,15 +29,15 @@ For Markdown files the plugin can also run md\_toc on the output before writing | Argument | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | -| template | str | True | None | | Path to Jinja2 Template file | -| dest | str | True | None | | Destination path. The rendered template will be written to this file | -| mode | str | False | None | | File mode for dest file. | -| schema | dict | False | None | | Schema conforming to \"AVD Meta Schema\". Either schema or schema\_id must be set. | -| schema_id | str | False | None | Valid values:
- eos_cli_config_gen
- eos_designs | ID of Schema conforming to \"AVD Meta Schema\". Either schema or schema\_id must be set. | -| add_md_toc | bool | False | None | | Run md\_toc on the output before writing to the file. | -| md_toc_skip_lines | int | False | 0 | | Pass this value as skip\_lines to add\_md\_toc. | -| conversion_mode | str | False | debug | Valid values:
- warning
- info
- debug
- quiet
- disabled | Run data conversion in either \"warning\", \"info\", \"debug\", \"quiet\" or \"disabled\" mode.
Conversion will perform type conversion of input variables as defined in the schema.
Conversion is intended to help the user to identify minor issues with the input data, while still allowing the data to be validated.
During conversion, messages will generated with information about the host\(s\) and key\(s\) which required conversion.
conversion\_mode\:disabled means that conversion will not run.
conversion\_mode\:error will produce error messages and fail the task.
conversion\_mode\:warning will produce warning messages.
conversion\_mode\:info will produce regular log messages.
conversion\_mode\:debug will produce hidden messages viewable with \-v.
conversion\_mode\:quiet will not produce any messages. | -| validation_mode | str | False | warning | Valid values:
- error
- warning
- info
- debug
- disabled | Run validation in either \"error\", \"warning\", \"info\", \"debug\" or \"disabled\" mode.
Validation will validate the input variables according to the schema.
During validation, messages will generated with information about the host\(s\) and key\(s\) which failed validation.
validation\_mode\:disabled means that validation will not run.
validation\_mode\:error will produce error messages and fail the task.
validation\_mode\:warning will produce warning messages.
validation\_mode\:info will produce regular log messages.
validation\_mode\:debug will produce hidden messages viewable with \-v. | +| template | str | True | None | | Path to Jinja2 Template file | +| dest | str | True | None | | Destination path. The rendered template will be written to this file | +| mode | str | False | None | | File mode for dest file. | +| schema | dict | False | None | | Schema conforming to \"AVD Meta Schema\". Either schema or schema\_id must be set. | +| schema_id | str | False | None | Valid values:
- eos_cli_config_gen
- eos_designs | ID of Schema conforming to \"AVD Meta Schema\". Either schema or schema\_id must be set. | +| add_md_toc | bool | False | None | | Run md\_toc on the output before writing to the file. | +| md_toc_skip_lines | int | False | 0 | | Pass this value as skip\_lines to add\_md\_toc. | +| conversion_mode | str | False | debug | Valid values:
- warning
- info
- debug
- quiet
- disabled | Run data conversion in either \"warning\", \"info\", \"debug\", \"quiet\" or \"disabled\" mode.
Conversion will perform type conversion of input variables as defined in the schema.
Conversion is intended to help the user to identify minor issues with the input data, while still allowing the data to be validated.
During conversion, messages will generated with information about the host\(s\) and key\(s\) which required conversion.
conversion\_mode\:disabled means that conversion will not run.
conversion\_mode\:error will produce error messages and fail the task.
conversion\_mode\:warning will produce warning messages.
conversion\_mode\:info will produce regular log messages.
conversion\_mode\:debug will produce hidden messages viewable with \-v.
conversion\_mode\:quiet will not produce any messages. | +| validation_mode | str | False | warning | Valid values:
- error
- warning
- info
- debug
- disabled | Run validation in either \"error\", \"warning\", \"info\", \"debug\" or \"disabled\" mode.
Validation will validate the input variables according to the schema.
During validation, messages will generated with information about the host\(s\) and key\(s\) which failed validation.
validation\_mode\:disabled means that validation will not run.
validation\_mode\:error will produce error messages and fail the task.
validation\_mode\:warning will produce warning messages.
validation\_mode\:info will produce regular log messages.
validation\_mode\:debug will produce hidden messages viewable with \-v. | ## Examples diff --git a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/verify_requirements.md b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/verify_requirements.md index 9b9cb021c11..43bdf1632d2 100644 --- a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/verify_requirements.md +++ b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/verify_requirements.md @@ -30,8 +30,8 @@ The \`arista.avd.verify\_requirements\` module is an Ansible Action Plugin provi | Argument | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | -| requirements | list | True | None | | List of strings of python requirements with pip file syntax. | -| avd_ignore_requirements | bool | False | False | | Boolean, if set to True, the play does not stop if any requirement error is detected. | +| requirements | list | True | None | | List of strings of python requirements with pip file syntax. | +| avd_ignore_requirements | bool | False | False | | Boolean, if set to True, the play does not stop if any requirement error is detected. | ## Examples diff --git a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/yaml_templates_to_facts.md b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/yaml_templates_to_facts.md index e26d3114654..b73edd78dee 100644 --- a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/yaml_templates_to_facts.md +++ b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/yaml_templates_to_facts.md @@ -23,25 +23,25 @@ Set facts from YAML produced by Jinja2 templates | Argument | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | -| root_key | str | False | None | | Root key under which the facts will be defined. If not set the facts well be set directly on root level. | -| schema | dict | False | None | | Schema conforming to \"AVD Meta Schema\". Either schema or schema\_id must be set. | -| schema_id | str | False | None | Valid values:
- eos_cli_config_gen
- eos_designs | ID of Schema conforming to \"AVD Meta Schema\". Either schema or schema\_id must be set. | -| templates | list | True | None | | List of dicts for Jinja templates to be run. | -| template | str | False | None | | Template file. Either template or python\_module must be set. | -| python_module | str | False | None | | Python module to import. Either template or python\_module must be set. | -| python_class_name | str | False | AvdStructuredConfig | | Name of Python Class to import. | -| options | dict | False | None | | Template options. | -| list_merge | str | False | append | | Merge strategy for lists | -| strip_empty_keys | bool | False | True | | Filter out keys from the generated output if value is null/none/undefined. Only applies to templates. | -| debug | bool | False | None | | Output list \'avd\_yaml\_templates\_to\_facts\_debug\' with timestamps of each performed action. | -| dest | str | False | None | | Destination path. If set, the output facts will also be written to this path.
Autodetects data format based on file suffix. \'.yml\', \'.yaml\' \-\> YAML, default \-\> JSON | -| mode | str | False | None | | File mode \(ex. 0664\) for dest file. See \'ansible.builtin.copy\' module for details. | -| template_output | bool | False | None | | If true, the output data will be run through another jinja2 rendering before returning.
This is to resolve any input values with inline jinja using variables/facts set by the input templates. | -| conversion_mode | str | False | debug | Valid values:
- error
- warning
- info
- debug
- quiet
- disabled | Run data conversion in either \"error\", \"warning\", \"info\", \"debug\", \"quiet\" or \"disabled\" mode.
Conversion will perform type conversion of input variables as defined in the schema.
Conversion is intended to help the user to identify minor issues with the input data, while still allowing the data to be validated.
During conversion, messages will be generated with information about the host\(s\) and key\(s\) which required conversion.
conversion\_mode\:disabled means that conversion will not run.
conversion\_mode\:error will produce error messages and fail the task.
conversion\_mode\:warning will produce warning messages.
conversion\_mode\:info will produce regular log messages.
conversion\_mode\:debug will produce hidden messages viewable with \-v.
conversion\_mode\:quiet will not produce any messages. | -| validation_mode | str | False | warning | Valid values:
- error
- warning
- info
- debug
- disabled | Run validation in either \"error\", \"warning\", \"info\", \"debug\" or \"disabled\" mode.
Validation will validate the input variables according to the schema.
During validation, messages will be generated with information about the host\(s\) and key\(s\) which failed validation.
validation\_mode\:disabled means that validation will not run.
validation\_mode\:error will produce error messages and fail the task.
validation\_mode\:warning will produce warning messages.
validation\_mode\:info will produce regular log messages.
validation\_mode\:debug will produce hidden messages viewable with \-v. | -| output_schema | dict | False | None | | AVD Schema for output data. Used for automatic merge of data. | -| output_schema_id | str | False | None | Valid values:
- eos_cli_config_gen
- eos_designs | ID of AVD Schema for output data. Used for automatic merge of data. | -| set_switch_fact | bool | False | True | | Set \"switch\" fact from on \"avd\_switch\_facts.\.switch\" | +| root_key | str | False | None | | Root key under which the facts will be defined. If not set the facts well be set directly on root level. | +| schema | dict | False | None | | Schema conforming to \"AVD Meta Schema\". Either schema or schema\_id must be set. | +| schema_id | str | False | None | Valid values:
- eos_cli_config_gen
- eos_designs | ID of Schema conforming to \"AVD Meta Schema\". Either schema or schema\_id must be set. | +| templates | list | True | None | | List of dicts for Jinja templates to be run. | +|     template | str | False | None | | Template file. Either template or python\_module must be set. | +|     python_module | str | False | None | | Python module to import. Either template or python\_module must be set. | +|     python_class_name | str | False | AvdStructuredConfig | | Name of Python Class to import. | +|     options | dict | False | None | | Template options. | +|         list_merge | str | False | append | | Merge strategy for lists | +|         strip_empty_keys | bool | False | True | | Filter out keys from the generated output if value is null/none/undefined. Only applies to templates. | +| debug | bool | False | None | | Output list \'avd\_yaml\_templates\_to\_facts\_debug\' with timestamps of each performed action. | +| dest | str | False | None | | Destination path. If set, the output facts will also be written to this path.
Autodetects data format based on file suffix. \'.yml\', \'.yaml\' \-\> YAML, default \-\> JSON | +| mode | str | False | None | | File mode \(ex. 0664\) for dest file. See \'ansible.builtin.copy\' module for details. | +| template_output | bool | False | None | | If true, the output data will be run through another jinja2 rendering before returning.
This is to resolve any input values with inline jinja using variables/facts set by the input templates. | +| conversion_mode | str | False | debug | Valid values:
- error
- warning
- info
- debug
- quiet
- disabled | Run data conversion in either \"error\", \"warning\", \"info\", \"debug\", \"quiet\" or \"disabled\" mode.
Conversion will perform type conversion of input variables as defined in the schema.
Conversion is intended to help the user to identify minor issues with the input data, while still allowing the data to be validated.
During conversion, messages will be generated with information about the host\(s\) and key\(s\) which required conversion.
conversion\_mode\:disabled means that conversion will not run.
conversion\_mode\:error will produce error messages and fail the task.
conversion\_mode\:warning will produce warning messages.
conversion\_mode\:info will produce regular log messages.
conversion\_mode\:debug will produce hidden messages viewable with \-v.
conversion\_mode\:quiet will not produce any messages. | +| validation_mode | str | False | warning | Valid values:
- error
- warning
- info
- debug
- disabled | Run validation in either \"error\", \"warning\", \"info\", \"debug\" or \"disabled\" mode.
Validation will validate the input variables according to the schema.
During validation, messages will be generated with information about the host\(s\) and key\(s\) which failed validation.
validation\_mode\:disabled means that validation will not run.
validation\_mode\:error will produce error messages and fail the task.
validation\_mode\:warning will produce warning messages.
validation\_mode\:info will produce regular log messages.
validation\_mode\:debug will produce hidden messages viewable with \-v. | +| output_schema | dict | False | None | | AVD Schema for output data. Used for automatic merge of data. | +| output_schema_id | str | False | None | Valid values:
- eos_cli_config_gen
- eos_designs | ID of AVD Schema for output data. Used for automatic merge of data. | +| set_switch_fact | bool | False | True | | Set \"switch\" fact from on \"avd\_switch\_facts.\.switch\" | ## Examples diff --git a/ansible_collections/arista/avd/docs/plugins/Test_plugins/contains.md b/ansible_collections/arista/avd/docs/plugins/Test_plugins/contains.md index 46e2fedea96..8db4db0cd40 100644 --- a/ansible_collections/arista/avd/docs/plugins/Test_plugins/contains.md +++ b/ansible_collections/arista/avd/docs/plugins/Test_plugins/contains.md @@ -25,8 +25,8 @@ The test accepts either a single test\_value or a list of test\_values. | Argument | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | -| _input | list | True | None | | List of items to test. | -| test_value | any | optional | None | | Single item or list of items to test for in value. | +| _input | list | True | None | | List of items to test. | +| test_value | any | optional | None | | Single item or list of items to test for in value. | ## Examples diff --git a/ansible_collections/arista/avd/docs/plugins/Test_plugins/defined.md b/ansible_collections/arista/avd/docs/plugins/Test_plugins/defined.md index b7e7dfb41e7..548b316f893 100644 --- a/ansible_collections/arista/avd/docs/plugins/Test_plugins/defined.md +++ b/ansible_collections/arista/avd/docs/plugins/Test_plugins/defined.md @@ -31,11 +31,11 @@ Compared to the built\-in is defined test, this test will also test | Argument | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | -| _input | any | True | None | | Value to test | -| test_value | any | optional | None | | Value to match for in addition to defined and not none | -| var_type | string | optional | None | Valid values:
- float
- int
- str
- list
- dict
- tuple
- bool | Type or Class to test for | -| fail_action | string | optional | None | Valid values:
- warning
- error | Optional action if a test fails to emit a Warning or Error | -| var_name | string | optional | None | | Optional string to use as a variable name in warning or error messages | +| _input | any | True | None | | Value to test | +| test_value | any | optional | None | | Value to match for in addition to defined and not none | +| var_type | string | optional | None | Valid values:
- float
- int
- str
- list
- dict
- tuple
- bool | Type or Class to test for | +| fail_action | string | optional | None | Valid values:
- warning
- error | Optional action if a test fails to emit a Warning or Error | +| var_name | string | optional | None | | Optional string to use as a variable name in warning or error messages | ## Examples diff --git a/ansible_collections/arista/avd/docs/plugins/Vars_plugins/global_vars.md b/ansible_collections/arista/avd/docs/plugins/Vars_plugins/global_vars.md index 456eb794b35..accc0be4224 100644 --- a/ansible_collections/arista/avd/docs/plugins/Vars_plugins/global_vars.md +++ b/ansible_collections/arista/avd/docs/plugins/Vars_plugins/global_vars.md @@ -69,9 +69,9 @@ The below requirements are needed on the host that executes this module. | Argument | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | -| paths | list | True | None | | List of relative paths relative to the inventory file.
If path is a directory, all the valid files inside are loaded alphabetically.
If the environment variable is set, it takes precedence over ansible.cfg. | -| stage | any | optional | inventory | Valid values:
- inventory | The stage during which executing the plugin. It could be \'inventory\' or \'task\'
Given the expected usage of this plugin at the beginning of the run. It is hard\-coded to \'inventory\' | -| _valid_extensions | list | optional | ['.yml', '.yaml', '.json'] | | Check all of these extensions when looking for \'variable\' files, which should be YAML, JSON, or vaulted versions.
This affects vars\_files, include\_vars, inventory, and vars plugins, among others. | +| paths | list | True | None | | List of relative paths relative to the inventory file.
If path is a directory, all the valid files inside are loaded alphabetically.
If the environment variable is set, it takes precedence over ansible.cfg. | +| stage | any | optional | inventory | Valid values:
- inventory | The stage during which executing the plugin. It could be \'inventory\' or \'task\'
Given the expected usage of this plugin at the beginning of the run. It is hard\-coded to \'inventory\' | +| _valid_extensions | list | optional | ['.yml', '.yaml', '.json'] | | Check all of these extensions when looking for \'variable\' files, which should be YAML, JSON, or vaulted versions.
This affects vars\_files, include\_vars, inventory, and vars plugins, among others. | ## Authors diff --git a/ansible_collections/arista/avd/docs/templates/plugin-docs.j2 b/ansible_collections/arista/avd/docs/templates/plugin-docs.j2 index 9dcdc743de1..f5b649da999 100644 --- a/ansible_collections/arista/avd/docs/templates/plugin-docs.j2 +++ b/ansible_collections/arista/avd/docs/templates/plugin-docs.j2 @@ -37,7 +37,7 @@ title: {{ collection | default("arista.avd", true) ~ "." ~ module }} {% set _ = restrictions.append("Max value: " ~ spec.max ~ "") %} {% endif %} {% set description = spec.description | map("md_ify") | map("replace", "\.", ".") | map("replace", "\,", ",") | join("
") %} -| {{ " " * level }}{{ name }} | {{ typ }} | {{ req }} | {{ def_val }} | {{ restrictions | join("
") }} | {{ description }} | +| {{ " " * 4 * level }}{{ name }} | {{ typ }} | {{ req }} | {{ def_val }} | {{ restrictions | join("
") }} | {{ description }} | {% if spec.suboptions %} {{ option_desc(spec.suboptions, level + 1) -}} {% endif %} diff --git a/ansible_collections/arista/avd/meta/runtime.yml b/ansible_collections/arista/avd/meta/runtime.yml index c0e50fb71f5..038871f6cd6 100644 --- a/ansible_collections/arista/avd/meta/runtime.yml +++ b/ansible_collections/arista/avd/meta/runtime.yml @@ -1,2 +1,9 @@ --- requires_ansible: '>=2.14.0,<2.17.0' +plugin_routing: + filter: + hash_passphrase: + redirect: arista.avd.snmp_hash + deprecation: + removal_version: 5.0.0 + warning_text: Use arista.avd.snmp_hash instead diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/dhcp-servers.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/dhcp-servers.md new file mode 100644 index 00000000000..2708a3b1c48 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/dhcp-servers.md @@ -0,0 +1,135 @@ +# dhcp-servers + +## Table of Contents + +- [Management](#management) + - [Management Interfaces](#management-interfaces) +- [DHCP Server](#dhcp-server) + - [DHCP Servers Summary](#dhcp-servers-summary) + - [DHCP Server Configuration](#dhcp-server-configuration) + +## Management + +### Management Interfaces + +#### Management Interfaces Summary + +##### IPv4 + +| Management Interface | description | Type | VRF | IP Address | Gateway | +| -------------------- | ----------- | ---- | --- | ---------- | ------- | +| Management1 | oob_management | oob | MGMT | 10.73.255.122/24 | 10.73.255.2 | + +##### IPv6 + +| Management Interface | description | Type | VRF | IPv6 Address | IPv6 Gateway | +| -------------------- | ----------- | ---- | --- | ------------ | ------------ | +| Management1 | oob_management | oob | MGMT | - | - | + +#### Management Interfaces Device Configuration + +```eos +! +interface Management1 + description oob_management + vrf MGMT + ip address 10.73.255.122/24 +``` + +## DHCP Server + +### DHCP Servers Summary + +| DHCP Server Enabled | VRF | IPv4 DNS Domain | IPv6 DNS Domain | +| ------------------- | --- | --------------- | --------------- | +| True | AVRF | - | - | +| True | defauls | - | - | +| True | default | - | - | +| True | defaulu | - | - | +| True | TEST | testv4.com | testv6.com | +| False | VRF01 | - | - | + +#### VRF AVRF DHCP Server + +##### Subnets + +| Subnet | Name | DNS Servers | Default Gateway | Lease Time | Ranges | +| ------ | ---- | ----------- | --------------- | ---------- | ------ | +| 172.16.254.0/24 | - | - | 172.16.254.1 | - | - | + +#### VRF default DHCP Server + +##### Subnets + +| Subnet | Name | DNS Servers | Default Gateway | Lease Time | Ranges | +| ------ | ---- | ----------- | --------------- | ---------- | ------ | +| 2a00:2::/64 | - | - | - | - | - | +| 10.2.3.0/24 | - | - | - | - | - | + +#### VRF TEST DHCP Server + +##### Subnets + +| Subnet | Name | DNS Servers | Default Gateway | Lease Time | Ranges | +| ------ | ---- | ----------- | --------------- | ---------- | ------ | +| 10.0.0.0/24 | TEST1 | 10.1.1.12, 10.1.1.13 | 10.0.0.1 | 0 days, 0 hours, 10 minutes | 10.0.0.10-10.0.0.100, 10.0.0.110-10.0.0.120 | + +##### IPv4 Vendor Options + +| Vendor ID | Sub-option Code | Sub-option Type | Sub-option Data | +| --------- | ----------------| --------------- | --------------- | +| NTP | 1 | string | test | +| NTP | 42 | ipv4-address | 10.1.1.1 | +| NTP | 66 | array ipv4-address | 1.1.1.1 2.2.2.2 | + +#### VRF VRF01 DHCP Server + +##### Subnets + +| Subnet | Name | DNS Servers | Default Gateway | Lease Time | Ranges | +| ------ | ---- | ----------- | --------------- | ---------- | ------ | +| 192.168.0.0/24 | - | - | - | - | - | + +### DHCP Server Configuration + +```eos +! +dhcp server vrf AVRF + ! + subnet 172.16.254.0/24 + default-gateway 172.16.254.1 +! +dhcp server vrf defauls +! +dhcp server + ! + subnet 2a00:2::/64 + ! + subnet 10.2.3.0/24 +! +dhcp server vrf defaulu +! +dhcp server vrf TEST + dns domain name ipv4 testv4.com + dns domain name ipv6 testv6.com + ! + subnet 10.0.0.0/24 + ! + range 10.0.0.10 10.0.0.100 + ! + range 10.0.0.110 10.0.0.120 + name TEST1 + dns server 10.1.1.12 10.1.1.13 + lease time 0 days 0 hours 10 minutes + default-gateway 10.0.0.1 + ! + vendor-option ipv4 NTP + sub-option 1 type string data "test" + sub-option 42 type ipv4-address data 10.1.1.1 + sub-option 66 type array ipv4-address data 1.1.1.1 2.2.2.2 +! +dhcp server vrf VRF01 + ! + subnet 192.168.0.0/24 + disabled +``` diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-base.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-base.md index f9c7d7140c6..f85849ead7f 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-base.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-base.md @@ -98,7 +98,7 @@ interface Management1 | Neighbor | Remote AS | VRF | Shutdown | Send-community | Maximum-routes | Allowas-in | BFD | RIB Pre-Policy Retain | Route-Reflector Client | Passive | | -------- | --------- | --- | -------- | -------------- | -------------- | ---------- | --- | --------------------- | ---------------------- | ------- | -| 192.0.3.1 | 65432 | default | - | all | - | - | True | True | - | True | +| 192.0.3.1 | 65432 | default | - | all | - | - | True(interval: 2000, min_rx: 2000, multiplier: 3) | True | - | True | | 192.0.3.2 | 65433 | default | - | extended | 10000 | - | False | True (All) | - | - | | 192.0.3.3 | 65434 | default | - | standard | - | - | - | True | - | - | | 192.0.3.4 | 65435 | default | - | large | - | - | - | False | - | - | @@ -165,6 +165,7 @@ router bgp 65101 neighbor 192.0.3.1 as-path remote-as replace out neighbor 192.0.3.1 as-path prepend-own disabled neighbor 192.0.3.1 bfd + neighbor 192.0.3.1 bfd interval 2000 min-rx 2000 multiplier 3 neighbor 192.0.3.1 rib-in pre-policy retain neighbor 192.0.3.1 passive neighbor 192.0.3.1 session tracker ST1 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-evpn.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-evpn.md index 4c52d277964..6151be040d8 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-evpn.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-evpn.md @@ -65,6 +65,7 @@ interface Management1 | Remote AS | 65001 | | Source | Loopback0 | | BFD | True | +| BFD Timers | interval: 2000, min_rx: 2000, multiplier: 3 | | Ebgp multihop | 3 | | Send community | all | | Maximum routes | 0 (no limit) | @@ -83,8 +84,8 @@ interface Management1 | Neighbor | Remote AS | VRF | Shutdown | Send-community | Maximum-routes | Allowas-in | BFD | RIB Pre-Policy Retain | Route-Reflector Client | Passive | | -------- | --------- | --- | -------- | -------------- | -------------- | ---------- | --- | --------------------- | ---------------------- | ------- | -| 192.168.255.1 | Inherited from peer group EVPN-OVERLAY-PEERS | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | Allowed, allowed 5 times | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | -| 192.168.255.2 | Inherited from peer group EVPN-OVERLAY-PEERS | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | +| 192.168.255.1 | Inherited from peer group EVPN-OVERLAY-PEERS | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | Allowed, allowed 5 times | Inherited from peer group EVPN-OVERLAY-PEERS(interval: 2000, min_rx: 2000, multiplier: 3) | - | - | - | +| 192.168.255.2 | Inherited from peer group EVPN-OVERLAY-PEERS | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS(interval: 2000, min_rx: 2000, multiplier: 3) | - | - | - | | 192.168.255.3 | - | default | - | - | 52000 (warning-limit 2000, warning-only) | Allowed, allowed 5 times | - | - | - | - | | 10.255.251.1 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | TENANT_A_PROJECT01 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | 15000 (warning-limit 50 percent) | - | - | - | - | - | | 10.255.251.1 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | TENANT_A_PROJECT02 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | @@ -171,6 +172,7 @@ router bgp 65101 neighbor EVPN-OVERLAY-PEERS remote-as 65001 neighbor EVPN-OVERLAY-PEERS update-source Loopback0 neighbor EVPN-OVERLAY-PEERS bfd + neighbor EVPN-OVERLAY-PEERS bfd interval 2000 min-rx 2000 multiplier 3 neighbor EVPN-OVERLAY-PEERS allowas-in neighbor EVPN-OVERLAY-PEERS ebgp-multihop 3 neighbor EVPN-OVERLAY-PEERS password 7 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-vrf-lite.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-vrf-lite.md index 8d1ccf8cb92..7fa97747a17 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-vrf-lite.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-vrf-lite.md @@ -92,6 +92,7 @@ ip route vrf BLUE-C1 193.1.2.0/24 Null0 | Address Family | ipv4 | | Remote AS | 65000 | | BFD | True | +| BFD Timers | interval: 2000, min_rx: 2000, multiplier: 3 | ##### SEDI @@ -128,18 +129,18 @@ ip route vrf BLUE-C1 193.1.2.0/24 Null0 | Neighbor | Remote AS | VRF | Shutdown | Send-community | Maximum-routes | Allowas-in | BFD | RIB Pre-Policy Retain | Route-Reflector Client | Passive | | -------- | --------- | --- | -------- | -------------- | -------------- | ---------- | --- | --------------------- | ---------------------- | ------- | -| 10.1.1.0 | Inherited from peer group OBS_WAN | BLUE-C1 | - | - | - | - | Inherited from peer group OBS_WAN | - | - | - | +| 10.1.1.0 | Inherited from peer group OBS_WAN | BLUE-C1 | - | - | - | - | Inherited from peer group OBS_WAN(interval: 2000, min_rx: 2000, multiplier: 3) | - | - | - | | 10.255.1.1 | Inherited from peer group WELCOME_ROUTERS | BLUE-C1 | - | - | - | - | - | - | True | - | | 101.0.3.1 | Inherited from peer group SEDI | BLUE-C1 | - | - | - | - | - | - | - | - | | 101.0.3.2 | Inherited from peer group SEDI | BLUE-C1 | True | - | - | Allowed, allowed 3 (default) times | - | - | - | - | | 101.0.3.3 | - | BLUE-C1 | Inherited from peer group SEDI-shut | - | - | Allowed, allowed 5 times | - | - | - | - | | 101.0.3.4 | Inherited from peer group TEST-PASSIVE | BLUE-C1 | - | - | - | - | - | - | - | Inherited from peer group TEST-PASSIVE | | 101.0.3.5 | Inherited from peer group WELCOME_ROUTERS | BLUE-C1 | - | - | - | - | False | - | - | True | -| 101.0.3.6 | Inherited from peer group WELCOME_ROUTERS | BLUE-C1 | - | - | - | - | True | - | - | - | +| 101.0.3.6 | Inherited from peer group WELCOME_ROUTERS | BLUE-C1 | - | - | - | - | True(interval: 2500, min_rx: 2000, multiplier: 3) | - | - | - | | 101.0.3.7 | - | BLUE-C1 | - | - | - | - | True | - | - | - | | 101.0.3.8 | - | BLUE-C1 | - | - | - | - | False | - | - | - | -| 10.1.1.0 | Inherited from peer group OBS_WAN | RED-C1 | - | - | - | - | Inherited from peer group OBS_WAN | - | - | - | -| 10.1.1.0 | Inherited from peer group OBS_WAN | YELLOW-C1 | - | - | - | - | Inherited from peer group OBS_WAN | - | - | - | +| 10.1.1.0 | Inherited from peer group OBS_WAN | RED-C1 | - | - | - | - | Inherited from peer group OBS_WAN(interval: 2000, min_rx: 2000, multiplier: 3) | - | - | - | +| 10.1.1.0 | Inherited from peer group OBS_WAN | YELLOW-C1 | - | - | - | - | Inherited from peer group OBS_WAN(interval: 2000, min_rx: 2000, multiplier: 3) | - | - | - | #### Router BGP VRFs @@ -165,6 +166,7 @@ router bgp 65001 neighbor OBS_WAN as-path prepend-own disabled neighbor OBS_WAN description BGP Connection to OBS WAN CPE neighbor OBS_WAN bfd + neighbor OBS_WAN bfd interval 2000 min-rx 2000 multiplier 3 neighbor SEDI peer group neighbor SEDI remote-as 65003 neighbor SEDI update-source Loopback101 @@ -211,6 +213,7 @@ router bgp 65001 no neighbor 101.0.3.5 bfd neighbor 101.0.3.6 peer group WELCOME_ROUTERS neighbor 101.0.3.6 bfd + neighbor 101.0.3.6 bfd interval 2500 min-rx 2000 multiplier 3 neighbor 101.0.3.7 bfd aggregate-address 0.0.0.0/0 as-set summary-only attribute-map RM-BGP-AGG-APPLY-SET aggregate-address 193.1.0.0/16 as-set summary-only attribute-map RM-BGP-AGG-APPLY-SET diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/dhcp-servers.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/dhcp-servers.cfg new file mode 100644 index 00000000000..1981af26a47 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/dhcp-servers.cfg @@ -0,0 +1,54 @@ +!RANCID-CONTENT-TYPE: arista +! +dhcp server vrf AVRF + ! + subnet 172.16.254.0/24 + default-gateway 172.16.254.1 +! +dhcp server vrf defauls +! +dhcp server + ! + subnet 2a00:2::/64 + ! + subnet 10.2.3.0/24 +! +dhcp server vrf defaulu +! +dhcp server vrf TEST + dns domain name ipv4 testv4.com + dns domain name ipv6 testv6.com + ! + subnet 10.0.0.0/24 + ! + range 10.0.0.10 10.0.0.100 + ! + range 10.0.0.110 10.0.0.120 + name TEST1 + dns server 10.1.1.12 10.1.1.13 + lease time 0 days 0 hours 10 minutes + default-gateway 10.0.0.1 + ! + vendor-option ipv4 NTP + sub-option 1 type string data "test" + sub-option 42 type ipv4-address data 10.1.1.1 + sub-option 66 type array ipv4-address data 1.1.1.1 2.2.2.2 +! +dhcp server vrf VRF01 + ! + subnet 192.168.0.0/24 + disabled +! +transceiver qsfp default-mode 4x10G +! +hostname dhcp-servers +! +no enable password +no aaa root +! +interface Management1 + description oob_management + vrf MGMT + ip address 10.73.255.122/24 +! +end diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-base.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-base.cfg index 7e9945a9046..59328d65c47 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-base.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-base.cfg @@ -43,6 +43,7 @@ router bgp 65101 neighbor 192.0.3.1 as-path remote-as replace out neighbor 192.0.3.1 as-path prepend-own disabled neighbor 192.0.3.1 bfd + neighbor 192.0.3.1 bfd interval 2000 min-rx 2000 multiplier 3 neighbor 192.0.3.1 rib-in pre-policy retain neighbor 192.0.3.1 passive neighbor 192.0.3.1 session tracker ST1 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-evpn.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-evpn.cfg index 66fc518f990..27ea71c6fca 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-evpn.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-evpn.cfg @@ -24,6 +24,7 @@ router bgp 65101 neighbor EVPN-OVERLAY-PEERS remote-as 65001 neighbor EVPN-OVERLAY-PEERS update-source Loopback0 neighbor EVPN-OVERLAY-PEERS bfd + neighbor EVPN-OVERLAY-PEERS bfd interval 2000 min-rx 2000 multiplier 3 neighbor EVPN-OVERLAY-PEERS allowas-in neighbor EVPN-OVERLAY-PEERS ebgp-multihop 3 neighbor EVPN-OVERLAY-PEERS password 7 q+VNViP5i4rVjW1cxFv2wA== diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-vrf-lite.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-vrf-lite.cfg index 7c5e057ec69..8db21597c38 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-vrf-lite.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-vrf-lite.cfg @@ -45,6 +45,7 @@ router bgp 65001 neighbor OBS_WAN as-path prepend-own disabled neighbor OBS_WAN description BGP Connection to OBS WAN CPE neighbor OBS_WAN bfd + neighbor OBS_WAN bfd interval 2000 min-rx 2000 multiplier 3 neighbor SEDI peer group neighbor SEDI remote-as 65003 neighbor SEDI update-source Loopback101 @@ -91,6 +92,7 @@ router bgp 65001 no neighbor 101.0.3.5 bfd neighbor 101.0.3.6 peer group WELCOME_ROUTERS neighbor 101.0.3.6 bfd + neighbor 101.0.3.6 bfd interval 2500 min-rx 2000 multiplier 3 neighbor 101.0.3.7 bfd aggregate-address 0.0.0.0/0 as-set summary-only attribute-map RM-BGP-AGG-APPLY-SET aggregate-address 193.1.0.0/16 as-set summary-only attribute-map RM-BGP-AGG-APPLY-SET diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/dhcp-servers.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/dhcp-servers.yml new file mode 100644 index 00000000000..fa3a2b3f848 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/dhcp-servers.yml @@ -0,0 +1,47 @@ +dhcp_servers: + - vrf: defauls + - vrf: defaulu + - vrf: TEST + ipv4_vendor_options: + - vendor_id: NTP + sub_options: + - code: 42 + ipv4_address: "10.1.1.1" + - code: 1 + string: "test" + - code: 66 + array_ipv4_address: [1.1.1.1, 2.2.2.2] + disabled: false + dns_domain_name_ipv4: testv4.com + dns_domain_name_ipv6: testv6.com + subnets: + - subnet: 10.0.0.0/24 # required + name: TEST1 + ranges: + - start: 10.0.0.110 # required + end: 10.0.0.120 # required + - start: 10.0.0.10 # required + end: 10.0.0.100 # required + dns_servers: + - 10.1.1.12 + - 10.1.1.13 + lease_time: + days: 0 + hours: 0 + minutes: 10 + default_gateway: 10.0.0.1 + + - vrf: default + subnets: + - subnet: 10.2.3.0/24 + - subnet: 2a00:2::/64 + + - vrf: VRF01 + subnets: + - subnet: 192.168.0.0/24 + disabled: true + + - vrf: AVRF + subnets: + - subnet: 172.16.254.0/24 + default_gateway: 172.16.254.1 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-base.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-base.yml index 900caeb4117..72dc9fada75 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-base.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-base.yml @@ -133,6 +133,10 @@ router_bgp: session_tracker: ST1 # Testing bfd true OUTSIDE a peer group that should render bfd: true + bfd_timers: + interval: 2000 + min_rx: 2000 + multiplier: 3 - ip_address: 192.0.3.2 remote_as: 65433 send_community: extended diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-evpn.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-evpn.yml index f4dd422a3f2..34030c02dae 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-evpn.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-evpn.yml @@ -16,6 +16,10 @@ router_bgp: remote_as: 65001 update_source: Loopback0 bfd: true + bfd_timers: + interval: 2000 + min_rx: 2000 + multiplier: 3 ebgp_multihop: 3 password: "q+VNViP5i4rVjW1cxFv2wA==" send_community: all diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-vrf-lite.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-vrf-lite.yml index ac6dfa8d4a9..b4ea90740ee 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-vrf-lite.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-vrf-lite.yml @@ -46,6 +46,10 @@ router_bgp: remote_as_replace_out: true prepend_own_disabled: true bfd: true + bfd_timers: + interval: 2000 + min_rx: 2000 + multiplier: 3 - name: WELCOME_ROUTERS type: ipv4 description: 'BGP Connection to WELCOME ROUTER 02' @@ -119,6 +123,10 @@ router_bgp: - ip_address: 101.0.3.6 peer_group: WELCOME_ROUTERS bfd: true + bfd_timers: + interval: 2500 + min_rx: 2000 + multiplier: 3 # Testing bfd true OUTSIDE a peer group that should render - ip_address: 101.0.3.7 bfd: true diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/hosts.ini b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/hosts.ini index 7f33add2a2a..c95101cb1c0 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/hosts.ini +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/hosts.ini @@ -20,6 +20,7 @@ daemons dps-interfaces dns-ntp dhcp-relay +dhcp-servers dot1x dot1x-2 enable-password diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/invalid-wan-role-cv-pathfinder-role-1.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/invalid-wan-role-cv-pathfinder-role-1.yml index 1113c85c3ed..e36355fb9e4 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/invalid-wan-role-cv-pathfinder-role-1.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/invalid-wan-role-cv-pathfinder-role-1.yml @@ -4,6 +4,14 @@ type: wan_edge bgp_as: 65000 +wan_carriers: + - name: MPLS + path_group: MPLS + +wan_path_groups: + - name: MPLS + id: 42 + wan_edge: defaults: loopback_ipv4_pool: 192.168.0.0/24 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/invalid-wan-role-cv-pathfinder-role-2.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/invalid-wan-role-cv-pathfinder-role-2.yml index 857729aec06..201fd318883 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/invalid-wan-role-cv-pathfinder-role-2.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/invalid-wan-role-cv-pathfinder-role-2.yml @@ -4,6 +4,14 @@ type: wan_rr bgp_as: 65000 +wan_carriers: + - name: MPLS + path_group: MPLS + +wan_path_groups: + - name: MPLS + id: 42 + wan_rr: defaults: loopback_ipv4_pool: 192.168.0.0/24 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/invalid-wan-role-overlay-routing-protocol.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/invalid-wan-role-overlay-routing-protocol.yml index 634b9f31e17..9258262254a 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/invalid-wan-role-overlay-routing-protocol.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/invalid-wan-role-overlay-routing-protocol.yml @@ -1,6 +1,7 @@ --- wan_mode: autovpn type: wan_edge +fabric_name: fabric_wan_role_overlay_routing_protocol # Not ibgp overlay_routing_protocol: none diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/hosts.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/hosts.yml index 010a74e8c92..4de229c3f17 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/hosts.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/hosts.yml @@ -45,6 +45,9 @@ all: invalid-uplink-port-channel-id-l3leaf-2: invalid-uplink-port-channel-id-l2leaf-1: invalid-uplink-port-channel-id-l2leaf-2: + fabric_wan_role_overlay_routing_protocol: + hosts: + invalid-wan-role-overlay-routing-protocol: EOS_DESIGNS_FAILURES: # Add cases that fail during 'eos_designs_structured_config' phase hosts: failure-port-channel: @@ -79,7 +82,6 @@ all: failure-duplicate-evpn-vlan-bundle-name: ntp-settings-server-vrf-missing-mgmt-ip: ntp-settings-server-vrf-missing-inband-mgmt-interface: - invalid-wan-role-overlay-routing-protocol: invalid-wan-role-cv-pathfinder-role-1: invalid-wan-role-cv-pathfinder-role-2: source-interfaces-domain-lookup-duplicate-vrf: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/autovpn-edge.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/autovpn-edge.cfg index 7a3672a0edc..f7d71815f9a 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/autovpn-edge.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/autovpn-edge.cfg @@ -10,7 +10,24 @@ hostname autovpn-edge ! router path-selection ! + path-group INET id 101 + ipsec profile AUTOVPN + ! + local interface Ethernet1 + stun server-profile INET-autovpn-rr1-Ethernet1 INET-autovpn-rr2-Ethernet1 + ! + peer dynamic + ! + peer static router-ip 192.168.31.1 + name autovpn-rr1 + ipv4 address 10.7.7.7 + ! + peer static router-ip 192.168.31.2 + name autovpn-rr2 + ipv4 address 10.8.8.8 + ! load-balance policy LBPOLICY + path-group INET ! policy dps-policy-default default-match @@ -48,6 +65,12 @@ interface Dps1 description DPS Interface tcp mss ceiling ipv4 1000 ! +interface Ethernet1 + no shutdown + no switchport + ip address dhcp + dhcp client accept default-route +! interface Loopback0 description Router_ID no shutdown @@ -100,4 +123,11 @@ management api http-commands vrf MGMT no shutdown ! +stun + client + server-profile INET-autovpn-rr1-Ethernet1 + ip address 10.7.7.7 + server-profile INET-autovpn-rr2-Ethernet1 + ip address 10.8.8.8 +! end diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/autovpn-rr1.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/autovpn-rr1.cfg index e9ac302212f..8c9e00d6f6a 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/autovpn-rr1.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/autovpn-rr1.cfg @@ -11,7 +11,17 @@ hostname autovpn-rr1 router path-selection peer dynamic source stun ! + path-group INET id 101 + ipsec profile AUTOVPN + ! + local interface Ethernet1 + ! + peer static router-ip 192.168.31.2 + name autovpn-rr2 + ipv4 address 10.8.8.8 + ! load-balance policy LBPOLICY + path-group INET ! policy dps-policy-default default-match @@ -46,6 +56,12 @@ interface Dps1 description DPS Interface tcp mss ceiling ipv4 1000 ! +interface Ethernet1 + no shutdown + no switchport + ip address dhcp + dhcp client accept default-route +! interface Loopback0 description Router_ID no shutdown @@ -111,5 +127,6 @@ management api http-commands ! stun server + local-interface Ethernet1 ! end diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/autovpn-rr2.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/autovpn-rr2.cfg index c0e59ba8dc2..e2301ad2e30 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/autovpn-rr2.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/autovpn-rr2.cfg @@ -11,7 +11,17 @@ hostname autovpn-rr2 router path-selection peer dynamic source stun ! + path-group INET id 101 + ipsec profile AUTOVPN + ! + local interface Ethernet1 + ! + peer static router-ip 192.168.31.1 + name autovpn-rr1 + ipv4 address 10.7.7.7 + ! load-balance policy LBPOLICY + path-group INET ! policy dps-policy-default default-match @@ -46,6 +56,11 @@ interface Dps1 description DPS Interface tcp mss ceiling ipv4 1000 ! +interface Ethernet1 + no shutdown + no switchport + ip address 10.8.8.8/31 +! interface Loopback0 description Router_ID no shutdown @@ -60,6 +75,8 @@ interface Vxlan1 ip routing no ip routing vrf MGMT ! +ip route 0.0.0.0/0 10.8.8.9 +! router bfd multihop interval 300 min-rx 300 multiplier 3 ! @@ -111,5 +128,6 @@ management api http-commands ! stun server + local-interface Ethernet1 ! end diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge.cfg index 037a1e25223..3cc0db26012 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge.cfg @@ -19,7 +19,28 @@ hostname cv-pathfinder-edge ! router path-selection ! + path-group INET id 101 + ipsec profile CP-PROFILE + ! + local interface Ethernet1 + stun server-profile INET-cv-pathfinder-pathfinder-Ethernet1 INET-cv-pathfinder-pathfinder-Ethernet3 + ! + peer dynamic + ! + peer static router-ip 192.168.44.1 + name cv-pathfinder-pathfinder + ipv4 address 10.7.7.7 + ipv4 address 10.9.9.9 + ! + path-group MPLS id 100 + ! + local interface Ethernet2 + ! + peer dynamic + ! load-balance policy LBPOLICY + path-group INET + path-group MPLS ! router adaptive-virtual-topology topology role edge @@ -74,6 +95,19 @@ interface Dps1 flow tracker hardware WAN-FLOW-TRACKER tcp mss ceiling ipv4 1000 ! +interface Ethernet1 + no shutdown + no switchport + flow tracker hardware WAN-FLOW-TRACKER + ip address dhcp + dhcp client accept default-route +! +interface Ethernet2 + no shutdown + no switchport + flow tracker hardware WAN-FLOW-TRACKER + ip address 172.15.5.5/31 +! interface Loopback0 description Router_ID no shutdown @@ -131,4 +165,11 @@ management api http-commands vrf MGMT no shutdown ! +stun + client + server-profile INET-cv-pathfinder-pathfinder-Ethernet1 + ip address 10.7.7.7 + server-profile INET-cv-pathfinder-pathfinder-Ethernet3 + ip address 10.9.9.9 +! end diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-pathfinder.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-pathfinder.cfg index 13b2ab77cc2..1c410b244dc 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-pathfinder.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-pathfinder.cfg @@ -20,7 +20,20 @@ hostname cv-pathfinder-pathfinder router path-selection peer dynamic source stun ! + path-group INET id 101 + ipsec profile CP-PROFILE + ! + local interface Ethernet1 + ! + local interface Ethernet3 + ! + path-group MPLS id 100 + ! + local interface Ethernet2 + ! load-balance policy LBPOLICY + path-group INET + path-group MPLS ! router adaptive-virtual-topology topology role pathfinder @@ -69,6 +82,24 @@ interface Dps1 flow tracker hardware WAN-FLOW-TRACKER tcp mss ceiling ipv4 1000 ! +interface Ethernet1 + no shutdown + no switchport + flow tracker hardware WAN-FLOW-TRACKER + ip address 10.7.7.7/31 +! +interface Ethernet2 + no shutdown + no switchport + flow tracker hardware WAN-FLOW-TRACKER + ip address 172.16.0.1/31 +! +interface Ethernet3 + no shutdown + no switchport + flow tracker hardware WAN-FLOW-TRACKER + ip address 10.9.9.9/31 +! interface Loopback0 description Router_ID no shutdown @@ -83,6 +114,8 @@ interface Vxlan1 ip routing no ip routing vrf MGMT ! +ip route 0.0.0.0/0 10.7.7.6 +! router bfd multihop interval 300 min-rx 300 multiplier 3 ! @@ -132,5 +165,8 @@ management api http-commands ! stun server + local-interface Ethernet1 + local-interface Ethernet2 + local-interface Ethernet3 ! end diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-pathfinder1.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-pathfinder1.cfg index 7ae3699255b..ffb079aca6d 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-pathfinder1.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-pathfinder1.cfg @@ -20,7 +20,21 @@ hostname cv-pathfinder-pathfinder1 router path-selection peer dynamic source stun ! + path-group INET id 101 + ipsec profile CP-PROFILE + ! + local interface Ethernet1 + ! + peer static router-ip 6.6.6.6 + name cv-pathfinder-pathfinder3 + ipv4 address 10.50.50.50 + ! + peer static router-ip 192.168.44.3 + name cv-pathfinder-pathfinder2 + ipv4 address 10.9.9.9 + ! load-balance policy LBPOLICY + path-group INET ! router adaptive-virtual-topology topology role pathfinder @@ -69,6 +83,12 @@ interface Dps1 flow tracker hardware WAN-FLOW-TRACKER tcp mss ceiling ipv4 1000 ! +interface Ethernet1 + no shutdown + no switchport + flow tracker hardware WAN-FLOW-TRACKER + ip address 10.8.8.8/31 +! interface Loopback0 description Router_ID no shutdown @@ -147,5 +167,6 @@ management api http-commands ! stun server + local-interface Ethernet1 ! end diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-pathfinder2.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-pathfinder2.cfg index c8665f3038a..c90f173b54b 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-pathfinder2.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-pathfinder2.cfg @@ -20,7 +20,30 @@ hostname cv-pathfinder-pathfinder2 router path-selection peer dynamic source stun ! + path-group INET id 101 + ipsec profile CP-PROFILE + ! + local interface Ethernet1 + ! + peer static router-ip 6.6.6.6 + name cv-pathfinder-pathfinder3 + ipv4 address 10.50.50.50 + ! + peer static router-ip 192.168.44.2 + name cv-pathfinder-pathfinder1 + ipv4 address 10.8.8.8 + ! + path-group MPLS id 100 + ! + local interface Ethernet2 + ! + peer static router-ip 6.6.6.6 + name cv-pathfinder-pathfinder3 + ipv4 address 172.17.17.17 + ! load-balance policy LBPOLICY + path-group INET + path-group MPLS ! router adaptive-virtual-topology topology role pathfinder @@ -69,6 +92,18 @@ interface Dps1 flow tracker hardware WAN-FLOW-TRACKER tcp mss ceiling ipv4 1000 ! +interface Ethernet1 + no shutdown + no switchport + flow tracker hardware WAN-FLOW-TRACKER + ip address 10.9.9.9/31 +! +interface Ethernet2 + no shutdown + no switchport + flow tracker hardware WAN-FLOW-TRACKER + ip address 172.19.9.9/31 +! interface Loopback0 description Router_ID no shutdown @@ -147,5 +182,7 @@ management api http-commands ! stun server + local-interface Ethernet1 + local-interface Ethernet2 ! end diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-transit.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-transit.cfg index 4178a894ef9..7d1e5dba3a1 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-transit.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-transit.cfg @@ -19,7 +19,33 @@ hostname cv-pathfinder-transit ! router path-selection ! + path-group INET id 101 + ipsec profile CP-PROFILE + ! + local interface Ethernet1 + stun server-profile INET-cv-pathfinder-pathfinder-Ethernet1 INET-cv-pathfinder-pathfinder-Ethernet3 + ! + peer dynamic + ! + peer static router-ip 192.168.44.1 + name cv-pathfinder-pathfinder + ipv4 address 10.7.7.7 + ipv4 address 10.9.9.9 + ! + path-group MPLS id 100 + ! + local interface Ethernet2 + stun server-profile MPLS-cv-pathfinder-pathfinder-Ethernet2 + ! + peer dynamic + ! + peer static router-ip 192.168.44.1 + name cv-pathfinder-pathfinder + ipv4 address 172.16.0.1 + ! load-balance policy LBPOLICY + path-group INET + path-group MPLS ! router adaptive-virtual-topology topology role transit region @@ -74,6 +100,19 @@ interface Dps1 flow tracker hardware WAN-FLOW-TRACKER tcp mss ceiling ipv4 1000 ! +interface Ethernet1 + no shutdown + no switchport + flow tracker hardware WAN-FLOW-TRACKER + ip address dhcp + dhcp client accept default-route +! +interface Ethernet2 + no shutdown + no switchport + flow tracker hardware WAN-FLOW-TRACKER + ip address 172.16.6.6/31 +! interface Loopback0 description Router_ID no shutdown @@ -131,4 +170,13 @@ management api http-commands vrf MGMT no shutdown ! +stun + client + server-profile INET-cv-pathfinder-pathfinder-Ethernet1 + ip address 10.7.7.7 + server-profile INET-cv-pathfinder-pathfinder-Ethernet3 + ip address 10.9.9.9 + server-profile MPLS-cv-pathfinder-pathfinder-Ethernet2 + ip address 172.16.0.1 +! end diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/l3_edge_l3_interfaces.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/node-type-l3-interfaces.cfg similarity index 94% rename from ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/l3_edge_l3_interfaces.cfg rename to ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/node-type-l3-interfaces.cfg index 14cd6198e71..803863dc99c 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/l3_edge_l3_interfaces.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/node-type-l3-interfaces.cfg @@ -6,7 +6,7 @@ transceiver qsfp default-mode 4x10G ! service routing protocols model multi-agent ! -hostname l3_edge_l3_interfaces +hostname node-type-l3-interfaces ! spanning-tree mode none ! @@ -18,6 +18,7 @@ vrf instance MGMT interface Ethernet1 description peer1_eth1 no shutdown + speed forced 10000full no switchport ip address 192.168.1.2/31 service-policy type qos input TEST_POLICY @@ -54,6 +55,8 @@ no ip routing vrf MGMT ip prefix-list PL-LOOPBACKS-EVPN-OVERLAY seq 10 permit 1.2.3.4/24 eq 32 ! +ip route 0.0.0.0/0 192.168.1.3 +! route-map RM-CONN-2-BGP permit 10 match ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY ! diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/autovpn-edge.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/autovpn-edge.yml index cad1d9abe9a..43a38a439a8 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/autovpn-edge.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/autovpn-edge.yml @@ -62,6 +62,13 @@ management_api_http: enable_vrfs: - name: MGMT enable_https: true +ethernet_interfaces: +- name: Ethernet1 + peer_type: l3_interface + ip_address: dhcp + shutdown: false + type: routed + dhcp_client_accept_default_route: true loopback_interfaces: - name: Loopback0 description: Router_ID @@ -92,8 +99,31 @@ router_bfd: min_rx: 300 multiplier: 3 router_path_selection: + path_groups: + - name: INET + id: 101 + local_interfaces: + - name: Ethernet1 + stun: + server_profiles: + - INET-autovpn-rr1-Ethernet1 + - INET-autovpn-rr2-Ethernet1 + dynamic_peers: + enabled: true + static_peers: + - router_ip: 192.168.31.1 + name: autovpn-rr1 + ipv4_addresses: + - 10.7.7.7 + - router_ip: 192.168.31.2 + name: autovpn-rr2 + ipv4_addresses: + - 10.8.8.8 + ipsec_profile: AUTOVPN load_balance_policies: - name: LBPOLICY + path_groups: + - name: INET policies: - name: dps-policy-default default_match: @@ -101,6 +131,13 @@ router_path_selection: vrfs: - name: default path_selection_policy: dps-policy-default +stun: + client: + server_profiles: + - name: INET-autovpn-rr1-Ethernet1 + ip_address: 10.7.7.7 + - name: INET-autovpn-rr2-Ethernet1 + ip_address: 10.8.8.8 dps_interfaces: - name: Dps1 description: DPS Interface diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/autovpn-rr1.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/autovpn-rr1.yml index 00fa1736937..797e7164442 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/autovpn-rr1.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/autovpn-rr1.yml @@ -79,6 +79,13 @@ management_api_http: enable_vrfs: - name: MGMT enable_https: true +ethernet_interfaces: +- name: Ethernet1 + peer_type: l3_interface + ip_address: dhcp + shutdown: false + type: routed + dhcp_client_accept_default_route: true loopback_interfaces: - name: Loopback0 description: Router_ID @@ -107,8 +114,21 @@ router_bfd: min_rx: 300 multiplier: 3 router_path_selection: + path_groups: + - name: INET + id: 101 + local_interfaces: + - name: Ethernet1 + static_peers: + - router_ip: 192.168.31.2 + name: autovpn-rr2 + ipv4_addresses: + - 10.8.8.8 + ipsec_profile: AUTOVPN load_balance_policies: - name: LBPOLICY + path_groups: + - name: INET policies: - name: dps-policy-default default_match: @@ -119,7 +139,8 @@ router_path_selection: peer_dynamic_source: stun stun: server: - local_interfaces: [] + local_interfaces: + - Ethernet1 dps_interfaces: - name: Dps1 description: DPS Interface diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/autovpn-rr2.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/autovpn-rr2.yml index 98ac4aefb99..646328bb0c2 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/autovpn-rr2.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/autovpn-rr2.yml @@ -79,11 +79,20 @@ management_api_http: enable_vrfs: - name: MGMT enable_https: true +ethernet_interfaces: +- name: Ethernet1 + peer_type: l3_interface + ip_address: 10.8.8.8/31 + shutdown: false + type: routed loopback_interfaces: - name: Loopback0 description: Router_ID shutdown: false ip_address: 192.168.31.2/32 +static_routes: +- destination_address_prefix: 0.0.0.0/0 + gateway: 10.8.8.9 ip_security: ike_policies: - name: AUTOVPN-IKE @@ -107,8 +116,21 @@ router_bfd: min_rx: 300 multiplier: 3 router_path_selection: + path_groups: + - name: INET + id: 101 + local_interfaces: + - name: Ethernet1 + static_peers: + - router_ip: 192.168.31.1 + name: autovpn-rr1 + ipv4_addresses: + - 10.7.7.7 + ipsec_profile: AUTOVPN load_balance_policies: - name: LBPOLICY + path_groups: + - name: INET policies: - name: dps-policy-default default_match: @@ -119,7 +141,8 @@ router_path_selection: peer_dynamic_source: stun stun: server: - local_interfaces: [] + local_interfaces: + - Ethernet1 dps_interfaces: - name: Dps1 description: DPS Interface diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge.yml index 134eb2791cf..87d15969a98 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge.yml @@ -69,6 +69,22 @@ management_api_http: enable_vrfs: - name: MGMT enable_https: true +ethernet_interfaces: +- name: Ethernet1 + peer_type: l3_interface + ip_address: dhcp + shutdown: false + type: routed + dhcp_client_accept_default_route: true + flow_tracker: + hardware: WAN-FLOW-TRACKER +- name: Ethernet2 + peer_type: l3_interface + ip_address: 172.15.5.5/31 + shutdown: false + type: routed + flow_tracker: + hardware: WAN-FLOW-TRACKER loopback_interfaces: - name: Loopback0 description: Router_ID @@ -142,8 +158,42 @@ router_bfd: min_rx: 300 multiplier: 3 router_path_selection: + path_groups: + - name: INET + id: 101 + local_interfaces: + - name: Ethernet1 + stun: + server_profiles: + - INET-cv-pathfinder-pathfinder-Ethernet1 + - INET-cv-pathfinder-pathfinder-Ethernet3 + dynamic_peers: + enabled: true + static_peers: + - router_ip: 192.168.44.1 + name: cv-pathfinder-pathfinder + ipv4_addresses: + - 10.7.7.7 + - 10.9.9.9 + ipsec_profile: CP-PROFILE + - name: MPLS + id: 100 + local_interfaces: + - name: Ethernet2 + dynamic_peers: + enabled: true load_balance_policies: - name: LBPOLICY + path_groups: + - name: INET + - name: MPLS +stun: + client: + server_profiles: + - name: INET-cv-pathfinder-pathfinder-Ethernet1 + ip_address: 10.7.7.7 + - name: INET-cv-pathfinder-pathfinder-Ethernet3 + ip_address: 10.9.9.9 dps_interfaces: - name: Dps1 description: DPS Interface diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-pathfinder.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-pathfinder.yml index 444449de5db..760db54b905 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-pathfinder.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-pathfinder.yml @@ -78,11 +78,36 @@ management_api_http: enable_vrfs: - name: MGMT enable_https: true +ethernet_interfaces: +- name: Ethernet1 + peer_type: l3_interface + ip_address: 10.7.7.7/31 + shutdown: false + type: routed + flow_tracker: + hardware: WAN-FLOW-TRACKER +- name: Ethernet2 + peer_type: l3_interface + ip_address: 172.16.0.1/31 + shutdown: false + type: routed + flow_tracker: + hardware: WAN-FLOW-TRACKER +- name: Ethernet3 + peer_type: l3_interface + ip_address: 10.9.9.9/31 + shutdown: false + type: routed + flow_tracker: + hardware: WAN-FLOW-TRACKER loopback_interfaces: - name: Loopback0 description: Router_ID shutdown: false ip_address: 192.168.44.1/32 +static_routes: +- destination_address_prefix: 0.0.0.0/0 + gateway: 10.7.7.6 flow_tracking: hardware: trackers: @@ -140,12 +165,29 @@ router_bfd: min_rx: 300 multiplier: 3 router_path_selection: + path_groups: + - name: INET + id: 101 + local_interfaces: + - name: Ethernet1 + - name: Ethernet3 + ipsec_profile: CP-PROFILE + - name: MPLS + id: 100 + local_interfaces: + - name: Ethernet2 load_balance_policies: - name: LBPOLICY + path_groups: + - name: INET + - name: MPLS peer_dynamic_source: stun stun: server: - local_interfaces: [] + local_interfaces: + - Ethernet1 + - Ethernet2 + - Ethernet3 dps_interfaces: - name: Dps1 description: DPS Interface diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-pathfinder1.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-pathfinder1.yml index 90a8fa49297..06b6b0b9de7 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-pathfinder1.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-pathfinder1.yml @@ -104,6 +104,14 @@ management_api_http: enable_vrfs: - name: MGMT enable_https: true +ethernet_interfaces: +- name: Ethernet1 + peer_type: l3_interface + ip_address: 10.8.8.8/31 + shutdown: false + type: routed + flow_tracker: + hardware: WAN-FLOW-TRACKER loopback_interfaces: - name: Loopback0 description: Router_ID @@ -166,12 +174,30 @@ router_bfd: min_rx: 300 multiplier: 3 router_path_selection: + path_groups: + - name: INET + id: 101 + local_interfaces: + - name: Ethernet1 + static_peers: + - router_ip: 192.168.44.3 + name: cv-pathfinder-pathfinder2 + ipv4_addresses: + - 10.9.9.9 + - router_ip: 6.6.6.6 + name: cv-pathfinder-pathfinder3 + ipv4_addresses: + - 10.50.50.50 + ipsec_profile: CP-PROFILE load_balance_policies: - name: LBPOLICY + path_groups: + - name: INET peer_dynamic_source: stun stun: server: - local_interfaces: [] + local_interfaces: + - Ethernet1 dps_interfaces: - name: Dps1 description: DPS Interface diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-pathfinder2.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-pathfinder2.yml index 4c3deda4500..1eee5cd3489 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-pathfinder2.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-pathfinder2.yml @@ -104,6 +104,21 @@ management_api_http: enable_vrfs: - name: MGMT enable_https: true +ethernet_interfaces: +- name: Ethernet1 + peer_type: l3_interface + ip_address: 10.9.9.9/31 + shutdown: false + type: routed + flow_tracker: + hardware: WAN-FLOW-TRACKER +- name: Ethernet2 + peer_type: l3_interface + ip_address: 172.19.9.9/31 + shutdown: false + type: routed + flow_tracker: + hardware: WAN-FLOW-TRACKER loopback_interfaces: - name: Loopback0 description: Router_ID @@ -166,12 +181,41 @@ router_bfd: min_rx: 300 multiplier: 3 router_path_selection: + path_groups: + - name: INET + id: 101 + local_interfaces: + - name: Ethernet1 + static_peers: + - router_ip: 192.168.44.2 + name: cv-pathfinder-pathfinder1 + ipv4_addresses: + - 10.8.8.8 + - router_ip: 6.6.6.6 + name: cv-pathfinder-pathfinder3 + ipv4_addresses: + - 10.50.50.50 + ipsec_profile: CP-PROFILE + - name: MPLS + id: 100 + local_interfaces: + - name: Ethernet2 + static_peers: + - router_ip: 6.6.6.6 + name: cv-pathfinder-pathfinder3 + ipv4_addresses: + - 172.17.17.17 load_balance_policies: - name: LBPOLICY + path_groups: + - name: INET + - name: MPLS peer_dynamic_source: stun stun: server: - local_interfaces: [] + local_interfaces: + - Ethernet1 + - Ethernet2 dps_interfaces: - name: Dps1 description: DPS Interface diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-transit.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-transit.yml index a61e3bb05af..28215c556ce 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-transit.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-transit.yml @@ -69,6 +69,22 @@ management_api_http: enable_vrfs: - name: MGMT enable_https: true +ethernet_interfaces: +- name: Ethernet1 + peer_type: l3_interface + ip_address: dhcp + shutdown: false + type: routed + dhcp_client_accept_default_route: true + flow_tracker: + hardware: WAN-FLOW-TRACKER +- name: Ethernet2 + peer_type: l3_interface + ip_address: 172.16.6.6/31 + shutdown: false + type: routed + flow_tracker: + hardware: WAN-FLOW-TRACKER loopback_interfaces: - name: Loopback0 description: Router_ID @@ -142,8 +158,52 @@ router_bfd: min_rx: 300 multiplier: 3 router_path_selection: + path_groups: + - name: INET + id: 101 + local_interfaces: + - name: Ethernet1 + stun: + server_profiles: + - INET-cv-pathfinder-pathfinder-Ethernet1 + - INET-cv-pathfinder-pathfinder-Ethernet3 + dynamic_peers: + enabled: true + static_peers: + - router_ip: 192.168.44.1 + name: cv-pathfinder-pathfinder + ipv4_addresses: + - 10.7.7.7 + - 10.9.9.9 + ipsec_profile: CP-PROFILE + - name: MPLS + id: 100 + local_interfaces: + - name: Ethernet2 + stun: + server_profiles: + - MPLS-cv-pathfinder-pathfinder-Ethernet2 + dynamic_peers: + enabled: true + static_peers: + - router_ip: 192.168.44.1 + name: cv-pathfinder-pathfinder + ipv4_addresses: + - 172.16.0.1 load_balance_policies: - name: LBPOLICY + path_groups: + - name: INET + - name: MPLS +stun: + client: + server_profiles: + - name: INET-cv-pathfinder-pathfinder-Ethernet1 + ip_address: 10.7.7.7 + - name: INET-cv-pathfinder-pathfinder-Ethernet3 + ip_address: 10.9.9.9 + - name: MPLS-cv-pathfinder-pathfinder-Ethernet2 + ip_address: 172.16.0.1 dps_interfaces: - name: Dps1 description: DPS Interface diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/l3_edge_l3_interfaces.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/node-type-l3-interfaces.yml similarity index 93% rename from ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/l3_edge_l3_interfaces.yml rename to ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/node-type-l3-interfaces.yml index 84e26c60d4a..78decbf3d75 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/l3_edge_l3_interfaces.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/node-type-l3-interfaces.yml @@ -1,4 +1,4 @@ -hostname: l3_edge_l3_interfaces +hostname: node-type-l3-interfaces is_deployed: true router_bgp: as: '65000' @@ -39,23 +39,6 @@ management_api_http: enable_vrfs: - name: MGMT enable_https: true -loopback_interfaces: -- name: Loopback0 - description: EVPN_Overlay_Peering - shutdown: false - ip_address: 1.2.3.1/32 -prefix_lists: -- name: PL-LOOPBACKS-EVPN-OVERLAY - sequence_numbers: - - sequence: 10 - action: permit 1.2.3.4/24 eq 32 -route_maps: -- name: RM-CONN-2-BGP - sequence_numbers: - - sequence: 10 - type: permit - match: - - ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY ethernet_interfaces: - name: Ethernet1 peer_type: l3_interface @@ -65,6 +48,7 @@ ethernet_interfaces: shutdown: false type: routed description: peer1_eth1 + speed: forced 10000full service_profile: TEST-QOS-PROFILE eos_cli: '! TEST RAW_EOS_CLI @@ -92,3 +76,23 @@ ethernet_interfaces: ip_address: 192.168.42.42/24 shutdown: true type: routed +loopback_interfaces: +- name: Loopback0 + description: EVPN_Overlay_Peering + shutdown: false + ip_address: 1.2.3.1/32 +prefix_lists: +- name: PL-LOOPBACKS-EVPN-OVERLAY + sequence_numbers: + - sequence: 10 + action: permit 1.2.3.4/24 eq 32 +route_maps: +- name: RM-CONN-2-BGP + sequence_numbers: + - sequence: 10 + type: permit + match: + - ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY +static_routes: +- destination_address_prefix: 0.0.0.0/0 + gateway: 192.168.1.3 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/AUTOVPN_TESTS.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/AUTOVPN_TESTS.yml index 161d0c26286..55c1eb1bf06 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/AUTOVPN_TESTS.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/AUTOVPN_TESTS.yml @@ -11,8 +11,13 @@ bgp_peer_groups: - 192.168.30.0/24 wan_route_servers: - # Not testing the overloading + # Testing having the interface configured with DHCP - hostname: autovpn-rr1 + path_groups: + - name: INET + interfaces: + - name: Ethernet1 + ip_address: 10.7.7.7/31 - hostname: autovpn-rr2 wan_ipsec_profiles: @@ -36,6 +41,12 @@ wan_edge: nodes: - name: autovpn-edge id: 1 + l3_interfaces: + - name: Ethernet1 + wan_carrier: Comcast + wan_circuit_id: 666 + ip: dhcp + set_default_route: true wan_rr: defaults: @@ -43,5 +54,33 @@ wan_rr: nodes: - name: autovpn-rr1 id: 1 + l3_interfaces: + - name: Ethernet1 + wan_carrier: ATT + wan_circuit_id: 777 + ip: dhcp + set_default_route: true - name: autovpn-rr2 id: 2 + l3_interfaces: + - name: Ethernet1 + wan_carrier: ATT + wan_circuit_id: 888 + ip: 10.8.8.8/31 + set_default_route: true + peer_ip: 10.8.8.9 + +wan_path_groups: + - name: MPLS + ipsec: False + id: 100 + - name: INET + id: 101 + - name: LTE + id: 102 + +wan_carriers: + - name: Comcast + path_group: INET + - name: ATT + path_group: INET diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/CV_PATHFINDER_MULTI_RR_TESTS.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/CV_PATHFINDER_MULTI_RR_TESTS.yml index a75f5f40b95..3a53c57f332 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/CV_PATHFINDER_MULTI_RR_TESTS.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/CV_PATHFINDER_MULTI_RR_TESTS.yml @@ -10,4 +10,10 @@ wan_route_servers: router_id: 6.6.6.6 path_groups: - name: MPLS + interfaces: + - name: Ethernet1 + ip_address: 172.17.17.17/31 - name: INET + interfaces: + - name: Ethernet2 + ip_address: 10.50.50.50/31 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/CV_PATHFINDER_TESTS.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/CV_PATHFINDER_TESTS.yml index 09f33ad2511..b5e131305ce 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/CV_PATHFINDER_TESTS.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/CV_PATHFINDER_TESTS.yml @@ -54,6 +54,17 @@ wan_edge: cv_pathfinder_region: AVD_Land_East cv_pathfinder_site: Site511 id: 1 + l3_interfaces: + - name: Ethernet1 + wan_carrier: ATT + wan_circuit_id: 666 + set_default_route: true + ip: dhcp + - name: Ethernet2 + wan_carrier: Colt + wan_circuit_id: 10555 + ip: 172.15.5.5/31 + connected_to_pathfinder: False wan_transit: defaults: @@ -63,6 +74,16 @@ wan_transit: cv_pathfinder_region: AVD_Land_West cv_pathfinder_site: Site422 id: 1 + l3_interfaces: + - name: Ethernet1 + wan_carrier: Comcast + wan_circuit_id: 667 + set_default_route: true + ip: dhcp + - name: Ethernet2 + wan_carrier: Colt + wan_circuit_id: 10666 + ip: 172.16.6.6/31 wan_rr: defaults: @@ -70,13 +91,64 @@ wan_rr: nodes: - name: cv-pathfinder-pathfinder id: 1 + l3_interfaces: + - name: Ethernet1 + wan_carrier: Bouygues_Telecom + wan_circuit_id: 777 + set_default_route: true + ip: 10.7.7.7/31 + peer_ip: 10.7.7.6 + - name: Ethernet2 + wan_carrier: Colt + wan_circuit_id: 10000 + ip: 172.16.0.1/31 + - name: Ethernet3 + wan_carrier: Another-ISP + wan_circuit_id: 999 + ip: 10.9.9.9/31 - name: cv-pathfinder-pathfinder1 id: 2 + l3_interfaces: + - name: Ethernet1 + wan_carrier: Orange + wan_circuit_id: 888 + ip: 10.8.8.8/31 - name: cv-pathfinder-pathfinder2 id: 3 + l3_interfaces: + - name: Ethernet1 + wan_carrier: SFR + wan_circuit_id: 999 + ip: 10.9.9.9/31 + - name: Ethernet2 + wan_carrier: ATT-MPLS + wan_circuit_id: 10999 + ip: 172.19.9.9/31 wan_path_groups: - name: MPLS - ipsec: False + ipsec: false + # TODO remove one once auto-id is implemented - for now required in schema + id: 100 - name: INET + id: 101 - name: LTE + id: 102 + +wan_carriers: + - name: Comcast + path_group: INET + - name: ATT + path_group: INET + - name: Bouygues_Telecom + path_group: INET + - name: SFR + path_group: INET + - name: Orange + path_group: INET + - name: Another-ISP + path_group: INET + - name: Colt + path_group: MPLS + - name: ATT-MPLS + path_group: MPLS diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/l3_edge_l3_interfaces.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/l3_edge_l3_interfaces.yml deleted file mode 100644 index 0d9d69d9b28..00000000000 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/l3_edge_l3_interfaces.yml +++ /dev/null @@ -1,46 +0,0 @@ -type: spine -spine: - nodes: - - name: l3_edge_l3_interfaces - id: 1 - evpn_role: "none" - loopback_ipv4_pool: 1.2.3.4/24 - bgp_as: 65000 - -l3_edge: - l3_interfaces_profiles: - - profile: profile1 - speed: "forced 10000full" - qos_profile: TEST-QOS-PROFILE - structured_config: - service_policy: - qos: - input: TEST_POLICY - raw_eos_cli: | - ! TEST RAW_EOS_CLI - l3_interfaces: - # Settings set via profile - - node: l3_edge_l3_interfaces - peer: peer1 - peer_interface: eth1 - interface: Ethernet1 - ip: 192.168.1.2/31 - profile: profile1 - # DHCP default route - - node: l3_edge_l3_interfaces - peer: peer2 - interface: Ethernet2/2 - ip: dhcp - dhcp_client_accept_default_route: True - # custom descriptipon - - node: l3_edge_l3_interfaces - peer: peer3 - interface: Ethernet42 - enabled: False - description: This is a custom description - ip: dhcp - # empty description - - node: l3_edge_l3_interfaces - interface: Ethernet43 - enabled: False - ip: 192.168.42.42/24 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/node-type-l3-interfaces.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/node-type-l3-interfaces.yml new file mode 100644 index 00000000000..9019126bd8c --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/node-type-l3-interfaces.yml @@ -0,0 +1,44 @@ +type: spine +spine: + nodes: + - name: node-type-l3-interfaces + id: 1 + evpn_role: "none" + loopback_ipv4_pool: 1.2.3.4/24 + bgp_as: 65000 + l3_interfaces: + - # Settings set via profile + name: Ethernet1 + ip: 192.168.1.2/31 + set_default_route: true + peer: peer1 + peer_interface: eth1 + peer_ip: 192.168.1.3 + profile: profile1 + - # DHCP default route + peer: peer2 + name: Ethernet2/2 + ip: dhcp + set_default_route: true + - # custom description + peer: peer3 + name: Ethernet42 + enabled: false + description: This is a custom description + ip: dhcp + - # empty description + name: Ethernet43 + enabled: false + ip: 192.168.42.42/24 + + +l3_interface_profiles: + - profile: profile1 + speed: "forced 10000full" + qos_profile: TEST-QOS-PROFILE + structured_config: + service_policy: + qos: + input: TEST_POLICY + raw_eos_cli: | + ! TEST RAW_EOS_CLI diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/hosts.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/hosts.yml index a7f22a9b538..152db25f3b8 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/hosts.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/hosts.yml @@ -32,6 +32,7 @@ all: evpn-to-ipvpn-gateway: vrfs_rd_rt_override: spanning-tree-mode-rapid-pvst: + node-type-l3-interfaces: OVERRIDE_UPLINK_TYPE: hosts: override_uplink_type-d: @@ -267,7 +268,6 @@ all: l3_edge_bgp: l3_edge_ospf: l3_edge_isis: - l3_edge_l3_interfaces: UPLINK_NATIVE_VLAN_TESTS: hosts: uplink-native-vlan-grandparent: diff --git a/ansible_collections/arista/avd/plugins/filter/snmp_hash.py b/ansible_collections/arista/avd/plugins/filter/snmp_hash.py index e5aa1c93a41..b3bb1abed2a 100644 --- a/ansible_collections/arista/avd/plugins/filter/snmp_hash.py +++ b/ansible_collections/arista/avd/plugins/filter/snmp_hash.py @@ -168,5 +168,5 @@ def hash_passphrase(input_dict): class FilterModule(object): def filters(self): return { - "hash_passphrase": hash_passphrase, + "snmp_hash": hash_passphrase, } diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/eos_designs_facts.py b/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/eos_designs_facts.py index 2dc7088f9b3..c9a5a8817a3 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/eos_designs_facts.py +++ b/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/eos_designs_facts.py @@ -14,9 +14,10 @@ from .short_esi import ShortEsiMixin from .uplinks import UplinksMixin from .vlans import VlansMixin +from .wan import WanMixin -class EosDesignsFacts(AvdFacts, MlagMixin, ShortEsiMixin, OverlayMixin, UplinksMixin, VlansMixin): +class EosDesignsFacts(AvdFacts, MlagMixin, ShortEsiMixin, OverlayMixin, WanMixin, UplinksMixin, VlansMixin): """ `EosDesignsFacts` is based on `AvdFacts`, so make sure to read the description there first. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/wan.py b/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/wan.py new file mode 100644 index 00000000000..94270c7df44 --- /dev/null +++ b/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/wan.py @@ -0,0 +1,32 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + +from functools import cached_property +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from .eos_designs_facts import EosDesignsFacts + + +class WanMixin: + """ + Mixin Class providing a subset of EosDesignsFacts + Class should only be used as Mixin to the EosDesignsFacts class + Using type-hint on self to get proper type-hints on attributes across all Mixins. + """ + + @cached_property + def wan_path_groups(self: EosDesignsFacts) -> list | None: + """ + TODO: Also add the path_groups importing any of our connected path groups. + Need to find out if we need to resolve recursive imports. + + Return the list of WAN path_groups directly connected to this router, with a list of dictionaries + containing the (interface, ip_address) in the path_group. + """ + if self.shared_utils.wan_role != "server": + return None + + return self.shared_utils.wan_local_path_groups diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/l3_interfaces.py b/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/l3_interfaces.py new file mode 100644 index 00000000000..bcd9061c373 --- /dev/null +++ b/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/l3_interfaces.py @@ -0,0 +1,57 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + +from functools import cached_property +from typing import TYPE_CHECKING + +from ansible_collections.arista.avd.plugins.plugin_utils.merge import merge +from ansible_collections.arista.avd.plugins.plugin_utils.utils import get, get_item + +if TYPE_CHECKING: + from .shared_utils import SharedUtils + + +class L3InterfacesMixin: + """ + Mixin Class providing a subset of SharedUtils + Class should only be used as Mixin to the SharedUtils class + Using type-hint on self to get proper type-hints on attributes across all Mixins. + """ + + def apply_l3_interfaces_profile(self: SharedUtils, l3_interface: dict) -> dict: + """ + Apply a profile to an l3_interface + """ + if "profile" not in l3_interface: + # Nothing to do + return l3_interface + + profile = get_item(self.l3_interface_profiles, "profile", l3_interface["profile"], default={}) + merged_dict: dict = merge(profile, l3_interface, list_merge="replace", destructive_merge=False) + merged_dict.pop("profile", None) + return merged_dict + + @cached_property + def l3_interface_profiles(self: SharedUtils) -> list: + return get(self.hostvars, "l3_interface_profiles", default=[]) + + # TODO: Add sflow knob under fabric_sflow to cover l3_interfaces defined under the node_types. + # @cached_property + # def _l3_interfaces_sflow(self) -> bool | None: + # return get(self._hostvars, f"fabric_sflow.{self.data_model}") + + @cached_property + def l3_interfaces(self: SharedUtils) -> list: + """ + Returns the list of l3_interfaces, where any referenced profiles are applied. + """ + if not (l3_interfaces := get(self.switch_data_combined, "l3_interfaces")): + return [] + + # Apply l3_interfaces._profile if set. Silently ignoring missing profile. + if self.l3_interface_profiles: + l3_interfaces = [self.apply_l3_interfaces_profile(l3_interface) for l3_interface in l3_interfaces] + + return l3_interfaces diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/shared_utils.py b/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/shared_utils.py index 9ff5010467b..fae2731ef48 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/shared_utils.py +++ b/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/shared_utils.py @@ -8,6 +8,7 @@ from .inband_management import InbandManagementMixin from .interface_descriptions import InterfaceDescriptionsMixin from .ip_addressing import IpAddressingMixin +from .l3_interfaces import L3InterfacesMixin from .link_tracking_groups import LinkTrackingGroupsMixin from .mgmt import MgmtMixin from .misc import MiscMixin @@ -32,6 +33,7 @@ class SharedUtils( InterfaceDescriptionsMixin, IpAddressingMixin, LinkTrackingGroupsMixin, + L3InterfacesMixin, CvTopology, MgmtMixin, MlagMixin, diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/wan.py b/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/wan.py index 2d274263ca0..5b11eed8c29 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/wan.py +++ b/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/wan.py @@ -7,7 +7,7 @@ from typing import TYPE_CHECKING from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get +from ansible_collections.arista.avd.plugins.plugin_utils.utils import get, get_item if TYPE_CHECKING: from .shared_utils import SharedUtils @@ -21,7 +21,7 @@ class WanMixin: """ @cached_property - def wan_mode(self: SharedUtils) -> str | None: + def wan_mode(self: SharedUtils) -> str: return get(self.hostvars, "wan_mode", default="cv-pathfinder") @cached_property @@ -51,3 +51,88 @@ def cv_pathfinder_role(self: SharedUtils) -> str | None: if cv_pathfinder_role in ["transit", "edge"] and self.wan_role != "client": raise AristaAvdError("'wan_role' must be 'client' when 'cv_pathfinder_role' is set to 'transit' or 'edge'") return cv_pathfinder_role + + @cached_property + def wan_interfaces(self: SharedUtils) -> list: + """ + As a first approach, only interfaces under l3edge.l3_interfaces can be considered + as WAN interfaces. + This may need to be made wider. + This also may require a different format for the dictionaries inside the list. + """ + if self.wan_role is None: + return [] + + wan_interfaces = [] + for interface in self.l3_interfaces: + if get(interface, "wan_carrier") is not None: + wan_interfaces.append(interface) + + return wan_interfaces + + @cached_property + def wan_local_carriers(self: SharedUtils) -> list: + """ + List of carriers present on this router based on the wan_interfaces with the associated WAN interfaces + interfaces: + - name: ... + ip: ... + """ + if not self.wan_role: + return [] + + local_carriers_dict = {} + global_carriers = get(self.hostvars, "wan_carriers", required=True) + for interface in self.wan_interfaces: + interface_carrier = interface["wan_carrier"] + if interface_carrier not in local_carriers_dict: + local_carriers_dict[interface_carrier] = get_item( + global_carriers, + "name", + interface["wan_carrier"], + required=True, + custom_error_msg=f"WAN carrier {interface['wan_carrier']} is not in the available carriers defined in `wan_carriers`", + ).copy() + local_carriers_dict[interface_carrier]["interfaces"] = [] + + local_carriers_dict[interface_carrier]["interfaces"].append( + { + "name": get(interface, "name", required=True), + "ip_address": get(interface, "ip", required=True), + "connected_to_pathfinder": get(interface, "connected_to_pathfinder", default=True), + } + ) + + return list(local_carriers_dict.values()) + + @cached_property + def wan_local_path_groups(self: SharedUtils) -> list: + """ + List of path_groups present on this router based on the local carriers. + Also add for each path_groups the local interfaces in a data structure + interfaces: + - name: ... + ip: ... + """ + if self.wan_role is None: + return [] + + local_path_groups_dict = {} + global_path_groups = get(self.hostvars, "wan_path_groups", required=True) + for carrier in self.wan_local_carriers: + path_group_name = get(carrier, "path_group", required=True) + if path_group_name not in local_path_groups_dict: + local_path_groups_dict[path_group_name] = get_item( + global_path_groups, + "name", + path_group_name, + required=True, + custom_error_msg=( + f"WAN path_group {path_group_name} defined for a WAN carrier is not in the available path_groups defined in `wan_path_groups`" + ), + ).copy() + local_path_groups_dict[path_group_name]["interfaces"] = [] + + local_path_groups_dict[path_group_name]["interfaces"].extend(carrier["interfaces"]) + + return list(local_path_groups_dict.values()) diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_validate_state_utils/avdtestbase.py b/ansible_collections/arista/avd/plugins/plugin_utils/eos_validate_state_utils/avdtestbase.py index 5e59107adfa..5d77ba99899 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_validate_state_utils/avdtestbase.py +++ b/ansible_collections/arista/avd/plugins/plugin_utils/eos_validate_state_utils/avdtestbase.py @@ -163,14 +163,14 @@ def get_interface_ip(self, interface_model: str, interface_name: str, host: str self.log_skip_message(message=f"Host '{host or self.device_name}' interface '{interface_name}' IP address is unavailable.", logging_level="WARNING") return None - def logged_get(self, key: str, host: str | None = None, logging_level: str = "WARNING"): + def logged_get(self, key: str, host: str | None = None, logging_level: str = "INFO"): """ Attempts to retrieve a value associated with a given key from structured_config and logs if it's missing. Args: key (str): The key to retrieve. host (str | None): The host from which to retrieve the key. Defaults to the device running the test. - logging_level (str): The logging level to use for the log message. + logging_level (str): The logging level to use for the log message. Defaults to "INFO". """ host_struct_cfg = self.get_host_structured_config(host=host) if host else self.structured_config try: @@ -185,7 +185,7 @@ def validate_data( data_path: str | None = None, host: str | None = None, required_keys: str | list[str] | None = None, - logging_level: str | None = None, + logging_level: str = "INFO", **kwargs, ) -> bool: """ @@ -196,8 +196,7 @@ def validate_data( data_path (str | None): The data path in dot notation. Used for logging purposes. Index or primary key can be used for lists. host (str | None): The host from which data should be retrieved. Defaults to the device running the test. required_keys (str | list[str] | None): The keys that are expected to be in the data. - logging_level (str): Overwrites all default logging levels within this function. - If not provided, the default logging level is 'WARNING' when a key is missing and 'INFO' when his value is not matching. + logging_level (str): The logging level to use for the log message. Defaults to "INFO". **kwargs: Expected key-value pairs in the data. Returns: @@ -216,10 +215,10 @@ def validate_data( for key, value in kwargs.items(): actual_value = get(data, key) if actual_value is None: - self.log_skip_message(key=key, value=value, key_path=data_path, is_missing=True, logging_level=logging_level or "WARNING") + self.log_skip_message(key=key, value=value, key_path=data_path, is_missing=True, logging_level=logging_level) valid = False elif actual_value != value: - self.log_skip_message(key=key, value=value, key_path=data_path, is_missing=False, logging_level=logging_level or "INFO") + self.log_skip_message(key=key, value=value, key_path=data_path, is_missing=False, logging_level=logging_level) valid = False # Return False if any of the expected values are missing or not matching @@ -231,7 +230,7 @@ def validate_data( required_keys = [required_keys] if isinstance(required_keys, str) else required_keys for key in required_keys: if get(data, key) is None: - self.log_skip_message(key=key, key_path=data_path, is_missing=True, logging_level=logging_level or "WARNING") + self.log_skip_message(key=key, key_path=data_path, is_missing=True, logging_level=logging_level) valid = False return valid diff --git a/ansible_collections/arista/avd/requirements-dev.txt b/ansible_collections/arista/avd/requirements-dev.txt index 4df5289bb83..d06799de17d 100644 --- a/ansible_collections/arista/avd/requirements-dev.txt +++ b/ansible_collections/arista/avd/requirements-dev.txt @@ -16,8 +16,8 @@ md-toc>=7.1.0 natsort jsonschema>=4.5.1,<4.18 deepmerge>=1.1.0 -isort==5.12.0 -black==22.8.0 +isort==5.13.2 +black==23.12.1 ansible-doc-extractor>=0.1.10 tox pydantic>=2.3.0 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/input-variables.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/input-variables.md index b35029defde..0ab73fbc655 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/input-variables.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/input-variables.md @@ -759,6 +759,11 @@ roles/eos_cli_config_gen/docs/tables/ip-dhcp-relay.md --8<-- roles/eos_cli_config_gen/docs/tables/ip-dhcp-snooping.md + +### DHCP Servers + +--8<-- +roles/eos_cli_config_gen/docs/tables/dhcp-servers.md --8<-- ### IP ICMP redirect diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/dhcp-servers.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/dhcp-servers.md new file mode 100644 index 00000000000..4a356f47c4f --- /dev/null +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/dhcp-servers.md @@ -0,0 +1,80 @@ + +=== "Table" + + | Variable | Type | Required | Default | Value Restrictions | Description | + | -------- | ---- | -------- | ------- | ------------------ | ----------- | + | [dhcp_servers](## "dhcp_servers") | List, items: Dictionary | | | | | + | [  - disabled](## "dhcp_servers.[].disabled") | Boolean | | | | | + | [    vrf](## "dhcp_servers.[].vrf") | String | Required, Unique | | | VRF in which to configure the DHCP server, use `default` to indicate default VRF. | + | [    dns_domain_name_ipv4](## "dhcp_servers.[].dns_domain_name_ipv4") | String | | | | | + | [    dns_domain_name_ipv6](## "dhcp_servers.[].dns_domain_name_ipv6") | String | | | | | + | [    ipv4_vendor_options](## "dhcp_servers.[].ipv4_vendor_options") | List, items: Dictionary | | | | | + | [      - vendor_id](## "dhcp_servers.[].ipv4_vendor_options.[].vendor_id") | String | Required, Unique | | | | + | [        sub_options](## "dhcp_servers.[].ipv4_vendor_options.[].sub_options") | List, items: Dictionary | | | | | + | [          - code](## "dhcp_servers.[].ipv4_vendor_options.[].sub_options.[].code") | Integer | Required, Unique | | Min: 1
Max: 254 | | + | [            string](## "dhcp_servers.[].ipv4_vendor_options.[].sub_options.[].string") | String | | | | String value for suboption data.
Only one of `string`, `ipv4_address` and `array_ipv4_address` variables should be used for any one suboption.
The order of precedence if multiple of these variables are defined is `string` -> `ipv4_address` -> `array_ipv4_address`. | + | [            ipv4_address](## "dhcp_servers.[].ipv4_vendor_options.[].sub_options.[].ipv4_address") | String | | | | IPv4 address value for suboption data.
Only one of `string`, `ipv4_address` and `array_ipv4_address` variables should be used for any one suboption.
The order of precedence if multiple of these variables are defined is `string` -> `ipv4_address` -> `array_ipv4_address`. | + | [            array_ipv4_address](## "dhcp_servers.[].ipv4_vendor_options.[].sub_options.[].array_ipv4_address") | List, items: String | | | | Array of IPv4 addresses for suboption data.
Only one of `string`, `ipv4_address` and `array_ipv4_address` variables should be used for any one suboption.
The order of precedence if multiple of these variables are defined is `string` -> `ipv4_address` -> `array_ipv4_address`. | + | [              - <str>](## "dhcp_servers.[].ipv4_vendor_options.[].sub_options.[].array_ipv4_address.[]") | String | | | | | + | [    subnets](## "dhcp_servers.[].subnets") | List, items: Dictionary | | | | | + | [      - subnet](## "dhcp_servers.[].subnets.[].subnet") | String | Required, Unique | | | | + | [        name](## "dhcp_servers.[].subnets.[].name") | String | | | | | + | [        default_gateway](## "dhcp_servers.[].subnets.[].default_gateway") | String | | | | | + | [        dns_servers](## "dhcp_servers.[].subnets.[].dns_servers") | List, items: String | | | | | + | [          - <str>](## "dhcp_servers.[].subnets.[].dns_servers.[]") | String | | | | | + | [        ranges](## "dhcp_servers.[].subnets.[].ranges") | List, items: Dictionary | | | | | + | [          - start](## "dhcp_servers.[].subnets.[].ranges.[].start") | String | Required | | | | + | [            end](## "dhcp_servers.[].subnets.[].ranges.[].end") | String | Required | | | | + | [        lease_time](## "dhcp_servers.[].subnets.[].lease_time") | Dictionary | | | | | + | [          days](## "dhcp_servers.[].subnets.[].lease_time.days") | Integer | Required | | Min: 0
Max: 2000 | | + | [          hours](## "dhcp_servers.[].subnets.[].lease_time.hours") | Integer | Required | | Min: 0
Max: 23 | | + | [          minutes](## "dhcp_servers.[].subnets.[].lease_time.minutes") | Integer | Required | | Min: 0
Max: 59 | | + +=== "YAML" + + ```yaml + dhcp_servers: + - disabled: + + # VRF in which to configure the DHCP server, use `default` to indicate default VRF. + vrf: + dns_domain_name_ipv4: + dns_domain_name_ipv6: + ipv4_vendor_options: + - vendor_id: + sub_options: + - code: + + # String value for suboption data. + # Only one of `string`, `ipv4_address` and `array_ipv4_address` variables should be used for any one suboption. + # The order of precedence if multiple of these variables are defined is `string` -> `ipv4_address` -> `array_ipv4_address`. + string: + + # IPv4 address value for suboption data. + # Only one of `string`, `ipv4_address` and `array_ipv4_address` variables should be used for any one suboption. + # The order of precedence if multiple of these variables are defined is `string` -> `ipv4_address` -> `array_ipv4_address`. + ipv4_address: + + # Array of IPv4 addresses for suboption data. + # Only one of `string`, `ipv4_address` and `array_ipv4_address` variables should be used for any one suboption. + # The order of precedence if multiple of these variables are defined is `string` -> `ipv4_address` -> `array_ipv4_address`. + array_ipv4_address: + - + subnets: + - subnet: + name: + default_gateway: + dns_servers: + - + ranges: + - start: + end: + lease_time: + days: + hours: + minutes: + ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-bgp.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-bgp.md index 60bc9e9ff9a..6b0ccf4a7e9 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-bgp.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-bgp.md @@ -67,7 +67,11 @@ | [      next_hop_unchanged](## "router_bgp.peer_groups.[].next_hop_unchanged") | Boolean | | | | | | [      update_source](## "router_bgp.peer_groups.[].update_source") | String | | | | IP address or interface name | | [      route_reflector_client](## "router_bgp.peer_groups.[].route_reflector_client") | Boolean | | | | | - | [      bfd](## "router_bgp.peer_groups.[].bfd") | Boolean | | | | | + | [      bfd](## "router_bgp.peer_groups.[].bfd") | Boolean | | | | Enable BFD. | + | [      bfd_timers](## "router_bgp.peer_groups.[].bfd_timers") | Dictionary | | | | Override default BFD timers. BFD must be enabled with `bfd: true`. | + | [        interval](## "router_bgp.peer_groups.[].bfd_timers.interval") | Integer | Required | | Min: 50
Max: 60000 | Interval in milliseconds. | + | [        min_rx](## "router_bgp.peer_groups.[].bfd_timers.min_rx") | Integer | Required | | Min: 50
Max: 60000 | Rate in milliseconds. | + | [        multiplier](## "router_bgp.peer_groups.[].bfd_timers.multiplier") | Integer | Required | | Min: 3
Max: 50 | | | [      ebgp_multihop](## "router_bgp.peer_groups.[].ebgp_multihop") | Integer | | | Min: 1
Max: 255 | Time-to-live in range of hops | | [      next_hop_self](## "router_bgp.peer_groups.[].next_hop_self") | Boolean | | | | | | [      password](## "router_bgp.peer_groups.[].password") | String | | | | | @@ -110,7 +114,11 @@ | [      passive](## "router_bgp.neighbors.[].passive") | Boolean | | | | | | [      shutdown](## "router_bgp.neighbors.[].shutdown") | Boolean | | | | | | [      update_source](## "router_bgp.neighbors.[].update_source") | String | | | | Source Interface | - | [      bfd](## "router_bgp.neighbors.[].bfd") | Boolean | | | | | + | [      bfd](## "router_bgp.neighbors.[].bfd") | Boolean | | | | Enable BFD. | + | [      bfd_timers](## "router_bgp.neighbors.[].bfd_timers") | Dictionary | | | | Override default BFD timers. BFD must be enabled with `bfd: true`. | + | [        interval](## "router_bgp.neighbors.[].bfd_timers.interval") | Integer | Required | | Min: 50
Max: 60000 | Interval in milliseconds. | + | [        min_rx](## "router_bgp.neighbors.[].bfd_timers.min_rx") | Integer | Required | | Min: 50
Max: 60000 | Rate in milliseconds. | + | [        multiplier](## "router_bgp.neighbors.[].bfd_timers.multiplier") | Integer | Required | | Min: 3
Max: 50 | | | [      weight](## "router_bgp.neighbors.[].weight") | Integer | | | Min: 0
Max: 65535 | | | [      timers](## "router_bgp.neighbors.[].timers") | String | | | | BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>" | | [      route_map_in](## "router_bgp.neighbors.[].route_map_in") | String | | | | Inbound route-map name | @@ -542,7 +550,11 @@ | [          ebgp_multihop](## "router_bgp.vrfs.[].neighbors.[].ebgp_multihop") | Integer | | | Min: 1
Max: 255 | Time-to-live in range of hops | | [          next_hop_self](## "router_bgp.vrfs.[].neighbors.[].next_hop_self") | Boolean | | | | | | [          shutdown](## "router_bgp.vrfs.[].neighbors.[].shutdown") | Boolean | | | | | - | [          bfd](## "router_bgp.vrfs.[].neighbors.[].bfd") | Boolean | | | | | + | [          bfd](## "router_bgp.vrfs.[].neighbors.[].bfd") | Boolean | | | | Enable BFD. | + | [          bfd_timers](## "router_bgp.vrfs.[].neighbors.[].bfd_timers") | Dictionary | | | | Override default BFD timers. BFD must be enabled with `bfd: true`. | + | [            interval](## "router_bgp.vrfs.[].neighbors.[].bfd_timers.interval") | Integer | Required | | Min: 50
Max: 60000 | Interval in milliseconds. | + | [            min_rx](## "router_bgp.vrfs.[].neighbors.[].bfd_timers.min_rx") | Integer | Required | | Min: 50
Max: 60000 | Rate in milliseconds. | + | [            multiplier](## "router_bgp.vrfs.[].neighbors.[].bfd_timers.multiplier") | Integer | Required | | Min: 3
Max: 50 | | | [          timers](## "router_bgp.vrfs.[].neighbors.[].timers") | String | | | | BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>" | | [          rib_in_pre_policy_retain](## "router_bgp.vrfs.[].neighbors.[].rib_in_pre_policy_retain") | Dictionary | | | | | | [            enabled](## "router_bgp.vrfs.[].neighbors.[].rib_in_pre_policy_retain.enabled") | Boolean | | | | | @@ -836,8 +848,20 @@ # IP address or interface name update_source: route_reflector_client: + + # Enable BFD. bfd: + # Override default BFD timers. BFD must be enabled with `bfd: true`. + bfd_timers: + + # Interval in milliseconds. + interval: + + # Rate in milliseconds. + min_rx: + multiplier: + # Time-to-live in range of hops ebgp_multihop: next_hop_self: @@ -921,7 +945,19 @@ # Source Interface update_source: + + # Enable BFD. bfd: + + # Override default BFD timers. BFD must be enabled with `bfd: true`. + bfd_timers: + + # Interval in milliseconds. + interval: + + # Rate in milliseconds. + min_rx: + multiplier: weight: # BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>" @@ -1616,8 +1652,20 @@ ebgp_multihop: next_hop_self: shutdown: + + # Enable BFD. bfd: + # Override default BFD timers. BFD must be enabled with `bfd: true`. + bfd_timers: + + # Interval in milliseconds. + interval: + + # Rate in milliseconds. + min_rx: + multiplier: + # BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>" timers: rib_in_pre_policy_retain: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/eos_cli_config_gen.jsonschema.json b/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/eos_cli_config_gen.jsonschema.json index 30b7048c817..2711a2abdbd 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/eos_cli_config_gen.jsonschema.json +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/eos_cli_config_gen.jsonschema.json @@ -1870,6 +1870,192 @@ }, "title": "DHCP Relay" }, + "dhcp_servers": { + "type": "array", + "items": { + "type": "object", + "properties": { + "disabled": { + "type": "boolean", + "title": "Disabled" + }, + "vrf": { + "type": "string", + "description": "VRF in which to configure the DHCP server, use `default` to indicate default VRF.", + "title": "VRF" + }, + "dns_domain_name_ipv4": { + "type": "string", + "title": "DNS Domain Name IPv4" + }, + "dns_domain_name_ipv6": { + "type": "string", + "title": "DNS Domain Name IPv6" + }, + "ipv4_vendor_options": { + "type": "array", + "items": { + "type": "object", + "properties": { + "vendor_id": { + "type": "string", + "title": "Vendor ID" + }, + "sub_options": { + "type": "array", + "items": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "minimum": 1, + "maximum": 254, + "title": "Code" + }, + "string": { + "type": "string", + "description": "String value for suboption data.\nOnly one of `string`, `ipv4_address` and `array_ipv4_address` variables should be used for any one suboption.\nThe order of precedence if multiple of these variables are defined is `string` -> `ipv4_address` -> `array_ipv4_address`.", + "title": "String" + }, + "ipv4_address": { + "type": "string", + "description": "IPv4 address value for suboption data.\nOnly one of `string`, `ipv4_address` and `array_ipv4_address` variables should be used for any one suboption.\nThe order of precedence if multiple of these variables are defined is `string` -> `ipv4_address` -> `array_ipv4_address`.", + "title": "IPv4 Address" + }, + "array_ipv4_address": { + "type": "array", + "description": "Array of IPv4 addresses for suboption data.\nOnly one of `string`, `ipv4_address` and `array_ipv4_address` variables should be used for any one suboption.\nThe order of precedence if multiple of these variables are defined is `string` -> `ipv4_address` -> `array_ipv4_address`.", + "items": { + "type": "string" + }, + "title": "Array IPv4 Address" + } + }, + "required": [ + "code" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Sub Options" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "vendor_id" + ] + }, + "title": "IPv4 Vendor Options" + }, + "subnets": { + "type": "array", + "items": { + "type": "object", + "properties": { + "subnet": { + "type": "string", + "title": "Subnet" + }, + "name": { + "type": "string", + "title": "Name" + }, + "default_gateway": { + "type": "string", + "title": "Default Gateway" + }, + "dns_servers": { + "type": "array", + "items": { + "type": "string" + }, + "title": "DNS Servers" + }, + "ranges": { + "type": "array", + "items": { + "type": "object", + "properties": { + "start": { + "type": "string", + "title": "Start" + }, + "end": { + "type": "string", + "title": "End" + } + }, + "required": [ + "start", + "end" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Ranges" + }, + "lease_time": { + "type": "object", + "properties": { + "days": { + "type": "integer", + "minimum": 0, + "maximum": 2000, + "title": "Days" + }, + "hours": { + "type": "integer", + "minimum": 0, + "maximum": 23, + "title": "Hours" + }, + "minutes": { + "type": "integer", + "minimum": 0, + "maximum": 59, + "title": "Minutes" + } + }, + "required": [ + "days", + "hours", + "minutes" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Lease Time" + } + }, + "required": [ + "subnet" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Subnets" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "vrf" + ] + }, + "title": "DHCP Servers" + }, "dns_domain": { "type": "string", "description": "Domain Name", @@ -15013,8 +15199,45 @@ }, "bfd": { "type": "boolean", + "description": "Enable BFD.", "title": "BFD" }, + "bfd_timers": { + "type": "object", + "description": "Override default BFD timers. BFD must be enabled with `bfd: true`.", + "properties": { + "interval": { + "type": "integer", + "minimum": 50, + "maximum": 60000, + "description": "Interval in milliseconds.", + "title": "Interval" + }, + "min_rx": { + "type": "integer", + "minimum": 50, + "maximum": 60000, + "description": "Rate in milliseconds.", + "title": "Min RX" + }, + "multiplier": { + "type": "integer", + "minimum": 3, + "maximum": 50, + "title": "Multiplier" + } + }, + "required": [ + "interval", + "min_rx", + "multiplier" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BFD Timers" + }, "ebgp_multihop": { "type": "integer", "minimum": 1, @@ -15254,8 +15477,45 @@ }, "bfd": { "type": "boolean", + "description": "Enable BFD.", "title": "BFD" }, + "bfd_timers": { + "type": "object", + "description": "Override default BFD timers. BFD must be enabled with `bfd: true`.", + "properties": { + "interval": { + "type": "integer", + "minimum": 50, + "maximum": 60000, + "description": "Interval in milliseconds.", + "title": "Interval" + }, + "min_rx": { + "type": "integer", + "minimum": 50, + "maximum": 60000, + "description": "Rate in milliseconds.", + "title": "Min RX" + }, + "multiplier": { + "type": "integer", + "minimum": 3, + "maximum": 50, + "title": "Multiplier" + } + }, + "required": [ + "interval", + "min_rx", + "multiplier" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BFD Timers" + }, "weight": { "type": "integer", "minimum": 0, @@ -18221,8 +18481,45 @@ }, "bfd": { "type": "boolean", + "description": "Enable BFD.", "title": "BFD" }, + "bfd_timers": { + "type": "object", + "description": "Override default BFD timers. BFD must be enabled with `bfd: true`.", + "properties": { + "interval": { + "type": "integer", + "minimum": 50, + "maximum": 60000, + "description": "Interval in milliseconds.", + "title": "Interval" + }, + "min_rx": { + "type": "integer", + "minimum": 50, + "maximum": 60000, + "description": "Rate in milliseconds.", + "title": "Min RX" + }, + "multiplier": { + "type": "integer", + "minimum": 3, + "maximum": 50, + "title": "Multiplier" + } + }, + "required": [ + "interval", + "min_rx", + "multiplier" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BFD Timers" + }, "timers": { "type": "string", "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\"", diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/eos_cli_config_gen.schema.yml b/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/eos_cli_config_gen.schema.yml index d5ee4b70935..859514837f6 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/eos_cli_config_gen.schema.yml +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/eos_cli_config_gen.schema.yml @@ -1327,6 +1327,130 @@ keys: type: bool mlag_peerlink_requests_disabled: type: bool + dhcp_servers: + type: list + primary_key: vrf + items: + type: dict + keys: + disabled: + type: bool + vrf: + type: str + description: VRF in which to configure the DHCP server, use `default` to + indicate default VRF. + convert_types: + - int + dns_domain_name_ipv4: + type: str + dns_domain_name_ipv6: + type: str + ipv4_vendor_options: + type: list + primary_key: vendor_id + items: + type: dict + keys: + vendor_id: + type: str + convert_types: + - int + sub_options: + type: list + primary_key: code + items: + type: dict + keys: + code: + type: int + required: true + min: 1 + max: 254 + convert_types: + - str + string: + type: str + description: 'String value for suboption data. + + Only one of `string`, `ipv4_address` and `array_ipv4_address` + variables should be used for any one suboption. + + The order of precedence if multiple of these variables are + defined is `string` -> `ipv4_address` -> `array_ipv4_address`.' + ipv4_address: + type: str + description: 'IPv4 address value for suboption data. + + Only one of `string`, `ipv4_address` and `array_ipv4_address` + variables should be used for any one suboption. + + The order of precedence if multiple of these variables are + defined is `string` -> `ipv4_address` -> `array_ipv4_address`.' + array_ipv4_address: + type: list + description: 'Array of IPv4 addresses for suboption data. + + Only one of `string`, `ipv4_address` and `array_ipv4_address` + variables should be used for any one suboption. + + The order of precedence if multiple of these variables are + defined is `string` -> `ipv4_address` -> `array_ipv4_address`.' + items: + type: str + subnets: + type: list + primary_key: subnet + items: + type: dict + keys: + subnet: + type: str + required: true + name: + type: str + convert_types: + - int + default_gateway: + type: str + dns_servers: + type: list + items: + type: str + ranges: + type: list + items: + type: dict + keys: + start: + type: str + required: true + end: + type: str + required: true + lease_time: + type: dict + keys: + days: + type: int + required: true + min: 0 + max: 2000 + convert_types: + - str + hours: + type: int + required: true + min: 0 + max: 23 + convert_types: + - str + minutes: + type: int + required: true + min: 0 + max: 59 + convert_types: + - str dns_domain: type: str description: Domain Name @@ -8967,6 +9091,35 @@ keys: type: bool bfd: type: bool + description: Enable BFD. + bfd_timers: + type: dict + description: 'Override default BFD timers. BFD must be enabled with + `bfd: true`.' + keys: + interval: + type: int + convert_types: + - str + min: 50 + max: 60000 + required: true + description: Interval in milliseconds. + min_rx: + type: int + convert_types: + - str + min: 50 + max: 60000 + required: true + description: Rate in milliseconds. + multiplier: + type: int + min: 3 + max: 50 + required: true + convert_types: + - str ebgp_multihop: type: int min: 1 @@ -9123,6 +9276,35 @@ keys: description: Source Interface bfd: type: bool + description: Enable BFD. + bfd_timers: + type: dict + description: 'Override default BFD timers. BFD must be enabled with + `bfd: true`.' + keys: + interval: + type: int + convert_types: + - str + min: 50 + max: 60000 + required: true + description: Interval in milliseconds. + min_rx: + type: int + convert_types: + - str + min: 50 + max: 60000 + required: true + description: Rate in milliseconds. + multiplier: + type: int + min: 3 + max: 50 + required: true + convert_types: + - str weight: type: int min: 0 @@ -10666,6 +10848,35 @@ keys: type: bool bfd: type: bool + description: Enable BFD. + bfd_timers: + type: dict + description: 'Override default BFD timers. BFD must be enabled + with `bfd: true`.' + keys: + interval: + type: int + convert_types: + - str + min: 50 + max: 60000 + required: true + description: Interval in milliseconds. + min_rx: + type: int + convert_types: + - str + min: 50 + max: 60000 + required: true + description: Rate in milliseconds. + multiplier: + type: int + min: 3 + max: 50 + convert_types: + - str + required: true timers: type: str description: BGP Keepalive and Hold Timer values in seconds as diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/dhcp_servers.schema.yml b/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/dhcp_servers.schema.yml new file mode 100644 index 00000000000..8d72c381ecd --- /dev/null +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/dhcp_servers.schema.yml @@ -0,0 +1,122 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +# yaml-language-server: $schema=../../../../plugins/plugin_utils/schema/avd_meta_schema.json +# Line above is used by RedHat's YAML Schema vscode extension +# Use Ctrl + Space to get suggestions for every field. Autocomplete will pop up after typing 2 letters. +type: dict +keys: + dhcp_servers: + type: list + primary_key: vrf + items: + type: dict + keys: + disabled: + type: bool + vrf: + type: str + description: VRF in which to configure the DHCP server, use `default` to indicate default VRF. + convert_types: + - int + dns_domain_name_ipv4: + type: str + dns_domain_name_ipv6: + type: str + ipv4_vendor_options: + type: list + primary_key: vendor_id + items: + type: dict + keys: + vendor_id: + type: str + convert_types: + - int + sub_options: + type: list + primary_key: code + items: + type: dict + keys: + code: + type: int + required: true + min: 1 + max: 254 + convert_types: + - str + string: + type: str + description: |- + String value for suboption data. + Only one of `string`, `ipv4_address` and `array_ipv4_address` variables should be used for any one suboption. + The order of precedence if multiple of these variables are defined is `string` -> `ipv4_address` -> `array_ipv4_address`. + ipv4_address: + type: str + description: |- + IPv4 address value for suboption data. + Only one of `string`, `ipv4_address` and `array_ipv4_address` variables should be used for any one suboption. + The order of precedence if multiple of these variables are defined is `string` -> `ipv4_address` -> `array_ipv4_address`. + array_ipv4_address: + type: list + description: |- + Array of IPv4 addresses for suboption data. + Only one of `string`, `ipv4_address` and `array_ipv4_address` variables should be used for any one suboption. + The order of precedence if multiple of these variables are defined is `string` -> `ipv4_address` -> `array_ipv4_address`. + items: + type: str + subnets: + type: list + primary_key: subnet + items: + type: dict + keys: + subnet: + type: str + required: true + name: + type: str + convert_types: + - int + default_gateway: + type: str + dns_servers: + type: list + items: + type: str + ranges: + type: list + items: + type: dict + keys: + start: + type: str + required: true + end: + type: str + required: true + lease_time: + type: dict + keys: + days: + type: int + required: true + min: 0 + max: 2000 + convert_types: + - str + hours: + type: int + required: true + min: 0 + max: 23 + convert_types: + - str + minutes: + type: int + required: true + min: 0 + max: 59 + convert_types: + - str diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_bgp.schema.yml b/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_bgp.schema.yml index 007a93ff213..73d2fa40004 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_bgp.schema.yml +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_bgp.schema.yml @@ -241,6 +241,35 @@ keys: type: bool bfd: type: bool + description: Enable BFD. + bfd_timers: + type: dict + description: |- + Override default BFD timers. BFD must be enabled with `bfd: true`. + keys: + interval: + type: int + convert_types: + - str + min: 50 + max: 60000 + required: true + description: Interval in milliseconds. + min_rx: + type: int + convert_types: + - str + min: 50 + max: 60000 + required: true + description: Rate in milliseconds. + multiplier: + type: int + min: 3 + max: 50 + required: true + convert_types: + - str ebgp_multihop: type: int min: 1 @@ -387,6 +416,35 @@ keys: description: Source Interface bfd: type: bool + description: Enable BFD. + bfd_timers: + type: dict + description: |- + Override default BFD timers. BFD must be enabled with `bfd: true`. + keys: + interval: + type: int + convert_types: + - str + min: 50 + max: 60000 + required: true + description: Interval in milliseconds. + min_rx: + type: int + convert_types: + - str + min: 50 + max: 60000 + required: true + description: Rate in milliseconds. + multiplier: + type: int + min: 3 + max: 50 + required: true + convert_types: + - str weight: type: int min: 0 @@ -1903,6 +1961,35 @@ keys: type: bool bfd: type: bool + description: Enable BFD. + bfd_timers: + type: dict + description: |- + Override default BFD timers. BFD must be enabled with `bfd: true`. + keys: + interval: + type: int + convert_types: + - str + min: 50 + max: 60000 + required: true + description: Interval in milliseconds. + min_rx: + type: int + convert_types: + - str + min: 50 + max: 60000 + required: true + description: Rate in milliseconds. + multiplier: + type: int + min: 3 + max: 50 + convert_types: + - str + required: true timers: type: str description: BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>" diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/dhcp-server.j2 b/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/dhcp-server.j2 index c977142e289..c954db99741 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/dhcp-server.j2 +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/dhcp-server.j2 @@ -10,16 +10,96 @@ {% do ethernet_interfaces_dhcp_server.append(ethernet_interface) %} {% endif %} {% endfor %} -{# later on this condition will change when top level key dhcp_server is implemented #} -{% if ethernet_interfaces_dhcp_server | length > 0 %} +{% if (ethernet_interfaces_dhcp_server | length > 0 or dhcp_servers is arista.avd.defined) %} ## DHCP Server +{% if dhcp_servers is arista.avd.defined %} + +### DHCP Servers Summary + +| DHCP Server Enabled | VRF | IPv4 DNS Domain | IPv6 DNS Domain | +| ------------------- | --- | --------------- | --------------- | +{% for dhcp_server in dhcp_servers | arista.avd.natural_sort("vrf") %} +| {{ not dhcp_server.disabled | arista.avd.default(false) }} | {{ dhcp_server.vrf }} | {{ dhcp_server.dns_domain_name_ipv4 | arista.avd.default("-") }} | {{ dhcp_server.dns_domain_name_ipv6 | arista.avd.default("-") }} | +{% endfor %} +{% for dhcp_server in dhcp_servers | arista.avd.natural_sort("vrf") %} +{% set dhcp_server_subnets = [] %} +{% set dhcp_vendor_options = [] %} +{% for subnet in dhcp_server.subnets | arista.avd.natural_sort %} +{% set subnet_dns_servers = subnet.dns_servers | arista.avd.default(["-"]) | join(", ") %} +{% if subnet.lease_time is arista.avd.defined %} +{% set subnet_lease_time = subnet.lease_time.days ~ " days, " ~ subnet.lease_time.hours ~ " hours, " ~ subnet.lease_time.minutes ~ " minutes" %} +{% else %} +{% set subnet_lease_time = "-" %} +{% endif %} +{% set subnet_default_gw = subnet.default_gateway | arista.avd.default("-") %} +{% if subnet.ranges is arista.avd.defined and subnet.ranges | length > 0 %} +{% set subnet_ranges = [] %} +{% for range in subnet.ranges | arista.avd.natural_sort("start") %} +{% do subnet_ranges.append(range.start ~ "-" ~ range.end) %} +{% endfor %} +{% else %} +{% set subnet_ranges = ["-"] %} +{% endif %} +{% do dhcp_server_subnets.append({"subnet": subnet.subnet, "name": subnet.name | arista.avd.default("-"), "dns_servers": subnet_dns_servers, "lease_time": subnet_lease_time, "default_gateway": subnet_default_gw , "ranges": subnet_ranges | join(", ")}) %} +{% endfor %} +{% for option in dhcp_server.ipv4_vendor_options | arista.avd.natural_sort("vendor_id") %} +{% do dhcp_vendor_options.append({"vendor_id": option.vendor_id, "sub_options": option.sub_options}) %} +{% endfor %} +{% if dhcp_server_subnets | length > 0 or dhcp_vendor_options | length > 0 %} + +#### VRF {{ dhcp_server.vrf }} DHCP Server +{% if dhcp_server_subnets | length > 0 %} + +##### Subnets + +| Subnet | Name | DNS Servers | Default Gateway | Lease Time | Ranges | +| ------ | ---- | ----------- | --------------- | ---------- | ------ | +{% for subnet in dhcp_server_subnets %} +| {{ subnet.subnet }} | {{ subnet.name | arista.avd.default("-") }} | {{ subnet.dns_servers }} | {{ subnet.default_gateway }} | {{ subnet.lease_time }} | {{ subnet.ranges }} | +{% endfor %} +{% endif %} +{% if dhcp_vendor_options | length > 0 %} + +##### IPv4 Vendor Options + +| Vendor ID | Sub-option Code | Sub-option Type | Sub-option Data | +| --------- | ----------------| --------------- | --------------- | +{% for option in dhcp_vendor_options | arista.avd.natural_sort("vendor_id") %} +{% for sub_option in option.sub_options | arista.avd.natural_sort("code") %} +{% if sub_option.string is arista.avd.defined %} +{% set sub_option_type = "string" %} +{% set sub_option_data = sub_option.string %} +{% elif sub_option.ipv4_address is arista.avd.defined %} +{% set sub_option_type = "ipv4-address" %} +{% set sub_option_data = sub_option.ipv4_address %} +{% elif sub_option.array_ipv4_address is arista.avd.defined %} +{% set sub_option_type = "array ipv4-address" %} +{% set sub_option_data = sub_option.array_ipv4_address | join(" ") %} +{% endif %} +{% if sub_option_type is arista.avd.defined %} +| {{ option.vendor_id }} | {{ sub_option.code }} | {{ sub_option_type }} | {{ sub_option_data }} | +{% endif %} +{% endfor %} +{% endfor %} +{% endif %} +{% endif %} +{% endfor %} + +### DHCP Server Configuration + +```eos +{% include 'eos/dhcp-servers.j2' %} +``` +{% endif %} +{% if ethernet_interfaces_dhcp_server | length > 0 %} ### DHCP Server Interfaces | Interface name | DHCP IPv4 | DHCP IPv6 | | -------------- | --------- | --------- | -{% for ethernet_interface in ethernet_interfaces_dhcp_server | arista.avd.natural_sort %} +{% for ethernet_interface in ethernet_interfaces_dhcp_server | arista.avd.natural_sort %} | {{ ethernet_interface.name }} | {{ ethernet_interface.dhcp_server_ipv4 | arista.avd.default(false) }} | {{ ethernet_interface.dhcp_server_ipv6 | arista.avd.default(false) }} | -{% endfor %} +{% endfor %} +{% endif %} {% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-bgp.j2 b/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-bgp.j2 index 0a7b79700c0..2a2512e31e5 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-bgp.j2 +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-bgp.j2 @@ -195,6 +195,10 @@ {% if peer_group.bfd is arista.avd.defined(true) %} | BFD | True | {% endif %} +{% if peer_group.bfd_timers.interval is arista.avd.defined and peer_group.bfd_timers.min_rx is arista.avd.defined and peer_group.bfd_timers.multiplier is arista.avd.defined %} +{% set timers = "interval: " ~ peer_group.bfd_timers.interval ~ ", min_rx: " ~ peer_group.bfd_timers.min_rx ~ ", multiplier: " ~ peer_group.bfd_timers.multiplier %} +| BFD Timers | {{ timers }} | +{% endif %} {% if peer_group.ebgp_multihop is arista.avd.defined %} | Ebgp multihop | {{ peer_group.ebgp_multihop }} | {% endif %} @@ -281,6 +285,9 @@ {% endif %} {% if peer_group.bfd is arista.avd.defined(true) %} {% set inherited.bfd = "Inherited from peer group " ~ neighbor.peer_group %} +{% if peer_group.bfd_timers.interval is arista.avd.defined and peer_group.bfd_timers.min_rx is arista.avd.defined and peer_group.bfd_timers.multiplier is arista.avd.defined %} +{% set inherited.bfd_timers = "interval: " ~ peer_group.bfd_timers.interval ~ ", min_rx: " ~ peer_group.bfd_timers.min_rx ~ ", multiplier: " ~ peer_group.bfd_timers.multiplier %} +{% endif %} {% endif %} {% if peer_group.shutdown is arista.avd.defined(true) %} {% set inherited.shutdown = "Inherited from peer group " ~ neighbor.peer_group %} @@ -300,6 +307,13 @@ {% set active_parameter.vrf = neighbor.vrf | arista.avd.default(inherited.vrf, 'default') %} {% set active_parameter.send_community = neighbor.send_community | arista.avd.default(inherited.send_community, '-') %} {% set active_parameter.bfd = neighbor.bfd | arista.avd.default(inherited.bfd, '-') %} +{% set active_parameter.bfd_timers = inherited.bfd_timers | arista.avd.default("-") %} +{% if neighbor.bfd_timers.interval is arista.avd.defined and neighbor.bfd_timers.min_rx is arista.avd.defined and neighbor.bfd_timers.multiplier is arista.avd.defined %} +{% set active_parameter.bfd_timers = "interval: " ~ neighbor.bfd_timers.interval ~ ", min_rx: " ~ neighbor.bfd_timers.min_rx ~ ", multiplier: " ~ neighbor.bfd_timers.multiplier %} +{% endif %} +{% if active_parameter.bfd != "-" and active_parameter.bfd_timers != "-" %} +{% set active_parameter.bfd = active_parameter.bfd ~ "(" ~ active_parameter.bfd_timers ~ ")" %} +{% endif %} {% set active_parameter.shutdown = neighbor.shutdown | arista.avd.default(inherited.shutdown, '-') %} {% set active_parameter.route_reflector_client = neighbor.route_reflector_client | arista.avd.default(inherited.route_reflector_client, '-') %} {% if neighbor.rib_in_pre_policy_retain.enabled is arista.avd.defined() %} @@ -365,6 +379,9 @@ {% endif %} {% if peer_group.bfd is arista.avd.defined(true) %} {% set inherited_vrf.bfd = "Inherited from peer group " ~ neighbor.peer_group %} +{% if peer_group.bfd_timers.interval is arista.avd.defined and peer_group.bfd_timers.min_rx is arista.avd.defined and peer_group.bfd_timers.multiplier is arista.avd.defined %} +{% set inherited_vrf.bfd_timers = "interval: " ~ peer_group.bfd_timers.interval ~ ", min_rx: " ~ peer_group.bfd_timers.min_rx ~ ", multiplier: " ~ peer_group.bfd_timers.multiplier %} +{% endif %} {% endif %} {% if peer_group.shutdown is arista.avd.defined(true) %} {% set inherited_vrf.shutdown = "Inherited from peer group " ~ neighbor.peer_group %} @@ -383,6 +400,13 @@ {% set active_parameter_vrf.remote_as = neighbor.remote_as | arista.avd.default(inherited_vrf.remote_as, '-') %} {% set active_parameter_vrf.send_community = neighbor.send_community | arista.avd.default(inherited_vrf.send_community, '-') %} {% set active_parameter_vrf.bfd = neighbor.bfd | arista.avd.default(inherited_vrf.bfd, '-') %} +{% set active_parameter_vrf.bfd_timers = inherited_vrf.bfd_timers | arista.avd.default("-") %} +{% if neighbor.bfd_timers.interval is arista.avd.defined and neighbor.bfd_timers.min_rx is arista.avd.defined and neighbor.bfd_timers.multiplier is arista.avd.defined %} +{% set active_parameter_vrf.bfd_timers = "interval: " ~ neighbor.bfd_timers.interval ~ ", min_rx: " ~ neighbor.bfd_timers.min_rx ~ ", multiplier: " ~ neighbor.bfd_timers.multiplier %} +{% endif %} +{% if active_parameter_vrf.bfd != "-" and active_parameter_vrf.bfd_timers != "-" %} +{% set active_parameter_vrf.bfd = active_parameter_vrf.bfd ~ "(" ~ active_parameter_vrf.bfd_timers ~ ")" %} +{% endif %} {% set active_parameter_vrf.shutdown = neighbor.shutdown | arista.avd.default(inherited_vrf.shutdown, '-') %} {% set active_parameter_vrf.route_reflector_client = neighbor.route_reflector_client | arista.avd.default(inherited_vrf.route_reflector_client, '-') %} {% set active_parameter_vrf.passive = neighbor.passive | arista.avd.default(inherited_vrf.passive, '-') %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos-device-documentation.j2 b/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos-device-documentation.j2 index a521c621940..9968bafee2e 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos-device-documentation.j2 +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos-device-documentation.j2 @@ -27,7 +27,7 @@ {% include 'documentation/aliases.j2' %} {# DHCP Relay #} {% include 'documentation/dhcp-relay.j2' %} -{# DHCP Server #} +{# DHCP Servers #} {% include 'documentation/dhcp-server.j2' %} {# System Boot Configuration #} {% include 'documentation/boot.j2' %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos-intended-config.j2 b/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos-intended-config.j2 index 012d9111c8b..4d9019c954a 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos-intended-config.j2 +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos-intended-config.j2 @@ -31,6 +31,8 @@ {% include 'eos/ip-dhcp-relay.j2' %} {# IP DHCP Snooping #} {% include 'eos/ip-dhcp-snooping.j2' %} +{# dhcp servers #} +{% include 'eos/dhcp-servers.j2' %} {# switchport default #} {% include 'eos/switchport-default.j2' %} {# internal vlan allocation policy #} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/dhcp-servers.j2 b/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/dhcp-servers.j2 new file mode 100644 index 00000000000..22b657b9eb3 --- /dev/null +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/dhcp-servers.j2 @@ -0,0 +1,58 @@ +{# + Copyright (c) 2023-2024 Arista Networks, Inc. + Use of this source code is governed by the Apache License 2.0 + that can be found in the LICENSE file. +#} +{# eos - dhcp servers #} +{% if dhcp_servers is arista.avd.defined %} +{% for dhcp_server in dhcp_servers | arista.avd.natural_sort("vrf") %} +{% set server_cli = "dhcp server" %} +{% if dhcp_server.vrf != "default" %} +{% set server_cli = server_cli ~ " vrf " ~ dhcp_server.vrf %} +{% endif %} +! +{{ server_cli }} +{% if dhcp_server.dns_domain_name_ipv4 is arista.avd.defined %} + dns domain name ipv4 {{ dhcp_server.dns_domain_name_ipv4 }} +{% endif %} +{% if dhcp_server.dns_domain_name_ipv6 is arista.avd.defined %} + dns domain name ipv6 {{ dhcp_server.dns_domain_name_ipv6 }} +{% endif %} +{% for subnet in dhcp_server.subnets | arista.avd.natural_sort %} + ! + subnet {{ subnet.subnet }} +{% for range in subnet.ranges | arista.avd.natural_sort("end") | arista.avd.natural_sort("start") %} + ! + range {{ range.start }} {{ range.end }} +{% endfor %} +{% if subnet.name is arista.avd.defined %} + name {{ subnet.name }} +{% endif %} +{% if subnet.dns_servers is arista.avd.defined %} + dns server {{ subnet.dns_servers | join(" ") }} +{% endif %} +{% if subnet.lease_time is arista.avd.defined %} + lease time {{ subnet.lease_time.days }} days {{ subnet.lease_time.hours }} hours {{ subnet.lease_time.minutes }} minutes +{% endif %} +{% if subnet.default_gateway is arista.avd.defined %} + default-gateway {{ subnet.default_gateway }} +{% endif %} +{% endfor %} +{% if dhcp_server.disabled | arista.avd.default(false) is true %} + disabled +{% endif %} +{% for option in dhcp_server.ipv4_vendor_options | arista.avd.natural_sort("vendor_id") %} + ! + vendor-option ipv4 {{ option.vendor_id }} +{% for sub_option in option.sub_options | arista.avd.natural_sort %} +{% if sub_option.string is arista.avd.defined %} + sub-option {{ sub_option.code }} type string data "{{ sub_option.string }}" +{% elif sub_option.ipv4_address is arista.avd.defined %} + sub-option {{ sub_option.code }} type ipv4-address data {{ sub_option.ipv4_address }} +{% elif sub_option.array_ipv4_address is arista.avd.defined %} + sub-option {{ sub_option.code }} type array ipv4-address data {{ sub_option.array_ipv4_address | join(" ") }} +{% endif %} +{% endfor %} +{% endfor %} +{% endfor %} +{% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-bgp.j2 b/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-bgp.j2 index 493293eaf0d..30cd06df2dc 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-bgp.j2 +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-bgp.j2 @@ -150,6 +150,11 @@ router bgp {{ router_bgp.as }} {% endif %} {% if peer_group.bfd is arista.avd.defined(true) %} neighbor {{ peer_group.name }} bfd +{% if peer_group.bfd_timers.interval is arista.avd.defined and + peer_group.bfd_timers.min_rx is arista.avd.defined and + peer_group.bfd_timers.multiplier is arista.avd.defined %} + neighbor {{ peer_group.name }} bfd interval {{ peer_group.bfd_timers.interval }} min-rx {{ peer_group.bfd_timers.min_rx }} multiplier {{ peer_group.bfd_timers.multiplier }} +{% endif %} {% endif %} {% if peer_group.allowas_in.enabled is arista.avd.defined(true) %} {% set allowas_in_cli = "neighbor " ~ peer_group.name ~ " allowas-in" %} @@ -291,6 +296,11 @@ router bgp {{ router_bgp.as }} {% endif %} {% if neighbor.bfd is arista.avd.defined(true) %} neighbor {{ neighbor.ip_address }} bfd +{% if neighbor.bfd_timers.interval is arista.avd.defined and + neighbor.bfd_timers.min_rx is arista.avd.defined and + neighbor.bfd_timers.multiplier is arista.avd.defined %} + neighbor {{ neighbor.ip_address }} bfd interval {{ neighbor.bfd_timers.interval }} min-rx {{ neighbor.bfd_timers.min_rx }} multiplier {{ neighbor.bfd_timers.multiplier }} +{% endif %} {% elif neighbor.bfd is arista.avd.defined(false) and neighbor.peer_group is arista.avd.defined %} no neighbor {{ neighbor.ip_address }} bfd {% endif %} @@ -1281,6 +1291,11 @@ router bgp {{ router_bgp.as }} {% endif %} {% if neighbor.bfd is arista.avd.defined(true) %} neighbor {{ neighbor.ip_address }} bfd +{% if neighbor.bfd_timers.interval is arista.avd.defined and + neighbor.bfd_timers.min_rx is arista.avd.defined and + neighbor.bfd_timers.multiplier is arista.avd.defined %} + neighbor {{ neighbor.ip_address }} bfd interval {{ neighbor.bfd_timers.interval }} min-rx {{ neighbor.bfd_timers.min_rx }} multiplier {{ neighbor.bfd_timers.multiplier }} +{% endif %} {% elif neighbor.bfd is arista.avd.defined(false) and neighbor.peer_group is arista.avd.defined %} no neighbor {{ neighbor.ip_address }} bfd {% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/core-interfaces.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/core-interfaces.md index e6812bfdbfa..7c59f2feeb3 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/core-interfaces.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/core-interfaces.md @@ -92,35 +92,6 @@ | [              - <str>](## "core_interfaces.p2p_links.[].port_channel.nodes_child_interfaces.[].interfaces.[]") | String | | | | | | [      raw_eos_cli](## "core_interfaces.p2p_links.[].raw_eos_cli") | String | | | | EOS CLI rendered directly on the point-to-point interface in the final EOS configuration. | | [      structured_config](## "core_interfaces.p2p_links.[].structured_config") | Dictionary | | | | Custom structured config for interfaces
Note! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces. | - | [  l3_interfaces_profiles](## "core_interfaces.l3_interfaces_profiles") | List, items: Dictionary | | | | | - | [    - profile](## "core_interfaces.l3_interfaces_profiles.[].profile") | String | Required, Unique | | | L3 interface profile name. Any variable supported under `l3_interfaces` can be inherited from a profile. | - | [      interface](## "core_interfaces.l3_interfaces_profiles.[].interface") | String | | | Pattern: Ethernet[\d/]+ | Ethernet interface name like 'Ethernet2'. | - | [      description](## "core_interfaces.l3_interfaces_profiles.[].description") | String | | | | Interface description.
If not set a default description will be configured with '[[ ]]' | - | [      ip](## "core_interfaces.l3_interfaces_profiles.[].ip") | String | | | | Node IPv4 address/Mask or 'dhcp'. | - | [      dhcp_client_accept_default_route](## "core_interfaces.l3_interfaces_profiles.[].dhcp_client_accept_default_route") | Boolean | | `False` | | Supported if `ip` is `dhcp`.
Accepts default route from DHCP. | - | [      enabled](## "core_interfaces.l3_interfaces_profiles.[].enabled") | Boolean | | `True` | | Enable or Shutdown the interface. | - | [      speed](## "core_interfaces.l3_interfaces_profiles.[].speed") | String | | | | Speed should be set in the format `` or `forced ` or `auto `. | - | [      peer](## "core_interfaces.l3_interfaces_profiles.[].peer") | String | | | | The peer device name. Used for description and documentation | - | [      peer_interface](## "core_interfaces.l3_interfaces_profiles.[].peer_interface") | String | | | | The peer device interface. Used for description and documentation | - | [      peer_ip](## "core_interfaces.l3_interfaces_profiles.[].peer_ip") | String | | | | The peer device IP. Used for description and documentation | - | [      qos_profile](## "core_interfaces.l3_interfaces_profiles.[].qos_profile") | String | | | | QOS service profile. | - | [      raw_eos_cli](## "core_interfaces.l3_interfaces_profiles.[].raw_eos_cli") | String | | | | EOS CLI rendered directly on the interface in the final EOS configuration. | - | [      structured_config](## "core_interfaces.l3_interfaces_profiles.[].structured_config") | Dictionary | | | | Custom structured config for the Ethernet interface. | - | [  l3_interfaces](## "core_interfaces.l3_interfaces") | List, items: Dictionary | | | | | - | [    - node](## "core_interfaces.l3_interfaces.[].node") | String | | | | Device on which the interface should be configured. | - | [      profile](## "core_interfaces.l3_interfaces.[].profile") | String | | | | L3 interface profile name. Profile defined under l3_interfaces_profiles. | - | [      interface](## "core_interfaces.l3_interfaces.[].interface") | String | | | Pattern: Ethernet[\d/]+ | Ethernet interface name like 'Ethernet2'. | - | [      description](## "core_interfaces.l3_interfaces.[].description") | String | | | | Interface description.
If not set a default description will be configured with '[[ ]]' | - | [      ip](## "core_interfaces.l3_interfaces.[].ip") | String | | | | Node IPv4 address/Mask or 'dhcp'. | - | [      dhcp_client_accept_default_route](## "core_interfaces.l3_interfaces.[].dhcp_client_accept_default_route") | Boolean | | `False` | | Supported if `ip` is `dhcp`.
Accepts default route from DHCP. | - | [      enabled](## "core_interfaces.l3_interfaces.[].enabled") | Boolean | | `True` | | Enable or Shutdown the interface. | - | [      speed](## "core_interfaces.l3_interfaces.[].speed") | String | | | | Speed should be set in the format `` or `forced ` or `auto `. | - | [      peer](## "core_interfaces.l3_interfaces.[].peer") | String | | | | The peer device name. Used for description and documentation | - | [      peer_interface](## "core_interfaces.l3_interfaces.[].peer_interface") | String | | | | The peer device interface. Used for description and documentation | - | [      peer_ip](## "core_interfaces.l3_interfaces.[].peer_ip") | String | | | | The peer device IP. Used for description and documentation | - | [      qos_profile](## "core_interfaces.l3_interfaces.[].qos_profile") | String | | | | QOS service profile. | - | [      raw_eos_cli](## "core_interfaces.l3_interfaces.[].raw_eos_cli") | String | | | | EOS CLI rendered directly on the interface in the final EOS configuration. | - | [      structured_config](## "core_interfaces.l3_interfaces.[].structured_config") | Dictionary | | | | Custom structured config for the Ethernet interface. | === "YAML" @@ -346,91 +317,4 @@ # Custom structured config for interfaces # Note! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces. structured_config: - l3_interfaces_profiles: - - # L3 interface profile name. Any variable supported under `l3_interfaces` can be inherited from a profile. - - profile: - - # Ethernet interface name like 'Ethernet2'. - interface: - - # Interface description. - # If not set a default description will be configured with '[[ ]]' - description: - - # Node IPv4 address/Mask or 'dhcp'. - ip: - - # Supported if `ip` is `dhcp`. - # Accepts default route from DHCP. - dhcp_client_accept_default_route: - - # Enable or Shutdown the interface. - enabled: - - # Speed should be set in the format `` or `forced ` or `auto `. - speed: - - # The peer device name. Used for description and documentation - peer: - - # The peer device interface. Used for description and documentation - peer_interface: - - # The peer device IP. Used for description and documentation - peer_ip: - - # QOS service profile. - qos_profile: - - # EOS CLI rendered directly on the interface in the final EOS configuration. - raw_eos_cli: - - # Custom structured config for the Ethernet interface. - structured_config: - l3_interfaces: - - # Device on which the interface should be configured. - - node: - - # L3 interface profile name. Profile defined under l3_interfaces_profiles. - profile: - - # Ethernet interface name like 'Ethernet2'. - interface: - - # Interface description. - # If not set a default description will be configured with '[[ ]]' - description: - - # Node IPv4 address/Mask or 'dhcp'. - ip: - - # Supported if `ip` is `dhcp`. - # Accepts default route from DHCP. - dhcp_client_accept_default_route: - - # Enable or Shutdown the interface. - enabled: - - # Speed should be set in the format `` or `forced ` or `auto `. - speed: - - # The peer device name. Used for description and documentation - peer: - - # The peer device interface. Used for description and documentation - peer_interface: - - # The peer device IP. Used for description and documentation - peer_ip: - - # QOS service profile. - qos_profile: - - # EOS CLI rendered directly on the interface in the final EOS configuration. - raw_eos_cli: - - # Custom structured config for the Ethernet interface. - structured_config: ``` diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/l3-edge.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/l3-edge.md index 31622a6801d..fe5836e37cc 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/l3-edge.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/l3-edge.md @@ -92,35 +92,6 @@ | [              - <str>](## "l3_edge.p2p_links.[].port_channel.nodes_child_interfaces.[].interfaces.[]") | String | | | | | | [      raw_eos_cli](## "l3_edge.p2p_links.[].raw_eos_cli") | String | | | | EOS CLI rendered directly on the point-to-point interface in the final EOS configuration. | | [      structured_config](## "l3_edge.p2p_links.[].structured_config") | Dictionary | | | | Custom structured config for interfaces
Note! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces. | - | [  l3_interfaces_profiles](## "l3_edge.l3_interfaces_profiles") | List, items: Dictionary | | | | | - | [    - profile](## "l3_edge.l3_interfaces_profiles.[].profile") | String | Required, Unique | | | L3 interface profile name. Any variable supported under `l3_interfaces` can be inherited from a profile. | - | [      interface](## "l3_edge.l3_interfaces_profiles.[].interface") | String | | | Pattern: Ethernet[\d/]+ | Ethernet interface name like 'Ethernet2'. | - | [      description](## "l3_edge.l3_interfaces_profiles.[].description") | String | | | | Interface description.
If not set a default description will be configured with '[[ ]]' | - | [      ip](## "l3_edge.l3_interfaces_profiles.[].ip") | String | | | | Node IPv4 address/Mask or 'dhcp'. | - | [      dhcp_client_accept_default_route](## "l3_edge.l3_interfaces_profiles.[].dhcp_client_accept_default_route") | Boolean | | `False` | | Supported if `ip` is `dhcp`.
Accepts default route from DHCP. | - | [      enabled](## "l3_edge.l3_interfaces_profiles.[].enabled") | Boolean | | `True` | | Enable or Shutdown the interface. | - | [      speed](## "l3_edge.l3_interfaces_profiles.[].speed") | String | | | | Speed should be set in the format `` or `forced ` or `auto `. | - | [      peer](## "l3_edge.l3_interfaces_profiles.[].peer") | String | | | | The peer device name. Used for description and documentation | - | [      peer_interface](## "l3_edge.l3_interfaces_profiles.[].peer_interface") | String | | | | The peer device interface. Used for description and documentation | - | [      peer_ip](## "l3_edge.l3_interfaces_profiles.[].peer_ip") | String | | | | The peer device IP. Used for description and documentation | - | [      qos_profile](## "l3_edge.l3_interfaces_profiles.[].qos_profile") | String | | | | QOS service profile. | - | [      raw_eos_cli](## "l3_edge.l3_interfaces_profiles.[].raw_eos_cli") | String | | | | EOS CLI rendered directly on the interface in the final EOS configuration. | - | [      structured_config](## "l3_edge.l3_interfaces_profiles.[].structured_config") | Dictionary | | | | Custom structured config for the Ethernet interface. | - | [  l3_interfaces](## "l3_edge.l3_interfaces") | List, items: Dictionary | | | | | - | [    - node](## "l3_edge.l3_interfaces.[].node") | String | | | | Device on which the interface should be configured. | - | [      profile](## "l3_edge.l3_interfaces.[].profile") | String | | | | L3 interface profile name. Profile defined under l3_interfaces_profiles. | - | [      interface](## "l3_edge.l3_interfaces.[].interface") | String | | | Pattern: Ethernet[\d/]+ | Ethernet interface name like 'Ethernet2'. | - | [      description](## "l3_edge.l3_interfaces.[].description") | String | | | | Interface description.
If not set a default description will be configured with '[[ ]]' | - | [      ip](## "l3_edge.l3_interfaces.[].ip") | String | | | | Node IPv4 address/Mask or 'dhcp'. | - | [      dhcp_client_accept_default_route](## "l3_edge.l3_interfaces.[].dhcp_client_accept_default_route") | Boolean | | `False` | | Supported if `ip` is `dhcp`.
Accepts default route from DHCP. | - | [      enabled](## "l3_edge.l3_interfaces.[].enabled") | Boolean | | `True` | | Enable or Shutdown the interface. | - | [      speed](## "l3_edge.l3_interfaces.[].speed") | String | | | | Speed should be set in the format `` or `forced ` or `auto `. | - | [      peer](## "l3_edge.l3_interfaces.[].peer") | String | | | | The peer device name. Used for description and documentation | - | [      peer_interface](## "l3_edge.l3_interfaces.[].peer_interface") | String | | | | The peer device interface. Used for description and documentation | - | [      peer_ip](## "l3_edge.l3_interfaces.[].peer_ip") | String | | | | The peer device IP. Used for description and documentation | - | [      qos_profile](## "l3_edge.l3_interfaces.[].qos_profile") | String | | | | QOS service profile. | - | [      raw_eos_cli](## "l3_edge.l3_interfaces.[].raw_eos_cli") | String | | | | EOS CLI rendered directly on the interface in the final EOS configuration. | - | [      structured_config](## "l3_edge.l3_interfaces.[].structured_config") | Dictionary | | | | Custom structured config for the Ethernet interface. | === "YAML" @@ -346,91 +317,4 @@ # Custom structured config for interfaces # Note! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces. structured_config: - l3_interfaces_profiles: - - # L3 interface profile name. Any variable supported under `l3_interfaces` can be inherited from a profile. - - profile: - - # Ethernet interface name like 'Ethernet2'. - interface: - - # Interface description. - # If not set a default description will be configured with '[[ ]]' - description: - - # Node IPv4 address/Mask or 'dhcp'. - ip: - - # Supported if `ip` is `dhcp`. - # Accepts default route from DHCP. - dhcp_client_accept_default_route: - - # Enable or Shutdown the interface. - enabled: - - # Speed should be set in the format `` or `forced ` or `auto `. - speed: - - # The peer device name. Used for description and documentation - peer: - - # The peer device interface. Used for description and documentation - peer_interface: - - # The peer device IP. Used for description and documentation - peer_ip: - - # QOS service profile. - qos_profile: - - # EOS CLI rendered directly on the interface in the final EOS configuration. - raw_eos_cli: - - # Custom structured config for the Ethernet interface. - structured_config: - l3_interfaces: - - # Device on which the interface should be configured. - - node: - - # L3 interface profile name. Profile defined under l3_interfaces_profiles. - profile: - - # Ethernet interface name like 'Ethernet2'. - interface: - - # Interface description. - # If not set a default description will be configured with '[[ ]]' - description: - - # Node IPv4 address/Mask or 'dhcp'. - ip: - - # Supported if `ip` is `dhcp`. - # Accepts default route from DHCP. - dhcp_client_accept_default_route: - - # Enable or Shutdown the interface. - enabled: - - # Speed should be set in the format `` or `forced ` or `auto `. - speed: - - # The peer device name. Used for description and documentation - peer: - - # The peer device interface. Used for description and documentation - peer_interface: - - # The peer device IP. Used for description and documentation - peer_ip: - - # QOS service profile. - qos_profile: - - # EOS CLI rendered directly on the interface in the final EOS configuration. - raw_eos_cli: - - # Custom structured config for the Ethernet interface. - structured_config: ``` diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-vrfs-bgp-settings.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-vrfs-bgp-settings.md index 012d9e427f8..d80fb110425 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-vrfs-bgp-settings.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-vrfs-bgp-settings.md @@ -32,7 +32,11 @@ | [        next_hop_unchanged](## ".[].bgp_peer_groups.[].next_hop_unchanged") | Boolean | | | | | | [        update_source](## ".[].bgp_peer_groups.[].update_source") | String | | | | IP address or interface name | | [        route_reflector_client](## ".[].bgp_peer_groups.[].route_reflector_client") | Boolean | | | | | - | [        bfd](## ".[].bgp_peer_groups.[].bfd") | Boolean | | | | | + | [        bfd](## ".[].bgp_peer_groups.[].bfd") | Boolean | | | | Enable BFD. | + | [        bfd_timers](## ".[].bgp_peer_groups.[].bfd_timers") | Dictionary | | | | Override default BFD timers. BFD must be enabled with `bfd: true`. | + | [          interval](## ".[].bgp_peer_groups.[].bfd_timers.interval") | Integer | Required | | Min: 50
Max: 60000 | Interval in milliseconds. | + | [          min_rx](## ".[].bgp_peer_groups.[].bfd_timers.min_rx") | Integer | Required | | Min: 50
Max: 60000 | Rate in milliseconds. | + | [          multiplier](## ".[].bgp_peer_groups.[].bfd_timers.multiplier") | Integer | Required | | Min: 3
Max: 50 | | | [        ebgp_multihop](## ".[].bgp_peer_groups.[].ebgp_multihop") | Integer | | | Min: 1
Max: 255 | Time-to-live in range of hops | | [        next_hop_self](## ".[].bgp_peer_groups.[].next_hop_self") | Boolean | | | | | | [        password](## ".[].bgp_peer_groups.[].password") | String | | | | | @@ -111,7 +115,11 @@ | [            next_hop_unchanged](## ".[].vrfs.[].bgp_peer_groups.[].next_hop_unchanged") | Boolean | | | | | | [            update_source](## ".[].vrfs.[].bgp_peer_groups.[].update_source") | String | | | | IP address or interface name | | [            route_reflector_client](## ".[].vrfs.[].bgp_peer_groups.[].route_reflector_client") | Boolean | | | | | - | [            bfd](## ".[].vrfs.[].bgp_peer_groups.[].bfd") | Boolean | | | | | + | [            bfd](## ".[].vrfs.[].bgp_peer_groups.[].bfd") | Boolean | | | | Enable BFD. | + | [            bfd_timers](## ".[].vrfs.[].bgp_peer_groups.[].bfd_timers") | Dictionary | | | | Override default BFD timers. BFD must be enabled with `bfd: true`. | + | [              interval](## ".[].vrfs.[].bgp_peer_groups.[].bfd_timers.interval") | Integer | Required | | Min: 50
Max: 60000 | Interval in milliseconds. | + | [              min_rx](## ".[].vrfs.[].bgp_peer_groups.[].bfd_timers.min_rx") | Integer | Required | | Min: 50
Max: 60000 | Rate in milliseconds. | + | [              multiplier](## ".[].vrfs.[].bgp_peer_groups.[].bfd_timers.multiplier") | Integer | Required | | Min: 3
Max: 50 | | | [            ebgp_multihop](## ".[].vrfs.[].bgp_peer_groups.[].ebgp_multihop") | Integer | | | Min: 1
Max: 255 | Time-to-live in range of hops | | [            next_hop_self](## ".[].vrfs.[].bgp_peer_groups.[].next_hop_self") | Boolean | | | | | | [            password](## ".[].vrfs.[].bgp_peer_groups.[].password") | String | | | | | @@ -205,8 +213,20 @@ # IP address or interface name update_source: route_reflector_client: + + # Enable BFD. bfd: + # Override default BFD timers. BFD must be enabled with `bfd: true`. + bfd_timers: + + # Interval in milliseconds. + interval: + + # Rate in milliseconds. + min_rx: + multiplier: + # Time-to-live in range of hops ebgp_multihop: next_hop_self: @@ -399,8 +419,20 @@ # IP address or interface name update_source: route_reflector_client: + + # Enable BFD. bfd: + # Override default BFD timers. BFD must be enabled with `bfd: true`. + bfd_timers: + + # Interval in milliseconds. + interval: + + # Rate in milliseconds. + min_rx: + multiplier: + # Time-to-live in range of hops ebgp_multihop: next_hop_self: diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-carriers.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-carriers.md new file mode 100644 index 00000000000..d70ab490fa2 --- /dev/null +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-carriers.md @@ -0,0 +1,31 @@ + +=== "Table" + + | Variable | Type | Required | Default | Value Restrictions | Description | + | -------- | ---- | -------- | ------- | ------------------ | ----------- | + | [wan_carriers](## "wan_carriers") | List, items: Dictionary | | | | PREVIEW: This key is currently not supported

List of carriers used for the WAN configuration and their mapping to path-groups. | + | [  - name](## "wan_carriers.[].name") | String | Required, Unique | | | Carrier name. | + | [    description](## "wan_carriers.[].description") | String | | | | Additional information about the carrier for documentation purposes. | + | [    path_group](## "wan_carriers.[].path_group") | String | Required | | | The path-group to which this carrier belongs. | + +=== "YAML" + + ```yaml + # PREVIEW: This key is currently not supported + + # List of carriers used for the WAN configuration and their mapping to path-groups. + wan_carriers: + + # Carrier name. + - name: + + # Additional information about the carrier for documentation purposes. + description: + + # The path-group to which this carrier belongs. + path_group: + ``` diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-interfaces-settings.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-interfaces-settings.md new file mode 100644 index 00000000000..0b12c697e28 --- /dev/null +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-interfaces-settings.md @@ -0,0 +1,426 @@ + +=== "Table" + + | Variable | Type | Required | Default | Value Restrictions | Description | + | -------- | ---- | -------- | ------- | ------------------ | ----------- | + | [<node_type_keys.key>](## "") | Dictionary | | | | | + | [  defaults](## ".defaults") | Dictionary | | | | Define variables for all nodes of this type. | + | [    l3_interfaces](## ".defaults.l3_interfaces") | List, items: Dictionary | | | | PREVIEW: This key is currently not supported

L3 Interfaces currently only use for WAN interfaces. | + | [      - profile](## ".defaults.l3_interfaces.[].profile") | String | | | | L3 interface profile name. Profile defined under `l3_interface_profiles`.
| + | [        name](## ".defaults.l3_interfaces.[].name") | String | Required, Unique | | Pattern: Ethernet[\d/]+ | Ethernet interface name like 'Ethernet2'. | + | [        description](## ".defaults.l3_interfaces.[].description") | String | | | | Interface description.
If not set a default description will be configured with '[[ ]]' | + | [        ip](## ".defaults.l3_interfaces.[].ip") | String | | | | Node IPv4 address/Mask or 'dhcp'. | + | [        set_default_route](## ".defaults.l3_interfaces.[].set_default_route") | Boolean | | `False` | | Insert a default route to the `peer_ip` if `ip` is an ip address
or configure to accept a default route from DHCP if `ip` is `dhcp`.

AVD will error out if set to true, `ip` is an ip address and `peer_ip` is missing. | + | [        enabled](## ".defaults.l3_interfaces.[].enabled") | Boolean | | `True` | | Enable or Shutdown the interface. | + | [        speed](## ".defaults.l3_interfaces.[].speed") | String | | | | Speed should be set in the format `` or `forced ` or `auto `. | + | [        peer](## ".defaults.l3_interfaces.[].peer") | String | | | | The peer device name. Used for description and documentation | + | [        peer_interface](## ".defaults.l3_interfaces.[].peer_interface") | String | | | | The peer device interface. Used for description and documentation | + | [        peer_ip](## ".defaults.l3_interfaces.[].peer_ip") | String | | | | The peer device IPv4 address (no mask). Used as default route gateway if `set_default_route` is true and `ip` is an IP address. | + | [        qos_profile](## ".defaults.l3_interfaces.[].qos_profile") | String | | | | QOS service profile. | + | [        wan_carrier](## ".defaults.l3_interfaces.[].wan_carrier") | String | | | | The WAN Carrier this interface is connected to.
This is used to infer the path-groups in which this interface should be configured. | + | [        wan_circuit_id](## ".defaults.l3_interfaces.[].wan_circuit_id") | String | | | | The WAN Circuit ID for this interface.
This is not rendered in the configuration but used for WAN designs. | + | [        connected_to_pathfinder](## ".defaults.l3_interfaces.[].connected_to_pathfinder") | Boolean | | `True` | | For a WAN interface (`wan_path_group` is set), allow to disable the static tunnel towards Pathfinders. | + | [        raw_eos_cli](## ".defaults.l3_interfaces.[].raw_eos_cli") | String | | | | EOS CLI rendered directly on the interface in the final EOS configuration. | + | [        structured_config](## ".defaults.l3_interfaces.[].structured_config") | Dictionary | | | | Custom structured config for the Ethernet interface. | + | [  node_groups](## ".node_groups") | List, items: Dictionary | | | | Define variables related to all nodes part of this group. | + | [    - group](## ".node_groups.[].group") | String | Required, Unique | | | The Node Group Name is used for MLAG domain unless set with 'mlag_domain_id'.
The Node Group Name is also used for peer description on downstream switches' uplinks.
| + | [      nodes](## ".node_groups.[].nodes") | List, items: Dictionary | | | | Define variables per node. | + | [        - name](## ".node_groups.[].nodes.[].name") | String | Required, Unique | | | The Node Name is used as "hostname". | + | [          l3_interfaces](## ".node_groups.[].nodes.[].l3_interfaces") | List, items: Dictionary | | | | PREVIEW: This key is currently not supported

L3 Interfaces currently only use for WAN interfaces. | + | [            - profile](## ".node_groups.[].nodes.[].l3_interfaces.[].profile") | String | | | | L3 interface profile name. Profile defined under `l3_interface_profiles`.
| + | [              name](## ".node_groups.[].nodes.[].l3_interfaces.[].name") | String | Required, Unique | | Pattern: Ethernet[\d/]+ | Ethernet interface name like 'Ethernet2'. | + | [              description](## ".node_groups.[].nodes.[].l3_interfaces.[].description") | String | | | | Interface description.
If not set a default description will be configured with '[[ ]]' | + | [              ip](## ".node_groups.[].nodes.[].l3_interfaces.[].ip") | String | | | | Node IPv4 address/Mask or 'dhcp'. | + | [              set_default_route](## ".node_groups.[].nodes.[].l3_interfaces.[].set_default_route") | Boolean | | `False` | | Insert a default route to the `peer_ip` if `ip` is an ip address
or configure to accept a default route from DHCP if `ip` is `dhcp`.

AVD will error out if set to true, `ip` is an ip address and `peer_ip` is missing. | + | [              enabled](## ".node_groups.[].nodes.[].l3_interfaces.[].enabled") | Boolean | | `True` | | Enable or Shutdown the interface. | + | [              speed](## ".node_groups.[].nodes.[].l3_interfaces.[].speed") | String | | | | Speed should be set in the format `` or `forced ` or `auto `. | + | [              peer](## ".node_groups.[].nodes.[].l3_interfaces.[].peer") | String | | | | The peer device name. Used for description and documentation | + | [              peer_interface](## ".node_groups.[].nodes.[].l3_interfaces.[].peer_interface") | String | | | | The peer device interface. Used for description and documentation | + | [              peer_ip](## ".node_groups.[].nodes.[].l3_interfaces.[].peer_ip") | String | | | | The peer device IPv4 address (no mask). Used as default route gateway if `set_default_route` is true and `ip` is an IP address. | + | [              qos_profile](## ".node_groups.[].nodes.[].l3_interfaces.[].qos_profile") | String | | | | QOS service profile. | + | [              wan_carrier](## ".node_groups.[].nodes.[].l3_interfaces.[].wan_carrier") | String | | | | The WAN Carrier this interface is connected to.
This is used to infer the path-groups in which this interface should be configured. | + | [              wan_circuit_id](## ".node_groups.[].nodes.[].l3_interfaces.[].wan_circuit_id") | String | | | | The WAN Circuit ID for this interface.
This is not rendered in the configuration but used for WAN designs. | + | [              connected_to_pathfinder](## ".node_groups.[].nodes.[].l3_interfaces.[].connected_to_pathfinder") | Boolean | | `True` | | For a WAN interface (`wan_path_group` is set), allow to disable the static tunnel towards Pathfinders. | + | [              raw_eos_cli](## ".node_groups.[].nodes.[].l3_interfaces.[].raw_eos_cli") | String | | | | EOS CLI rendered directly on the interface in the final EOS configuration. | + | [              structured_config](## ".node_groups.[].nodes.[].l3_interfaces.[].structured_config") | Dictionary | | | | Custom structured config for the Ethernet interface. | + | [      l3_interfaces](## ".node_groups.[].l3_interfaces") | List, items: Dictionary | | | | PREVIEW: This key is currently not supported

L3 Interfaces currently only use for WAN interfaces. | + | [        - profile](## ".node_groups.[].l3_interfaces.[].profile") | String | | | | L3 interface profile name. Profile defined under `l3_interface_profiles`.
| + | [          name](## ".node_groups.[].l3_interfaces.[].name") | String | Required, Unique | | Pattern: Ethernet[\d/]+ | Ethernet interface name like 'Ethernet2'. | + | [          description](## ".node_groups.[].l3_interfaces.[].description") | String | | | | Interface description.
If not set a default description will be configured with '[[ ]]' | + | [          ip](## ".node_groups.[].l3_interfaces.[].ip") | String | | | | Node IPv4 address/Mask or 'dhcp'. | + | [          set_default_route](## ".node_groups.[].l3_interfaces.[].set_default_route") | Boolean | | `False` | | Insert a default route to the `peer_ip` if `ip` is an ip address
or configure to accept a default route from DHCP if `ip` is `dhcp`.

AVD will error out if set to true, `ip` is an ip address and `peer_ip` is missing. | + | [          enabled](## ".node_groups.[].l3_interfaces.[].enabled") | Boolean | | `True` | | Enable or Shutdown the interface. | + | [          speed](## ".node_groups.[].l3_interfaces.[].speed") | String | | | | Speed should be set in the format `` or `forced ` or `auto `. | + | [          peer](## ".node_groups.[].l3_interfaces.[].peer") | String | | | | The peer device name. Used for description and documentation | + | [          peer_interface](## ".node_groups.[].l3_interfaces.[].peer_interface") | String | | | | The peer device interface. Used for description and documentation | + | [          peer_ip](## ".node_groups.[].l3_interfaces.[].peer_ip") | String | | | | The peer device IPv4 address (no mask). Used as default route gateway if `set_default_route` is true and `ip` is an IP address. | + | [          qos_profile](## ".node_groups.[].l3_interfaces.[].qos_profile") | String | | | | QOS service profile. | + | [          wan_carrier](## ".node_groups.[].l3_interfaces.[].wan_carrier") | String | | | | The WAN Carrier this interface is connected to.
This is used to infer the path-groups in which this interface should be configured. | + | [          wan_circuit_id](## ".node_groups.[].l3_interfaces.[].wan_circuit_id") | String | | | | The WAN Circuit ID for this interface.
This is not rendered in the configuration but used for WAN designs. | + | [          connected_to_pathfinder](## ".node_groups.[].l3_interfaces.[].connected_to_pathfinder") | Boolean | | `True` | | For a WAN interface (`wan_path_group` is set), allow to disable the static tunnel towards Pathfinders. | + | [          raw_eos_cli](## ".node_groups.[].l3_interfaces.[].raw_eos_cli") | String | | | | EOS CLI rendered directly on the interface in the final EOS configuration. | + | [          structured_config](## ".node_groups.[].l3_interfaces.[].structured_config") | Dictionary | | | | Custom structured config for the Ethernet interface. | + | [  nodes](## ".nodes") | List, items: Dictionary | | | | Define variables per node. | + | [    - name](## ".nodes.[].name") | String | Required, Unique | | | The Node Name is used as "hostname". | + | [      l3_interfaces](## ".nodes.[].l3_interfaces") | List, items: Dictionary | | | | PREVIEW: This key is currently not supported

L3 Interfaces currently only use for WAN interfaces. | + | [        - profile](## ".nodes.[].l3_interfaces.[].profile") | String | | | | L3 interface profile name. Profile defined under `l3_interface_profiles`.
| + | [          name](## ".nodes.[].l3_interfaces.[].name") | String | Required, Unique | | Pattern: Ethernet[\d/]+ | Ethernet interface name like 'Ethernet2'. | + | [          description](## ".nodes.[].l3_interfaces.[].description") | String | | | | Interface description.
If not set a default description will be configured with '[[ ]]' | + | [          ip](## ".nodes.[].l3_interfaces.[].ip") | String | | | | Node IPv4 address/Mask or 'dhcp'. | + | [          set_default_route](## ".nodes.[].l3_interfaces.[].set_default_route") | Boolean | | `False` | | Insert a default route to the `peer_ip` if `ip` is an ip address
or configure to accept a default route from DHCP if `ip` is `dhcp`.

AVD will error out if set to true, `ip` is an ip address and `peer_ip` is missing. | + | [          enabled](## ".nodes.[].l3_interfaces.[].enabled") | Boolean | | `True` | | Enable or Shutdown the interface. | + | [          speed](## ".nodes.[].l3_interfaces.[].speed") | String | | | | Speed should be set in the format `` or `forced ` or `auto `. | + | [          peer](## ".nodes.[].l3_interfaces.[].peer") | String | | | | The peer device name. Used for description and documentation | + | [          peer_interface](## ".nodes.[].l3_interfaces.[].peer_interface") | String | | | | The peer device interface. Used for description and documentation | + | [          peer_ip](## ".nodes.[].l3_interfaces.[].peer_ip") | String | | | | The peer device IPv4 address (no mask). Used as default route gateway if `set_default_route` is true and `ip` is an IP address. | + | [          qos_profile](## ".nodes.[].l3_interfaces.[].qos_profile") | String | | | | QOS service profile. | + | [          wan_carrier](## ".nodes.[].l3_interfaces.[].wan_carrier") | String | | | | The WAN Carrier this interface is connected to.
This is used to infer the path-groups in which this interface should be configured. | + | [          wan_circuit_id](## ".nodes.[].l3_interfaces.[].wan_circuit_id") | String | | | | The WAN Circuit ID for this interface.
This is not rendered in the configuration but used for WAN designs. | + | [          connected_to_pathfinder](## ".nodes.[].l3_interfaces.[].connected_to_pathfinder") | Boolean | | `True` | | For a WAN interface (`wan_path_group` is set), allow to disable the static tunnel towards Pathfinders. | + | [          raw_eos_cli](## ".nodes.[].l3_interfaces.[].raw_eos_cli") | String | | | | EOS CLI rendered directly on the interface in the final EOS configuration. | + | [          structured_config](## ".nodes.[].l3_interfaces.[].structured_config") | Dictionary | | | | Custom structured config for the Ethernet interface. | + | [l3_interface_profiles](## "l3_interface_profiles") | List, items: Dictionary | | | | PREVIEW: This key is currently not supported

Profiles to inherit common settings for l3_interfaces defined under the node type key.
These profiles will *not* work for `l3_interfaces` defined under `vrfs`. | + | [  - profile](## "l3_interface_profiles.[].profile") | String | Required, Unique | | | L3 interface profile name. Any variable supported under `l3_interfaces` can be inherited from a profile. | + | [    name](## "l3_interface_profiles.[].name") | String | | | Pattern: Ethernet[\d/]+ | Ethernet interface name like 'Ethernet2'. | + | [    description](## "l3_interface_profiles.[].description") | String | | | | Interface description.
If not set a default description will be configured with '[[ ]]' | + | [    ip](## "l3_interface_profiles.[].ip") | String | | | | Node IPv4 address/Mask or 'dhcp'. | + | [    set_default_route](## "l3_interface_profiles.[].set_default_route") | Boolean | | `False` | | Insert a default route to the `peer_ip` if `ip` is an ip address
or configure to accept a default route from DHCP if `ip` is `dhcp`.

AVD will error out if set to true, `ip` is an ip address and `peer_ip` is missing. | + | [    enabled](## "l3_interface_profiles.[].enabled") | Boolean | | `True` | | Enable or Shutdown the interface. | + | [    speed](## "l3_interface_profiles.[].speed") | String | | | | Speed should be set in the format `` or `forced ` or `auto `. | + | [    peer](## "l3_interface_profiles.[].peer") | String | | | | The peer device name. Used for description and documentation | + | [    peer_interface](## "l3_interface_profiles.[].peer_interface") | String | | | | The peer device interface. Used for description and documentation | + | [    peer_ip](## "l3_interface_profiles.[].peer_ip") | String | | | | The peer device IPv4 address (no mask). Used as default route gateway if `set_default_route` is true and `ip` is an IP address. | + | [    qos_profile](## "l3_interface_profiles.[].qos_profile") | String | | | | QOS service profile. | + | [    wan_carrier](## "l3_interface_profiles.[].wan_carrier") | String | | | | The WAN Carrier this interface is connected to.
This is used to infer the path-groups in which this interface should be configured. | + | [    wan_circuit_id](## "l3_interface_profiles.[].wan_circuit_id") | String | | | | The WAN Circuit ID for this interface.
This is not rendered in the configuration but used for WAN designs. | + | [    connected_to_pathfinder](## "l3_interface_profiles.[].connected_to_pathfinder") | Boolean | | `True` | | For a WAN interface (`wan_path_group` is set), allow to disable the static tunnel towards Pathfinders. | + | [    raw_eos_cli](## "l3_interface_profiles.[].raw_eos_cli") | String | | | | EOS CLI rendered directly on the interface in the final EOS configuration. | + | [    structured_config](## "l3_interface_profiles.[].structured_config") | Dictionary | | | | Custom structured config for the Ethernet interface. | + +=== "YAML" + + ```yaml + : + + # Define variables for all nodes of this type. + defaults: + + # PREVIEW: This key is currently not supported + + # L3 Interfaces currently only use for WAN interfaces. + l3_interfaces: + + # L3 interface profile name. Profile defined under `l3_interface_profiles`. + - profile: + + # Ethernet interface name like 'Ethernet2'. + name: + + # Interface description. + # If not set a default description will be configured with '[[ ]]' + description: + + # Node IPv4 address/Mask or 'dhcp'. + ip: + + # Insert a default route to the `peer_ip` if `ip` is an ip address + # or configure to accept a default route from DHCP if `ip` is `dhcp`. + + # AVD will error out if set to true, `ip` is an ip address and `peer_ip` is missing. + set_default_route: + + # Enable or Shutdown the interface. + enabled: + + # Speed should be set in the format `` or `forced ` or `auto `. + speed: + + # The peer device name. Used for description and documentation + peer: + + # The peer device interface. Used for description and documentation + peer_interface: + + # The peer device IPv4 address (no mask). Used as default route gateway if `set_default_route` is true and `ip` is an IP address. + peer_ip: + + # QOS service profile. + qos_profile: + + # The WAN Carrier this interface is connected to. + # This is used to infer the path-groups in which this interface should be configured. + wan_carrier: + + # The WAN Circuit ID for this interface. + # This is not rendered in the configuration but used for WAN designs. + wan_circuit_id: + + # For a WAN interface (`wan_path_group` is set), allow to disable the static tunnel towards Pathfinders. + connected_to_pathfinder: + + # EOS CLI rendered directly on the interface in the final EOS configuration. + raw_eos_cli: + + # Custom structured config for the Ethernet interface. + structured_config: + + # Define variables related to all nodes part of this group. + node_groups: + + # The Node Group Name is used for MLAG domain unless set with 'mlag_domain_id'. + # The Node Group Name is also used for peer description on downstream switches' uplinks. + - group: + + # Define variables per node. + nodes: + + # The Node Name is used as "hostname". + - name: + + # PREVIEW: This key is currently not supported + + # L3 Interfaces currently only use for WAN interfaces. + l3_interfaces: + + # L3 interface profile name. Profile defined under `l3_interface_profiles`. + - profile: + + # Ethernet interface name like 'Ethernet2'. + name: + + # Interface description. + # If not set a default description will be configured with '[[ ]]' + description: + + # Node IPv4 address/Mask or 'dhcp'. + ip: + + # Insert a default route to the `peer_ip` if `ip` is an ip address + # or configure to accept a default route from DHCP if `ip` is `dhcp`. + + # AVD will error out if set to true, `ip` is an ip address and `peer_ip` is missing. + set_default_route: + + # Enable or Shutdown the interface. + enabled: + + # Speed should be set in the format `` or `forced ` or `auto `. + speed: + + # The peer device name. Used for description and documentation + peer: + + # The peer device interface. Used for description and documentation + peer_interface: + + # The peer device IPv4 address (no mask). Used as default route gateway if `set_default_route` is true and `ip` is an IP address. + peer_ip: + + # QOS service profile. + qos_profile: + + # The WAN Carrier this interface is connected to. + # This is used to infer the path-groups in which this interface should be configured. + wan_carrier: + + # The WAN Circuit ID for this interface. + # This is not rendered in the configuration but used for WAN designs. + wan_circuit_id: + + # For a WAN interface (`wan_path_group` is set), allow to disable the static tunnel towards Pathfinders. + connected_to_pathfinder: + + # EOS CLI rendered directly on the interface in the final EOS configuration. + raw_eos_cli: + + # Custom structured config for the Ethernet interface. + structured_config: + + # PREVIEW: This key is currently not supported + + # L3 Interfaces currently only use for WAN interfaces. + l3_interfaces: + + # L3 interface profile name. Profile defined under `l3_interface_profiles`. + - profile: + + # Ethernet interface name like 'Ethernet2'. + name: + + # Interface description. + # If not set a default description will be configured with '[[ ]]' + description: + + # Node IPv4 address/Mask or 'dhcp'. + ip: + + # Insert a default route to the `peer_ip` if `ip` is an ip address + # or configure to accept a default route from DHCP if `ip` is `dhcp`. + + # AVD will error out if set to true, `ip` is an ip address and `peer_ip` is missing. + set_default_route: + + # Enable or Shutdown the interface. + enabled: + + # Speed should be set in the format `` or `forced ` or `auto `. + speed: + + # The peer device name. Used for description and documentation + peer: + + # The peer device interface. Used for description and documentation + peer_interface: + + # The peer device IPv4 address (no mask). Used as default route gateway if `set_default_route` is true and `ip` is an IP address. + peer_ip: + + # QOS service profile. + qos_profile: + + # The WAN Carrier this interface is connected to. + # This is used to infer the path-groups in which this interface should be configured. + wan_carrier: + + # The WAN Circuit ID for this interface. + # This is not rendered in the configuration but used for WAN designs. + wan_circuit_id: + + # For a WAN interface (`wan_path_group` is set), allow to disable the static tunnel towards Pathfinders. + connected_to_pathfinder: + + # EOS CLI rendered directly on the interface in the final EOS configuration. + raw_eos_cli: + + # Custom structured config for the Ethernet interface. + structured_config: + + # Define variables per node. + nodes: + + # The Node Name is used as "hostname". + - name: + + # PREVIEW: This key is currently not supported + + # L3 Interfaces currently only use for WAN interfaces. + l3_interfaces: + + # L3 interface profile name. Profile defined under `l3_interface_profiles`. + - profile: + + # Ethernet interface name like 'Ethernet2'. + name: + + # Interface description. + # If not set a default description will be configured with '[[ ]]' + description: + + # Node IPv4 address/Mask or 'dhcp'. + ip: + + # Insert a default route to the `peer_ip` if `ip` is an ip address + # or configure to accept a default route from DHCP if `ip` is `dhcp`. + + # AVD will error out if set to true, `ip` is an ip address and `peer_ip` is missing. + set_default_route: + + # Enable or Shutdown the interface. + enabled: + + # Speed should be set in the format `` or `forced ` or `auto `. + speed: + + # The peer device name. Used for description and documentation + peer: + + # The peer device interface. Used for description and documentation + peer_interface: + + # The peer device IPv4 address (no mask). Used as default route gateway if `set_default_route` is true and `ip` is an IP address. + peer_ip: + + # QOS service profile. + qos_profile: + + # The WAN Carrier this interface is connected to. + # This is used to infer the path-groups in which this interface should be configured. + wan_carrier: + + # The WAN Circuit ID for this interface. + # This is not rendered in the configuration but used for WAN designs. + wan_circuit_id: + + # For a WAN interface (`wan_path_group` is set), allow to disable the static tunnel towards Pathfinders. + connected_to_pathfinder: + + # EOS CLI rendered directly on the interface in the final EOS configuration. + raw_eos_cli: + + # Custom structured config for the Ethernet interface. + structured_config: + + # PREVIEW: This key is currently not supported + + # Profiles to inherit common settings for l3_interfaces defined under the node type key. + # These profiles will *not* work for `l3_interfaces` defined under `vrfs`. + l3_interface_profiles: + + # L3 interface profile name. Any variable supported under `l3_interfaces` can be inherited from a profile. + - profile: + + # Ethernet interface name like 'Ethernet2'. + name: + + # Interface description. + # If not set a default description will be configured with '[[ ]]' + description: + + # Node IPv4 address/Mask or 'dhcp'. + ip: + + # Insert a default route to the `peer_ip` if `ip` is an ip address + # or configure to accept a default route from DHCP if `ip` is `dhcp`. + + # AVD will error out if set to true, `ip` is an ip address and `peer_ip` is missing. + set_default_route: + + # Enable or Shutdown the interface. + enabled: + + # Speed should be set in the format `` or `forced ` or `auto `. + speed: + + # The peer device name. Used for description and documentation + peer: + + # The peer device interface. Used for description and documentation + peer_interface: + + # The peer device IPv4 address (no mask). Used as default route gateway if `set_default_route` is true and `ip` is an IP address. + peer_ip: + + # QOS service profile. + qos_profile: + + # The WAN Carrier this interface is connected to. + # This is used to infer the path-groups in which this interface should be configured. + wan_carrier: + + # The WAN Circuit ID for this interface. + # This is not rendered in the configuration but used for WAN designs. + wan_circuit_id: + + # For a WAN interface (`wan_path_group` is set), allow to disable the static tunnel towards Pathfinders. + connected_to_pathfinder: + + # EOS CLI rendered directly on the interface in the final EOS configuration. + raw_eos_cli: + + # Custom structured config for the Ethernet interface. + structured_config: + ``` diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-path-groups.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-path-groups.md new file mode 100644 index 00000000000..64d40ccddab --- /dev/null +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-path-groups.md @@ -0,0 +1,50 @@ + +=== "Table" + + | Variable | Type | Required | Default | Value Restrictions | Description | + | -------- | ---- | -------- | ------- | ------------------ | ----------- | + | [wan_path_groups](## "wan_path_groups") | List, items: Dictionary | | | | PREVIEW: This key is currently not supported
List of path-groups used for the WAN configuration. | + | [  - name](## "wan_path_groups.[].name") | String | Required, Unique | | | Path-group name. | + | [    id](## "wan_path_groups.[].id") | Integer | Required | | | Path-group id.

TODO: Required until an auto ID algorithm is implemented. | + | [    description](## "wan_path_groups.[].description") | String | | | | Additional information about the path-group for documentation purposes. | + | [    ipsec](## "wan_path_groups.[].ipsec") | Boolean | | `True` | | Flag to configure IPsec at the path-group level.

When set to `true`, IPsec is enabled for both the static and dynamic peers. | + | [    import_path_groups](## "wan_path_groups.[].import_path_groups") | List, items: Dictionary | | | | List of [ath-groups to import in this path-group. | + | [      - remote](## "wan_path_groups.[].import_path_groups.[].remote") | String | | | | Remote path-group to import. | + | [        local](## "wan_path_groups.[].import_path_groups.[].local") | String | | | | Optional, if not set, the path-group `name` is used as local. | + +=== "YAML" + + ```yaml + # PREVIEW: This key is currently not supported + # List of path-groups used for the WAN configuration. + wan_path_groups: + + # Path-group name. + - name: + + # Path-group id. + + # TODO: Required until an auto ID algorithm is implemented. + id: + + # Additional information about the path-group for documentation purposes. + description: + + # Flag to configure IPsec at the path-group level. + + # When set to `true`, IPsec is enabled for both the static and dynamic peers. + ipsec: + + # List of [ath-groups to import in this path-group. + import_path_groups: + + # Remote path-group to import. + - remote: + + # Optional, if not set, the path-group `name` is used as local. + local: + ``` diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-settings.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-settings.md index d288556d697..01f590ae8d1 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-settings.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-settings.md @@ -19,20 +19,14 @@ | [    profile_name](## "wan_ipsec_profiles.data_plane.profile_name") | String | | `DP-PROFILE` | | Name of the IPSec profile. | | [    shared_key](## "wan_ipsec_profiles.data_plane.shared_key") | String | Required | | | The type 7 encrypted IPSec shared key.
This variable is sensitive and should be configured using some vault mechanism. | | [wan_mode](## "wan_mode") | String | | `cv-pathfinder` | Valid Values:
- autovpn
- cv-pathfinder | PREVIEW: This key is currently not supported

Select if the WAN should be run using CV Pathfinder or Auto VPN only. | - | [wan_path_groups](## "wan_path_groups") | List, items: Dictionary | | | | PREVIEW: This key is currently not supported
List of path-groups used for the WAN configuration. | - | [  - name](## "wan_path_groups.[].name") | String | Required, Unique | | | Path-group name. | - | [    id](## "wan_path_groups.[].id") | String | | | | Path-group id. | - | [    description](## "wan_path_groups.[].description") | String | | | | Additional information about the path-group for documentation purposes. | - | [    ipsec](## "wan_path_groups.[].ipsec") | Boolean | | | | Flag to configure IPsec on the carrier (default is True). | - | [    import_path_groups](## "wan_path_groups.[].import_path_groups") | List, items: Dictionary | | | | List of [ath-groups to import in this path-group. | - | [      - remote](## "wan_path_groups.[].import_path_groups.[].remote") | String | | | | Remote path-group to import. | - | [        local](## "wan_path_groups.[].import_path_groups.[].local") | String | | | | Optional, if not set, the path-group `name` is used as local. | | [wan_route_servers](## "wan_route_servers") | List, items: Dictionary | | | | PREVIEW: This key is currently not supported

List of the AutoVPN RRs when using `wan_mode`=`autovpn`, or the Pathfinders
when using `wan_mode`=`cv-pathfinder`, to which the device should connect to.

When the route server is part of the same inventory as the WAN routers,
only the name is required. | | [  - hostname](## "wan_route_servers.[].hostname") | String | Required, Unique | | | Route-Reflector hostname. | | [    router_id](## "wan_route_servers.[].router_id") | String | | | | Route-Reflector router id. | | [    path_groups](## "wan_route_servers.[].path_groups") | List, items: Dictionary | | | | Path-groups through which the Route Reflector/Pathfinder is reached. | - | [      - name](## "wan_route_servers.[].path_groups.[].name") | String | | | | Path-group name. | - | [        ip_address](## "wan_route_servers.[].path_groups.[].ip_address") | String | | | | The public IP address of the Route Reflector for this path-group. | + | [      - name](## "wan_route_servers.[].path_groups.[].name") | String | Required, Unique | | | Path-group name. | + | [        interfaces](## "wan_route_servers.[].path_groups.[].interfaces") | List, items: Dictionary | Required | | Min Length: 1 | | + | [          - name](## "wan_route_servers.[].path_groups.[].interfaces.[].name") | String | Required, Unique | | | Interface name. | + | [            ip_address](## "wan_route_servers.[].path_groups.[].interfaces.[].ip_address") | String | | | | The public IP address of the Route Reflector for this path-group. | === "YAML" @@ -79,31 +73,6 @@ # Select if the WAN should be run using CV Pathfinder or Auto VPN only. wan_mode: - # PREVIEW: This key is currently not supported - # List of path-groups used for the WAN configuration. - wan_path_groups: - - # Path-group name. - - name: - - # Path-group id. - id: - - # Additional information about the path-group for documentation purposes. - description: - - # Flag to configure IPsec on the carrier (default is True). - ipsec: - - # List of [ath-groups to import in this path-group. - import_path_groups: - - # Remote path-group to import. - - remote: - - # Optional, if not set, the path-group `name` is used as local. - local: - # PREVIEW: This key is currently not supported # List of the AutoVPN RRs when using `wan_mode`=`autovpn`, or the Pathfinders @@ -123,8 +92,12 @@ path_groups: # Path-group name. - - name: + - name: + interfaces: # >=1 items; required + + # Interface name. + - name: - # The public IP address of the Route Reflector for this path-group. - ip_address: + # The public IP address of the Route Reflector for this path-group. + ip_address: ``` diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/wan-preview.md b/ansible_collections/arista/avd/roles/eos_designs/docs/wan-preview.md index 27175defd0a..7dddca63e6d 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/wan-preview.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/wan-preview.md @@ -11,6 +11,7 @@ title: Ansible Collection Role eos_design - WAN preview # WAN preview !!! warning + The integration of WAN designs to `eos_designs` role is in preview mode. Everything is subject to change, is not supported and may not be complete. @@ -48,12 +49,15 @@ The intention is to support both a single [AutoVPN design](https://www.arista.co ``` - No IPv6 support +- For WAN interfaces only `l3_edge.l3_interfaces` is supported and not `core_interfaces.l3_interfaces`. +- For WAN interfaces, NAT IP on the Pathfinder side can be supported using the `wan_route_servers.path_groups.interfaces` key. +- Path-group ID is currently required under `wan_path_groups` until an algorithm is implemented to auto generate IDs. ## Future work - As of now, only the fundations of the `eos_designs` functionality for WAN is - being introduced without any support for LAN and WAN interfaces. - This implies that path-groups are not configured. + being introduced without any support for LAN interfaces. +- Auto generation of Path-group IDs and other IDs. - The configuration of AVT policies is not supported yet and will be introduced later. - HA for sites will be covered in a future PR @@ -94,15 +98,34 @@ All these node types are defined with `default_underlay_routing_protocol: none` roles/eos_designs/docs/tables/wan-settings.md --8<-- -#### WAN hierarchy +##### WAN path-groups + +--8<-- +roles/eos_designs/docs/tables/wan-path-groups.md +--8<-- + +##### WAN carriers + +--8<-- +roles/eos_designs/docs/tables/wan-carriers.md +--8<-- + +##### WAN hierarchy !!! note + This section is only relevant for CV Pathfinder and not for AutoVPN --8<-- roles/eos_designs/docs/tables/wan-cv-pathfinder-regions.md --8<-- +#### WAN interfaces + +--8<-- +roles/eos_designs/docs/tables/wan-interfaces-settings.md +--8<-- + #### New BGP peer-group --8<-- diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/ethernet_interfaces.py b/ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/ethernet_interfaces.py index 6068521dea0..783b4c2b574 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/ethernet_interfaces.py +++ b/ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/ethernet_interfaces.py @@ -56,18 +56,6 @@ def ethernet_interfaces(self) -> list | None: context_keys=["name", "peer", "peer_interface"], ) - for l3_interface in self._filtered_l3_interfaces: - # Ethernet interface - ethernet_interface = self._get_l3_interface_cfg(l3_interface) - - append_if_not_duplicate( - list_of_dicts=ethernet_interfaces, - primary_key="name", - new_dict=ethernet_interface, - context=f"Ethernet Interfaces defined under {self.data_model} l3_interfaces", - context_keys=["name", "peer", "peer_interface"], - ) - if ethernet_interfaces: return ethernet_interfaces diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/utils.py b/ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/utils.py index 1089a1ca91d..a149d97557e 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/utils.py +++ b/ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/utils.py @@ -4,6 +4,7 @@ from __future__ import annotations import re +from copy import deepcopy from functools import cached_property from ipaddress import ip_network from itertools import islice @@ -12,7 +13,6 @@ from ansible_collections.arista.avd.plugins.plugin_utils.eos_designs_shared_utils import SharedUtils from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdMissingVariableError from ansible_collections.arista.avd.plugins.plugin_utils.merge import merge -from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_empties_from_dict from ansible_collections.arista.avd.plugins.plugin_utils.utils import default, get, get_item @@ -55,7 +55,7 @@ def _filtered_p2p_links(self) -> list: # Apply p2p_profiles if set. Silently ignoring missing profile. if self._p2p_links_profiles: - p2p_links = [self._apply_profile("p2p_links", p2p_link) for p2p_link in p2p_links] + p2p_links = [self._apply_p2p_links_profile(p2p_link) for p2p_link in p2p_links] # Filter to only include p2p_links with our hostname under "nodes" p2p_links = [p2p_link for p2p_link in p2p_links if self.shared_utils.hostname in p2p_link.get("nodes", [])] @@ -70,27 +70,18 @@ def _filtered_p2p_links(self) -> list: return p2p_links - def _apply_profile(self, type: str, target_dict: dict) -> dict: + def _apply_p2p_links_profile(self, target_dict: dict) -> dict: """ - Apply a profile to a p2p_link or a l3_interface + Apply a profile to a p2p_link """ if "profile" not in target_dict: # Nothing to do return target_dict - # Silently ignoring missing profile and wrong types. - if type == "l3_interfaces": - profile = get_item(self._l3_interfaces_profiles, "profile", target_dict["profile"], default={}) - target_dict.pop("profile", None) - elif type == "p2p_links": - profile = get_item(self._p2p_links_profiles, "name", target_dict["profile"], default={}) - target_dict.pop("name", None) - else: - return target_dict - - target_dict = merge(profile, target_dict, list_merge="replace", destructive_merge=False) - - return target_dict + profile = deepcopy(get_item(self._p2p_links_profiles, "name", target_dict["profile"], default={})) + merged_dict: dict = merge(profile, target_dict, list_merge="replace", destructive_merge=False) + merged_dict.pop("name", None) + return merged_dict def _resolve_p2p_ips(self, p2p_link: dict) -> dict: if "ip" in p2p_link: @@ -331,74 +322,3 @@ def _get_port_channel_member_cfg(self, p2p_link: dict, member: dict) -> dict: "mode": get(p2p_link, "port_channel.mode", default="active"), }, } - - # l3_interfaces here - @cached_property - def _l3_interfaces_profiles(self) -> list: - return get(self._hostvars, f"{self.data_model}.l3_interfaces_profiles", default=[]) - - @cached_property - def _l3_interfaces(self) -> list: - return get(self._hostvars, f"{self.data_model}.l3_interfaces", default=[]) - - @cached_property - def _l3_interfaces_sflow(self) -> bool | None: - return get(self._hostvars, f"fabric_sflow.{self.data_model}") - - @cached_property - def _filtered_l3_interfaces(self) -> list: - """ - Returns a filtered list of l3_interfaces, which only contains interfaces with our hostname. - For each interface any referenced profiles are applied. - """ - if not (l3_interfaces := self._l3_interfaces): - return [] - - # Apply l3_interfaces._profile if set. Silently ignoring missing profile. - if self._l3_interfaces_profiles: - l3_interfaces = [self._apply_profile("l3_interfaces", l3_interface) for l3_interface in l3_interfaces] - - # Filter to only include l3_interfaces with our hostname as node - l3_interfaces = [l3_interface for l3_interface in l3_interfaces if self.shared_utils.hostname == get(l3_interface, "node", required=True)] - if not l3_interfaces: - return [] - - return l3_interfaces - - def _get_l3_interface_cfg(self, l3_interface: dict) -> dict | None: - """ - Returns structured_configuration for one L3 Physical interface - """ - if l3_interface["node"] != self.shared_utils.hostname: - return None - - interface_name = l3_interface["interface"] - - # TODO move this to description module? - interface_description = ( - l3_interface.get("description") - or "_".join([elem for elem in [l3_interface.get("peer"), l3_interface.get("peer_interface")] if elem is not None]) - or None - ) - - # TODO catch if ip_address is not valid or not dhcp - ip_address = get(l3_interface, "ip", required=True) - - interface = { - "name": interface_name, - "peer_type": "l3_interface", - "peer": l3_interface.get("peer"), - "peer_interface": l3_interface.get("peer_interface"), - "ip_address": ip_address, - "shutdown": not l3_interface.get("enabled", True), - "type": "routed", - "description": interface_description, - "service_profile": l3_interface.get("qos_profile"), - "eos_cli": l3_interface.get("raw_eos_cli"), - "struct_cfg": l3_interface.get("structured_config"), - } - - if ip_address == "dhcp" and l3_interface.get("dhcp_client_accept_default_route", False): - interface["dhcp_client_accept_default_route"] = True - - return strip_empties_from_dict(interface) diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/router_bgp.py b/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/router_bgp.py index da08bbc9e40..aa72e9a60df 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/router_bgp.py +++ b/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/router_bgp.py @@ -484,12 +484,12 @@ def _neighbors(self) -> list | None: f"Loopback0 IP {self.shared_utils.router_id} is not in the Route Reflector listen range prefixes" " 'bgp_peer_groups.wan_overlay_peers.listen_range_prefixes'." ) - for wan_route_server, data in self._wan_route_servers.items(): + for wan_route_server, data in self._filtered_wan_route_servers.items(): neighbor = self._create_neighbor(data["router_id"], wan_route_server, self.shared_utils.bgp_peer_groups["wan_overlay_peers"]["name"]) neighbors.append(neighbor) if self.shared_utils.wan_role == "server": # No neighbor configured on the `wan_overlay_peers` peer group as it is covered by listen ranges - for wan_route_server, data in self._wan_route_servers.items(): + for wan_route_server, data in self._filtered_wan_route_servers.items(): neighbor = self._create_neighbor(data["router_id"], wan_route_server, self.shared_utils.bgp_peer_groups["rr_overlay_peers"]["name"]) neighbors.append(neighbor) diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/router_path_selection.py b/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/router_path_selection.py index 50f1d2502b7..2e673d812f8 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/router_path_selection.py +++ b/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/router_path_selection.py @@ -5,8 +5,9 @@ from functools import cached_property +from ansible_collections.arista.avd.plugins.filter.natural_sort import natural_sort from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_empties_from_dict -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get +from ansible_collections.arista.avd.plugins.plugin_utils.utils import get, get_item from .utils import UtilsMixin @@ -44,32 +45,26 @@ def _get_path_groups(self) -> list: """ Generate the required path-groups locally """ - # TODO - get this once WAN interface are available - # TODO - this function will need to handle Crossconnection of public path_groups - # - local_path_groups = [] - # The value will be set based on the WAN interfaces configuration - # local_path_groups = self.shared_utils.path_groups - - if not local_path_groups: - return [] - path_groups = [] # TODO - need to have default value in one place only -> maybe facts / shared_utils ? - ipsec_profile_name = get(self._hostvars, "wan_ipsec_profiles.control_plane.profile_name", required=True) - - for carrier in local_path_groups: - path_groups.append( - { - "name": carrier.get("name"), - "id": self._get_carrier_id(carrier), - "ipsec_profile": ipsec_profile_name, # TODO - disable on a per carrier basis - "local_interfaces": self._get_local_interfaces(carrier), - "dynamic_peers": self._get_dynamic_peers(), - "static_peers": self._get_static_peers(carrier), - } - ) + ipsec_profile_name = get(self._hostvars, "wan_ipsec_profiles.control_plane.profile_name", default="CP-PROFILE") + + for path_group in self.shared_utils.wan_local_path_groups: + pg_name = path_group.get("name") + + path_group_data = { + "name": pg_name, + "id": self._get_path_group_id(pg_name, path_group.get("id")), + "local_interfaces": self._get_local_interfaces_for_path_group(pg_name), + "dynamic_peers": self._get_dynamic_peers(), + "static_peers": self._get_static_peers_for_path_group(pg_name), + } + + if path_group.get("ipsec", True): + path_group_data["ipsec_profile"] = ipsec_profile_name + + path_groups.append(path_group_data) if self.shared_utils.cv_pathfinder_role: pass @@ -79,10 +74,13 @@ def _get_path_groups(self) -> list: def _get_load_balance_policies(self, path_groups: dict) -> dict | None: """ """ - # TODO for now a default load balance policy with all path-groups. - load_balance_policies = [] - load_balance_policies.append({"name": "LBPOLICY", "path_groups": [pg.get("name") for pg in path_groups]}) - return load_balance_policies + unique_path_groups = natural_sort({path_group.get("name") for path_group in path_groups}, "name") + return [ + { + "name": "LBPOLICY", + "path_groups": [{"name": pg_name} for pg_name in unique_path_groups], + } + ] def _get_policies(self) -> list | None: """ @@ -108,35 +106,67 @@ def _get_vrfs(self) -> list | None: return vrfs return None - def _get_carrier_id(self, carrier: dict) -> int: + def _get_path_group_id(self, path_group_name: str, config_id: int | None = None) -> int: """ TODO - implement algorithm to auto assign IDs - cf internal documenation TODO - also implement algorithm for cross connects on public path_groups """ - if carrier["name"] == "LAN_HA": + if path_group_name == "LAN_HA": return 65535 + if config_id is not None: + return config_id return 500 - def _get_local_interfaces(self, carrier: dict) -> list | None: + def _get_local_interfaces_for_path_group(self, path_group_name: str) -> list | None: """ Generate the router_path_selection.local_interfaces list For AUTOVPN clients, configure the stun server profiles as appropriate """ local_interfaces = [] + path_group = get_item(self.shared_utils.wan_local_path_groups, "name", path_group_name, default={}) + for interface in path_group.get("interfaces", []): + local_interface = {"name": get(interface, "name", required=True)} + + if self.shared_utils.wan_role == "client" and self._should_connect_to_wan_rs([path_group_name]): + stun_server_profiles = self._stun_server_profiles.get(path_group_name, []) + if stun_server_profiles: + local_interface["stun"] = {"server_profiles": [profile["name"] for profile in stun_server_profiles]} + + local_interfaces.append(local_interface) + return local_interfaces def _get_dynamic_peers(self) -> dict | None: - """ """ + """ + TODO support ip_local and ipsec ? + """ if self.shared_utils.wan_role != "client": return None return {"enabled": True} - def _get_static_peers(self, transport: dict) -> list | None: + def _get_static_peers_for_path_group(self, path_group_name: str) -> list | None: """ TODO """ - if self.shared_utils.wan_role != "client": + if not self.shared_utils.wan_role: return None + static_peers = [] + for wan_route_server, data in self._filtered_wan_route_servers.items(): + if (path_group := get_item(data["wan_path_groups"], "name", path_group_name)) is not None: + ipv4_addresses = [] + + for interface_dict in get(path_group, "interfaces", required=True): + if (ip_address := interface_dict.get("ip_address")) is not None: + # TODO - removing mask using split but maybe a helper is clearer + ipv4_addresses.append(ip_address.split("/")[0]) + static_peers.append( + { + "router_ip": get(data, "router_id", required=True), + "name": wan_route_server, + "ipv4_addresses": ipv4_addresses, + } + ) + return static_peers diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/stun.py b/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/stun.py index 0e0ad206b69..f1738db7e69 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/stun.py +++ b/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/stun.py @@ -3,6 +3,7 @@ # that can be found in the LICENSE file. from __future__ import annotations +import itertools from functools import cached_property from .utils import UtilsMixin @@ -25,16 +26,11 @@ def stun(self) -> dict | None: stun = {} if self.shared_utils.wan_role == "server": - local_interfaces = [] - # TODO - once the WAN interfaces are implemented, add them here - + local_interfaces = [wan_interface["name"] for wan_interface in self.shared_utils.wan_interfaces] stun["server"] = {"local_interfaces": local_interfaces} if self.shared_utils.wan_role == "client": - server_profiles = [] - - # TODO - once the WAN interfaces are implemented, add them here - if server_profiles: + if server_profiles := list(itertools.chain.from_iterable(self._stun_server_profiles.values())): stun["client"] = {"server_profiles": server_profiles} return stun or None diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/utils.py b/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/utils.py index 90bb1a9d234..0fd72889f81 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/utils.py +++ b/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/utils.py @@ -262,7 +262,7 @@ def _append_peer(self, peers_dict: dict, peer_name: str, peer_facts: dict) -> No @cached_property def _is_wan_server_with_peers(self) -> bool: - return self.shared_utils.wan_role == "server" and len(self._wan_route_servers) > 0 + return self.shared_utils.wan_role == "server" and len(self._filtered_wan_route_servers) > 0 @cached_property def _wan_listen_ranges(self): @@ -352,59 +352,116 @@ def _wan_route_servers(self) -> dict: wan_route_servers_list = get(self._hostvars, "wan_route_servers", default=[]) - for wan_rr_dict in natural_sort(wan_route_servers_list, sort_key="hostname"): + for wan_rs_dict in natural_sort(wan_route_servers_list, sort_key="hostname"): # These remote gw can be outside of the inventory - wan_rr = wan_rr_dict["hostname"] + wan_rs = wan_rs_dict["hostname"] - if wan_rr == self.shared_utils.hostname: + if wan_rs == self.shared_utils.hostname: # Don't add yourself continue - if (peer_facts := self.shared_utils.get_peer_facts(wan_rr, required=False)) is not None: + if (peer_facts := self.shared_utils.get_peer_facts(wan_rs, required=False)) is not None: # Found a matching server in inventory bgp_as = peer_facts.get("bgp_as") # Only ibgp is supported for WAN so raise if peer from peer_facts BGP AS is different from ours. if bgp_as != self.shared_utils.bgp_as: raise AristaAvdError( - f"Only iBGP is supported for WAN, the BGP AS {bgp_as} on {wan_rr} is different from our own: {self.shared_utils.bgp_as}." + f"Only iBGP is supported for WAN, the BGP AS {bgp_as} on {wan_rs} is different from our own: {self.shared_utils.bgp_as}." ) # Prefer values coming from the input variables over peer facts - router_id = get(wan_rr_dict, "router_id", default=peer_facts.get("router_id")) - wan_path_groups = get(wan_rr_dict, "path_groups", default=peer_facts.get("wan_path_groups")) + router_id = get(wan_rs_dict, "router_id", default=peer_facts.get("router_id")) + wan_path_groups = get(wan_rs_dict, "path_groups", default=peer_facts.get("wan_path_groups")) if router_id is None: raise AristaAvdMissingVariableError( - f"'router_id' is missing for peering with {wan_rr}, either set it in under 'wan_route_servers' or something is wrong with the peer" + f"'router_id' is missing for peering with {wan_rs}, either set it in under 'wan_route_servers' or something is wrong with the peer" " facts." ) - # TODO - enable this once the wan_path_groups peer fact is implemented as this requires WAN interfaces not - # covered in this PR. - # if wan_path_groups is None: - # raise AristaAvdMissingVariableError( - # f"'wan_path_groups' is missing for peering with {wan_rr}, either set it in under 'wan_route_servers'" - # " or something is wrong with the peer" - # " facts." - # ) + if wan_path_groups is None: + raise AristaAvdMissingVariableError( + f"'wan_path_groups' is missing for peering with {wan_rs}, either set it in under 'wan_route_servers'" + " or something is wrong with the peer facts." + ) else: # Retrieve the values from the dictionary, making them required if the peer_facts were not found - router_id = get(wan_rr_dict, "router_id", required=True) + router_id = get(wan_rs_dict, "router_id", required=True) wan_path_groups = get( - wan_rr_dict, + wan_rs_dict, "path_groups", required=True, org_key=( - f"'path_groups' is missing for peering with {wan_rr} which was not found in the inventory, either set it in under 'wan_route_servers'" + f"'path_groups' is missing for peering with {wan_rs} which was not found in the inventory, either set it in under 'wan_route_servers'" " or check your inventory." ), ) - wan_rr_result_dict = { + wan_rs_result_dict = { "router_id": router_id, "wan_path_groups": wan_path_groups, } - wan_route_servers[wan_rr] = strip_empties_from_dict(wan_rr_result_dict) + if any(interface["ip_address"] == "dhcp" for path_group in wan_rs_result_dict["wan_path_groups"] for interface in path_group.get("interfaces", [])): + raise AristaAvdError( + f"The IP address for a WAN interface on a Route Server '{wan_rs}' is set 'dhcp'. Clients need to peer with a static IP which can be set" + " under the 'wan_route_servers.path_groups.interfaces' key." + ) + + wan_route_servers[wan_rs] = strip_empties_from_dict(wan_rs_result_dict) return wan_route_servers + + def _stun_server_profile_name(self, wan_route_server_name: str, path_group_name: str, interface_name: str) -> str: + """ + Return a string to use as the name of the stun server_profile + """ + return f"{path_group_name}-{wan_route_server_name}-{interface_name}" + + def _should_connect_to_wan_rs(self, path_groups: list) -> bool: + """ + This helper implements wherther or not a connection to the wan_rs should be made or not based on a list of path-groups. + + To do this the logic is the following: + * Look at the wan_interfaces on the router and check if there is any path-group in common with the RR where + `connected_to_pathfinder` is not False. + """ + return any( + local_path_group["name"] in path_groups and any(wan_interface["connected_to_pathfinder"] for wan_interface in local_path_group["interfaces"]) + for local_path_group in self.shared_utils.wan_local_path_groups + ) + + @cached_property + def _filtered_wan_route_servers(self) -> dict: + """ + Return a dictionary of wan_route_servers with only the path_groups the router should connect to + """ + filtered_wan_route_servers = {} + for wan_route_server, data in self._wan_route_servers.items(): + if wan_route_server == self.shared_utils.hostname: + # Do not include yourself + continue + for path_group in data.get("wan_path_groups", []): + if self._should_connect_to_wan_rs([path_group["name"]]): + filtered_wan_route_servers.setdefault(wan_route_server, {"router_id": data["router_id"], "wan_path_groups": []})["wan_path_groups"].append( + path_group + ) + + return filtered_wan_route_servers + + @cached_property + def _stun_server_profiles(self) -> list: + """ + Return a dictionary of _stun_server_profiles with ip_address per local path_group + """ + stun_server_profiles = {} + for wan_route_server, data in self._filtered_wan_route_servers.items(): + for path_group in data.get("wan_path_groups", []): + stun_server_profiles.setdefault(path_group["name"], []).extend( + { + "name": self._stun_server_profile_name(wan_route_server, path_group["name"], get(interface_dict, "name", required=True)), + "ip_address": get(interface_dict, "ip_address", required=True).split("/")[0], + } + for interface_dict in get(path_group, "interfaces", required=True) + ) + return stun_server_profiles diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/avdstructuredconfig.py b/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/avdstructuredconfig.py index ef4e7ea1a1f..282fb13017a 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/avdstructuredconfig.py +++ b/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/avdstructuredconfig.py @@ -15,6 +15,7 @@ from .router_ospf import RouterOspfMixin from .router_pim_sparse_mode import RouterPimSparseModeMixin from .standard_access_lists import StandardAccessListsMixin +from .static_routes import StaticRoutesMixin from .vlans import VlansMixin @@ -32,6 +33,7 @@ class AvdStructuredConfigUnderlay( RouterMsdpMixin, RouterPimSparseModeMixin, StandardAccessListsMixin, + StaticRoutesMixin, MplsMixin, ): """ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/ethernet_interfaces.py b/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/ethernet_interfaces.py index f02b2d7e58f..e0050110998 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/ethernet_interfaces.py +++ b/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/ethernet_interfaces.py @@ -173,6 +173,18 @@ def ethernet_interfaces(self) -> list | None: context_keys=["name", "peer", "peer_interface"], ) + for l3_interface in self.shared_utils.l3_interfaces: + # Ethernet interface + ethernet_interface = self._get_l3_interface_cfg(l3_interface) + + append_if_not_duplicate( + list_of_dicts=ethernet_interfaces, + primary_key="name", + new_dict=ethernet_interface, + context=f"L3 Interfaces defined under {self.shared_utils.node_type_key_data['key']} l3_interfaces", + context_keys=["name", "peer", "peer_interface"], + ) + if ethernet_interfaces: return ethernet_interfaces diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/static_routes.py b/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/static_routes.py new file mode 100644 index 00000000000..d24b9fffc7d --- /dev/null +++ b/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/static_routes.py @@ -0,0 +1,66 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + +from functools import cached_property + +from ansible_collections.arista.avd.plugins.plugin_utils.utils import get + +from .utils import UtilsMixin + + +class StaticRoutesMixin(UtilsMixin): + """ + Mixin Class used to generate structured config for one key. + Class should only be used as Mixin to a AvdStructuredConfig class + """ + + @cached_property + def static_routes(self) -> list[dict] | None: + """ + Returns structured config for static_routes + + Consist of + - default route injected for l3interfaces when `set_default_route` is True + note that only VRF default is supported today. + """ + + static_routes = [] + + for l3_interface in self.shared_utils.l3_interfaces: + interface_name = get(l3_interface, "name", required=True, org_key=f"...[node={self.shared_utils.hostname}].l3_interfaces[].name]") + ip_address = get( + l3_interface, + "ip", + required=True, + org_key=f"{self.shared_utils.node_type_key_data['key']}.nodes[name={self.shared_utils.hostname}].l3_interfaces[name={interface_name}.ip]", + ) + + # 'dhcp' is handled at the interface level + if ip_address == "dhcp": + continue + + if not l3_interface.get("set_default_route", False): + # No route to inject + continue + + gateway = get( + l3_interface, + "peer_ip", + required=True, + org_key=f"Cannot set a default route for interface {interface_name} because 'peer_ip' is missing", + ) + + static_route = { + "destination_address_prefix": "0.0.0.0/0", + "gateway": gateway, + } + + if static_route not in static_routes: + static_routes.append(static_route) + + if static_routes: + return static_routes + + return None diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/utils.py b/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/utils.py index bbeac528ec4..e8109f96c68 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/utils.py +++ b/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/utils.py @@ -135,3 +135,47 @@ def _underlay_vlan_trunk_groups(self) -> list: @cached_property def _uplinks(self) -> list: return get(self._hostvars, "switch.uplinks") + + def _get_l3_interface_cfg(self, l3_interface: dict) -> dict | None: + """ + Returns structured_configuration for one L3 interface + """ + interface_name = get(l3_interface, "name", required=True, org_key=f"...[node={self.shared_utils.hostname}].l3_interfaces[].name]") + + # TODO move this to description module? + interface_description = ( + l3_interface.get("description") + or "_".join([elem for elem in [l3_interface.get("peer"), l3_interface.get("peer_interface")] if elem is not None]) + or None + ) + + # TODO catch if ip_address is not valid or not dhcp + ip_address = get( + l3_interface, + "ip", + required=True, + org_key=f"{self.shared_utils.node_type_key_data['key']}.nodes[name={self.shared_utils.hostname}].l3_interfaces[name={interface_name}.ip]", + ) + + interface = { + "name": interface_name, + "peer_type": "l3_interface", + "peer": l3_interface.get("peer"), + "peer_interface": l3_interface.get("peer_interface"), + "ip_address": ip_address, + "shutdown": not l3_interface.get("enabled", True), + "type": "routed", + "description": interface_description, + "speed": l3_interface.get("speed"), + "service_profile": l3_interface.get("qos_profile"), + "eos_cli": l3_interface.get("raw_eos_cli"), + "struct_cfg": l3_interface.get("structured_config"), + } + + if ip_address == "dhcp" and l3_interface.get("set_default_route", False): + interface["dhcp_client_accept_default_route"] = True + + if self.shared_utils.cv_pathfinder_role: + interface["flow_tracker"] = {"hardware": "WAN-FLOW-TRACKER"} + + return strip_empties_from_dict(interface) diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/eos_designs.jsonschema.json b/ansible_collections/arista/avd/roles/eos_designs/schemas/eos_designs.jsonschema.json index a4af6c0e38e..b87437a52e1 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/eos_designs.jsonschema.json +++ b/ansible_collections/arista/avd/roles/eos_designs/schemas/eos_designs.jsonschema.json @@ -297,8 +297,45 @@ }, "bfd": { "type": "boolean", + "description": "Enable BFD.", "title": "BFD" }, + "bfd_timers": { + "type": "object", + "description": "Override default BFD timers. BFD must be enabled with `bfd: true`.", + "properties": { + "interval": { + "type": "integer", + "minimum": 50, + "maximum": 60000, + "description": "Interval in milliseconds.", + "title": "Interval" + }, + "min_rx": { + "type": "integer", + "minimum": 50, + "maximum": 60000, + "description": "Rate in milliseconds.", + "title": "Min RX" + }, + "multiplier": { + "type": "integer", + "minimum": 3, + "maximum": 50, + "title": "Multiplier" + } + }, + "required": [ + "interval", + "min_rx", + "multiplier" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BFD Timers" + }, "ebgp_multihop": { "type": "integer", "minimum": 1, @@ -599,8 +636,45 @@ }, "bfd": { "type": "boolean", + "description": "Enable BFD.", "title": "BFD" }, + "bfd_timers": { + "type": "object", + "description": "Override default BFD timers. BFD must be enabled with `bfd: true`.", + "properties": { + "interval": { + "type": "integer", + "minimum": 50, + "maximum": 60000, + "description": "Interval in milliseconds.", + "title": "Interval" + }, + "min_rx": { + "type": "integer", + "minimum": 50, + "maximum": 60000, + "description": "Rate in milliseconds.", + "title": "Min RX" + }, + "multiplier": { + "type": "integer", + "minimum": 3, + "maximum": 50, + "title": "Multiplier" + } + }, + "required": [ + "interval", + "min_rx", + "multiplier" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BFD Timers" + }, "ebgp_multihop": { "type": "integer", "minimum": 1, @@ -901,8 +975,45 @@ }, "bfd": { "type": "boolean", + "description": "Enable BFD.", "title": "BFD" }, + "bfd_timers": { + "type": "object", + "description": "Override default BFD timers. BFD must be enabled with `bfd: true`.", + "properties": { + "interval": { + "type": "integer", + "minimum": 50, + "maximum": 60000, + "description": "Interval in milliseconds.", + "title": "Interval" + }, + "min_rx": { + "type": "integer", + "minimum": 50, + "maximum": 60000, + "description": "Rate in milliseconds.", + "title": "Min RX" + }, + "multiplier": { + "type": "integer", + "minimum": 3, + "maximum": 50, + "title": "Multiplier" + } + }, + "required": [ + "interval", + "min_rx", + "multiplier" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BFD Timers" + }, "ebgp_multihop": { "type": "integer", "minimum": 1, @@ -1203,8 +1314,45 @@ }, "bfd": { "type": "boolean", + "description": "Enable BFD.", "title": "BFD" }, + "bfd_timers": { + "type": "object", + "description": "Override default BFD timers. BFD must be enabled with `bfd: true`.", + "properties": { + "interval": { + "type": "integer", + "minimum": 50, + "maximum": 60000, + "description": "Interval in milliseconds.", + "title": "Interval" + }, + "min_rx": { + "type": "integer", + "minimum": 50, + "maximum": 60000, + "description": "Rate in milliseconds.", + "title": "Min RX" + }, + "multiplier": { + "type": "integer", + "minimum": 3, + "maximum": 50, + "title": "Multiplier" + } + }, + "required": [ + "interval", + "min_rx", + "multiplier" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BFD Timers" + }, "ebgp_multihop": { "type": "integer", "minimum": 1, @@ -1505,8 +1653,45 @@ }, "bfd": { "type": "boolean", + "description": "Enable BFD.", "title": "BFD" }, + "bfd_timers": { + "type": "object", + "description": "Override default BFD timers. BFD must be enabled with `bfd: true`.", + "properties": { + "interval": { + "type": "integer", + "minimum": 50, + "maximum": 60000, + "description": "Interval in milliseconds.", + "title": "Interval" + }, + "min_rx": { + "type": "integer", + "minimum": 50, + "maximum": 60000, + "description": "Rate in milliseconds.", + "title": "Min RX" + }, + "multiplier": { + "type": "integer", + "minimum": 3, + "maximum": 50, + "title": "Multiplier" + } + }, + "required": [ + "interval", + "min_rx", + "multiplier" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BFD Timers" + }, "ebgp_multihop": { "type": "integer", "minimum": 1, @@ -1807,8 +1992,45 @@ }, "bfd": { "type": "boolean", + "description": "Enable BFD.", "title": "BFD" }, + "bfd_timers": { + "type": "object", + "description": "Override default BFD timers. BFD must be enabled with `bfd: true`.", + "properties": { + "interval": { + "type": "integer", + "minimum": 50, + "maximum": 60000, + "description": "Interval in milliseconds.", + "title": "Interval" + }, + "min_rx": { + "type": "integer", + "minimum": 50, + "maximum": 60000, + "description": "Rate in milliseconds.", + "title": "Min RX" + }, + "multiplier": { + "type": "integer", + "minimum": 3, + "maximum": 50, + "title": "Multiplier" + } + }, + "required": [ + "interval", + "min_rx", + "multiplier" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BFD Timers" + }, "ebgp_multihop": { "type": "integer", "minimum": 1, @@ -2109,8 +2331,45 @@ }, "bfd": { "type": "boolean", + "description": "Enable BFD.", "title": "BFD" }, + "bfd_timers": { + "type": "object", + "description": "Override default BFD timers. BFD must be enabled with `bfd: true`.", + "properties": { + "interval": { + "type": "integer", + "minimum": 50, + "maximum": 60000, + "description": "Interval in milliseconds.", + "title": "Interval" + }, + "min_rx": { + "type": "integer", + "minimum": 50, + "maximum": 60000, + "description": "Rate in milliseconds.", + "title": "Min RX" + }, + "multiplier": { + "type": "integer", + "minimum": 3, + "maximum": 50, + "title": "Multiplier" + } + }, + "required": [ + "interval", + "min_rx", + "multiplier" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BFD Timers" + }, "ebgp_multihop": { "type": "integer", "minimum": 1, @@ -2421,8 +2680,45 @@ }, "bfd": { "type": "boolean", + "description": "Enable BFD.", "title": "BFD" }, + "bfd_timers": { + "type": "object", + "description": "Override default BFD timers. BFD must be enabled with `bfd: true`.", + "properties": { + "interval": { + "type": "integer", + "minimum": 50, + "maximum": 60000, + "description": "Interval in milliseconds.", + "title": "Interval" + }, + "min_rx": { + "type": "integer", + "minimum": 50, + "maximum": 60000, + "description": "Rate in milliseconds.", + "title": "Min RX" + }, + "multiplier": { + "type": "integer", + "minimum": 3, + "maximum": 50, + "title": "Multiplier" + } + }, + "required": [ + "interval", + "min_rx", + "multiplier" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BFD Timers" + }, "ebgp_multihop": { "type": "integer", "minimum": 1, @@ -3205,9372 +3501,1394 @@ } }, "title": "P2P Links" - }, - "l3_interfaces_profiles": { - "type": "array", - "items": { - "type": "object", - "properties": { - "profile": { - "type": "string", - "description": "L3 interface profile name. Any variable supported under `l3_interfaces` can be inherited from a profile.", - "title": "Profile" - }, - "interface": { - "type": "string", - "description": "Ethernet interface name like 'Ethernet2'.", - "pattern": "Ethernet[\\d/]+", - "title": "Interface" - }, - "description": { - "type": "string", - "description": "Interface description.\nIf not set a default description will be configured with '[[ ]]'", - "title": "Description" - }, - "ip": { - "type": "string", - "description": "Node IPv4 address/Mask or 'dhcp'.", - "title": "IP" - }, - "dhcp_client_accept_default_route": { - "type": "boolean", - "default": false, - "description": "Supported if `ip` is `dhcp`.\nAccepts default route from DHCP.", - "title": "DHCP Client Accept Default Route" - }, - "enabled": { - "type": "boolean", - "default": true, - "description": "Enable or Shutdown the interface.", - "title": "Enabled" - }, - "speed": { - "type": "string", - "description": "Speed should be set in the format `` or `forced ` or `auto `.", - "title": "Speed" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Core Interfaces" + }, + "custom_structured_configuration_list_merge": { + "type": "string", + "description": "The List-merge strategy used when merging custom structured configurations.\n\nThis applies to all vars prefixed by prefixes in `custom_structured_configuration_prefix`\nand all data under the various `structured_config` options.\n\nThe available list merge strategies:\n- `replace`:\n - Any list will be replaced with the list defined in custom structured configurations.\n- `append`:\n - Existing list items with the same \"Primary key\"-value will be updated.\n - New items will be appended to the existing list (including duplicates).\n- `keep`:\n - Only set list if there is no existing list or existing list is `None`.\n- `prepend`:\n - Existing list items with the same \"Primary key\"-value will be updated.\n - New items will be prepended to the existing list (including duplicates).\n- `append_rp`:\n - Existing list items with the same \"Primary key\"-value will be updated.\n - New unique items will be appended to the existing list.\n- `prepend_rp`:\n - Existing list items with the same \"Primary key\"-value will be updated.\n - New unique items will be prepended to the existing list.\n", + "enum": [ + "replace", + "append", + "keep", + "prepend", + "append_rp", + "prepend_rp" + ], + "default": "append_rp", + "title": "Custom Structured Configuration List Merge" + }, + "custom_structured_configuration_prefix": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Custom EOS Structured Configuration keys can be set on any group or host_var level using the name\nof the corresponding `eos_cli_config_gen` key prefixed with content of `custom_structured_configuration_prefix`.\n\nThe content of Custom Structured Configuration variables will be merged with the structured config generated by the eos_designs role.\n\nThe merge is done recursively, so it is possible to update a sub-key of a variable set by `eos_designs` role already.\n\nThe merge follow these recursive merge strategies:\n- New keys will be added for all types.\n- Existing keys of type \"List\" with a \"Primary key\" set in the schema:\n - Strategy can be changed with `custom_structured_configuration_list_merge`. Default strategy:\n - Existing list items with the same \"Primary key\"-value will be updated.\n - New unique items will be appended to the existing list\n- Other keys of type \"List\" will have new unique items appended the the existing list.\n- Existing keys of type \"Dictionary\" will recursively merge\n- Other existing keys will be replaced.\n", + "default": [ + "custom_structured_configuration_" + ], + "title": "Custom Structured Configuration Prefix" + }, + "cv_pathfinder_regions": { + "description": "PREVIEW: This key is currently not supported\nDefine the SDWAN hierarchy for the device.", + "type": "array", + "items": { + "type": "object", + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "id": { + "type": "integer", + "description": "The region ID must be unique for the whole WAN deployment.", + "minimum": 1, + "maximum": 255, + "title": "ID" + }, + "sites": { + "type": "array", + "description": "All sites are placed in a default zone called DEFAULT-ZONE with ID 1.", + "items": { + "type": "object", + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "id": { + "type": "integer", + "description": "The site ID must be unique within a zone.\nGiven that all the sites are placed in the DEFAULT-ZONE, the site ID must be unique within a region.", + "minimum": 1, + "maximum": 10000, + "title": "ID" + }, + "location": { + "type": "string", + "description": "Will be interpreted", + "title": "Location" + }, + "site_contact": { + "type": "string", + "title": "Site Contact" + }, + "site_after_hours_contact": { + "type": "string", + "title": "Site After Hours Contact" + }, + "name": { + "type": "string", + "title": "Name" + } }, - "peer": { - "type": "string", - "description": "The peer device name. Used for description and documentation", - "title": "Peer" + "required": [ + "id", + "name" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} }, - "peer_interface": { - "type": "string", - "description": "The peer device interface. Used for description and documentation", - "title": "Peer Interface" - }, - "peer_ip": { - "type": "string", - "description": "The peer device IP. Used for description and documentation", - "title": "Peer IP" - }, - "qos_profile": { - "type": "string", - "description": "QOS service profile.", - "title": "QOS Profile" + "description": "Site name and ID." + }, + "title": "Sites" + }, + "name": { + "type": "string", + "title": "Name" + } + }, + "required": [ + "id", + "name" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "description": "Region name and ID." + }, + "title": "Cv Pathfinder Regions" + }, + "cv_topology": { + "type": "array", + "description": "Generate AVD configurations directly from the given CloudVision topology.\nActivate this feature by setting `use_cv_topology` to `true`.\nRequires `default_interfaces` to be set for the relevant platforms and node types to detect the proper interface roles automatically.\nNeighbor hostnames must match the inventory hostnames of the AVD inventory to be taken into consideration.", + "items": { + "type": "object", + "properties": { + "hostname": { + "type": "string", + "title": "Hostname" + }, + "platform": { + "type": "string", + "title": "Platform" + }, + "interfaces": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "neighbor": { + "type": "string", + "title": "Neighbor" + }, + "neighbor_interface": { + "type": "string", + "title": "Neighbor Interface" + } }, - "raw_eos_cli": { - "type": "string", - "description": "EOS CLI rendered directly on the interface in the final EOS configuration.", - "title": "Raw EOS CLI" + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} }, - "structured_config": { - "type": "object", - "description": "Custom structured config for the Ethernet interface.", - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "description": { - "type": "string", - "title": "Description" - }, - "shutdown": { - "type": "boolean", - "title": "Shutdown" - }, - "load_interval": { - "type": "integer", - "minimum": 0, - "maximum": 600, - "description": "Interval in seconds for updating interface counters\"", - "title": "Load Interval" - }, - "speed": { - "type": "string", - "description": "Speed should be set in the format `` or `forced ` or `auto `.", - "title": "Speed" - }, - "mtu": { - "type": "integer", - "minimum": 68, - "maximum": 65535, - "title": "MTU" - }, - "l2_mtu": { - "type": "integer", - "minimum": 68, - "maximum": 65535, - "description": "\"l2_mtu\" should only be defined for platforms supporting the \"l2 mtu\" CLI\n", - "title": "L2 MTU" - }, - "l2_mru": { - "type": "integer", - "minimum": 68, - "maximum": 65535, - "description": "\"l2_mru\" should only be defined for platforms supporting the \"l2 mru\" CLI\n", - "title": "L2 MRU" - }, - "vlans": { - "type": "string", - "description": "List of switchport vlans as string\nFor a trunk port this would be a range like \"1-200,300\"\nFor an access port this would be a single vlan \"123\"\n", - "title": "VLANs" - }, - "native_vlan": { - "type": "integer", - "title": "Native VLAN" - }, - "native_vlan_tag": { - "type": "boolean", - "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence", - "title": "Native VLAN Tag" - }, - "mode": { - "type": "string", - "enum": [ - "access", - "dot1q-tunnel", - "trunk", - "trunk phone" - ], - "title": "Mode" - }, - "phone": { - "type": "object", - "properties": { - "trunk": { - "type": "string", - "enum": [ - "tagged", - "tagged phone", - "untagged", - "untagged phone" - ], - "title": "Trunk" - }, - "vlan": { - "type": "integer", - "minimum": 1, - "maximum": 4094, - "title": "VLAN" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Phone" - }, - "l2_protocol": { - "type": "object", - "properties": { - "encapsulation_dot1q_vlan": { - "type": "integer", - "description": "Vlan tag to configure on sub-interface", - "title": "Encapsulation Dot1Q VLAN" - }, - "forwarding_profile": { - "type": "string", - "description": "L2 protocol forwarding profile", - "title": "Forwarding Profile" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "L2 Protocol" - }, - "trunk_groups": { - "type": "array", - "items": { - "type": "string" - }, - "title": "Trunk Groups" - }, - "type": { - "type": "string", - "enum": [ - "routed", - "switched", - "l3dot1q", - "l2dot1q", - "port-channel-member" - ], - "description": "l3dot1q and l2dot1q are used for sub-interfaces. The parent interface should be defined as routed.\nInterface will not be listed in device documentation, unless \"type\" is set.\n", - "title": "Type" - }, - "snmp_trap_link_change": { - "type": "boolean", - "title": "Snmp Trap Link Change" - }, - "address_locking": { - "type": "object", - "properties": { - "ipv4": { - "type": "boolean", - "description": "Enable address locking for IPv4", - "title": "IPv4" - }, - "ipv6": { - "type": "boolean", - "description": "Enable address locking for IPv6", - "title": "IPv6" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Address Locking" - }, - "flowcontrol": { - "type": "object", - "properties": { - "received": { - "type": "string", - "enum": [ - "desired", - "on", - "off" - ], - "title": "Received" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Flowcontrol" - }, - "vrf": { - "type": "string", - "description": "VRF name", - "title": "VRF" - }, - "flow_tracker": { - "type": "object", - "properties": { - "sampled": { - "type": "string", - "description": "Sampled flow tracker name.", - "title": "Sampled" - }, - "hardware": { - "type": "string", - "description": "Hardware flow tracker name.", - "title": "Hardware" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Flow Tracker" - }, - "error_correction_encoding": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "default": true, - "title": "Enabled" - }, - "fire_code": { - "type": "boolean", - "title": "Fire Code" - }, - "reed_solomon": { - "type": "boolean", - "title": "Reed Solomon" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Error Correction Encoding" - }, - "link_tracking_groups": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Group name", - "title": "Name" - }, - "direction": { - "type": "string", - "enum": [ - "upstream", - "downstream" - ], - "title": "Direction" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "name" - ] - }, - "title": "Link Tracking Groups" - }, - "evpn_ethernet_segment": { - "type": "object", - "properties": { - "identifier": { - "type": "string", - "description": "EVPN Ethernet Segment Identifier (Type 1 format)", - "title": "Identifier" - }, - "redundancy": { - "type": "string", - "enum": [ - "all-active", - "single-active" - ], - "title": "Redundancy" - }, - "designated_forwarder_election": { - "type": "object", - "properties": { - "algorithm": { - "type": "string", - "enum": [ - "modulus", - "preference" - ], - "title": "Algorithm" - }, - "preference_value": { - "type": "integer", - "minimum": 0, - "maximum": 65535, - "description": "Preference_value is only used when \"algorithm\" is \"preference\"", - "title": "Preference Value" - }, - "dont_preempt": { - "type": "boolean", - "description": "Dont_preempt is only used when \"algorithm\" is \"preference\"", - "title": "Dont Preempt" - }, - "hold_time": { - "type": "integer", - "title": "Hold Time" - }, - "subsequent_hold_time": { - "type": "integer", - "title": "Subsequent Hold Time" - }, - "candidate_reachability_required": { - "type": "boolean", - "title": "Candidate Reachability Required" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Designated Forwarder Election" - }, - "mpls": { - "type": "object", - "properties": { - "shared_index": { - "type": "integer", - "minimum": 1, - "maximum": 1024, - "title": "Shared Index" - }, - "tunnel_flood_filter_time": { - "type": "integer", - "title": "Tunnel Flood Filter Time" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "MPLS" - }, - "route_target": { - "type": "string", - "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx", - "title": "Route Target" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "EVPN Ethernet Segment" - }, - "encapsulation_dot1q_vlan": { - "type": "integer", - "description": "VLAN tag to configure on sub-interface", - "title": "Encapsulation Dot1Q VLAN" - }, - "encapsulation_vlan": { - "type": "object", - "properties": { - "client": { - "type": "object", - "properties": { - "dot1q": { - "type": "object", - "properties": { - "vlan": { - "type": "integer", - "description": "Client VLAN ID", - "title": "VLAN" - }, - "outer": { - "type": "integer", - "description": "Client Outer VLAN ID", - "title": "Outer" - }, - "inner": { - "type": "integer", - "description": "Client Inner VLAN ID", - "title": "Inner" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Dot1Q" - }, - "unmatched": { - "type": "boolean", - "title": "Unmatched" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Client" - }, - "network": { - "type": "object", - "description": "Network encapsulations are all optional and skipped if using client unmatched", - "properties": { - "dot1q": { - "type": "object", - "properties": { - "vlan": { - "type": "integer", - "description": "Network VLAN ID", - "title": "VLAN" - }, - "outer": { - "type": "integer", - "description": "Network outer VLAN ID", - "title": "Outer" - }, - "inner": { - "type": "integer", - "description": "Network inner VLAN ID", - "title": "Inner" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Dot1Q" - }, - "client": { - "type": "boolean", - "title": "Client" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Network" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Encapsulation VLAN" - }, - "vlan_id": { - "type": "integer", - "minimum": 1, - "maximum": 4094, - "title": "VLAN ID" - }, - "ip_address": { - "type": "string", - "description": "IPv4 address/mask or \"dhcp\"", - "title": "IP Address" - }, - "ip_address_secondaries": { - "type": "array", - "items": { - "type": "string" - }, - "title": "IP Address Secondaries" - }, - "dhcp_client_accept_default_route": { - "type": "boolean", - "description": "Install default-route obtained via DHCP", - "title": "DHCP Client Accept Default Route" - }, - "dhcp_server_ipv4": { - "type": "boolean", - "description": "Enable IPv4 DHCP server.", - "title": "DHCP Server IPv4" - }, - "dhcp_server_ipv6": { - "type": "boolean", - "description": "Enable IPv6 DHCP server.", - "title": "DHCP Server IPv6" - }, - "ip_helpers": { - "type": "array", - "items": { - "type": "object", - "properties": { - "ip_helper": { - "type": "string", - "title": "IP Helper" - }, - "source_interface": { - "type": "string", - "description": "Source interface name", - "title": "Source Interface" - }, - "vrf": { - "type": "string", - "description": "VRF name", - "title": "VRF" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "ip_helper" - ] - }, - "title": "IP Helpers" - }, - "ip_nat": { - "type": "object", - "properties": { - "service_profile": { - "type": "string", - "description": "NAT interface profile.", - "title": "Service Profile" - }, - "destination": { - "type": "object", - "properties": { - "dynamic": { - "type": "array", - "items": { - "type": "object", - "properties": { - "access_list": { - "type": "string", - "title": "Access List" - }, - "comment": { - "type": "string", - "title": "Comment" - }, - "pool_name": { - "type": "string", - "title": "Pool Name" - }, - "priority": { - "type": "integer", - "minimum": 0, - "maximum": 4294967295, - "title": "Priority" - } - }, - "required": [ - "pool_name", - "access_list" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "Dynamic" - }, - "static": { - "type": "array", - "items": { - "type": "object", - "properties": { - "access_list": { - "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", - "title": "Access List" - }, - "comment": { - "type": "string", - "title": "Comment" - }, - "direction": { - "type": "string", - "enum": [ - "egress", - "ingress" - ], - "description": "Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware platform.\nEOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW.\n", - "title": "Direction" - }, - "group": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", - "title": "Group" - }, - "original_ip": { - "type": "string", - "description": "IPv4 address", - "title": "Original IP" - }, - "original_port": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "title": "Original Port" - }, - "priority": { - "type": "integer", - "minimum": 0, - "maximum": 4294967295, - "title": "Priority" - }, - "protocol": { - "type": "string", - "enum": [ - "udp", - "tcp" - ], - "title": "Protocol" - }, - "translated_ip": { - "type": "string", - "description": "IPv4 address", - "title": "Translated IP" - }, - "translated_port": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "description": "requires 'original_port'", - "title": "Translated Port" - } - }, - "required": [ - "translated_ip", - "original_ip" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "Static" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Destination" - }, - "source": { - "type": "object", - "properties": { - "dynamic": { - "type": "array", - "items": { - "type": "object", - "properties": { - "access_list": { - "type": "string", - "title": "Access List" - }, - "comment": { - "type": "string", - "title": "Comment" - }, - "nat_type": { - "type": "string", - "enum": [ - "overload", - "pool", - "pool-address-only", - "pool-full-cone" - ], - "title": "Nat Type" - }, - "pool_name": { - "type": "string", - "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone\nignored if 'nat_type' is overload\n", - "title": "Pool Name" - }, - "priority": { - "type": "integer", - "minimum": 0, - "maximum": 4294967295, - "title": "Priority" - } - }, - "required": [ - "nat_type", - "access_list" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "Dynamic" - }, - "static": { - "type": "array", - "items": { - "type": "object", - "properties": { - "access_list": { - "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", - "title": "Access List" - }, - "comment": { - "type": "string", - "title": "Comment" - }, - "direction": { - "type": "string", - "enum": [ - "egress", - "ingress" - ], - "description": "Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware platform.\nEOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW.\n", - "title": "Direction" - }, - "group": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", - "title": "Group" - }, - "original_ip": { - "type": "string", - "description": "IPv4 address", - "title": "Original IP" - }, - "original_port": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "title": "Original Port" - }, - "priority": { - "type": "integer", - "minimum": 0, - "maximum": 4294967295, - "title": "Priority" - }, - "protocol": { - "type": "string", - "enum": [ - "udp", - "tcp" - ], - "title": "Protocol" - }, - "translated_ip": { - "type": "string", - "description": "IPv4 address", - "title": "Translated IP" - }, - "translated_port": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "description": "requires 'original_port'", - "title": "Translated Port" - } - }, - "required": [ - "translated_ip", - "original_ip" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "Static" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Source" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "IP Nat" - }, - "ipv6_enable": { - "type": "boolean", - "title": "IPv6 Enable" - }, - "ipv6_address": { - "type": "string", - "title": "IPv6 Address" - }, - "ipv6_address_link_local": { - "type": "string", - "description": "Link local IPv6 address/mask", - "title": "IPv6 Address Link Local" - }, - "ipv6_nd_ra_disabled": { - "type": "boolean", - "title": "IPv6 ND RA Disabled" - }, - "ipv6_nd_managed_config_flag": { - "type": "boolean", - "title": "IPv6 ND Managed Config Flag" - }, - "ipv6_nd_prefixes": { - "type": "array", - "items": { - "type": "object", - "properties": { - "ipv6_prefix": { - "type": "string", - "title": "IPv6 Prefix" - }, - "valid_lifetime": { - "type": "string", - "description": "Infinite or lifetime in seconds", - "title": "Valid Lifetime" - }, - "preferred_lifetime": { - "type": "string", - "description": "Infinite or lifetime in seconds", - "title": "Preferred Lifetime" - }, - "no_autoconfig_flag": { - "type": "boolean", - "title": "No Autoconfig Flag" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "ipv6_prefix" - ] - }, - "title": "IPv6 ND Prefixes" - }, - "ipv6_dhcp_relay_destinations": { - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "type": "string", - "description": "DHCP server's IPv6 address", - "title": "Address" - }, - "vrf": { - "type": "string", - "title": "VRF" - }, - "local_interface": { - "type": "string", - "description": "Local interface to communicate with DHCP server - mutually exclusive to source_address", - "title": "Local Interface" - }, - "source_address": { - "type": "string", - "description": "Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface", - "title": "Source Address" - }, - "link_address": { - "type": "string", - "description": "Override the default link address specified in the relayed DHCP packet", - "title": "Link Address" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "address" - ] - }, - "title": "IPv6 DHCP Relay Destinations" - }, - "access_group_in": { - "type": "string", - "description": "Access list name", - "title": "Access Group In" - }, - "access_group_out": { - "type": "string", - "description": "Access list name", - "title": "Access Group Out" - }, - "ipv6_access_group_in": { - "type": "string", - "description": "IPv6 access list name", - "title": "IPv6 Access Group In" - }, - "ipv6_access_group_out": { - "type": "string", - "description": "IPv6 access list name", - "title": "IPv6 Access Group Out" - }, - "mac_access_group_in": { - "type": "string", - "description": "MAC access list name", - "title": "MAC Access Group In" - }, - "mac_access_group_out": { - "type": "string", - "description": "MAC access list name", - "title": "MAC Access Group Out" - }, - "multicast": { - "type": "object", - "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both", - "properties": { - "ipv4": { - "type": "object", - "properties": { - "boundaries": { - "type": "array", - "items": { - "type": "object", - "properties": { - "boundary": { - "type": "string", - "description": "ACL name or multicast IP subnet", - "title": "Boundary" - }, - "out": { - "type": "boolean", - "title": "Out" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "Boundaries" - }, - "static": { - "type": "boolean", - "title": "Static" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "IPv4" - }, - "ipv6": { - "type": "object", - "properties": { - "boundaries": { - "type": "array", - "items": { - "type": "object", - "properties": { - "boundary": { - "type": "string", - "description": "ACL name or multicast IP subnet", - "title": "Boundary" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "Boundaries" - }, - "static": { - "type": "boolean", - "title": "Static" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "IPv6" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Multicast" - }, - "ospf_network_point_to_point": { - "type": "boolean", - "title": "OSPF Network Point To Point" - }, - "ospf_area": { - "type": "string", - "title": "OSPF Area" - }, - "ospf_cost": { - "type": "integer", - "title": "OSPF Cost" - }, - "ospf_authentication": { - "type": "string", - "enum": [ - "none", - "simple", - "message-digest" - ], - "title": "OSPF Authentication" - }, - "ospf_authentication_key": { - "type": "string", - "description": "Encrypted password - only type 7 supported", - "title": "OSPF Authentication Key" - }, - "ospf_message_digest_keys": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "title": "ID" - }, - "hash_algorithm": { - "type": "string", - "enum": [ - "md5", - "sha1", - "sha256", - "sha384", - "sha512" - ], - "title": "Hash Algorithm" - }, - "key": { - "type": "string", - "description": "Encrypted password - only type 7 supported", - "title": "Key" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "id" - ] - }, - "title": "OSPF Message Digest Keys" - }, - "pim": { - "type": "object", - "properties": { - "ipv4": { - "type": "object", - "properties": { - "dr_priority": { - "type": "integer", - "minimum": 0, - "maximum": 429467295, - "title": "DR Priority" - }, - "sparse_mode": { - "type": "boolean", - "title": "Sparse Mode" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "IPv4" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "PIM" - }, - "mac_security": { - "type": "object", - "properties": { - "profile": { - "type": "string", - "title": "Profile" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "MAC Security" - }, - "channel_group": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "title": "ID" - }, - "mode": { - "type": "string", - "enum": [ - "on", - "active", - "passive" - ], - "title": "Mode" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Channel Group" - }, - "isis_enable": { - "type": "string", - "description": "ISIS instance", - "title": "ISIS Enable" - }, - "isis_passive": { - "type": "boolean", - "title": "ISIS Passive" - }, - "isis_metric": { - "type": "integer", - "title": "ISIS Metric" - }, - "isis_network_point_to_point": { - "type": "boolean", - "title": "ISIS Network Point To Point" - }, - "isis_circuit_type": { - "type": "string", - "enum": [ - "level-1-2", - "level-1", - "level-2" - ], - "title": "ISIS Circuit Type" - }, - "isis_hello_padding": { - "type": "boolean", - "title": "ISIS Hello Padding" - }, - "isis_authentication_mode": { - "type": "string", - "enum": [ - "text", - "md5" - ], - "title": "ISIS Authentication Mode" - }, - "isis_authentication_key": { - "type": "string", - "description": "Type-7 encrypted password", - "title": "ISIS Authentication Key" - }, - "poe": { - "type": "object", - "properties": { - "disabled": { - "type": "boolean", - "description": "Disable PoE on a POE capable port. PoE is enabled on all ports that support it by default in EOS.", - "default": false, - "title": "Disabled" - }, - "priority": { - "type": "string", - "enum": [ - "critical", - "high", - "medium", - "low" - ], - "description": "Prioritize a port's power in the event that one of the switch's power supplies loses power", - "title": "Priority" - }, - "reboot": { - "description": "Set the PoE power behavior for a PoE port when the system is rebooted", - "type": "object", - "properties": { - "action": { - "type": "string", - "enum": [ - "maintain", - "power-off" - ], - "description": "PoE action for interface", - "title": "Action" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Reboot" - }, - "link_down": { - "description": "Set the PoE power behavior for a PoE port when the port goes down", - "type": "object", - "properties": { - "action": { - "type": "string", - "enum": [ - "maintain", - "power-off" - ], - "description": "PoE action for interface", - "title": "Action" - }, - "power_off_delay": { - "type": "integer", - "minimum": 1, - "maximum": 86400, - "description": "Number of seconds to delay shutting the power off after a link down event occurs. Default value is 5 seconds in EOS.", - "title": "Power Off Delay" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Link Down" - }, - "shutdown": { - "description": "Set the PoE power behavior for a PoE port when the port is admin down", - "type": "object", - "properties": { - "action": { - "type": "string", - "enum": [ - "maintain", - "power-off" - ], - "description": "PoE action for interface", - "title": "Action" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Shutdown" - }, - "limit": { - "type": "object", - "description": "Override the hardware-negotiated power limit using either wattage or a power class. Note that if using a power class, AVD will automatically convert the class value to the wattage value corresponding to that power class.", - "properties": { - "class": { - "type": "integer", - "minimum": 0, - "maximum": 8, - "title": "Class" - }, - "watts": { - "type": "string", - "title": "Watts" - }, - "fixed": { - "type": "boolean", - "description": "Set to ignore hardware classification", - "title": "Fixed" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Limit" - }, - "negotiation_lldp": { - "type": "boolean", - "description": "Disable to prevent port from negotiating power with powered devices over LLDP. Enabled by default in EOS.", - "title": "Negotiation LLDP" - }, - "legacy_detect": { - "type": "boolean", - "description": "Allow a subset of legacy devices to work with the PoE switch. Disabled by default in EOS because it can cause false positive detections.", - "title": "Legacy Detect" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "PoE" - }, - "ptp": { - "type": "object", - "properties": { - "enable": { - "type": "boolean", - "title": "Enable" - }, - "announce": { - "type": "object", - "properties": { - "interval": { - "type": "integer", - "title": "Interval" - }, - "timeout": { - "type": "integer", - "title": "Timeout" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Announce" - }, - "delay_req": { - "type": "integer", - "title": "Delay Req" - }, - "delay_mechanism": { - "type": "string", - "enum": [ - "e2e", - "p2p" - ], - "title": "Delay Mechanism" - }, - "sync_message": { - "type": "object", - "properties": { - "interval": { - "type": "integer", - "title": "Interval" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Sync Message" - }, - "role": { - "type": "string", - "enum": [ - "master", - "dynamic" - ], - "title": "Role" - }, - "vlan": { - "type": "string", - "description": "VLAN can be 'all' or list of vlans as string", - "title": "VLAN" - }, - "transport": { - "type": "string", - "enum": [ - "ipv4", - "ipv6", - "layer2" - ], - "title": "Transport" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "PTP" - }, - "profile": { - "type": "string", - "description": "Interface profile", - "title": "Profile" - }, - "storm_control": { - "type": "object", - "properties": { - "all": { - "type": "object", - "properties": { - "level": { - "type": "string", - "description": "Configure maximum storm-control level", - "title": "Level" - }, - "unit": { - "type": "string", - "default": "percent", - "enum": [ - "percent", - "pps" - ], - "description": "Optional field and is hardware dependent", - "title": "Unit" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "All" - }, - "broadcast": { - "type": "object", - "properties": { - "level": { - "type": "string", - "description": "Configure maximum storm-control level", - "title": "Level" - }, - "unit": { - "type": "string", - "default": "percent", - "enum": [ - "percent", - "pps" - ], - "description": "Optional field and is hardware dependent", - "title": "Unit" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Broadcast" - }, - "multicast": { - "type": "object", - "properties": { - "level": { - "type": "string", - "description": "Configure maximum storm-control level", - "title": "Level" - }, - "unit": { - "type": "string", - "default": "percent", - "enum": [ - "percent", - "pps" - ], - "description": "Optional field and is hardware dependent", - "title": "Unit" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Multicast" - }, - "unknown_unicast": { - "type": "object", - "properties": { - "level": { - "type": "string", - "description": "Configure maximum storm-control level", - "title": "Level" - }, - "unit": { - "type": "string", - "default": "percent", - "enum": [ - "percent", - "pps" - ], - "description": "Optional field and is hardware dependent", - "title": "Unit" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Unknown Unicast" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Storm Control" - }, - "logging": { - "type": "object", - "properties": { - "event": { - "type": "object", - "properties": { - "link_status": { - "type": "boolean", - "title": "Link Status" - }, - "congestion_drops": { - "type": "boolean", - "title": "Congestion Drops" - }, - "spanning_tree": { - "type": "boolean", - "title": "Spanning Tree" - }, - "storm_control_discards": { - "type": "boolean", - "title": "Storm Control Discards" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Event" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Logging" - }, - "lldp": { - "type": "object", - "properties": { - "transmit": { - "type": "boolean", - "title": "Transmit" - }, - "receive": { - "type": "boolean", - "title": "Receive" - }, - "ztp_vlan": { - "type": "integer", - "description": "ZTP vlan number", - "title": "ZTP VLAN" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "LLDP" - }, - "trunk_private_vlan_secondary": { - "type": "boolean", - "title": "Trunk Private VLAN Secondary" - }, - "pvlan_mapping": { - "type": "string", - "description": "List of vlans as string", - "title": "PVLAN Mapping" - }, - "vlan_translations": { - "type": "array", - "items": { - "type": "object", - "properties": { - "from": { - "type": "string", - "description": "List of vlans as string (only one vlan if direction is \"both\")", - "title": "From" - }, - "to": { - "type": "integer", - "description": "VLAN ID", - "title": "To" - }, - "direction": { - "type": "string", - "enum": [ - "in", - "out", - "both" - ], - "default": "both", - "title": "Direction" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "VLAN Translations" - }, - "dot1x": { - "type": "object", - "properties": { - "port_control": { - "type": "string", - "enum": [ - "auto", - "force-authorized", - "force-unauthorized" - ], - "title": "Port Control" - }, - "port_control_force_authorized_phone": { - "type": "boolean", - "title": "Port Control Force Authorized Phone" - }, - "reauthentication": { - "type": "boolean", - "title": "Reauthentication" - }, - "pae": { - "type": "object", - "properties": { - "mode": { - "type": "string", - "enum": [ - "authenticator" - ], - "title": "Mode" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "PAE" - }, - "authentication_failure": { - "type": "object", - "properties": { - "action": { - "type": "string", - "enum": [ - "allow", - "drop" - ], - "title": "Action" - }, - "allow_vlan": { - "type": "integer", - "minimum": 1, - "maximum": 4094, - "title": "Allow VLAN" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Authentication Failure" - }, - "host_mode": { - "type": "object", - "properties": { - "mode": { - "type": "string", - "enum": [ - "multi-host", - "single-host" - ], - "title": "Mode" - }, - "multi_host_authenticated": { - "type": "boolean", - "title": "Multi Host Authenticated" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Host Mode" - }, - "mac_based_authentication": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "title": "Enabled" - }, - "always": { - "type": "boolean", - "title": "Always" - }, - "host_mode_common": { - "type": "boolean", - "title": "Host Mode Common" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "MAC Based Authentication" - }, - "timeout": { - "type": "object", - "properties": { - "idle_host": { - "type": "integer", - "minimum": 10, - "maximum": 65535, - "title": "Idle Host" - }, - "quiet_period": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "title": "Quiet Period" - }, - "reauth_period": { - "type": "string", - "description": "Value can be 60-4294967295 or 'server'", - "title": "Reauth Period" - }, - "reauth_timeout_ignore": { - "type": "boolean", - "title": "Reauth Timeout Ignore" - }, - "tx_period": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "title": "TX Period" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Timeout" - }, - "reauthorization_request_limit": { - "type": "integer", - "minimum": 1, - "maximum": 10, - "title": "Reauthorization Request Limit" - }, - "unauthorized": { - "type": "object", - "properties": { - "access_vlan_membership_egress": { - "type": "boolean", - "title": "Access VLAN Membership Egress" - }, - "native_vlan_membership_egress": { - "type": "boolean", - "title": "Native VLAN Membership Egress" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Unauthorized" - }, - "eapol": { - "type": "object", - "properties": { - "disabled": { - "type": "boolean", - "title": "Disabled" - }, - "authentication_failure_fallback_mba": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "title": "Enabled" - }, - "timeout": { - "type": "integer", - "minimum": 0, - "maximum": 65535, - "title": "Timeout" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Authentication Failure Fallback Mba" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Eapol" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "dot1x" - }, - "service_profile": { - "type": "string", - "description": "QOS profile", - "title": "Service Profile" - }, - "shape": { - "type": "object", - "properties": { - "rate": { - "type": "string", - "description": "Rate in kbps, pps or percent\nSupported options are platform dependent\nExamples:\n- \"5000 kbps\"\n- \"1000 pps\"\n- \"20 percent\"\n", - "title": "Rate" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Shape" - }, - "qos": { - "type": "object", - "properties": { - "trust": { - "type": "string", - "enum": [ - "dscp", - "cos", - "disabled" - ], - "title": "Trust" - }, - "dscp": { - "type": "integer", - "description": "DSCP value", - "title": "DSCP" - }, - "cos": { - "type": "integer", - "description": "COS value", - "title": "COS" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "QOS" - }, - "spanning_tree_bpdufilter": { - "type": "string", - "enum": [ - "enabled", - "disabled", - "True", - "False", - "true", - "false" - ], - "title": "Spanning Tree Bpdufilter" - }, - "spanning_tree_bpduguard": { - "type": "string", - "enum": [ - "enabled", - "disabled", - "True", - "False", - "true", - "false" - ], - "title": "Spanning Tree Bpduguard" - }, - "spanning_tree_guard": { - "type": "string", - "enum": [ - "loop", - "root", - "disabled" - ], - "title": "Spanning Tree Guard" - }, - "spanning_tree_portfast": { - "type": "string", - "enum": [ - "edge", - "network" - ], - "title": "Spanning Tree Portfast" - }, - "vmtracer": { - "type": "boolean", - "title": "VMTracer" - }, - "priority_flow_control": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "title": "Enabled" - }, - "priorities": { - "type": "array", - "items": { - "type": "object", - "properties": { - "priority": { - "type": "integer", - "minimum": 0, - "maximum": 7, - "title": "Priority" - }, - "no_drop": { - "type": "boolean", - "title": "No Drop" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "priority" - ] - }, - "title": "Priorities" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Priority Flow Control" - }, - "bfd": { - "type": "object", - "properties": { - "echo": { - "type": "boolean", - "title": "Echo" - }, - "interval": { - "type": "integer", - "description": "Interval in milliseconds", - "title": "Interval" - }, - "min_rx": { - "type": "integer", - "description": "Rate in milliseconds", - "title": "Min RX" - }, - "multiplier": { - "type": "integer", - "minimum": 3, - "maximum": 50, - "title": "Multiplier" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "BFD" - }, - "service_policy": { - "type": "object", - "properties": { - "pbr": { - "type": "object", - "properties": { - "input": { - "type": "string", - "description": "Policy Based Routing Policy-map name", - "title": "Input" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "PBR" - }, - "qos": { - "type": "object", - "properties": { - "input": { - "type": "string", - "description": "Quality of Service Policy-map name", - "title": "Input" - } - }, - "required": [ - "input" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "QOS" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Service Policy" - }, - "mpls": { - "type": "object", - "properties": { - "ip": { - "type": "boolean", - "title": "IP" - }, - "ldp": { - "type": "object", - "properties": { - "interface": { - "type": "boolean", - "title": "Interface" - }, - "igp_sync": { - "type": "boolean", - "title": "IGP Sync" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "LDP" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "MPLS" - }, - "lacp_timer": { - "type": "object", - "properties": { - "mode": { - "type": "string", - "enum": [ - "fast", - "normal" - ], - "title": "Mode" - }, - "multiplier": { - "type": "integer", - "minimum": 3, - "maximum": 3000, - "title": "Multiplier" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "LACP Timer" - }, - "lacp_port_priority": { - "type": "integer", - "minimum": 0, - "maximum": 65535, - "title": "LACP Port Priority" - }, - "transceiver": { - "type": "object", - "properties": { - "media": { - "type": "object", - "properties": { - "override": { - "type": "string", - "description": "Transceiver type", - "title": "Override" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Media" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Transceiver" - }, - "ip_proxy_arp": { - "type": "boolean", - "title": "IP Proxy ARP" - }, - "traffic_policy": { - "type": "object", - "properties": { - "input": { - "type": "string", - "description": "Ingress traffic policy", - "title": "Input" - }, - "output": { - "type": "string", - "description": "Egress traffic policy", - "title": "Output" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Traffic Policy" - }, - "bgp": { - "type": "object", - "properties": { - "session_tracker": { - "type": "string", - "description": "Name of session tracker", - "title": "Session Tracker" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "BGP" - }, - "peer": { - "type": "string", - "description": "Key only used for documentation or validation purposes", - "title": "Peer" - }, - "peer_interface": { - "type": "string", - "description": "Key only used for documentation or validation purposes", - "title": "Peer Interface" - }, - "peer_type": { - "type": "string", - "description": "Key only used for documentation or validation purposes", - "title": "Peer Type" - }, - "sflow": { - "type": "object", - "properties": { - "enable": { - "type": "boolean", - "title": "Enable" - }, - "egress": { - "type": "object", - "properties": { - "enable": { - "type": "boolean", - "title": "Enable" - }, - "unmodified_enable": { - "type": "boolean", - "title": "Unmodified Enable" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Egress" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Sflow" - }, - "port_profile": { - "type": "string", - "description": "Key only used for documentation or validation purposes", - "title": "Port Profile" - }, - "uc_tx_queues": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "description": "TX-Queue ID", - "title": "ID" - }, - "random_detect": { - "type": "object", - "properties": { - "ecn": { - "description": "Explicit Congestion Notification", - "type": "object", - "properties": { - "count": { - "type": "boolean", - "description": "Enable counter for random-detect ECNs", - "title": "Count" - }, - "threshold": { - "type": "object", - "properties": { - "units": { - "type": "string", - "enum": [ - "segments", - "bytes", - "kbytes", - "mbytes", - "milliseconds" - ], - "description": "Indicate the units to be used for the threshold values", - "title": "Units" - }, - "min": { - "type": "integer", - "minimum": 1, - "maximum": 256000000, - "description": "Set the random-detect ECN minimum-threshold", - "title": "Min" - }, - "max": { - "type": "integer", - "minimum": 1, - "maximum": 256000000, - "description": "Set the random-detect ECN maximum-threshold", - "title": "Max" - }, - "max_probability": { - "type": "integer", - "minimum": 1, - "maximum": 100, - "description": "Set the random-detect ECN max-mark-probability", - "title": "Max Probability" - }, - "weight": { - "type": "integer", - "minimum": 0, - "maximum": 15, - "description": "Set the random-detect ECN weight", - "title": "Weight" - } - }, - "required": [ - "units", - "min", - "max" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Threshold" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Ecn" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Random Detect" - } - }, - "required": [ - "id" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "Uc TX Queues" - }, - "tx_queues": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "description": "TX-Queue ID", - "title": "ID" - }, - "random_detect": { - "type": "object", - "properties": { - "ecn": { - "description": "Explicit Congestion Notification", - "type": "object", - "properties": { - "count": { - "type": "boolean", - "description": "Enable counter for random-detect ECNs", - "title": "Count" - }, - "threshold": { - "type": "object", - "properties": { - "units": { - "type": "string", - "enum": [ - "segments", - "bytes", - "kbytes", - "mbytes", - "milliseconds" - ], - "description": "Indicate the units to be used for the threshold values", - "title": "Units" - }, - "min": { - "type": "integer", - "minimum": 1, - "maximum": 256000000, - "description": "Set the random-detect ECN minimum-threshold", - "title": "Min" - }, - "max": { - "type": "integer", - "minimum": 1, - "maximum": 256000000, - "description": "Set the random-detect ECN maximum-threshold", - "title": "Max" - }, - "max_probability": { - "type": "integer", - "minimum": 1, - "maximum": 100, - "description": "Set the random-detect ECN max-mark-probability", - "title": "Max Probability" - }, - "weight": { - "type": "integer", - "minimum": 0, - "maximum": 15, - "description": "Set the random-detect ECN weight", - "title": "Weight" - } - }, - "required": [ - "units", - "max", - "max_probability" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Threshold" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Ecn" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Random Detect" - } - }, - "required": [ - "id" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "TX Queues" - }, - "vrrp_ids": { - "type": "array", - "description": "VRRP model.", - "items": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "description": "VRID", - "title": "ID" - }, - "priority_level": { - "type": "integer", - "description": "Instance priority", - "minimum": 1, - "maximum": 254, - "title": "Priority Level" - }, - "advertisement": { - "type": "object", - "properties": { - "interval": { - "type": "integer", - "description": "Interval in seconds", - "minimum": 1, - "maximum": 255, - "title": "Interval" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Advertisement" - }, - "preempt": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "title": "Enabled" - }, - "delay": { - "type": "object", - "properties": { - "minimum": { - "type": "integer", - "description": "Minimum preempt delay in seconds", - "minimum": 0, - "maximum": 3600, - "title": "Minimum" - }, - "reload": { - "type": "integer", - "description": "Reload preempt delay in seconds", - "minimum": 0, - "maximum": 3600, - "title": "Reload" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Delay" - } - }, - "required": [ - "enabled" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Preempt" - }, - "timers": { - "type": "object", - "properties": { - "delay": { - "type": "object", - "properties": { - "reload": { - "type": "integer", - "description": "Delay after reload in seconds.", - "minimum": 0, - "maximum": 3600, - "title": "Reload" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Delay" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Timers" - }, - "tracked_object": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Tracked object name", - "title": "Name" - }, - "decrement": { - "type": "integer", - "minimum": 1, - "maximum": 254, - "description": "Decrement VRRP priority by 1-254", - "title": "Decrement" - }, - "shutdown": { - "type": "boolean", - "title": "Shutdown" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "name" - ] - }, - "title": "Tracked Object" - }, - "ipv4": { - "type": "object", - "properties": { - "address": { - "type": "string", - "description": "Virtual IPv4 address", - "title": "Address" - }, - "version": { - "type": "integer", - "enum": [ - 2, - 3 - ], - "title": "Version" - } - }, - "required": [ - "address" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "IPv4" - }, - "ipv6": { - "type": "object", - "properties": { - "address": { - "type": "string", - "description": "Virtual IPv6 address", - "title": "Address" - } - }, - "required": [ - "address" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "IPv6" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "id" - ] - }, - "title": "VRRP IDs" - }, - "eos_cli": { - "type": "string", - "description": "Multiline EOS CLI rendered directly on the ethernet interface in the final EOS configuration", - "title": "EOS CLI" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Structured Config" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "profile" - ] - }, - "title": "L3 Interfaces Profiles" - }, - "l3_interfaces": { - "type": "array", - "items": { - "type": "object", - "properties": { - "node": { - "type": "string", - "description": "Device on which the interface should be configured.", - "title": "Node" - }, - "profile": { - "type": "string", - "description": "L3 interface profile name. Profile defined under l3_interfaces_profiles.", - "title": "Profile" - }, - "interface": { - "type": "string", - "description": "Ethernet interface name like 'Ethernet2'.", - "pattern": "Ethernet[\\d/]+", - "title": "Interface" - }, - "description": { - "type": "string", - "description": "Interface description.\nIf not set a default description will be configured with '[[ ]]'", - "title": "Description" - }, - "ip": { - "type": "string", - "description": "Node IPv4 address/Mask or 'dhcp'.", - "title": "IP" - }, - "dhcp_client_accept_default_route": { - "type": "boolean", - "default": false, - "description": "Supported if `ip` is `dhcp`.\nAccepts default route from DHCP.", - "title": "DHCP Client Accept Default Route" - }, - "enabled": { - "type": "boolean", - "default": true, - "description": "Enable or Shutdown the interface.", - "title": "Enabled" - }, - "speed": { - "type": "string", - "description": "Speed should be set in the format `` or `forced ` or `auto `.", - "title": "Speed" - }, - "peer": { - "type": "string", - "description": "The peer device name. Used for description and documentation", - "title": "Peer" - }, - "peer_interface": { - "type": "string", - "description": "The peer device interface. Used for description and documentation", - "title": "Peer Interface" - }, - "peer_ip": { - "type": "string", - "description": "The peer device IP. Used for description and documentation", - "title": "Peer IP" - }, - "qos_profile": { - "type": "string", - "description": "QOS service profile.", - "title": "QOS Profile" - }, - "raw_eos_cli": { - "type": "string", - "description": "EOS CLI rendered directly on the interface in the final EOS configuration.", - "title": "Raw EOS CLI" - }, - "structured_config": { - "type": "object", - "description": "Custom structured config for the Ethernet interface.", - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "description": { - "type": "string", - "title": "Description" - }, - "shutdown": { - "type": "boolean", - "title": "Shutdown" - }, - "load_interval": { - "type": "integer", - "minimum": 0, - "maximum": 600, - "description": "Interval in seconds for updating interface counters\"", - "title": "Load Interval" - }, - "speed": { - "type": "string", - "description": "Speed should be set in the format `` or `forced ` or `auto `.", - "title": "Speed" - }, - "mtu": { - "type": "integer", - "minimum": 68, - "maximum": 65535, - "title": "MTU" - }, - "l2_mtu": { - "type": "integer", - "minimum": 68, - "maximum": 65535, - "description": "\"l2_mtu\" should only be defined for platforms supporting the \"l2 mtu\" CLI\n", - "title": "L2 MTU" - }, - "l2_mru": { - "type": "integer", - "minimum": 68, - "maximum": 65535, - "description": "\"l2_mru\" should only be defined for platforms supporting the \"l2 mru\" CLI\n", - "title": "L2 MRU" - }, - "vlans": { - "type": "string", - "description": "List of switchport vlans as string\nFor a trunk port this would be a range like \"1-200,300\"\nFor an access port this would be a single vlan \"123\"\n", - "title": "VLANs" - }, - "native_vlan": { - "type": "integer", - "title": "Native VLAN" - }, - "native_vlan_tag": { - "type": "boolean", - "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence", - "title": "Native VLAN Tag" - }, - "mode": { - "type": "string", - "enum": [ - "access", - "dot1q-tunnel", - "trunk", - "trunk phone" - ], - "title": "Mode" - }, - "phone": { - "type": "object", - "properties": { - "trunk": { - "type": "string", - "enum": [ - "tagged", - "tagged phone", - "untagged", - "untagged phone" - ], - "title": "Trunk" - }, - "vlan": { - "type": "integer", - "minimum": 1, - "maximum": 4094, - "title": "VLAN" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Phone" - }, - "l2_protocol": { - "type": "object", - "properties": { - "encapsulation_dot1q_vlan": { - "type": "integer", - "description": "Vlan tag to configure on sub-interface", - "title": "Encapsulation Dot1Q VLAN" - }, - "forwarding_profile": { - "type": "string", - "description": "L2 protocol forwarding profile", - "title": "Forwarding Profile" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "L2 Protocol" - }, - "trunk_groups": { - "type": "array", - "items": { - "type": "string" - }, - "title": "Trunk Groups" - }, - "type": { - "type": "string", - "enum": [ - "routed", - "switched", - "l3dot1q", - "l2dot1q", - "port-channel-member" - ], - "description": "l3dot1q and l2dot1q are used for sub-interfaces. The parent interface should be defined as routed.\nInterface will not be listed in device documentation, unless \"type\" is set.\n", - "title": "Type" - }, - "snmp_trap_link_change": { - "type": "boolean", - "title": "Snmp Trap Link Change" - }, - "address_locking": { - "type": "object", - "properties": { - "ipv4": { - "type": "boolean", - "description": "Enable address locking for IPv4", - "title": "IPv4" - }, - "ipv6": { - "type": "boolean", - "description": "Enable address locking for IPv6", - "title": "IPv6" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Address Locking" - }, - "flowcontrol": { - "type": "object", - "properties": { - "received": { - "type": "string", - "enum": [ - "desired", - "on", - "off" - ], - "title": "Received" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Flowcontrol" - }, - "vrf": { - "type": "string", - "description": "VRF name", - "title": "VRF" - }, - "flow_tracker": { - "type": "object", - "properties": { - "sampled": { - "type": "string", - "description": "Sampled flow tracker name.", - "title": "Sampled" - }, - "hardware": { - "type": "string", - "description": "Hardware flow tracker name.", - "title": "Hardware" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Flow Tracker" - }, - "error_correction_encoding": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "default": true, - "title": "Enabled" - }, - "fire_code": { - "type": "boolean", - "title": "Fire Code" - }, - "reed_solomon": { - "type": "boolean", - "title": "Reed Solomon" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Error Correction Encoding" - }, - "link_tracking_groups": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Group name", - "title": "Name" - }, - "direction": { - "type": "string", - "enum": [ - "upstream", - "downstream" - ], - "title": "Direction" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "name" - ] - }, - "title": "Link Tracking Groups" - }, - "evpn_ethernet_segment": { - "type": "object", - "properties": { - "identifier": { - "type": "string", - "description": "EVPN Ethernet Segment Identifier (Type 1 format)", - "title": "Identifier" - }, - "redundancy": { - "type": "string", - "enum": [ - "all-active", - "single-active" - ], - "title": "Redundancy" - }, - "designated_forwarder_election": { - "type": "object", - "properties": { - "algorithm": { - "type": "string", - "enum": [ - "modulus", - "preference" - ], - "title": "Algorithm" - }, - "preference_value": { - "type": "integer", - "minimum": 0, - "maximum": 65535, - "description": "Preference_value is only used when \"algorithm\" is \"preference\"", - "title": "Preference Value" - }, - "dont_preempt": { - "type": "boolean", - "description": "Dont_preempt is only used when \"algorithm\" is \"preference\"", - "title": "Dont Preempt" - }, - "hold_time": { - "type": "integer", - "title": "Hold Time" - }, - "subsequent_hold_time": { - "type": "integer", - "title": "Subsequent Hold Time" - }, - "candidate_reachability_required": { - "type": "boolean", - "title": "Candidate Reachability Required" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Designated Forwarder Election" - }, - "mpls": { - "type": "object", - "properties": { - "shared_index": { - "type": "integer", - "minimum": 1, - "maximum": 1024, - "title": "Shared Index" - }, - "tunnel_flood_filter_time": { - "type": "integer", - "title": "Tunnel Flood Filter Time" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "MPLS" - }, - "route_target": { - "type": "string", - "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx", - "title": "Route Target" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "EVPN Ethernet Segment" - }, - "encapsulation_dot1q_vlan": { - "type": "integer", - "description": "VLAN tag to configure on sub-interface", - "title": "Encapsulation Dot1Q VLAN" - }, - "encapsulation_vlan": { - "type": "object", - "properties": { - "client": { - "type": "object", - "properties": { - "dot1q": { - "type": "object", - "properties": { - "vlan": { - "type": "integer", - "description": "Client VLAN ID", - "title": "VLAN" - }, - "outer": { - "type": "integer", - "description": "Client Outer VLAN ID", - "title": "Outer" - }, - "inner": { - "type": "integer", - "description": "Client Inner VLAN ID", - "title": "Inner" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Dot1Q" - }, - "unmatched": { - "type": "boolean", - "title": "Unmatched" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Client" - }, - "network": { - "type": "object", - "description": "Network encapsulations are all optional and skipped if using client unmatched", - "properties": { - "dot1q": { - "type": "object", - "properties": { - "vlan": { - "type": "integer", - "description": "Network VLAN ID", - "title": "VLAN" - }, - "outer": { - "type": "integer", - "description": "Network outer VLAN ID", - "title": "Outer" - }, - "inner": { - "type": "integer", - "description": "Network inner VLAN ID", - "title": "Inner" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Dot1Q" - }, - "client": { - "type": "boolean", - "title": "Client" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Network" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Encapsulation VLAN" - }, - "vlan_id": { - "type": "integer", - "minimum": 1, - "maximum": 4094, - "title": "VLAN ID" - }, - "ip_address": { - "type": "string", - "description": "IPv4 address/mask or \"dhcp\"", - "title": "IP Address" - }, - "ip_address_secondaries": { - "type": "array", - "items": { - "type": "string" - }, - "title": "IP Address Secondaries" - }, - "dhcp_client_accept_default_route": { - "type": "boolean", - "description": "Install default-route obtained via DHCP", - "title": "DHCP Client Accept Default Route" - }, - "dhcp_server_ipv4": { - "type": "boolean", - "description": "Enable IPv4 DHCP server.", - "title": "DHCP Server IPv4" - }, - "dhcp_server_ipv6": { - "type": "boolean", - "description": "Enable IPv6 DHCP server.", - "title": "DHCP Server IPv6" - }, - "ip_helpers": { - "type": "array", - "items": { - "type": "object", - "properties": { - "ip_helper": { - "type": "string", - "title": "IP Helper" - }, - "source_interface": { - "type": "string", - "description": "Source interface name", - "title": "Source Interface" - }, - "vrf": { - "type": "string", - "description": "VRF name", - "title": "VRF" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "ip_helper" - ] - }, - "title": "IP Helpers" - }, - "ip_nat": { - "type": "object", - "properties": { - "service_profile": { - "type": "string", - "description": "NAT interface profile.", - "title": "Service Profile" - }, - "destination": { - "type": "object", - "properties": { - "dynamic": { - "type": "array", - "items": { - "type": "object", - "properties": { - "access_list": { - "type": "string", - "title": "Access List" - }, - "comment": { - "type": "string", - "title": "Comment" - }, - "pool_name": { - "type": "string", - "title": "Pool Name" - }, - "priority": { - "type": "integer", - "minimum": 0, - "maximum": 4294967295, - "title": "Priority" - } - }, - "required": [ - "pool_name", - "access_list" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "Dynamic" - }, - "static": { - "type": "array", - "items": { - "type": "object", - "properties": { - "access_list": { - "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", - "title": "Access List" - }, - "comment": { - "type": "string", - "title": "Comment" - }, - "direction": { - "type": "string", - "enum": [ - "egress", - "ingress" - ], - "description": "Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware platform.\nEOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW.\n", - "title": "Direction" - }, - "group": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", - "title": "Group" - }, - "original_ip": { - "type": "string", - "description": "IPv4 address", - "title": "Original IP" - }, - "original_port": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "title": "Original Port" - }, - "priority": { - "type": "integer", - "minimum": 0, - "maximum": 4294967295, - "title": "Priority" - }, - "protocol": { - "type": "string", - "enum": [ - "udp", - "tcp" - ], - "title": "Protocol" - }, - "translated_ip": { - "type": "string", - "description": "IPv4 address", - "title": "Translated IP" - }, - "translated_port": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "description": "requires 'original_port'", - "title": "Translated Port" - } - }, - "required": [ - "translated_ip", - "original_ip" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "Static" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Destination" - }, - "source": { - "type": "object", - "properties": { - "dynamic": { - "type": "array", - "items": { - "type": "object", - "properties": { - "access_list": { - "type": "string", - "title": "Access List" - }, - "comment": { - "type": "string", - "title": "Comment" - }, - "nat_type": { - "type": "string", - "enum": [ - "overload", - "pool", - "pool-address-only", - "pool-full-cone" - ], - "title": "Nat Type" - }, - "pool_name": { - "type": "string", - "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone\nignored if 'nat_type' is overload\n", - "title": "Pool Name" - }, - "priority": { - "type": "integer", - "minimum": 0, - "maximum": 4294967295, - "title": "Priority" - } - }, - "required": [ - "nat_type", - "access_list" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "Dynamic" - }, - "static": { - "type": "array", - "items": { - "type": "object", - "properties": { - "access_list": { - "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", - "title": "Access List" - }, - "comment": { - "type": "string", - "title": "Comment" - }, - "direction": { - "type": "string", - "enum": [ - "egress", - "ingress" - ], - "description": "Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware platform.\nEOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW.\n", - "title": "Direction" - }, - "group": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", - "title": "Group" - }, - "original_ip": { - "type": "string", - "description": "IPv4 address", - "title": "Original IP" - }, - "original_port": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "title": "Original Port" - }, - "priority": { - "type": "integer", - "minimum": 0, - "maximum": 4294967295, - "title": "Priority" - }, - "protocol": { - "type": "string", - "enum": [ - "udp", - "tcp" - ], - "title": "Protocol" - }, - "translated_ip": { - "type": "string", - "description": "IPv4 address", - "title": "Translated IP" - }, - "translated_port": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "description": "requires 'original_port'", - "title": "Translated Port" - } - }, - "required": [ - "translated_ip", - "original_ip" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "Static" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Source" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "IP Nat" - }, - "ipv6_enable": { - "type": "boolean", - "title": "IPv6 Enable" - }, - "ipv6_address": { - "type": "string", - "title": "IPv6 Address" - }, - "ipv6_address_link_local": { - "type": "string", - "description": "Link local IPv6 address/mask", - "title": "IPv6 Address Link Local" - }, - "ipv6_nd_ra_disabled": { - "type": "boolean", - "title": "IPv6 ND RA Disabled" - }, - "ipv6_nd_managed_config_flag": { - "type": "boolean", - "title": "IPv6 ND Managed Config Flag" - }, - "ipv6_nd_prefixes": { - "type": "array", - "items": { - "type": "object", - "properties": { - "ipv6_prefix": { - "type": "string", - "title": "IPv6 Prefix" - }, - "valid_lifetime": { - "type": "string", - "description": "Infinite or lifetime in seconds", - "title": "Valid Lifetime" - }, - "preferred_lifetime": { - "type": "string", - "description": "Infinite or lifetime in seconds", - "title": "Preferred Lifetime" - }, - "no_autoconfig_flag": { - "type": "boolean", - "title": "No Autoconfig Flag" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "ipv6_prefix" - ] - }, - "title": "IPv6 ND Prefixes" - }, - "ipv6_dhcp_relay_destinations": { - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "type": "string", - "description": "DHCP server's IPv6 address", - "title": "Address" - }, - "vrf": { - "type": "string", - "title": "VRF" - }, - "local_interface": { - "type": "string", - "description": "Local interface to communicate with DHCP server - mutually exclusive to source_address", - "title": "Local Interface" - }, - "source_address": { - "type": "string", - "description": "Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface", - "title": "Source Address" - }, - "link_address": { - "type": "string", - "description": "Override the default link address specified in the relayed DHCP packet", - "title": "Link Address" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "address" - ] - }, - "title": "IPv6 DHCP Relay Destinations" - }, - "access_group_in": { - "type": "string", - "description": "Access list name", - "title": "Access Group In" - }, - "access_group_out": { - "type": "string", - "description": "Access list name", - "title": "Access Group Out" - }, - "ipv6_access_group_in": { - "type": "string", - "description": "IPv6 access list name", - "title": "IPv6 Access Group In" - }, - "ipv6_access_group_out": { - "type": "string", - "description": "IPv6 access list name", - "title": "IPv6 Access Group Out" - }, - "mac_access_group_in": { - "type": "string", - "description": "MAC access list name", - "title": "MAC Access Group In" - }, - "mac_access_group_out": { - "type": "string", - "description": "MAC access list name", - "title": "MAC Access Group Out" - }, - "multicast": { - "type": "object", - "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both", - "properties": { - "ipv4": { - "type": "object", - "properties": { - "boundaries": { - "type": "array", - "items": { - "type": "object", - "properties": { - "boundary": { - "type": "string", - "description": "ACL name or multicast IP subnet", - "title": "Boundary" - }, - "out": { - "type": "boolean", - "title": "Out" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "Boundaries" - }, - "static": { - "type": "boolean", - "title": "Static" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "IPv4" - }, - "ipv6": { - "type": "object", - "properties": { - "boundaries": { - "type": "array", - "items": { - "type": "object", - "properties": { - "boundary": { - "type": "string", - "description": "ACL name or multicast IP subnet", - "title": "Boundary" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "Boundaries" - }, - "static": { - "type": "boolean", - "title": "Static" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "IPv6" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Multicast" - }, - "ospf_network_point_to_point": { - "type": "boolean", - "title": "OSPF Network Point To Point" - }, - "ospf_area": { - "type": "string", - "title": "OSPF Area" - }, - "ospf_cost": { - "type": "integer", - "title": "OSPF Cost" - }, - "ospf_authentication": { - "type": "string", - "enum": [ - "none", - "simple", - "message-digest" - ], - "title": "OSPF Authentication" - }, - "ospf_authentication_key": { - "type": "string", - "description": "Encrypted password - only type 7 supported", - "title": "OSPF Authentication Key" - }, - "ospf_message_digest_keys": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "title": "ID" - }, - "hash_algorithm": { - "type": "string", - "enum": [ - "md5", - "sha1", - "sha256", - "sha384", - "sha512" - ], - "title": "Hash Algorithm" - }, - "key": { - "type": "string", - "description": "Encrypted password - only type 7 supported", - "title": "Key" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "id" - ] - }, - "title": "OSPF Message Digest Keys" - }, - "pim": { - "type": "object", - "properties": { - "ipv4": { - "type": "object", - "properties": { - "dr_priority": { - "type": "integer", - "minimum": 0, - "maximum": 429467295, - "title": "DR Priority" - }, - "sparse_mode": { - "type": "boolean", - "title": "Sparse Mode" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "IPv4" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "PIM" - }, - "mac_security": { - "type": "object", - "properties": { - "profile": { - "type": "string", - "title": "Profile" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "MAC Security" - }, - "channel_group": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "title": "ID" - }, - "mode": { - "type": "string", - "enum": [ - "on", - "active", - "passive" - ], - "title": "Mode" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Channel Group" - }, - "isis_enable": { - "type": "string", - "description": "ISIS instance", - "title": "ISIS Enable" - }, - "isis_passive": { - "type": "boolean", - "title": "ISIS Passive" - }, - "isis_metric": { - "type": "integer", - "title": "ISIS Metric" - }, - "isis_network_point_to_point": { - "type": "boolean", - "title": "ISIS Network Point To Point" - }, - "isis_circuit_type": { - "type": "string", - "enum": [ - "level-1-2", - "level-1", - "level-2" - ], - "title": "ISIS Circuit Type" - }, - "isis_hello_padding": { - "type": "boolean", - "title": "ISIS Hello Padding" - }, - "isis_authentication_mode": { - "type": "string", - "enum": [ - "text", - "md5" - ], - "title": "ISIS Authentication Mode" - }, - "isis_authentication_key": { - "type": "string", - "description": "Type-7 encrypted password", - "title": "ISIS Authentication Key" - }, - "poe": { - "type": "object", - "properties": { - "disabled": { - "type": "boolean", - "description": "Disable PoE on a POE capable port. PoE is enabled on all ports that support it by default in EOS.", - "default": false, - "title": "Disabled" - }, - "priority": { - "type": "string", - "enum": [ - "critical", - "high", - "medium", - "low" - ], - "description": "Prioritize a port's power in the event that one of the switch's power supplies loses power", - "title": "Priority" - }, - "reboot": { - "description": "Set the PoE power behavior for a PoE port when the system is rebooted", - "type": "object", - "properties": { - "action": { - "type": "string", - "enum": [ - "maintain", - "power-off" - ], - "description": "PoE action for interface", - "title": "Action" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Reboot" - }, - "link_down": { - "description": "Set the PoE power behavior for a PoE port when the port goes down", - "type": "object", - "properties": { - "action": { - "type": "string", - "enum": [ - "maintain", - "power-off" - ], - "description": "PoE action for interface", - "title": "Action" - }, - "power_off_delay": { - "type": "integer", - "minimum": 1, - "maximum": 86400, - "description": "Number of seconds to delay shutting the power off after a link down event occurs. Default value is 5 seconds in EOS.", - "title": "Power Off Delay" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Link Down" - }, - "shutdown": { - "description": "Set the PoE power behavior for a PoE port when the port is admin down", - "type": "object", - "properties": { - "action": { - "type": "string", - "enum": [ - "maintain", - "power-off" - ], - "description": "PoE action for interface", - "title": "Action" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Shutdown" - }, - "limit": { - "type": "object", - "description": "Override the hardware-negotiated power limit using either wattage or a power class. Note that if using a power class, AVD will automatically convert the class value to the wattage value corresponding to that power class.", - "properties": { - "class": { - "type": "integer", - "minimum": 0, - "maximum": 8, - "title": "Class" - }, - "watts": { - "type": "string", - "title": "Watts" - }, - "fixed": { - "type": "boolean", - "description": "Set to ignore hardware classification", - "title": "Fixed" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Limit" - }, - "negotiation_lldp": { - "type": "boolean", - "description": "Disable to prevent port from negotiating power with powered devices over LLDP. Enabled by default in EOS.", - "title": "Negotiation LLDP" - }, - "legacy_detect": { - "type": "boolean", - "description": "Allow a subset of legacy devices to work with the PoE switch. Disabled by default in EOS because it can cause false positive detections.", - "title": "Legacy Detect" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "PoE" - }, - "ptp": { - "type": "object", - "properties": { - "enable": { - "type": "boolean", - "title": "Enable" - }, - "announce": { - "type": "object", - "properties": { - "interval": { - "type": "integer", - "title": "Interval" - }, - "timeout": { - "type": "integer", - "title": "Timeout" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Announce" - }, - "delay_req": { - "type": "integer", - "title": "Delay Req" - }, - "delay_mechanism": { - "type": "string", - "enum": [ - "e2e", - "p2p" - ], - "title": "Delay Mechanism" - }, - "sync_message": { - "type": "object", - "properties": { - "interval": { - "type": "integer", - "title": "Interval" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Sync Message" - }, - "role": { - "type": "string", - "enum": [ - "master", - "dynamic" - ], - "title": "Role" - }, - "vlan": { - "type": "string", - "description": "VLAN can be 'all' or list of vlans as string", - "title": "VLAN" - }, - "transport": { - "type": "string", - "enum": [ - "ipv4", - "ipv6", - "layer2" - ], - "title": "Transport" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "PTP" - }, - "profile": { - "type": "string", - "description": "Interface profile", - "title": "Profile" - }, - "storm_control": { - "type": "object", - "properties": { - "all": { - "type": "object", - "properties": { - "level": { - "type": "string", - "description": "Configure maximum storm-control level", - "title": "Level" - }, - "unit": { - "type": "string", - "default": "percent", - "enum": [ - "percent", - "pps" - ], - "description": "Optional field and is hardware dependent", - "title": "Unit" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "All" - }, - "broadcast": { - "type": "object", - "properties": { - "level": { - "type": "string", - "description": "Configure maximum storm-control level", - "title": "Level" - }, - "unit": { - "type": "string", - "default": "percent", - "enum": [ - "percent", - "pps" - ], - "description": "Optional field and is hardware dependent", - "title": "Unit" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Broadcast" - }, - "multicast": { - "type": "object", - "properties": { - "level": { - "type": "string", - "description": "Configure maximum storm-control level", - "title": "Level" - }, - "unit": { - "type": "string", - "default": "percent", - "enum": [ - "percent", - "pps" - ], - "description": "Optional field and is hardware dependent", - "title": "Unit" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Multicast" - }, - "unknown_unicast": { - "type": "object", - "properties": { - "level": { - "type": "string", - "description": "Configure maximum storm-control level", - "title": "Level" - }, - "unit": { - "type": "string", - "default": "percent", - "enum": [ - "percent", - "pps" - ], - "description": "Optional field and is hardware dependent", - "title": "Unit" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Unknown Unicast" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Storm Control" - }, - "logging": { - "type": "object", - "properties": { - "event": { - "type": "object", - "properties": { - "link_status": { - "type": "boolean", - "title": "Link Status" - }, - "congestion_drops": { - "type": "boolean", - "title": "Congestion Drops" - }, - "spanning_tree": { - "type": "boolean", - "title": "Spanning Tree" - }, - "storm_control_discards": { - "type": "boolean", - "title": "Storm Control Discards" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Event" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Logging" - }, - "lldp": { - "type": "object", - "properties": { - "transmit": { - "type": "boolean", - "title": "Transmit" - }, - "receive": { - "type": "boolean", - "title": "Receive" - }, - "ztp_vlan": { - "type": "integer", - "description": "ZTP vlan number", - "title": "ZTP VLAN" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "LLDP" - }, - "trunk_private_vlan_secondary": { - "type": "boolean", - "title": "Trunk Private VLAN Secondary" - }, - "pvlan_mapping": { - "type": "string", - "description": "List of vlans as string", - "title": "PVLAN Mapping" - }, - "vlan_translations": { - "type": "array", - "items": { - "type": "object", - "properties": { - "from": { - "type": "string", - "description": "List of vlans as string (only one vlan if direction is \"both\")", - "title": "From" - }, - "to": { - "type": "integer", - "description": "VLAN ID", - "title": "To" - }, - "direction": { - "type": "string", - "enum": [ - "in", - "out", - "both" - ], - "default": "both", - "title": "Direction" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "VLAN Translations" - }, - "dot1x": { - "type": "object", - "properties": { - "port_control": { - "type": "string", - "enum": [ - "auto", - "force-authorized", - "force-unauthorized" - ], - "title": "Port Control" - }, - "port_control_force_authorized_phone": { - "type": "boolean", - "title": "Port Control Force Authorized Phone" - }, - "reauthentication": { - "type": "boolean", - "title": "Reauthentication" - }, - "pae": { - "type": "object", - "properties": { - "mode": { - "type": "string", - "enum": [ - "authenticator" - ], - "title": "Mode" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "PAE" - }, - "authentication_failure": { - "type": "object", - "properties": { - "action": { - "type": "string", - "enum": [ - "allow", - "drop" - ], - "title": "Action" - }, - "allow_vlan": { - "type": "integer", - "minimum": 1, - "maximum": 4094, - "title": "Allow VLAN" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Authentication Failure" - }, - "host_mode": { - "type": "object", - "properties": { - "mode": { - "type": "string", - "enum": [ - "multi-host", - "single-host" - ], - "title": "Mode" - }, - "multi_host_authenticated": { - "type": "boolean", - "title": "Multi Host Authenticated" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Host Mode" - }, - "mac_based_authentication": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "title": "Enabled" - }, - "always": { - "type": "boolean", - "title": "Always" - }, - "host_mode_common": { - "type": "boolean", - "title": "Host Mode Common" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "MAC Based Authentication" - }, - "timeout": { - "type": "object", - "properties": { - "idle_host": { - "type": "integer", - "minimum": 10, - "maximum": 65535, - "title": "Idle Host" - }, - "quiet_period": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "title": "Quiet Period" - }, - "reauth_period": { - "type": "string", - "description": "Value can be 60-4294967295 or 'server'", - "title": "Reauth Period" - }, - "reauth_timeout_ignore": { - "type": "boolean", - "title": "Reauth Timeout Ignore" - }, - "tx_period": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "title": "TX Period" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Timeout" - }, - "reauthorization_request_limit": { - "type": "integer", - "minimum": 1, - "maximum": 10, - "title": "Reauthorization Request Limit" - }, - "unauthorized": { - "type": "object", - "properties": { - "access_vlan_membership_egress": { - "type": "boolean", - "title": "Access VLAN Membership Egress" - }, - "native_vlan_membership_egress": { - "type": "boolean", - "title": "Native VLAN Membership Egress" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Unauthorized" - }, - "eapol": { - "type": "object", - "properties": { - "disabled": { - "type": "boolean", - "title": "Disabled" - }, - "authentication_failure_fallback_mba": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "title": "Enabled" - }, - "timeout": { - "type": "integer", - "minimum": 0, - "maximum": 65535, - "title": "Timeout" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Authentication Failure Fallback Mba" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Eapol" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "dot1x" - }, - "service_profile": { - "type": "string", - "description": "QOS profile", - "title": "Service Profile" - }, - "shape": { - "type": "object", - "properties": { - "rate": { - "type": "string", - "description": "Rate in kbps, pps or percent\nSupported options are platform dependent\nExamples:\n- \"5000 kbps\"\n- \"1000 pps\"\n- \"20 percent\"\n", - "title": "Rate" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Shape" - }, - "qos": { - "type": "object", - "properties": { - "trust": { - "type": "string", - "enum": [ - "dscp", - "cos", - "disabled" - ], - "title": "Trust" - }, - "dscp": { - "type": "integer", - "description": "DSCP value", - "title": "DSCP" - }, - "cos": { - "type": "integer", - "description": "COS value", - "title": "COS" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "QOS" - }, - "spanning_tree_bpdufilter": { - "type": "string", - "enum": [ - "enabled", - "disabled", - "True", - "False", - "true", - "false" - ], - "title": "Spanning Tree Bpdufilter" - }, - "spanning_tree_bpduguard": { - "type": "string", - "enum": [ - "enabled", - "disabled", - "True", - "False", - "true", - "false" - ], - "title": "Spanning Tree Bpduguard" - }, - "spanning_tree_guard": { - "type": "string", - "enum": [ - "loop", - "root", - "disabled" - ], - "title": "Spanning Tree Guard" - }, - "spanning_tree_portfast": { - "type": "string", - "enum": [ - "edge", - "network" - ], - "title": "Spanning Tree Portfast" - }, - "vmtracer": { - "type": "boolean", - "title": "VMTracer" - }, - "priority_flow_control": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "title": "Enabled" - }, - "priorities": { - "type": "array", - "items": { - "type": "object", - "properties": { - "priority": { - "type": "integer", - "minimum": 0, - "maximum": 7, - "title": "Priority" - }, - "no_drop": { - "type": "boolean", - "title": "No Drop" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "priority" - ] - }, - "title": "Priorities" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Priority Flow Control" - }, - "bfd": { - "type": "object", - "properties": { - "echo": { - "type": "boolean", - "title": "Echo" - }, - "interval": { - "type": "integer", - "description": "Interval in milliseconds", - "title": "Interval" - }, - "min_rx": { - "type": "integer", - "description": "Rate in milliseconds", - "title": "Min RX" - }, - "multiplier": { - "type": "integer", - "minimum": 3, - "maximum": 50, - "title": "Multiplier" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "BFD" - }, - "service_policy": { - "type": "object", - "properties": { - "pbr": { - "type": "object", - "properties": { - "input": { - "type": "string", - "description": "Policy Based Routing Policy-map name", - "title": "Input" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "PBR" - }, - "qos": { - "type": "object", - "properties": { - "input": { - "type": "string", - "description": "Quality of Service Policy-map name", - "title": "Input" - } - }, - "required": [ - "input" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "QOS" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Service Policy" - }, - "mpls": { - "type": "object", - "properties": { - "ip": { - "type": "boolean", - "title": "IP" - }, - "ldp": { - "type": "object", - "properties": { - "interface": { - "type": "boolean", - "title": "Interface" - }, - "igp_sync": { - "type": "boolean", - "title": "IGP Sync" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "LDP" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "MPLS" - }, - "lacp_timer": { - "type": "object", - "properties": { - "mode": { - "type": "string", - "enum": [ - "fast", - "normal" - ], - "title": "Mode" - }, - "multiplier": { - "type": "integer", - "minimum": 3, - "maximum": 3000, - "title": "Multiplier" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "LACP Timer" - }, - "lacp_port_priority": { - "type": "integer", - "minimum": 0, - "maximum": 65535, - "title": "LACP Port Priority" - }, - "transceiver": { - "type": "object", - "properties": { - "media": { - "type": "object", - "properties": { - "override": { - "type": "string", - "description": "Transceiver type", - "title": "Override" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Media" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Transceiver" - }, - "ip_proxy_arp": { - "type": "boolean", - "title": "IP Proxy ARP" - }, - "traffic_policy": { - "type": "object", - "properties": { - "input": { - "type": "string", - "description": "Ingress traffic policy", - "title": "Input" - }, - "output": { - "type": "string", - "description": "Egress traffic policy", - "title": "Output" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Traffic Policy" - }, - "bgp": { - "type": "object", - "properties": { - "session_tracker": { - "type": "string", - "description": "Name of session tracker", - "title": "Session Tracker" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "BGP" - }, - "peer": { - "type": "string", - "description": "Key only used for documentation or validation purposes", - "title": "Peer" - }, - "peer_interface": { - "type": "string", - "description": "Key only used for documentation or validation purposes", - "title": "Peer Interface" - }, - "peer_type": { - "type": "string", - "description": "Key only used for documentation or validation purposes", - "title": "Peer Type" - }, - "sflow": { - "type": "object", - "properties": { - "enable": { - "type": "boolean", - "title": "Enable" - }, - "egress": { - "type": "object", - "properties": { - "enable": { - "type": "boolean", - "title": "Enable" - }, - "unmodified_enable": { - "type": "boolean", - "title": "Unmodified Enable" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Egress" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Sflow" - }, - "port_profile": { - "type": "string", - "description": "Key only used for documentation or validation purposes", - "title": "Port Profile" - }, - "uc_tx_queues": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "description": "TX-Queue ID", - "title": "ID" - }, - "random_detect": { - "type": "object", - "properties": { - "ecn": { - "description": "Explicit Congestion Notification", - "type": "object", - "properties": { - "count": { - "type": "boolean", - "description": "Enable counter for random-detect ECNs", - "title": "Count" - }, - "threshold": { - "type": "object", - "properties": { - "units": { - "type": "string", - "enum": [ - "segments", - "bytes", - "kbytes", - "mbytes", - "milliseconds" - ], - "description": "Indicate the units to be used for the threshold values", - "title": "Units" - }, - "min": { - "type": "integer", - "minimum": 1, - "maximum": 256000000, - "description": "Set the random-detect ECN minimum-threshold", - "title": "Min" - }, - "max": { - "type": "integer", - "minimum": 1, - "maximum": 256000000, - "description": "Set the random-detect ECN maximum-threshold", - "title": "Max" - }, - "max_probability": { - "type": "integer", - "minimum": 1, - "maximum": 100, - "description": "Set the random-detect ECN max-mark-probability", - "title": "Max Probability" - }, - "weight": { - "type": "integer", - "minimum": 0, - "maximum": 15, - "description": "Set the random-detect ECN weight", - "title": "Weight" - } - }, - "required": [ - "units", - "min", - "max" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Threshold" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Ecn" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Random Detect" - } - }, - "required": [ - "id" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "Uc TX Queues" - }, - "tx_queues": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "description": "TX-Queue ID", - "title": "ID" - }, - "random_detect": { - "type": "object", - "properties": { - "ecn": { - "description": "Explicit Congestion Notification", - "type": "object", - "properties": { - "count": { - "type": "boolean", - "description": "Enable counter for random-detect ECNs", - "title": "Count" - }, - "threshold": { - "type": "object", - "properties": { - "units": { - "type": "string", - "enum": [ - "segments", - "bytes", - "kbytes", - "mbytes", - "milliseconds" - ], - "description": "Indicate the units to be used for the threshold values", - "title": "Units" - }, - "min": { - "type": "integer", - "minimum": 1, - "maximum": 256000000, - "description": "Set the random-detect ECN minimum-threshold", - "title": "Min" - }, - "max": { - "type": "integer", - "minimum": 1, - "maximum": 256000000, - "description": "Set the random-detect ECN maximum-threshold", - "title": "Max" - }, - "max_probability": { - "type": "integer", - "minimum": 1, - "maximum": 100, - "description": "Set the random-detect ECN max-mark-probability", - "title": "Max Probability" - }, - "weight": { - "type": "integer", - "minimum": 0, - "maximum": 15, - "description": "Set the random-detect ECN weight", - "title": "Weight" - } - }, - "required": [ - "units", - "max", - "max_probability" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Threshold" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Ecn" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Random Detect" - } - }, - "required": [ - "id" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "TX Queues" - }, - "vrrp_ids": { - "type": "array", - "description": "VRRP model.", - "items": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "description": "VRID", - "title": "ID" - }, - "priority_level": { - "type": "integer", - "description": "Instance priority", - "minimum": 1, - "maximum": 254, - "title": "Priority Level" - }, - "advertisement": { - "type": "object", - "properties": { - "interval": { - "type": "integer", - "description": "Interval in seconds", - "minimum": 1, - "maximum": 255, - "title": "Interval" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Advertisement" - }, - "preempt": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "title": "Enabled" - }, - "delay": { - "type": "object", - "properties": { - "minimum": { - "type": "integer", - "description": "Minimum preempt delay in seconds", - "minimum": 0, - "maximum": 3600, - "title": "Minimum" - }, - "reload": { - "type": "integer", - "description": "Reload preempt delay in seconds", - "minimum": 0, - "maximum": 3600, - "title": "Reload" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Delay" - } - }, - "required": [ - "enabled" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Preempt" - }, - "timers": { - "type": "object", - "properties": { - "delay": { - "type": "object", - "properties": { - "reload": { - "type": "integer", - "description": "Delay after reload in seconds.", - "minimum": 0, - "maximum": 3600, - "title": "Reload" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Delay" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Timers" - }, - "tracked_object": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Tracked object name", - "title": "Name" - }, - "decrement": { - "type": "integer", - "minimum": 1, - "maximum": 254, - "description": "Decrement VRRP priority by 1-254", - "title": "Decrement" - }, - "shutdown": { - "type": "boolean", - "title": "Shutdown" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "name" - ] - }, - "title": "Tracked Object" - }, - "ipv4": { - "type": "object", - "properties": { - "address": { - "type": "string", - "description": "Virtual IPv4 address", - "title": "Address" - }, - "version": { - "type": "integer", - "enum": [ - 2, - 3 - ], - "title": "Version" - } - }, - "required": [ - "address" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "IPv4" - }, - "ipv6": { - "type": "object", - "properties": { - "address": { - "type": "string", - "description": "Virtual IPv6 address", - "title": "Address" - } - }, - "required": [ - "address" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "IPv6" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "id" - ] - }, - "title": "VRRP IDs" - }, - "eos_cli": { - "type": "string", - "description": "Multiline EOS CLI rendered directly on the ethernet interface in the final EOS configuration", - "title": "EOS CLI" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Structured Config" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "L3 Interfaces" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Core Interfaces" - }, - "custom_structured_configuration_list_merge": { - "type": "string", - "description": "The List-merge strategy used when merging custom structured configurations.\n\nThis applies to all vars prefixed by prefixes in `custom_structured_configuration_prefix`\nand all data under the various `structured_config` options.\n\nThe available list merge strategies:\n- `replace`:\n - Any list will be replaced with the list defined in custom structured configurations.\n- `append`:\n - Existing list items with the same \"Primary key\"-value will be updated.\n - New items will be appended to the existing list (including duplicates).\n- `keep`:\n - Only set list if there is no existing list or existing list is `None`.\n- `prepend`:\n - Existing list items with the same \"Primary key\"-value will be updated.\n - New items will be prepended to the existing list (including duplicates).\n- `append_rp`:\n - Existing list items with the same \"Primary key\"-value will be updated.\n - New unique items will be appended to the existing list.\n- `prepend_rp`:\n - Existing list items with the same \"Primary key\"-value will be updated.\n - New unique items will be prepended to the existing list.\n", - "enum": [ - "replace", - "append", - "keep", - "prepend", - "append_rp", - "prepend_rp" - ], - "default": "append_rp", - "title": "Custom Structured Configuration List Merge" - }, - "custom_structured_configuration_prefix": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Custom EOS Structured Configuration keys can be set on any group or host_var level using the name\nof the corresponding `eos_cli_config_gen` key prefixed with content of `custom_structured_configuration_prefix`.\n\nThe content of Custom Structured Configuration variables will be merged with the structured config generated by the eos_designs role.\n\nThe merge is done recursively, so it is possible to update a sub-key of a variable set by `eos_designs` role already.\n\nThe merge follow these recursive merge strategies:\n- New keys will be added for all types.\n- Existing keys of type \"List\" with a \"Primary key\" set in the schema:\n - Strategy can be changed with `custom_structured_configuration_list_merge`. Default strategy:\n - Existing list items with the same \"Primary key\"-value will be updated.\n - New unique items will be appended to the existing list\n- Other keys of type \"List\" will have new unique items appended the the existing list.\n- Existing keys of type \"Dictionary\" will recursively merge\n- Other existing keys will be replaced.\n", - "default": [ - "custom_structured_configuration_" - ], - "title": "Custom Structured Configuration Prefix" - }, - "cv_pathfinder_regions": { - "description": "PREVIEW: This key is currently not supported\nDefine the SDWAN hierarchy for the device.", - "type": "array", - "items": { - "type": "object", - "properties": { - "description": { - "type": "string", - "title": "Description" - }, - "id": { - "type": "integer", - "description": "The region ID must be unique for the whole WAN deployment.", - "minimum": 1, - "maximum": 255, - "title": "ID" - }, - "sites": { - "type": "array", - "description": "All sites are placed in a default zone called DEFAULT-ZONE with ID 1.", - "items": { - "type": "object", - "properties": { - "description": { - "type": "string", - "title": "Description" - }, - "id": { - "type": "integer", - "description": "The site ID must be unique within a zone.\nGiven that all the sites are placed in the DEFAULT-ZONE, the site ID must be unique within a region.", - "minimum": 1, - "maximum": 10000, - "title": "ID" - }, - "location": { - "type": "string", - "description": "Will be interpreted", - "title": "Location" - }, - "site_contact": { - "type": "string", - "title": "Site Contact" - }, - "site_after_hours_contact": { - "type": "string", - "title": "Site After Hours Contact" - }, - "name": { - "type": "string", - "title": "Name" - } - }, - "required": [ - "id", - "name" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "description": "Site name and ID." - }, - "title": "Sites" - }, - "name": { - "type": "string", - "title": "Name" - } - }, - "required": [ - "id", - "name" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "description": "Region name and ID." - }, - "title": "Cv Pathfinder Regions" - }, - "cv_topology": { - "type": "array", - "description": "Generate AVD configurations directly from the given CloudVision topology.\nActivate this feature by setting `use_cv_topology` to `true`.\nRequires `default_interfaces` to be set for the relevant platforms and node types to detect the proper interface roles automatically.\nNeighbor hostnames must match the inventory hostnames of the AVD inventory to be taken into consideration.", - "items": { - "type": "object", - "properties": { - "hostname": { - "type": "string", - "title": "Hostname" - }, - "platform": { - "type": "string", - "title": "Platform" - }, - "interfaces": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "neighbor": { - "type": "string", - "title": "Neighbor" - }, - "neighbor_interface": { - "type": "string", - "title": "Neighbor Interface" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "name" - ] - }, - "title": "Interfaces" - } - }, - "required": [ - "platform", - "interfaces", - "hostname" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "Cv Topology" - }, - "cvp_ingestauth_key": { - "type": "string", - "description": "On-premise CVP ingest auth key. If set, TerminAttr will be configured with key-based authentication for on-premise CVP.\nIf not set, TerminAttr will be configured with certificate based authentication:\n- On-premise using token onboarding. Default token path is '/tmp/token'.\n- CVaaS using token-secure onboarding. Default token path is '/tmp/cv-onboarding-token'.\nToken must be copied to the device first.", - "title": "CVP Ingestauth Key" - }, - "cvp_instance_ip": { - "type": "string", - "description": "IPv4 address or DNS name for CloudVision.\nThis variable only supports an on-premise single-node cluster or the DNS name of a CloudVision as a Service instance.\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use cvp_instance_ips instead.", - "deprecated": true, - "title": "CVP Instance IP" - }, - "cvp_instance_ips": { - "type": "array", - "description": "List of IPv4 addresses or DNS names for CloudVision.\nFor on-premise CloudVision enter all the nodes of the cluster.\nFor CloudVision as a Service enter the DNS name of the instance.\n`eos_designs` only supports one CloudVision cluster.\n", - "items": { - "type": "string", - "description": "IPv4 address or DNS name for CloudVision" - }, - "title": "CVP Instance Ips" - }, - "cvp_token_file": { - "type": "string", - "description": "cvp_token_file is the path to the token file on the switch.\nIf not set the default locations for on-premise or CVaaS will be used.\nSee cvp_ingestauth_key for details.", - "title": "CVP Token File" - }, - "dc_name": { - "description": "POD Name is used in:\n- Fabric Documentation (Optional, falls back to fabric_name)\n- SNMP Location: `snmp_settings.location` (Optional)\n- HER Overlay DC scoped flood lists: `overlay_her_flood_list_scope: dc` (Required)\n", - "type": "string", - "title": "DC Name" - }, - "default_igmp_snooping_enabled": { - "description": "When set to false, disables IGMP snooping at fabric level and overrides per vlan settings.\n", - "type": "boolean", - "default": true, - "title": "Default IGMP Snooping Enabled" - }, - "default_interfaces": { - "type": "array", - "description": "Default uplink, downlink, and MLAG interfaces, which will be used if these interfaces are not defined on a device (either directly or through inheritance).\n", - "items": { - "type": "object", - "properties": { - "types": { - "type": "array", - "description": "List of node type keys.", - "items": { - "type": "string" - }, - "title": "Types" - }, - "platforms": { - "type": "array", - "description": "List of platform families.\nThis is defined as a Python regular expression that matches the full platform type.\n", - "items": { - "type": "string", - "description": "Arista platform family regular expression." - }, - "title": "Platforms" - }, - "uplink_interfaces": { - "type": "array", - "description": "List of uplink interfaces or uplink interface ranges.", - "items": { - "type": "string", - "description": "Interface range or interface." - }, - "title": "Uplink Interfaces" - }, - "mlag_interfaces": { - "type": "array", - "description": "List of MLAG interfaces or MLAG interface ranges.", - "items": { - "type": "string", - "description": "Interface range or interface." - }, - "title": "MLAG Interfaces" - }, - "downlink_interfaces": { - "type": "array", - "description": "List of downlink interfaces or downlink interface ranges.", - "items": { - "type": "string", - "description": "Interface range or interface." - }, - "title": "Downlink Interfaces" - } - }, - "required": [ - "types", - "platforms" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "Default Interfaces" - }, - "default_mgmt_method": { - "type": "string", - "description": "`default_mgmt_method` controls the default VRF and source interface used for the following management and monitoring protocols configured with `eos_designs`:\n - `cv_settings`\n - `dns_settings`\n - `ntp_settings`\n - `sflow_settings`\n\n`oob` means the protocols will be configured with the VRF set by `mgmt_interface_vrf` and `mgmt_interface` as the source interface.\n`inband` means the protocols will be configured with the VRF set by `inband_mgmt_vrf` and `inband_mgmt_interface` as the source interface.\n`none` means the VRF and or interface must be manually set for each protocol.\nThis can be overridden under the settings for each protocol.\n", - "enum": [ - "oob", - "inband", - "none" - ], - "default": "oob", - "title": "Default Management Method" - }, - "default_node_types": { - "type": "array", - "description": "Uses hostname matches against a regular expression to determine the node type.", - "items": { - "type": "object", - "properties": { - "node_type": { - "type": "string", - "description": "Resulting node type when regex matches.", - "title": "Node Type" - }, - "match_hostnames": { - "type": "array", - "description": "Regular expressions to match against hostnames.", - "items": { - "type": "string", - "description": "Regex needs to match full hostname (i.e. is bounded by ^ and $ elements)." - }, - "title": "Match Hostnames" - } - }, - "required": [ - "match_hostnames", - "node_type" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "Default Node Types" - }, - "design": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "By setting the design.type variable, the default node-types and templates described in these documents will be used.\n", - "enum": [ - "l3ls-evpn", - "mpls", - "l2ls" - ], - "default": "l3ls-evpn", - "title": "Type" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Design" - }, - "enable_trunk_groups": { - "type": "boolean", - "description": "Enable Trunk Group support across eos_designs.\nWarning: Because of the nature of the EOS Trunk Group feature, enabling this is \"all or nothing\".\n*All* vlans and *all* trunks towards connected endpoints must be using trunk groups as well.\nIf trunk groups are not assigned to a trunk, no vlans will be enabled on that trunk.\nSee \"Details on enable_trunk_groups\" below before enabling this feature.\n", - "default": false, - "title": "Enable Trunk Groups" - }, - "eos_designs_custom_templates": { - "type": "array", - "items": { - "type": "object", - "properties": { - "template": { - "type": "string", - "description": "Template file.", - "title": "Template" - }, - "options": { - "description": "Template options.", - "type": "object", - "properties": { - "list_merge": { - "type": "string", - "description": "Merge strategy for lists.", - "default": "append_rp", - "title": "List Merge" - }, - "strip_empty_keys": { - "type": "boolean", - "description": "Filter out keys from the generated output if value is null/none/undefined.", - "default": true, - "title": "Strip Empty Keys" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Options" - } - }, - "required": [ - "template" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "EOS Designs Custom Templates" - }, - "eos_designs_documentation": { - "description": "Control fabric documentation generation.\n", - "type": "object", - "properties": { - "connected_endpoints": { - "description": "Generate fabric-wide documentation for connected endpoints.\n", - "type": "boolean", - "default": false, - "title": "Connected Endpoints" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "EOS Designs Documentation" - }, - "event_handlers": { - "type": "array", - "description": "Gives the ability to monitor and react to Syslog messages.\nEvent Handlers provide a powerful and flexible tool that can be used to apply self-healing actions,\ncustomize the system behavior, and implement workarounds to problems discovered in the field.\n", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Event Handler Name", - "title": "Name" - }, - "action_type": { - "type": "string", - "enum": [ - "bash", - "increment", - "log" - ], - "title": "Action Type" - }, - "action": { - "type": "string", - "description": "Command to execute\n", - "title": "Action" - }, - "delay": { - "type": "integer", - "description": "Event-handler delay in seconds\n", - "title": "Delay" - }, - "trigger": { - "type": "string", - "description": "Configure event trigger condition.\n", - "enum": [ - "on-boot", - "on-logging", - "on-startup-config" - ], - "title": "Trigger" - }, - "regex": { - "type": "string", - "description": "Regular expression to use for searching log messages. Required for on-logging trigger\n", - "title": "Regex" - }, - "asynchronous": { - "type": "boolean", - "default": false, - "description": "Set the action to be non-blocking.", - "title": "Asynchronous" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "name" - ] - }, - "title": "Event Handlers" - }, - "evpn_ebgp_gateway_inter_domain": { - "type": "boolean", - "title": "EVPN Ebgp Gateway Inter Domain" - }, - "evpn_ebgp_gateway_multihop": { - "description": "Default of 15, considering a large value to avoid BGP reachability issues in very complex DCI networks.\nAdapt the value for your specific topology.\n", - "type": "integer", - "default": 15, - "title": "EVPN Ebgp Gateway Multihop" - }, - "evpn_ebgp_multihop": { - "description": "Default of 3, the recommended value for a 3 stage spine and leaf topology.\nSet to a higher value to allow for very large and complex topologies.\n", - "type": "integer", - "default": 3, - "title": "EVPN Ebgp Multihop" - }, - "evpn_hostflap_detection": { - "type": "object", - "properties": { - "enabled": { - "description": "If set to false it will disable EVPN host-flap detection.", - "type": "boolean", - "default": true, - "title": "Enabled" - }, - "threshold": { - "description": "Minimum number of MAC moves that indicate a MAC duplication issue.", - "type": "integer", - "default": 5, - "title": "Threshold" - }, - "window": { - "description": "Time (in seconds) to detect a MAC duplication issue.", - "type": "integer", - "default": 180, - "title": "Window" - }, - "expiry_timeout": { - "description": "Time (in seconds) to purge a MAC duplication issue.", - "type": "integer", - "title": "Expiry Timeout" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "EVPN Hostflap Detection" - }, - "evpn_import_pruning": { - "description": "Enable VPN import pruning (Min. EOS 4.24.2F).\nThe Route Target extended communities carried by incoming VPN paths will be examined.\nIf none of those Route Targets have been configured for import, the path will be immediately discarded.\n", - "type": "boolean", - "default": false, - "title": "EVPN Import Pruning" - }, - "evpn_multicast": { - "type": "boolean", - "description": "General Configuration required for EVPN Multicast. \"evpn_l2_multicast\" or \"evpn_l3_multicast\" must also be configured under the Network Services (tenants).\nRequires \"underlay_multicast: true\" and IGMP snooping enabled globally (default).\nFor MLAG devices Route Distinguisher must be unique since this feature will create multi-vtep configuration.\nWarning !!! For Trident3 based platforms i.e 7050X3, 7300X3, 720XP and 722XP\n The Following default platform setting will be configured: \"platform trident forwarding-table partition flexible exact-match 16384 l2-shared 98304 l3-shared 131072\"\n All forwarding agents will be restarted when this configuration is applied.\n You can tune the settings by overriding the default variable: \"platform_settings[platforms].trident_forwarding_table_partition:\"\n Please contact an Arista representative for help with determining the appropriate values for your environment.\n", - "default": false, - "title": "EVPN Multicast" - }, - "evpn_overlay_bgp_rtc": { - "description": "Enable Route Target Membership Constraint Address Family on EVPN overlay BGP peerings (Min. EOS 4.25.1F).\nRequires use eBGP as overlay protocol.\n", - "type": "boolean", - "default": false, - "title": "EVPN Overlay BGP Rtc" - }, - "evpn_prevent_readvertise_to_server": { - "description": "Configure route-map on eBGP sessions towards route-servers, where prefixes with the peer's ASN in the AS Path are filtered away.\nThis is very useful in large-scale networks, where convergence will be quicker by not returning all updates received\nfrom Route-server-1 to Router-server-2 just for Route-server-2 to throw them away because of AS Path loop detection.\n", - "type": "boolean", - "default": false, - "title": "EVPN Prevent Readvertise To Server" - }, - "evpn_short_esi_prefix": { - "description": "Configure prefix for \"short_esi\" values.", - "type": "string", - "default": "0000:0000:", - "title": "EVPN Short Esi Prefix" - }, - "evpn_vlan_aware_bundles": { - "description": "Enable vlan aware bundles for EVPN MAC-VRF.", - "type": "boolean", - "default": false, - "title": "EVPN VLAN Aware Bundles" - }, - "evpn_vlan_bundles": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Specify an EVPN vlan-aware-bundle name.\nEVPN vlan-aware-bundles group L2 VLANs and define common settings.\n", - "title": "Name" - }, - "id": { - "type": "integer", - "description": "\"id\" may be used for vlan-aware-bundle RD/RT ID so it should not overlap with l2vlan IDs which are not part of this bundle.\nSee \"overlay_rd_type\" and \"overlay_rt_type\" for details.\n", - "title": "ID" - }, - "rt_override": { - "type": "string", - "description": "By default the MAC VRF bundle RT will be derived from mac_vrf_id_base + bundle_id.\nThe rt_override allows us to override this value and statically define it.\nrt_override will default to vni_override if set.\n\nrt_override supports two formats:\n - A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details).\n - A full RT string with colon seperator which will override the full RT.\n", - "title": "Rt Override" - }, - "rd_override": { - "type": "string", - "description": "By default the MAC VRF bundle RD will be derived from mac_vrf_id_base + bundle_id.\nThe rt_override allows us to override this value and statically define it.\nrd_override will default to rt_override or vni_override if set.\n\nrd_override supports two formats:\n - A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details).\n - A full RD string with colon seperator which will override the full RD.\n", - "title": "Rd Override" - }, - "evpn_l2_multi_domain": { - "type": "boolean", - "description": "Explicitly extend VLAN-Aware Bundle to remote EVPN domains.\nOverrides `.[].evpn_l2_multi_domain`.\n", - "title": "EVPN L2 Multi Domain" - }, - "bgp": { - "type": "object", - "properties": { - "raw_eos_cli": { - "type": "string", - "description": "EOS cli commands rendered on router_bgp.vlans-aware-bundle.", - "title": "Raw EOS CLI" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "BGP" - } - }, - "required": [ - "id", - "name" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "EVPN VLAN Bundles" - }, - "fabric_evpn_encapsulation": { - "description": "Should be set to mpls for evpn-mpls scenario.", - "enum": [ - "vxlan", - "mpls" - ], - "default": "vxlan", - "type": "string", - "title": "Fabric EVPN Encapsulation" - }, - "fabric_ip_addressing": { - "type": "object", - "properties": { - "mlag": { - "type": "object", - "properties": { - "algorithm": { - "type": "string", - "default": "first_id", - "description": "This variable defines the Multi-chassis Link Aggregation (MLAG) algorithm used.\nEach MLAG link will have a /31* subnet with each subnet allocated from the relevant MLAG pool via a calculated offset.\nThe offset is calculated using one of the following algorithms:\n - first_id: `(mlag_primary_id - 1) * 2` where `mlag_primary_id` is the ID of the first node defined under the node_group.\n This allocation method will skip every other /31* subnet making it less space efficient than `odd_id`.\n - odd_id: `(odd_id - 1) / 2`. Requires the node_group to have a node with an odd ID and a node with an even ID.\n - same_subnet: the offset will always be zero.\n This allocation method will cause every MLAG link to be addressed with the same /31* subnet.\n\\* - The prefix length is configurable with a default of /31.", - "enum": [ - "first_id", - "odd_id", - "same_subnet" - ], - "title": "Algorithm" - }, - "ipv4_prefix_length": { - "type": "integer", - "default": 31, - "minimum": 1, - "maximum": 31, - "description": "IPv4 prefix length used for MLAG peer-vlan and L3 point-to-point SVIs over the MLAG peer-link.", - "title": "IPv4 Prefix Length" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "MLAG" - }, - "p2p_uplinks": { - "type": "object", - "properties": { - "ipv4_prefix_length": { - "type": "integer", - "default": 31, - "minimum": 1, - "maximum": 31, - "description": "IPv4 prefix length used for L3 point-to-point uplinks.", - "title": "IPv4 Prefix Length" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "P2P Uplinks" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Fabric IP Addressing" - }, - "fabric_name": { - "description": "Fabric Name, required to match Ansible Group name covering all devices in the Fabric, **must** be an inventory group name.", - "type": "string", - "title": "Fabric Name" - }, - "hardware_counters": { - "type": "object", - "properties": { - "features": { - "type": "array", - "description": "This data model allows to configure the list of hardware counters feature\navailable on Arista platforms.\n\nThe `name` key accepts a list of valid_values which MUST be updated to support\nnew feature as they are released in EOS.\n\nThe available values of the different keys like 'direction' or 'address_type'\nare feature and hardware dependent and this model DOES NOT validate that the\ncombinations are valid. It is the responsability of the user of this data model\nto make sure that the rendered CLI is accepted by the targeted device.\n\nExamples:\n\n * Use:\n ```yaml\n hardware_counters:\n features:\n - name: ip\n direction: out\n layer3: true\n units_packets: true\n ```\n\n to render:\n ```eos\n hardware counter feature ip out layer3 units packets\n ```\n * Use:\n ```yaml\n hardware_counters:\n features:\n - name: route\n address_type: ipv4\n vrf: test\n prefix: 192.168.0.0/24\n ```\n\n to render:\n ```eos\n hardware counter feature route ipv4 vrf test 192.168.0.0/24\n ```\n", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "enum": [ - "acl", - "decap-group", - "directflow", - "ecn", - "flow-spec", - "gre tunnel interface", - "ip", - "mpls interface", - "mpls lfib", - "mpls tunnel", - "multicast", - "nexthop", - "pbr", - "pdp", - "policing interface", - "qos", - "qos dual-rate-policer", - "route", - "routed-port", - "subinterface", - "tapagg", - "traffic-class", - "traffic-policy", - "vlan", - "vlan-interface", - "vni decap", - "vni encap", - "vtep decap", - "vtep encap" - ], - "title": "Name" - }, - "direction": { - "type": "string", - "enum": [ - "in", - "out", - "cpu" - ], - "description": "Most features support only 'in' and 'out'. Some like traffic-policy support 'cpu'.\nSome features DO NOT have any direction.\nThis validation IS NOT made by the schemas.\n", - "title": "Direction" - }, - "address_type": { - "type": "string", - "enum": [ - "ipv4", - "ipv6", - "mac" - ], - "description": "Supported only for the following features:\n- acl: [ipv4, ipv6, mac] if direction is 'out'\n- multicast: [ipv4, ipv6]\n- route: [ipv4, ipv6]\nThis validation IS NOT made by the schemas.\n", - "title": "Address Type" - }, - "layer3": { - "type": "boolean", - "description": "Supported only for the 'ip' feature\n", - "title": "Layer3" - }, - "vrf": { - "type": "string", - "description": "Supported only for the 'route' feature.\nThis validation IS NOT made by the schemas.\n", - "title": "VRF" - }, - "prefix": { - "type": "string", - "description": "Supported only for the 'route' feature.\nMandatory for the 'route' feature.\nThis validation IS NOT made by the schemas.\n", - "title": "Prefix" - }, - "units_packets": { - "type": "boolean", - "title": "Units Packets" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "Features" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Hardware Counters" - }, - "internal_vlan_order": { - "type": "object", - "description": "Internal vlan allocation order and range.", - "properties": { - "allocation": { - "type": "string", - "enum": [ - "ascending", - "descending" - ], - "title": "Allocation" - }, - "range": { - "type": "object", - "properties": { - "beginning": { - "type": "integer", - "description": "First VLAN ID.", - "minimum": 2, - "maximum": 4094, - "title": "Beginning" - }, - "ending": { - "type": "integer", - "description": "Last VLAN ID.", - "minimum": 2, - "maximum": 4094, - "title": "Ending" - } - }, - "required": [ - "beginning", - "ending" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Range" - } - }, - "required": [ - "allocation" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "default": { - "allocation": "ascending", - "range": { - "beginning": 1006, - "ending": 1199 - } - }, - "title": "Internal VLAN Order" - }, - "ipv6_mgmt_destination_networks": { - "description": "List of IPv6 prefixes to configure as static routes towards the OOB IPv6 Management interface gateway.\nReplaces the default route.\n", - "type": "array", - "items": { - "type": "string", - "description": "IPv6_network/Mask." - }, - "title": "IPv6 Management Destination Networks" - }, - "ipv6_mgmt_gateway": { - "type": "string", - "format": "ipv6", - "description": "OOB Management interface gateway in IPv6 format.\nUsed as next-hop for default gateway or static routes defined under 'ipv6_mgmt_destination_networks'.", - "title": "IPv6 Management Gateway" - }, - "is_deployed": { - "description": "If the device is already deployed in the fabric.\nWhen set to false, interfaces toward this device may be shutdown depending on the `shutdown_interfaces_towards_undeployed_peers` setting.\nFurthermore `eos_config_deploy_cvp` will not attempt to move or apply configurations to the device.\n", - "type": "boolean", - "default": true, - "title": "Is Deployed" - }, - "isis_advertise_passive_only": { - "type": "boolean", - "default": false, - "title": "ISIS Advertise Passive Only" - }, - "isis_area_id": { - "type": "string", - "default": "49.0001", - "title": "ISIS Area ID" - }, - "isis_default_circuit_type": { - "type": "string", - "enum": [ - "level-1-2", - "level-1", - "level-2" - ], - "default": "level-2", - "description": "These fabric level parameters can be used with core_interfaces running ISIS, and may be overridden on link profile or link level.", - "title": "ISIS Default Circuit Type" - }, - "isis_default_is_type": { - "title": "ISIS Default IS Type", - "type": "string", - "enum": [ - "level-1-2", - "level-1", - "level-2" - ], - "default": "level-2" - }, - "isis_default_metric": { - "type": "integer", - "default": 50, - "description": "These fabric level parameters can be used with core_interfaces running ISIS, and may be overridden at link profile or link level.", - "title": "ISIS Default Metric" - }, - "isis_maximum_paths": { - "description": "Number of path to configure in ECMP for ISIS.", - "type": "integer", - "title": "ISIS Maximum Paths" - }, - "isis_ti_lfa": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "default": false, - "title": "Enabled" - }, - "protection": { - "type": "string", - "enum": [ - "link", - "node" - ], - "title": "Protection" - }, - "local_convergence_delay": { - "description": "Local convergence delay in milliseconds.", - "type": "integer", - "default": 10000, - "title": "Local Convergence Delay" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "ISIS TI LFA" - }, - "l3_edge": { - "type": "object", - "properties": { - "p2p_links_ip_pools": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "P2P pool name.", - "title": "Name" - }, - "ipv4_pool": { - "type": "string", - "description": "IPv4 address/Mask.", - "title": "IPv4 Pool" - }, - "prefix_size": { - "type": "integer", - "description": "Subnet mask size.", - "default": 31, - "minimum": 8, - "maximum": 31, - "title": "Prefix Size" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "name" - ] - }, - "title": "P2P Links IP Pools" - }, - "p2p_links_profiles": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "P2P profile name. Any variable supported under `p2p_links` can be inherited from a profile.", - "title": "Name" - }, - "id": { - "type": "integer", - "description": "Unique id per subnet_summary. Used to calculate ip addresses.\nRequired with ip_pool. ID starting from 1.\n", - "title": "ID" - }, - "speed": { - "type": "string", - "description": "Speed should be set in the format `` or `forced ` or `auto `.", - "title": "Speed" - }, - "ip_pool": { - "type": "string", - "description": "P2P pool name. IP Pool defined under p2p_links_ip_pools. A /31 will be taken from the pool per P2P link.", - "title": "IP Pool" - }, - "subnet": { - "type": "string", - "description": "IPv4 address/Mask. Subnet used on this P2P link.", - "title": "Subnet" - }, - "ip": { - "type": "array", - "description": "Specific IP addresses used on this P2P link.", - "items": { - "type": "string", - "description": "Node IPv4 address/Mask." - }, - "title": "IP" - }, - "ipv6_enable": { - "type": "boolean", - "default": false, - "description": "Allows turning on ipv6 for the link or profile (also autodetected based on underlay_rfc5549 and include_in_underlay_protocol).", - "title": "IPv6 Enable" - }, - "nodes": { - "type": "array", - "description": "Nodes where this link should be configured.", - "items": { - "type": "string", - "description": "The values can be < node_a >, < node_b >.\nex.- [ core-1-isis-sr-ldp, core-2-ospf-ldp ].\n" - }, - "title": "Nodes" - }, - "interfaces": { - "type": "array", - "description": "Interfaces where this link should be configured and Required unless using port-channels.", - "items": { - "type": "string", - "description": "The value can be like < node_a_interface >, < node_b_interface >.\nex. - [ Ethernet2, Ethernet2 ].\n" - }, - "title": "Interfaces" - }, - "as": { - "type": "array", - "description": "AS numbers for BGP.\nRequired with bgp peering.\n", - "items": { - "type": "string", - "description": "The values can be like [\"node_a_as\", \"node_b_as\"]." - }, - "title": "As" - }, - "descriptions": { - "type": "array", - "description": "Interface description.", - "items": { - "type": "string" - }, - "title": "Descriptions" - }, - "include_in_underlay_protocol": { - "type": "boolean", - "default": true, - "description": "Add this interface to underlay routing protocol.", - "title": "Include In Underlay Protocol" - }, - "isis_hello_padding": { - "type": "boolean", - "default": false, - "title": "ISIS Hello Padding" - }, - "isis_metric": { - "type": "integer", - "title": "ISIS Metric" - }, - "isis_circuit_type": { - "type": "string", - "enum": [ - "level-1", - "level-2", - "level-1-2" - ], - "title": "ISIS Circuit Type" - }, - "isis_authentication_mode": { - "type": "string", - "enum": [ - "md5", - "text" - ], - "title": "ISIS Authentication Mode" - }, - "isis_authentication_key": { - "type": "string", - "description": "Type-7 encrypted password.", - "title": "ISIS Authentication Key" - }, - "mpls_ip": { - "type": "boolean", - "description": "MPLS parameters. Default value is true if switch.mpls_lsr is true.", - "title": "MPLS IP" - }, - "mpls_ldp": { - "type": "boolean", - "description": "MPLS parameters. Default value is true for ldp underlay variants, otherwise false.", - "title": "MPLS LDP" - }, - "mtu": { - "type": "integer", - "description": "MTU for this P2P link. Default value same as p2p_uplinks_mtu.", - "title": "MTU" - }, - "bfd": { - "type": "boolean", - "default": false, - "description": "Enable BFD (only considered for BGP).", - "title": "BFD" - }, - "ptp": { - "description": "PTP parameters.", - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "default": false, - "description": "Enable PTP.", - "title": "Enabled" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "PTP" - }, - "sflow": { - "type": "boolean", - "description": "Enable sFlow. Overrides `fabric_sflow` setting.", - "title": "Sflow" - }, - "qos_profile": { - "type": "string", - "description": "QOS service profile.", - "title": "QOS Profile" - }, - "macsec_profile": { - "type": "string", - "description": "MAC security profile.", - "title": "Macsec Profile" - }, - "port_channel": { - "description": "Port-channel parameters.", - "type": "object", - "properties": { - "mode": { - "type": "string", - "default": "active", - "title": "Mode" - }, - "nodes_child_interfaces": { - "type": "array", - "items": { - "type": "object", - "properties": { - "node": { - "type": "string", - "title": "Node" - }, - "interfaces": { - "type": "array", - "description": "List of node interfaces. Ex.- [ 'node1 interface1', 'node1 interface2' ].", - "items": { - "type": "string" - }, - "title": "Interfaces" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "node" - ] - }, - "title": "Nodes Child Interfaces" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Port Channel" - }, - "raw_eos_cli": { - "type": "string", - "description": "EOS CLI rendered directly on the point-to-point interface in the final EOS configuration.", - "title": "Raw EOS CLI" - }, - "structured_config": { - "type": "object", - "description": "Custom structured config for interfaces\nNote! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces.", - "title": "Structured Config" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "name" - ] - }, - "title": "P2P Links Profiles" - }, - "p2p_links": { - "type": "array", - "items": { - "type": "object", - "properties": { - "nodes": { - "type": "array", - "description": "Nodes where this link should be configured.", - "items": { - "type": "string", - "description": "The values can be < node_a >, < node_b >.\nex.- [ core-1-isis-sr-ldp, core-2-ospf-ldp ].\n" - }, - "title": "Nodes" - }, - "profile": { - "type": "string", - "description": "P2P profile name. Profile defined under p2p_profiles.", - "title": "Profile" - }, - "id": { - "type": "integer", - "description": "Unique id per subnet_summary. Used to calculate ip addresses.\nRequired with ip_pool. ID starting from 1.\n", - "title": "ID" - }, - "speed": { - "type": "string", - "description": "Speed should be set in the format `` or `forced ` or `auto `.", - "title": "Speed" - }, - "ip_pool": { - "type": "string", - "description": "P2P pool name. IP Pool defined under p2p_links_ip_pools. A /31 will be taken from the pool per P2P link.", - "title": "IP Pool" - }, - "subnet": { - "type": "string", - "description": "IPv4 address/Mask. Subnet used on this P2P link.", - "title": "Subnet" - }, - "ip": { - "type": "array", - "description": "Specific IP addresses used on this P2P link.", - "items": { - "type": "string", - "description": "Node IPv4 address/Mask." - }, - "title": "IP" - }, - "ipv6_enable": { - "type": "boolean", - "default": false, - "description": "Allows turning on ipv6 for the link or profile (also autodetected based on underlay_rfc5549 and include_in_underlay_protocol).", - "title": "IPv6 Enable" - }, - "interfaces": { - "type": "array", - "description": "Interfaces where this link should be configured and Required unless using port-channels.", - "items": { - "type": "string", - "description": "The value can be like < node_a_interface >, < node_b_interface >.\nex. - [ Ethernet2, Ethernet2 ].\n" - }, - "title": "Interfaces" - }, - "as": { - "type": "array", - "description": "AS numbers for BGP.\nRequired with bgp peering.\n", - "items": { - "type": "string", - "description": "The values can be like [\"node_a_as\", \"node_b_as\"]." - }, - "title": "As" - }, - "descriptions": { - "type": "array", - "description": "Interface description.", - "items": { - "type": "string" - }, - "title": "Descriptions" - }, - "include_in_underlay_protocol": { - "type": "boolean", - "default": true, - "description": "Add this interface to underlay routing protocol.", - "title": "Include In Underlay Protocol" - }, - "isis_hello_padding": { - "type": "boolean", - "default": false, - "title": "ISIS Hello Padding" - }, - "isis_metric": { - "type": "integer", - "title": "ISIS Metric" - }, - "isis_circuit_type": { - "type": "string", - "enum": [ - "level-1", - "level-2", - "level-1-2" - ], - "title": "ISIS Circuit Type" - }, - "isis_authentication_mode": { - "type": "string", - "enum": [ - "md5", - "text" - ], - "title": "ISIS Authentication Mode" - }, - "isis_authentication_key": { - "type": "string", - "description": "Type-7 encrypted password.", - "title": "ISIS Authentication Key" - }, - "mpls_ip": { - "type": "boolean", - "description": "MPLS parameters. Default value is true if switch.mpls_lsr is true.", - "title": "MPLS IP" - }, - "mpls_ldp": { - "type": "boolean", - "description": "MPLS parameters. Default value is true for ldp underlay variants, otherwise false.", - "title": "MPLS LDP" - }, - "mtu": { - "type": "integer", - "description": "MTU for this P2P link. Default value same as p2p_uplinks_mtu.", - "title": "MTU" - }, - "bfd": { - "type": "boolean", - "default": false, - "description": "Enable BFD (only considered for BGP).", - "title": "BFD" - }, - "ptp": { - "description": "PTP parameters.", - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "default": false, - "description": "Enable PTP.", - "title": "Enabled" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "PTP" - }, - "sflow": { - "type": "boolean", - "description": "Enable sFlow. Overrides `fabric_sflow` setting.", - "title": "Sflow" - }, - "qos_profile": { - "type": "string", - "description": "QOS service profile.", - "title": "QOS Profile" - }, - "macsec_profile": { - "type": "string", - "description": "MAC security profile.", - "title": "Macsec Profile" - }, - "port_channel": { - "description": "Port-channel parameters.", - "type": "object", - "properties": { - "mode": { - "type": "string", - "default": "active", - "title": "Mode" - }, - "nodes_child_interfaces": { - "type": "array", - "items": { - "type": "object", - "properties": { - "node": { - "type": "string", - "title": "Node" - }, - "interfaces": { - "type": "array", - "description": "List of node interfaces. Ex.- [ 'node1 interface1', 'node1 interface2' ].", - "items": { - "type": "string" - }, - "title": "Interfaces" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "node" - ] - }, - "title": "Nodes Child Interfaces" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Port Channel" - }, - "raw_eos_cli": { - "type": "string", - "description": "EOS CLI rendered directly on the point-to-point interface in the final EOS configuration.", - "title": "Raw EOS CLI" - }, - "structured_config": { - "type": "object", - "description": "Custom structured config for interfaces\nNote! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces.", - "title": "Structured Config" - } - }, - "required": [ - "nodes" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "P2P Links" - }, - "l3_interfaces_profiles": { - "type": "array", - "items": { - "type": "object", - "properties": { - "profile": { - "type": "string", - "description": "L3 interface profile name. Any variable supported under `l3_interfaces` can be inherited from a profile.", - "title": "Profile" - }, - "interface": { - "type": "string", - "description": "Ethernet interface name like 'Ethernet2'.", - "pattern": "Ethernet[\\d/]+", - "title": "Interface" - }, - "description": { - "type": "string", - "description": "Interface description.\nIf not set a default description will be configured with '[[ ]]'", - "title": "Description" - }, - "ip": { - "type": "string", - "description": "Node IPv4 address/Mask or 'dhcp'.", - "title": "IP" - }, - "dhcp_client_accept_default_route": { - "type": "boolean", - "default": false, - "description": "Supported if `ip` is `dhcp`.\nAccepts default route from DHCP.", - "title": "DHCP Client Accept Default Route" - }, - "enabled": { - "type": "boolean", - "default": true, - "description": "Enable or Shutdown the interface.", - "title": "Enabled" - }, - "speed": { - "type": "string", - "description": "Speed should be set in the format `` or `forced ` or `auto `.", - "title": "Speed" - }, - "peer": { - "type": "string", - "description": "The peer device name. Used for description and documentation", - "title": "Peer" - }, - "peer_interface": { - "type": "string", - "description": "The peer device interface. Used for description and documentation", - "title": "Peer Interface" - }, - "peer_ip": { - "type": "string", - "description": "The peer device IP. Used for description and documentation", - "title": "Peer IP" - }, - "qos_profile": { - "type": "string", - "description": "QOS service profile.", - "title": "QOS Profile" - }, - "raw_eos_cli": { - "type": "string", - "description": "EOS CLI rendered directly on the interface in the final EOS configuration.", - "title": "Raw EOS CLI" - }, - "structured_config": { - "type": "object", - "description": "Custom structured config for the Ethernet interface.", - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "description": { - "type": "string", - "title": "Description" - }, - "shutdown": { - "type": "boolean", - "title": "Shutdown" - }, - "load_interval": { - "type": "integer", - "minimum": 0, - "maximum": 600, - "description": "Interval in seconds for updating interface counters\"", - "title": "Load Interval" - }, - "speed": { - "type": "string", - "description": "Speed should be set in the format `` or `forced ` or `auto `.", - "title": "Speed" - }, - "mtu": { - "type": "integer", - "minimum": 68, - "maximum": 65535, - "title": "MTU" - }, - "l2_mtu": { - "type": "integer", - "minimum": 68, - "maximum": 65535, - "description": "\"l2_mtu\" should only be defined for platforms supporting the \"l2 mtu\" CLI\n", - "title": "L2 MTU" - }, - "l2_mru": { - "type": "integer", - "minimum": 68, - "maximum": 65535, - "description": "\"l2_mru\" should only be defined for platforms supporting the \"l2 mru\" CLI\n", - "title": "L2 MRU" - }, - "vlans": { - "type": "string", - "description": "List of switchport vlans as string\nFor a trunk port this would be a range like \"1-200,300\"\nFor an access port this would be a single vlan \"123\"\n", - "title": "VLANs" - }, - "native_vlan": { - "type": "integer", - "title": "Native VLAN" - }, - "native_vlan_tag": { - "type": "boolean", - "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence", - "title": "Native VLAN Tag" - }, - "mode": { - "type": "string", - "enum": [ - "access", - "dot1q-tunnel", - "trunk", - "trunk phone" - ], - "title": "Mode" - }, - "phone": { - "type": "object", - "properties": { - "trunk": { - "type": "string", - "enum": [ - "tagged", - "tagged phone", - "untagged", - "untagged phone" - ], - "title": "Trunk" - }, - "vlan": { - "type": "integer", - "minimum": 1, - "maximum": 4094, - "title": "VLAN" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Phone" - }, - "l2_protocol": { - "type": "object", - "properties": { - "encapsulation_dot1q_vlan": { - "type": "integer", - "description": "Vlan tag to configure on sub-interface", - "title": "Encapsulation Dot1Q VLAN" - }, - "forwarding_profile": { - "type": "string", - "description": "L2 protocol forwarding profile", - "title": "Forwarding Profile" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "L2 Protocol" - }, - "trunk_groups": { - "type": "array", - "items": { - "type": "string" - }, - "title": "Trunk Groups" - }, - "type": { - "type": "string", - "enum": [ - "routed", - "switched", - "l3dot1q", - "l2dot1q", - "port-channel-member" - ], - "description": "l3dot1q and l2dot1q are used for sub-interfaces. The parent interface should be defined as routed.\nInterface will not be listed in device documentation, unless \"type\" is set.\n", - "title": "Type" - }, - "snmp_trap_link_change": { - "type": "boolean", - "title": "Snmp Trap Link Change" - }, - "address_locking": { - "type": "object", - "properties": { - "ipv4": { - "type": "boolean", - "description": "Enable address locking for IPv4", - "title": "IPv4" - }, - "ipv6": { - "type": "boolean", - "description": "Enable address locking for IPv6", - "title": "IPv6" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Address Locking" - }, - "flowcontrol": { - "type": "object", - "properties": { - "received": { - "type": "string", - "enum": [ - "desired", - "on", - "off" - ], - "title": "Received" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Flowcontrol" - }, - "vrf": { - "type": "string", - "description": "VRF name", - "title": "VRF" - }, - "flow_tracker": { - "type": "object", - "properties": { - "sampled": { - "type": "string", - "description": "Sampled flow tracker name.", - "title": "Sampled" - }, - "hardware": { - "type": "string", - "description": "Hardware flow tracker name.", - "title": "Hardware" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Flow Tracker" - }, - "error_correction_encoding": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "default": true, - "title": "Enabled" - }, - "fire_code": { - "type": "boolean", - "title": "Fire Code" - }, - "reed_solomon": { - "type": "boolean", - "title": "Reed Solomon" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Error Correction Encoding" - }, - "link_tracking_groups": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Group name", - "title": "Name" - }, - "direction": { - "type": "string", - "enum": [ - "upstream", - "downstream" - ], - "title": "Direction" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "name" - ] - }, - "title": "Link Tracking Groups" - }, - "evpn_ethernet_segment": { - "type": "object", - "properties": { - "identifier": { - "type": "string", - "description": "EVPN Ethernet Segment Identifier (Type 1 format)", - "title": "Identifier" - }, - "redundancy": { - "type": "string", - "enum": [ - "all-active", - "single-active" - ], - "title": "Redundancy" - }, - "designated_forwarder_election": { - "type": "object", - "properties": { - "algorithm": { - "type": "string", - "enum": [ - "modulus", - "preference" - ], - "title": "Algorithm" - }, - "preference_value": { - "type": "integer", - "minimum": 0, - "maximum": 65535, - "description": "Preference_value is only used when \"algorithm\" is \"preference\"", - "title": "Preference Value" - }, - "dont_preempt": { - "type": "boolean", - "description": "Dont_preempt is only used when \"algorithm\" is \"preference\"", - "title": "Dont Preempt" - }, - "hold_time": { - "type": "integer", - "title": "Hold Time" - }, - "subsequent_hold_time": { - "type": "integer", - "title": "Subsequent Hold Time" - }, - "candidate_reachability_required": { - "type": "boolean", - "title": "Candidate Reachability Required" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Designated Forwarder Election" - }, - "mpls": { - "type": "object", - "properties": { - "shared_index": { - "type": "integer", - "minimum": 1, - "maximum": 1024, - "title": "Shared Index" - }, - "tunnel_flood_filter_time": { - "type": "integer", - "title": "Tunnel Flood Filter Time" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "MPLS" - }, - "route_target": { - "type": "string", - "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx", - "title": "Route Target" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "EVPN Ethernet Segment" - }, - "encapsulation_dot1q_vlan": { - "type": "integer", - "description": "VLAN tag to configure on sub-interface", - "title": "Encapsulation Dot1Q VLAN" - }, - "encapsulation_vlan": { - "type": "object", - "properties": { - "client": { - "type": "object", - "properties": { - "dot1q": { - "type": "object", - "properties": { - "vlan": { - "type": "integer", - "description": "Client VLAN ID", - "title": "VLAN" - }, - "outer": { - "type": "integer", - "description": "Client Outer VLAN ID", - "title": "Outer" - }, - "inner": { - "type": "integer", - "description": "Client Inner VLAN ID", - "title": "Inner" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Dot1Q" - }, - "unmatched": { - "type": "boolean", - "title": "Unmatched" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Client" - }, - "network": { - "type": "object", - "description": "Network encapsulations are all optional and skipped if using client unmatched", - "properties": { - "dot1q": { - "type": "object", - "properties": { - "vlan": { - "type": "integer", - "description": "Network VLAN ID", - "title": "VLAN" - }, - "outer": { - "type": "integer", - "description": "Network outer VLAN ID", - "title": "Outer" - }, - "inner": { - "type": "integer", - "description": "Network inner VLAN ID", - "title": "Inner" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Dot1Q" - }, - "client": { - "type": "boolean", - "title": "Client" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Network" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Encapsulation VLAN" - }, - "vlan_id": { - "type": "integer", - "minimum": 1, - "maximum": 4094, - "title": "VLAN ID" - }, - "ip_address": { - "type": "string", - "description": "IPv4 address/mask or \"dhcp\"", - "title": "IP Address" - }, - "ip_address_secondaries": { - "type": "array", - "items": { - "type": "string" - }, - "title": "IP Address Secondaries" - }, - "dhcp_client_accept_default_route": { - "type": "boolean", - "description": "Install default-route obtained via DHCP", - "title": "DHCP Client Accept Default Route" - }, - "dhcp_server_ipv4": { - "type": "boolean", - "description": "Enable IPv4 DHCP server.", - "title": "DHCP Server IPv4" - }, - "dhcp_server_ipv6": { - "type": "boolean", - "description": "Enable IPv6 DHCP server.", - "title": "DHCP Server IPv6" - }, - "ip_helpers": { - "type": "array", - "items": { - "type": "object", - "properties": { - "ip_helper": { - "type": "string", - "title": "IP Helper" - }, - "source_interface": { - "type": "string", - "description": "Source interface name", - "title": "Source Interface" - }, - "vrf": { - "type": "string", - "description": "VRF name", - "title": "VRF" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "ip_helper" - ] - }, - "title": "IP Helpers" - }, - "ip_nat": { - "type": "object", - "properties": { - "service_profile": { - "type": "string", - "description": "NAT interface profile.", - "title": "Service Profile" - }, - "destination": { - "type": "object", - "properties": { - "dynamic": { - "type": "array", - "items": { - "type": "object", - "properties": { - "access_list": { - "type": "string", - "title": "Access List" - }, - "comment": { - "type": "string", - "title": "Comment" - }, - "pool_name": { - "type": "string", - "title": "Pool Name" - }, - "priority": { - "type": "integer", - "minimum": 0, - "maximum": 4294967295, - "title": "Priority" - } - }, - "required": [ - "pool_name", - "access_list" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "Dynamic" - }, - "static": { - "type": "array", - "items": { - "type": "object", - "properties": { - "access_list": { - "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", - "title": "Access List" - }, - "comment": { - "type": "string", - "title": "Comment" - }, - "direction": { - "type": "string", - "enum": [ - "egress", - "ingress" - ], - "description": "Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware platform.\nEOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW.\n", - "title": "Direction" - }, - "group": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", - "title": "Group" - }, - "original_ip": { - "type": "string", - "description": "IPv4 address", - "title": "Original IP" - }, - "original_port": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "title": "Original Port" - }, - "priority": { - "type": "integer", - "minimum": 0, - "maximum": 4294967295, - "title": "Priority" - }, - "protocol": { - "type": "string", - "enum": [ - "udp", - "tcp" - ], - "title": "Protocol" - }, - "translated_ip": { - "type": "string", - "description": "IPv4 address", - "title": "Translated IP" - }, - "translated_port": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "description": "requires 'original_port'", - "title": "Translated Port" - } - }, - "required": [ - "translated_ip", - "original_ip" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "Static" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Destination" - }, - "source": { - "type": "object", - "properties": { - "dynamic": { - "type": "array", - "items": { - "type": "object", - "properties": { - "access_list": { - "type": "string", - "title": "Access List" - }, - "comment": { - "type": "string", - "title": "Comment" - }, - "nat_type": { - "type": "string", - "enum": [ - "overload", - "pool", - "pool-address-only", - "pool-full-cone" - ], - "title": "Nat Type" - }, - "pool_name": { - "type": "string", - "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone\nignored if 'nat_type' is overload\n", - "title": "Pool Name" - }, - "priority": { - "type": "integer", - "minimum": 0, - "maximum": 4294967295, - "title": "Priority" - } - }, - "required": [ - "nat_type", - "access_list" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "Dynamic" - }, - "static": { - "type": "array", - "items": { - "type": "object", - "properties": { - "access_list": { - "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", - "title": "Access List" - }, - "comment": { - "type": "string", - "title": "Comment" - }, - "direction": { - "type": "string", - "enum": [ - "egress", - "ingress" - ], - "description": "Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware platform.\nEOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW.\n", - "title": "Direction" - }, - "group": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", - "title": "Group" - }, - "original_ip": { - "type": "string", - "description": "IPv4 address", - "title": "Original IP" - }, - "original_port": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "title": "Original Port" - }, - "priority": { - "type": "integer", - "minimum": 0, - "maximum": 4294967295, - "title": "Priority" - }, - "protocol": { - "type": "string", - "enum": [ - "udp", - "tcp" - ], - "title": "Protocol" - }, - "translated_ip": { - "type": "string", - "description": "IPv4 address", - "title": "Translated IP" - }, - "translated_port": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "description": "requires 'original_port'", - "title": "Translated Port" - } - }, - "required": [ - "translated_ip", - "original_ip" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "Static" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Source" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "IP Nat" - }, - "ipv6_enable": { - "type": "boolean", - "title": "IPv6 Enable" - }, - "ipv6_address": { - "type": "string", - "title": "IPv6 Address" - }, - "ipv6_address_link_local": { - "type": "string", - "description": "Link local IPv6 address/mask", - "title": "IPv6 Address Link Local" - }, - "ipv6_nd_ra_disabled": { - "type": "boolean", - "title": "IPv6 ND RA Disabled" - }, - "ipv6_nd_managed_config_flag": { - "type": "boolean", - "title": "IPv6 ND Managed Config Flag" - }, - "ipv6_nd_prefixes": { - "type": "array", - "items": { - "type": "object", - "properties": { - "ipv6_prefix": { - "type": "string", - "title": "IPv6 Prefix" - }, - "valid_lifetime": { - "type": "string", - "description": "Infinite or lifetime in seconds", - "title": "Valid Lifetime" - }, - "preferred_lifetime": { - "type": "string", - "description": "Infinite or lifetime in seconds", - "title": "Preferred Lifetime" - }, - "no_autoconfig_flag": { - "type": "boolean", - "title": "No Autoconfig Flag" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "ipv6_prefix" - ] - }, - "title": "IPv6 ND Prefixes" - }, - "ipv6_dhcp_relay_destinations": { - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "type": "string", - "description": "DHCP server's IPv6 address", - "title": "Address" - }, - "vrf": { - "type": "string", - "title": "VRF" - }, - "local_interface": { - "type": "string", - "description": "Local interface to communicate with DHCP server - mutually exclusive to source_address", - "title": "Local Interface" - }, - "source_address": { - "type": "string", - "description": "Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface", - "title": "Source Address" - }, - "link_address": { - "type": "string", - "description": "Override the default link address specified in the relayed DHCP packet", - "title": "Link Address" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "address" - ] - }, - "title": "IPv6 DHCP Relay Destinations" - }, - "access_group_in": { - "type": "string", - "description": "Access list name", - "title": "Access Group In" - }, - "access_group_out": { - "type": "string", - "description": "Access list name", - "title": "Access Group Out" - }, - "ipv6_access_group_in": { - "type": "string", - "description": "IPv6 access list name", - "title": "IPv6 Access Group In" - }, - "ipv6_access_group_out": { - "type": "string", - "description": "IPv6 access list name", - "title": "IPv6 Access Group Out" - }, - "mac_access_group_in": { - "type": "string", - "description": "MAC access list name", - "title": "MAC Access Group In" - }, - "mac_access_group_out": { - "type": "string", - "description": "MAC access list name", - "title": "MAC Access Group Out" - }, - "multicast": { - "type": "object", - "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both", - "properties": { - "ipv4": { - "type": "object", - "properties": { - "boundaries": { - "type": "array", - "items": { - "type": "object", - "properties": { - "boundary": { - "type": "string", - "description": "ACL name or multicast IP subnet", - "title": "Boundary" - }, - "out": { - "type": "boolean", - "title": "Out" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "Boundaries" - }, - "static": { - "type": "boolean", - "title": "Static" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "IPv4" - }, - "ipv6": { - "type": "object", - "properties": { - "boundaries": { - "type": "array", - "items": { - "type": "object", - "properties": { - "boundary": { - "type": "string", - "description": "ACL name or multicast IP subnet", - "title": "Boundary" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "Boundaries" - }, - "static": { - "type": "boolean", - "title": "Static" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "IPv6" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Multicast" - }, - "ospf_network_point_to_point": { - "type": "boolean", - "title": "OSPF Network Point To Point" - }, - "ospf_area": { - "type": "string", - "title": "OSPF Area" - }, - "ospf_cost": { - "type": "integer", - "title": "OSPF Cost" - }, - "ospf_authentication": { - "type": "string", - "enum": [ - "none", - "simple", - "message-digest" - ], - "title": "OSPF Authentication" - }, - "ospf_authentication_key": { - "type": "string", - "description": "Encrypted password - only type 7 supported", - "title": "OSPF Authentication Key" - }, - "ospf_message_digest_keys": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "title": "ID" - }, - "hash_algorithm": { - "type": "string", - "enum": [ - "md5", - "sha1", - "sha256", - "sha384", - "sha512" - ], - "title": "Hash Algorithm" - }, - "key": { - "type": "string", - "description": "Encrypted password - only type 7 supported", - "title": "Key" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "id" - ] - }, - "title": "OSPF Message Digest Keys" - }, - "pim": { - "type": "object", - "properties": { - "ipv4": { - "type": "object", - "properties": { - "dr_priority": { - "type": "integer", - "minimum": 0, - "maximum": 429467295, - "title": "DR Priority" - }, - "sparse_mode": { - "type": "boolean", - "title": "Sparse Mode" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "IPv4" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "PIM" - }, - "mac_security": { - "type": "object", - "properties": { - "profile": { - "type": "string", - "title": "Profile" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "MAC Security" - }, - "channel_group": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "title": "ID" - }, - "mode": { - "type": "string", - "enum": [ - "on", - "active", - "passive" - ], - "title": "Mode" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Channel Group" - }, - "isis_enable": { - "type": "string", - "description": "ISIS instance", - "title": "ISIS Enable" - }, - "isis_passive": { - "type": "boolean", - "title": "ISIS Passive" - }, - "isis_metric": { - "type": "integer", - "title": "ISIS Metric" - }, - "isis_network_point_to_point": { - "type": "boolean", - "title": "ISIS Network Point To Point" - }, - "isis_circuit_type": { - "type": "string", - "enum": [ - "level-1-2", - "level-1", - "level-2" - ], - "title": "ISIS Circuit Type" - }, - "isis_hello_padding": { - "type": "boolean", - "title": "ISIS Hello Padding" - }, - "isis_authentication_mode": { - "type": "string", - "enum": [ - "text", - "md5" - ], - "title": "ISIS Authentication Mode" - }, - "isis_authentication_key": { - "type": "string", - "description": "Type-7 encrypted password", - "title": "ISIS Authentication Key" - }, - "poe": { - "type": "object", - "properties": { - "disabled": { - "type": "boolean", - "description": "Disable PoE on a POE capable port. PoE is enabled on all ports that support it by default in EOS.", - "default": false, - "title": "Disabled" - }, - "priority": { - "type": "string", - "enum": [ - "critical", - "high", - "medium", - "low" - ], - "description": "Prioritize a port's power in the event that one of the switch's power supplies loses power", - "title": "Priority" - }, - "reboot": { - "description": "Set the PoE power behavior for a PoE port when the system is rebooted", - "type": "object", - "properties": { - "action": { - "type": "string", - "enum": [ - "maintain", - "power-off" - ], - "description": "PoE action for interface", - "title": "Action" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Reboot" - }, - "link_down": { - "description": "Set the PoE power behavior for a PoE port when the port goes down", - "type": "object", - "properties": { - "action": { - "type": "string", - "enum": [ - "maintain", - "power-off" - ], - "description": "PoE action for interface", - "title": "Action" - }, - "power_off_delay": { - "type": "integer", - "minimum": 1, - "maximum": 86400, - "description": "Number of seconds to delay shutting the power off after a link down event occurs. Default value is 5 seconds in EOS.", - "title": "Power Off Delay" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Link Down" - }, - "shutdown": { - "description": "Set the PoE power behavior for a PoE port when the port is admin down", - "type": "object", - "properties": { - "action": { - "type": "string", - "enum": [ - "maintain", - "power-off" - ], - "description": "PoE action for interface", - "title": "Action" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Shutdown" - }, - "limit": { - "type": "object", - "description": "Override the hardware-negotiated power limit using either wattage or a power class. Note that if using a power class, AVD will automatically convert the class value to the wattage value corresponding to that power class.", - "properties": { - "class": { - "type": "integer", - "minimum": 0, - "maximum": 8, - "title": "Class" - }, - "watts": { - "type": "string", - "title": "Watts" - }, - "fixed": { - "type": "boolean", - "description": "Set to ignore hardware classification", - "title": "Fixed" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Limit" - }, - "negotiation_lldp": { - "type": "boolean", - "description": "Disable to prevent port from negotiating power with powered devices over LLDP. Enabled by default in EOS.", - "title": "Negotiation LLDP" - }, - "legacy_detect": { - "type": "boolean", - "description": "Allow a subset of legacy devices to work with the PoE switch. Disabled by default in EOS because it can cause false positive detections.", - "title": "Legacy Detect" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "PoE" - }, - "ptp": { - "type": "object", - "properties": { - "enable": { - "type": "boolean", - "title": "Enable" - }, - "announce": { - "type": "object", - "properties": { - "interval": { - "type": "integer", - "title": "Interval" - }, - "timeout": { - "type": "integer", - "title": "Timeout" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Announce" - }, - "delay_req": { - "type": "integer", - "title": "Delay Req" - }, - "delay_mechanism": { - "type": "string", - "enum": [ - "e2e", - "p2p" - ], - "title": "Delay Mechanism" - }, - "sync_message": { - "type": "object", - "properties": { - "interval": { - "type": "integer", - "title": "Interval" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Sync Message" - }, - "role": { - "type": "string", - "enum": [ - "master", - "dynamic" - ], - "title": "Role" - }, - "vlan": { - "type": "string", - "description": "VLAN can be 'all' or list of vlans as string", - "title": "VLAN" - }, - "transport": { - "type": "string", - "enum": [ - "ipv4", - "ipv6", - "layer2" - ], - "title": "Transport" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "PTP" - }, - "profile": { - "type": "string", - "description": "Interface profile", - "title": "Profile" - }, - "storm_control": { - "type": "object", - "properties": { - "all": { - "type": "object", - "properties": { - "level": { - "type": "string", - "description": "Configure maximum storm-control level", - "title": "Level" - }, - "unit": { - "type": "string", - "default": "percent", - "enum": [ - "percent", - "pps" - ], - "description": "Optional field and is hardware dependent", - "title": "Unit" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "All" - }, - "broadcast": { - "type": "object", - "properties": { - "level": { - "type": "string", - "description": "Configure maximum storm-control level", - "title": "Level" - }, - "unit": { - "type": "string", - "default": "percent", - "enum": [ - "percent", - "pps" - ], - "description": "Optional field and is hardware dependent", - "title": "Unit" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Broadcast" - }, - "multicast": { - "type": "object", - "properties": { - "level": { - "type": "string", - "description": "Configure maximum storm-control level", - "title": "Level" - }, - "unit": { - "type": "string", - "default": "percent", - "enum": [ - "percent", - "pps" - ], - "description": "Optional field and is hardware dependent", - "title": "Unit" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Multicast" - }, - "unknown_unicast": { - "type": "object", - "properties": { - "level": { - "type": "string", - "description": "Configure maximum storm-control level", - "title": "Level" - }, - "unit": { - "type": "string", - "default": "percent", - "enum": [ - "percent", - "pps" - ], - "description": "Optional field and is hardware dependent", - "title": "Unit" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Unknown Unicast" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Storm Control" - }, - "logging": { - "type": "object", - "properties": { - "event": { - "type": "object", - "properties": { - "link_status": { - "type": "boolean", - "title": "Link Status" - }, - "congestion_drops": { - "type": "boolean", - "title": "Congestion Drops" - }, - "spanning_tree": { - "type": "boolean", - "title": "Spanning Tree" - }, - "storm_control_discards": { - "type": "boolean", - "title": "Storm Control Discards" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Event" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Logging" - }, - "lldp": { - "type": "object", - "properties": { - "transmit": { - "type": "boolean", - "title": "Transmit" - }, - "receive": { - "type": "boolean", - "title": "Receive" - }, - "ztp_vlan": { - "type": "integer", - "description": "ZTP vlan number", - "title": "ZTP VLAN" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "LLDP" - }, - "trunk_private_vlan_secondary": { - "type": "boolean", - "title": "Trunk Private VLAN Secondary" - }, - "pvlan_mapping": { - "type": "string", - "description": "List of vlans as string", - "title": "PVLAN Mapping" - }, - "vlan_translations": { - "type": "array", - "items": { - "type": "object", - "properties": { - "from": { - "type": "string", - "description": "List of vlans as string (only one vlan if direction is \"both\")", - "title": "From" - }, - "to": { - "type": "integer", - "description": "VLAN ID", - "title": "To" - }, - "direction": { - "type": "string", - "enum": [ - "in", - "out", - "both" - ], - "default": "both", - "title": "Direction" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "VLAN Translations" - }, - "dot1x": { - "type": "object", - "properties": { - "port_control": { - "type": "string", - "enum": [ - "auto", - "force-authorized", - "force-unauthorized" - ], - "title": "Port Control" - }, - "port_control_force_authorized_phone": { - "type": "boolean", - "title": "Port Control Force Authorized Phone" - }, - "reauthentication": { - "type": "boolean", - "title": "Reauthentication" - }, - "pae": { - "type": "object", - "properties": { - "mode": { - "type": "string", - "enum": [ - "authenticator" - ], - "title": "Mode" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "PAE" - }, - "authentication_failure": { - "type": "object", - "properties": { - "action": { - "type": "string", - "enum": [ - "allow", - "drop" - ], - "title": "Action" - }, - "allow_vlan": { - "type": "integer", - "minimum": 1, - "maximum": 4094, - "title": "Allow VLAN" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Authentication Failure" - }, - "host_mode": { - "type": "object", - "properties": { - "mode": { - "type": "string", - "enum": [ - "multi-host", - "single-host" - ], - "title": "Mode" - }, - "multi_host_authenticated": { - "type": "boolean", - "title": "Multi Host Authenticated" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Host Mode" - }, - "mac_based_authentication": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "title": "Enabled" - }, - "always": { - "type": "boolean", - "title": "Always" - }, - "host_mode_common": { - "type": "boolean", - "title": "Host Mode Common" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "MAC Based Authentication" - }, - "timeout": { - "type": "object", - "properties": { - "idle_host": { - "type": "integer", - "minimum": 10, - "maximum": 65535, - "title": "Idle Host" - }, - "quiet_period": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "title": "Quiet Period" - }, - "reauth_period": { - "type": "string", - "description": "Value can be 60-4294967295 or 'server'", - "title": "Reauth Period" - }, - "reauth_timeout_ignore": { - "type": "boolean", - "title": "Reauth Timeout Ignore" - }, - "tx_period": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "title": "TX Period" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Timeout" - }, - "reauthorization_request_limit": { - "type": "integer", - "minimum": 1, - "maximum": 10, - "title": "Reauthorization Request Limit" - }, - "unauthorized": { - "type": "object", - "properties": { - "access_vlan_membership_egress": { - "type": "boolean", - "title": "Access VLAN Membership Egress" - }, - "native_vlan_membership_egress": { - "type": "boolean", - "title": "Native VLAN Membership Egress" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Unauthorized" - }, - "eapol": { - "type": "object", - "properties": { - "disabled": { - "type": "boolean", - "title": "Disabled" - }, - "authentication_failure_fallback_mba": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "title": "Enabled" - }, - "timeout": { - "type": "integer", - "minimum": 0, - "maximum": 65535, - "title": "Timeout" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Authentication Failure Fallback Mba" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Eapol" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "dot1x" - }, - "service_profile": { - "type": "string", - "description": "QOS profile", - "title": "Service Profile" - }, - "shape": { - "type": "object", - "properties": { - "rate": { - "type": "string", - "description": "Rate in kbps, pps or percent\nSupported options are platform dependent\nExamples:\n- \"5000 kbps\"\n- \"1000 pps\"\n- \"20 percent\"\n", - "title": "Rate" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Shape" - }, - "qos": { - "type": "object", - "properties": { - "trust": { - "type": "string", - "enum": [ - "dscp", - "cos", - "disabled" - ], - "title": "Trust" - }, - "dscp": { - "type": "integer", - "description": "DSCP value", - "title": "DSCP" - }, - "cos": { - "type": "integer", - "description": "COS value", - "title": "COS" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "QOS" - }, - "spanning_tree_bpdufilter": { - "type": "string", - "enum": [ - "enabled", - "disabled", - "True", - "False", - "true", - "false" - ], - "title": "Spanning Tree Bpdufilter" - }, - "spanning_tree_bpduguard": { - "type": "string", - "enum": [ - "enabled", - "disabled", - "True", - "False", - "true", - "false" - ], - "title": "Spanning Tree Bpduguard" - }, - "spanning_tree_guard": { - "type": "string", - "enum": [ - "loop", - "root", - "disabled" - ], - "title": "Spanning Tree Guard" - }, - "spanning_tree_portfast": { - "type": "string", - "enum": [ - "edge", - "network" - ], - "title": "Spanning Tree Portfast" - }, - "vmtracer": { - "type": "boolean", - "title": "VMTracer" - }, - "priority_flow_control": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "title": "Enabled" - }, - "priorities": { - "type": "array", - "items": { - "type": "object", - "properties": { - "priority": { - "type": "integer", - "minimum": 0, - "maximum": 7, - "title": "Priority" - }, - "no_drop": { - "type": "boolean", - "title": "No Drop" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "priority" - ] - }, - "title": "Priorities" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Priority Flow Control" - }, - "bfd": { - "type": "object", - "properties": { - "echo": { - "type": "boolean", - "title": "Echo" - }, - "interval": { - "type": "integer", - "description": "Interval in milliseconds", - "title": "Interval" - }, - "min_rx": { - "type": "integer", - "description": "Rate in milliseconds", - "title": "Min RX" - }, - "multiplier": { - "type": "integer", - "minimum": 3, - "maximum": 50, - "title": "Multiplier" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "BFD" - }, - "service_policy": { - "type": "object", - "properties": { - "pbr": { - "type": "object", - "properties": { - "input": { - "type": "string", - "description": "Policy Based Routing Policy-map name", - "title": "Input" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "PBR" - }, - "qos": { - "type": "object", - "properties": { - "input": { - "type": "string", - "description": "Quality of Service Policy-map name", - "title": "Input" - } - }, - "required": [ - "input" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "QOS" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Service Policy" - }, - "mpls": { - "type": "object", - "properties": { - "ip": { - "type": "boolean", - "title": "IP" - }, - "ldp": { - "type": "object", - "properties": { - "interface": { - "type": "boolean", - "title": "Interface" - }, - "igp_sync": { - "type": "boolean", - "title": "IGP Sync" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "LDP" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "MPLS" - }, - "lacp_timer": { - "type": "object", - "properties": { - "mode": { - "type": "string", - "enum": [ - "fast", - "normal" - ], - "title": "Mode" - }, - "multiplier": { - "type": "integer", - "minimum": 3, - "maximum": 3000, - "title": "Multiplier" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "LACP Timer" - }, - "lacp_port_priority": { - "type": "integer", - "minimum": 0, - "maximum": 65535, - "title": "LACP Port Priority" - }, - "transceiver": { - "type": "object", - "properties": { - "media": { - "type": "object", - "properties": { - "override": { - "type": "string", - "description": "Transceiver type", - "title": "Override" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Media" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Transceiver" - }, - "ip_proxy_arp": { + "required": [ + "name" + ] + }, + "title": "Interfaces" + } + }, + "required": [ + "platform", + "interfaces", + "hostname" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Cv Topology" + }, + "cvp_ingestauth_key": { + "type": "string", + "description": "On-premise CVP ingest auth key. If set, TerminAttr will be configured with key-based authentication for on-premise CVP.\nIf not set, TerminAttr will be configured with certificate based authentication:\n- On-premise using token onboarding. Default token path is '/tmp/token'.\n- CVaaS using token-secure onboarding. Default token path is '/tmp/cv-onboarding-token'.\nToken must be copied to the device first.", + "title": "CVP Ingestauth Key" + }, + "cvp_instance_ip": { + "type": "string", + "description": "IPv4 address or DNS name for CloudVision.\nThis variable only supports an on-premise single-node cluster or the DNS name of a CloudVision as a Service instance.\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use cvp_instance_ips instead.", + "deprecated": true, + "title": "CVP Instance IP" + }, + "cvp_instance_ips": { + "type": "array", + "description": "List of IPv4 addresses or DNS names for CloudVision.\nFor on-premise CloudVision enter all the nodes of the cluster.\nFor CloudVision as a Service enter the DNS name of the instance.\n`eos_designs` only supports one CloudVision cluster.\n", + "items": { + "type": "string", + "description": "IPv4 address or DNS name for CloudVision" + }, + "title": "CVP Instance Ips" + }, + "cvp_token_file": { + "type": "string", + "description": "cvp_token_file is the path to the token file on the switch.\nIf not set the default locations for on-premise or CVaaS will be used.\nSee cvp_ingestauth_key for details.", + "title": "CVP Token File" + }, + "dc_name": { + "description": "POD Name is used in:\n- Fabric Documentation (Optional, falls back to fabric_name)\n- SNMP Location: `snmp_settings.location` (Optional)\n- HER Overlay DC scoped flood lists: `overlay_her_flood_list_scope: dc` (Required)\n", + "type": "string", + "title": "DC Name" + }, + "default_igmp_snooping_enabled": { + "description": "When set to false, disables IGMP snooping at fabric level and overrides per vlan settings.\n", + "type": "boolean", + "default": true, + "title": "Default IGMP Snooping Enabled" + }, + "default_interfaces": { + "type": "array", + "description": "Default uplink, downlink, and MLAG interfaces, which will be used if these interfaces are not defined on a device (either directly or through inheritance).\n", + "items": { + "type": "object", + "properties": { + "types": { + "type": "array", + "description": "List of node type keys.", + "items": { + "type": "string" + }, + "title": "Types" + }, + "platforms": { + "type": "array", + "description": "List of platform families.\nThis is defined as a Python regular expression that matches the full platform type.\n", + "items": { + "type": "string", + "description": "Arista platform family regular expression." + }, + "title": "Platforms" + }, + "uplink_interfaces": { + "type": "array", + "description": "List of uplink interfaces or uplink interface ranges.", + "items": { + "type": "string", + "description": "Interface range or interface." + }, + "title": "Uplink Interfaces" + }, + "mlag_interfaces": { + "type": "array", + "description": "List of MLAG interfaces or MLAG interface ranges.", + "items": { + "type": "string", + "description": "Interface range or interface." + }, + "title": "MLAG Interfaces" + }, + "downlink_interfaces": { + "type": "array", + "description": "List of downlink interfaces or downlink interface ranges.", + "items": { + "type": "string", + "description": "Interface range or interface." + }, + "title": "Downlink Interfaces" + } + }, + "required": [ + "types", + "platforms" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Default Interfaces" + }, + "default_mgmt_method": { + "type": "string", + "description": "`default_mgmt_method` controls the default VRF and source interface used for the following management and monitoring protocols configured with `eos_designs`:\n - `cv_settings`\n - `dns_settings`\n - `ntp_settings`\n - `sflow_settings`\n\n`oob` means the protocols will be configured with the VRF set by `mgmt_interface_vrf` and `mgmt_interface` as the source interface.\n`inband` means the protocols will be configured with the VRF set by `inband_mgmt_vrf` and `inband_mgmt_interface` as the source interface.\n`none` means the VRF and or interface must be manually set for each protocol.\nThis can be overridden under the settings for each protocol.\n", + "enum": [ + "oob", + "inband", + "none" + ], + "default": "oob", + "title": "Default Management Method" + }, + "default_node_types": { + "type": "array", + "description": "Uses hostname matches against a regular expression to determine the node type.", + "items": { + "type": "object", + "properties": { + "node_type": { + "type": "string", + "description": "Resulting node type when regex matches.", + "title": "Node Type" + }, + "match_hostnames": { + "type": "array", + "description": "Regular expressions to match against hostnames.", + "items": { + "type": "string", + "description": "Regex needs to match full hostname (i.e. is bounded by ^ and $ elements)." + }, + "title": "Match Hostnames" + } + }, + "required": [ + "match_hostnames", + "node_type" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Default Node Types" + }, + "design": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "By setting the design.type variable, the default node-types and templates described in these documents will be used.\n", + "enum": [ + "l3ls-evpn", + "mpls", + "l2ls" + ], + "default": "l3ls-evpn", + "title": "Type" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Design" + }, + "enable_trunk_groups": { + "type": "boolean", + "description": "Enable Trunk Group support across eos_designs.\nWarning: Because of the nature of the EOS Trunk Group feature, enabling this is \"all or nothing\".\n*All* vlans and *all* trunks towards connected endpoints must be using trunk groups as well.\nIf trunk groups are not assigned to a trunk, no vlans will be enabled on that trunk.\nSee \"Details on enable_trunk_groups\" below before enabling this feature.\n", + "default": false, + "title": "Enable Trunk Groups" + }, + "eos_designs_custom_templates": { + "type": "array", + "items": { + "type": "object", + "properties": { + "template": { + "type": "string", + "description": "Template file.", + "title": "Template" + }, + "options": { + "description": "Template options.", + "type": "object", + "properties": { + "list_merge": { + "type": "string", + "description": "Merge strategy for lists.", + "default": "append_rp", + "title": "List Merge" + }, + "strip_empty_keys": { + "type": "boolean", + "description": "Filter out keys from the generated output if value is null/none/undefined.", + "default": true, + "title": "Strip Empty Keys" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Options" + } + }, + "required": [ + "template" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "EOS Designs Custom Templates" + }, + "eos_designs_documentation": { + "description": "Control fabric documentation generation.\n", + "type": "object", + "properties": { + "connected_endpoints": { + "description": "Generate fabric-wide documentation for connected endpoints.\n", + "type": "boolean", + "default": false, + "title": "Connected Endpoints" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "EOS Designs Documentation" + }, + "event_handlers": { + "type": "array", + "description": "Gives the ability to monitor and react to Syslog messages.\nEvent Handlers provide a powerful and flexible tool that can be used to apply self-healing actions,\ncustomize the system behavior, and implement workarounds to problems discovered in the field.\n", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Event Handler Name", + "title": "Name" + }, + "action_type": { + "type": "string", + "enum": [ + "bash", + "increment", + "log" + ], + "title": "Action Type" + }, + "action": { + "type": "string", + "description": "Command to execute\n", + "title": "Action" + }, + "delay": { + "type": "integer", + "description": "Event-handler delay in seconds\n", + "title": "Delay" + }, + "trigger": { + "type": "string", + "description": "Configure event trigger condition.\n", + "enum": [ + "on-boot", + "on-logging", + "on-startup-config" + ], + "title": "Trigger" + }, + "regex": { + "type": "string", + "description": "Regular expression to use for searching log messages. Required for on-logging trigger\n", + "title": "Regex" + }, + "asynchronous": { + "type": "boolean", + "default": false, + "description": "Set the action to be non-blocking.", + "title": "Asynchronous" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "Event Handlers" + }, + "evpn_ebgp_gateway_inter_domain": { + "type": "boolean", + "title": "EVPN Ebgp Gateway Inter Domain" + }, + "evpn_ebgp_gateway_multihop": { + "description": "Default of 15, considering a large value to avoid BGP reachability issues in very complex DCI networks.\nAdapt the value for your specific topology.\n", + "type": "integer", + "default": 15, + "title": "EVPN Ebgp Gateway Multihop" + }, + "evpn_ebgp_multihop": { + "description": "Default of 3, the recommended value for a 3 stage spine and leaf topology.\nSet to a higher value to allow for very large and complex topologies.\n", + "type": "integer", + "default": 3, + "title": "EVPN Ebgp Multihop" + }, + "evpn_hostflap_detection": { + "type": "object", + "properties": { + "enabled": { + "description": "If set to false it will disable EVPN host-flap detection.", + "type": "boolean", + "default": true, + "title": "Enabled" + }, + "threshold": { + "description": "Minimum number of MAC moves that indicate a MAC duplication issue.", + "type": "integer", + "default": 5, + "title": "Threshold" + }, + "window": { + "description": "Time (in seconds) to detect a MAC duplication issue.", + "type": "integer", + "default": 180, + "title": "Window" + }, + "expiry_timeout": { + "description": "Time (in seconds) to purge a MAC duplication issue.", + "type": "integer", + "title": "Expiry Timeout" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "EVPN Hostflap Detection" + }, + "evpn_import_pruning": { + "description": "Enable VPN import pruning (Min. EOS 4.24.2F).\nThe Route Target extended communities carried by incoming VPN paths will be examined.\nIf none of those Route Targets have been configured for import, the path will be immediately discarded.\n", + "type": "boolean", + "default": false, + "title": "EVPN Import Pruning" + }, + "evpn_multicast": { + "type": "boolean", + "description": "General Configuration required for EVPN Multicast. \"evpn_l2_multicast\" or \"evpn_l3_multicast\" must also be configured under the Network Services (tenants).\nRequires \"underlay_multicast: true\" and IGMP snooping enabled globally (default).\nFor MLAG devices Route Distinguisher must be unique since this feature will create multi-vtep configuration.\nWarning !!! For Trident3 based platforms i.e 7050X3, 7300X3, 720XP and 722XP\n The Following default platform setting will be configured: \"platform trident forwarding-table partition flexible exact-match 16384 l2-shared 98304 l3-shared 131072\"\n All forwarding agents will be restarted when this configuration is applied.\n You can tune the settings by overriding the default variable: \"platform_settings[platforms].trident_forwarding_table_partition:\"\n Please contact an Arista representative for help with determining the appropriate values for your environment.\n", + "default": false, + "title": "EVPN Multicast" + }, + "evpn_overlay_bgp_rtc": { + "description": "Enable Route Target Membership Constraint Address Family on EVPN overlay BGP peerings (Min. EOS 4.25.1F).\nRequires use eBGP as overlay protocol.\n", + "type": "boolean", + "default": false, + "title": "EVPN Overlay BGP Rtc" + }, + "evpn_prevent_readvertise_to_server": { + "description": "Configure route-map on eBGP sessions towards route-servers, where prefixes with the peer's ASN in the AS Path are filtered away.\nThis is very useful in large-scale networks, where convergence will be quicker by not returning all updates received\nfrom Route-server-1 to Router-server-2 just for Route-server-2 to throw them away because of AS Path loop detection.\n", + "type": "boolean", + "default": false, + "title": "EVPN Prevent Readvertise To Server" + }, + "evpn_short_esi_prefix": { + "description": "Configure prefix for \"short_esi\" values.", + "type": "string", + "default": "0000:0000:", + "title": "EVPN Short Esi Prefix" + }, + "evpn_vlan_aware_bundles": { + "description": "Enable vlan aware bundles for EVPN MAC-VRF.", + "type": "boolean", + "default": false, + "title": "EVPN VLAN Aware Bundles" + }, + "evpn_vlan_bundles": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Specify an EVPN vlan-aware-bundle name.\nEVPN vlan-aware-bundles group L2 VLANs and define common settings.\n", + "title": "Name" + }, + "id": { + "type": "integer", + "description": "\"id\" may be used for vlan-aware-bundle RD/RT ID so it should not overlap with l2vlan IDs which are not part of this bundle.\nSee \"overlay_rd_type\" and \"overlay_rt_type\" for details.\n", + "title": "ID" + }, + "rt_override": { + "type": "string", + "description": "By default the MAC VRF bundle RT will be derived from mac_vrf_id_base + bundle_id.\nThe rt_override allows us to override this value and statically define it.\nrt_override will default to vni_override if set.\n\nrt_override supports two formats:\n - A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details).\n - A full RT string with colon seperator which will override the full RT.\n", + "title": "Rt Override" + }, + "rd_override": { + "type": "string", + "description": "By default the MAC VRF bundle RD will be derived from mac_vrf_id_base + bundle_id.\nThe rt_override allows us to override this value and statically define it.\nrd_override will default to rt_override or vni_override if set.\n\nrd_override supports two formats:\n - A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details).\n - A full RD string with colon seperator which will override the full RD.\n", + "title": "Rd Override" + }, + "evpn_l2_multi_domain": { + "type": "boolean", + "description": "Explicitly extend VLAN-Aware Bundle to remote EVPN domains.\nOverrides `.[].evpn_l2_multi_domain`.\n", + "title": "EVPN L2 Multi Domain" + }, + "bgp": { + "type": "object", + "properties": { + "raw_eos_cli": { + "type": "string", + "description": "EOS cli commands rendered on router_bgp.vlans-aware-bundle.", + "title": "Raw EOS CLI" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BGP" + } + }, + "required": [ + "id", + "name" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "EVPN VLAN Bundles" + }, + "fabric_evpn_encapsulation": { + "description": "Should be set to mpls for evpn-mpls scenario.", + "enum": [ + "vxlan", + "mpls" + ], + "default": "vxlan", + "type": "string", + "title": "Fabric EVPN Encapsulation" + }, + "fabric_ip_addressing": { + "type": "object", + "properties": { + "mlag": { + "type": "object", + "properties": { + "algorithm": { + "type": "string", + "default": "first_id", + "description": "This variable defines the Multi-chassis Link Aggregation (MLAG) algorithm used.\nEach MLAG link will have a /31* subnet with each subnet allocated from the relevant MLAG pool via a calculated offset.\nThe offset is calculated using one of the following algorithms:\n - first_id: `(mlag_primary_id - 1) * 2` where `mlag_primary_id` is the ID of the first node defined under the node_group.\n This allocation method will skip every other /31* subnet making it less space efficient than `odd_id`.\n - odd_id: `(odd_id - 1) / 2`. Requires the node_group to have a node with an odd ID and a node with an even ID.\n - same_subnet: the offset will always be zero.\n This allocation method will cause every MLAG link to be addressed with the same /31* subnet.\n\\* - The prefix length is configurable with a default of /31.", + "enum": [ + "first_id", + "odd_id", + "same_subnet" + ], + "title": "Algorithm" + }, + "ipv4_prefix_length": { + "type": "integer", + "default": 31, + "minimum": 1, + "maximum": 31, + "description": "IPv4 prefix length used for MLAG peer-vlan and L3 point-to-point SVIs over the MLAG peer-link.", + "title": "IPv4 Prefix Length" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "MLAG" + }, + "p2p_uplinks": { + "type": "object", + "properties": { + "ipv4_prefix_length": { + "type": "integer", + "default": 31, + "minimum": 1, + "maximum": 31, + "description": "IPv4 prefix length used for L3 point-to-point uplinks.", + "title": "IPv4 Prefix Length" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "P2P Uplinks" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Fabric IP Addressing" + }, + "fabric_name": { + "description": "Fabric Name, required to match Ansible Group name covering all devices in the Fabric, **must** be an inventory group name.", + "type": "string", + "title": "Fabric Name" + }, + "hardware_counters": { + "type": "object", + "properties": { + "features": { + "type": "array", + "description": "This data model allows to configure the list of hardware counters feature\navailable on Arista platforms.\n\nThe `name` key accepts a list of valid_values which MUST be updated to support\nnew feature as they are released in EOS.\n\nThe available values of the different keys like 'direction' or 'address_type'\nare feature and hardware dependent and this model DOES NOT validate that the\ncombinations are valid. It is the responsability of the user of this data model\nto make sure that the rendered CLI is accepted by the targeted device.\n\nExamples:\n\n * Use:\n ```yaml\n hardware_counters:\n features:\n - name: ip\n direction: out\n layer3: true\n units_packets: true\n ```\n\n to render:\n ```eos\n hardware counter feature ip out layer3 units packets\n ```\n * Use:\n ```yaml\n hardware_counters:\n features:\n - name: route\n address_type: ipv4\n vrf: test\n prefix: 192.168.0.0/24\n ```\n\n to render:\n ```eos\n hardware counter feature route ipv4 vrf test 192.168.0.0/24\n ```\n", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "enum": [ + "acl", + "decap-group", + "directflow", + "ecn", + "flow-spec", + "gre tunnel interface", + "ip", + "mpls interface", + "mpls lfib", + "mpls tunnel", + "multicast", + "nexthop", + "pbr", + "pdp", + "policing interface", + "qos", + "qos dual-rate-policer", + "route", + "routed-port", + "subinterface", + "tapagg", + "traffic-class", + "traffic-policy", + "vlan", + "vlan-interface", + "vni decap", + "vni encap", + "vtep decap", + "vtep encap" + ], + "title": "Name" + }, + "direction": { + "type": "string", + "enum": [ + "in", + "out", + "cpu" + ], + "description": "Most features support only 'in' and 'out'. Some like traffic-policy support 'cpu'.\nSome features DO NOT have any direction.\nThis validation IS NOT made by the schemas.\n", + "title": "Direction" + }, + "address_type": { + "type": "string", + "enum": [ + "ipv4", + "ipv6", + "mac" + ], + "description": "Supported only for the following features:\n- acl: [ipv4, ipv6, mac] if direction is 'out'\n- multicast: [ipv4, ipv6]\n- route: [ipv4, ipv6]\nThis validation IS NOT made by the schemas.\n", + "title": "Address Type" + }, + "layer3": { + "type": "boolean", + "description": "Supported only for the 'ip' feature\n", + "title": "Layer3" + }, + "vrf": { + "type": "string", + "description": "Supported only for the 'route' feature.\nThis validation IS NOT made by the schemas.\n", + "title": "VRF" + }, + "prefix": { + "type": "string", + "description": "Supported only for the 'route' feature.\nMandatory for the 'route' feature.\nThis validation IS NOT made by the schemas.\n", + "title": "Prefix" + }, + "units_packets": { + "type": "boolean", + "title": "Units Packets" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Features" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Hardware Counters" + }, + "internal_vlan_order": { + "type": "object", + "description": "Internal vlan allocation order and range.", + "properties": { + "allocation": { + "type": "string", + "enum": [ + "ascending", + "descending" + ], + "title": "Allocation" + }, + "range": { + "type": "object", + "properties": { + "beginning": { + "type": "integer", + "description": "First VLAN ID.", + "minimum": 2, + "maximum": 4094, + "title": "Beginning" + }, + "ending": { + "type": "integer", + "description": "Last VLAN ID.", + "minimum": 2, + "maximum": 4094, + "title": "Ending" + } + }, + "required": [ + "beginning", + "ending" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Range" + } + }, + "required": [ + "allocation" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "default": { + "allocation": "ascending", + "range": { + "beginning": 1006, + "ending": 1199 + } + }, + "title": "Internal VLAN Order" + }, + "ipv6_mgmt_destination_networks": { + "description": "List of IPv6 prefixes to configure as static routes towards the OOB IPv6 Management interface gateway.\nReplaces the default route.\n", + "type": "array", + "items": { + "type": "string", + "description": "IPv6_network/Mask." + }, + "title": "IPv6 Management Destination Networks" + }, + "ipv6_mgmt_gateway": { + "type": "string", + "format": "ipv6", + "description": "OOB Management interface gateway in IPv6 format.\nUsed as next-hop for default gateway or static routes defined under 'ipv6_mgmt_destination_networks'.", + "title": "IPv6 Management Gateway" + }, + "is_deployed": { + "description": "If the device is already deployed in the fabric.\nWhen set to false, interfaces toward this device may be shutdown depending on the `shutdown_interfaces_towards_undeployed_peers` setting.\nFurthermore `eos_config_deploy_cvp` will not attempt to move or apply configurations to the device.\n", + "type": "boolean", + "default": true, + "title": "Is Deployed" + }, + "isis_advertise_passive_only": { + "type": "boolean", + "default": false, + "title": "ISIS Advertise Passive Only" + }, + "isis_area_id": { + "type": "string", + "default": "49.0001", + "title": "ISIS Area ID" + }, + "isis_default_circuit_type": { + "type": "string", + "enum": [ + "level-1-2", + "level-1", + "level-2" + ], + "default": "level-2", + "description": "These fabric level parameters can be used with core_interfaces running ISIS, and may be overridden on link profile or link level.", + "title": "ISIS Default Circuit Type" + }, + "isis_default_is_type": { + "title": "ISIS Default IS Type", + "type": "string", + "enum": [ + "level-1-2", + "level-1", + "level-2" + ], + "default": "level-2" + }, + "isis_default_metric": { + "type": "integer", + "default": 50, + "description": "These fabric level parameters can be used with core_interfaces running ISIS, and may be overridden at link profile or link level.", + "title": "ISIS Default Metric" + }, + "isis_maximum_paths": { + "description": "Number of path to configure in ECMP for ISIS.", + "type": "integer", + "title": "ISIS Maximum Paths" + }, + "isis_ti_lfa": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "default": false, + "title": "Enabled" + }, + "protection": { + "type": "string", + "enum": [ + "link", + "node" + ], + "title": "Protection" + }, + "local_convergence_delay": { + "description": "Local convergence delay in milliseconds.", + "type": "integer", + "default": 10000, + "title": "Local Convergence Delay" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "ISIS TI LFA" + }, + "l3_edge": { + "type": "object", + "properties": { + "p2p_links_ip_pools": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "P2P pool name.", + "title": "Name" + }, + "ipv4_pool": { + "type": "string", + "description": "IPv4 address/Mask.", + "title": "IPv4 Pool" + }, + "prefix_size": { + "type": "integer", + "description": "Subnet mask size.", + "default": 31, + "minimum": 8, + "maximum": 31, + "title": "Prefix Size" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "P2P Links IP Pools" + }, + "p2p_links_profiles": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "P2P profile name. Any variable supported under `p2p_links` can be inherited from a profile.", + "title": "Name" + }, + "id": { + "type": "integer", + "description": "Unique id per subnet_summary. Used to calculate ip addresses.\nRequired with ip_pool. ID starting from 1.\n", + "title": "ID" + }, + "speed": { + "type": "string", + "description": "Speed should be set in the format `` or `forced ` or `auto `.", + "title": "Speed" + }, + "ip_pool": { + "type": "string", + "description": "P2P pool name. IP Pool defined under p2p_links_ip_pools. A /31 will be taken from the pool per P2P link.", + "title": "IP Pool" + }, + "subnet": { + "type": "string", + "description": "IPv4 address/Mask. Subnet used on this P2P link.", + "title": "Subnet" + }, + "ip": { + "type": "array", + "description": "Specific IP addresses used on this P2P link.", + "items": { + "type": "string", + "description": "Node IPv4 address/Mask." + }, + "title": "IP" + }, + "ipv6_enable": { + "type": "boolean", + "default": false, + "description": "Allows turning on ipv6 for the link or profile (also autodetected based on underlay_rfc5549 and include_in_underlay_protocol).", + "title": "IPv6 Enable" + }, + "nodes": { + "type": "array", + "description": "Nodes where this link should be configured.", + "items": { + "type": "string", + "description": "The values can be < node_a >, < node_b >.\nex.- [ core-1-isis-sr-ldp, core-2-ospf-ldp ].\n" + }, + "title": "Nodes" + }, + "interfaces": { + "type": "array", + "description": "Interfaces where this link should be configured and Required unless using port-channels.", + "items": { + "type": "string", + "description": "The value can be like < node_a_interface >, < node_b_interface >.\nex. - [ Ethernet2, Ethernet2 ].\n" + }, + "title": "Interfaces" + }, + "as": { + "type": "array", + "description": "AS numbers for BGP.\nRequired with bgp peering.\n", + "items": { + "type": "string", + "description": "The values can be like [\"node_a_as\", \"node_b_as\"]." + }, + "title": "As" + }, + "descriptions": { + "type": "array", + "description": "Interface description.", + "items": { + "type": "string" + }, + "title": "Descriptions" + }, + "include_in_underlay_protocol": { + "type": "boolean", + "default": true, + "description": "Add this interface to underlay routing protocol.", + "title": "Include In Underlay Protocol" + }, + "isis_hello_padding": { + "type": "boolean", + "default": false, + "title": "ISIS Hello Padding" + }, + "isis_metric": { + "type": "integer", + "title": "ISIS Metric" + }, + "isis_circuit_type": { + "type": "string", + "enum": [ + "level-1", + "level-2", + "level-1-2" + ], + "title": "ISIS Circuit Type" + }, + "isis_authentication_mode": { + "type": "string", + "enum": [ + "md5", + "text" + ], + "title": "ISIS Authentication Mode" + }, + "isis_authentication_key": { + "type": "string", + "description": "Type-7 encrypted password.", + "title": "ISIS Authentication Key" + }, + "mpls_ip": { + "type": "boolean", + "description": "MPLS parameters. Default value is true if switch.mpls_lsr is true.", + "title": "MPLS IP" + }, + "mpls_ldp": { + "type": "boolean", + "description": "MPLS parameters. Default value is true for ldp underlay variants, otherwise false.", + "title": "MPLS LDP" + }, + "mtu": { + "type": "integer", + "description": "MTU for this P2P link. Default value same as p2p_uplinks_mtu.", + "title": "MTU" + }, + "bfd": { + "type": "boolean", + "default": false, + "description": "Enable BFD (only considered for BGP).", + "title": "BFD" + }, + "ptp": { + "description": "PTP parameters.", + "type": "object", + "properties": { + "enabled": { "type": "boolean", - "title": "IP Proxy ARP" - }, - "traffic_policy": { - "type": "object", - "properties": { - "input": { - "type": "string", - "description": "Ingress traffic policy", - "title": "Input" - }, - "output": { - "type": "string", - "description": "Egress traffic policy", - "title": "Output" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Traffic Policy" - }, - "bgp": { - "type": "object", - "properties": { - "session_tracker": { - "type": "string", - "description": "Name of session tracker", - "title": "Session Tracker" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "BGP" - }, - "peer": { - "type": "string", - "description": "Key only used for documentation or validation purposes", - "title": "Peer" - }, - "peer_interface": { - "type": "string", - "description": "Key only used for documentation or validation purposes", - "title": "Peer Interface" - }, - "peer_type": { - "type": "string", - "description": "Key only used for documentation or validation purposes", - "title": "Peer Type" - }, - "sflow": { - "type": "object", - "properties": { - "enable": { - "type": "boolean", - "title": "Enable" - }, - "egress": { - "type": "object", - "properties": { - "enable": { - "type": "boolean", - "title": "Enable" - }, - "unmodified_enable": { - "type": "boolean", - "title": "Unmodified Enable" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Egress" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Sflow" - }, - "port_profile": { + "default": false, + "description": "Enable PTP.", + "title": "Enabled" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "PTP" + }, + "sflow": { + "type": "boolean", + "description": "Enable sFlow. Overrides `fabric_sflow` setting.", + "title": "Sflow" + }, + "qos_profile": { + "type": "string", + "description": "QOS service profile.", + "title": "QOS Profile" + }, + "macsec_profile": { + "type": "string", + "description": "MAC security profile.", + "title": "Macsec Profile" + }, + "port_channel": { + "description": "Port-channel parameters.", + "type": "object", + "properties": { + "mode": { "type": "string", - "description": "Key only used for documentation or validation purposes", - "title": "Port Profile" + "default": "active", + "title": "Mode" }, - "uc_tx_queues": { + "nodes_child_interfaces": { "type": "array", "items": { "type": "object", "properties": { - "id": { - "type": "integer", - "description": "TX-Queue ID", - "title": "ID" + "node": { + "type": "string", + "title": "Node" }, - "random_detect": { - "type": "object", - "properties": { - "ecn": { - "description": "Explicit Congestion Notification", - "type": "object", - "properties": { - "count": { - "type": "boolean", - "description": "Enable counter for random-detect ECNs", - "title": "Count" - }, - "threshold": { - "type": "object", - "properties": { - "units": { - "type": "string", - "enum": [ - "segments", - "bytes", - "kbytes", - "mbytes", - "milliseconds" - ], - "description": "Indicate the units to be used for the threshold values", - "title": "Units" - }, - "min": { - "type": "integer", - "minimum": 1, - "maximum": 256000000, - "description": "Set the random-detect ECN minimum-threshold", - "title": "Min" - }, - "max": { - "type": "integer", - "minimum": 1, - "maximum": 256000000, - "description": "Set the random-detect ECN maximum-threshold", - "title": "Max" - }, - "max_probability": { - "type": "integer", - "minimum": 1, - "maximum": 100, - "description": "Set the random-detect ECN max-mark-probability", - "title": "Max Probability" - }, - "weight": { - "type": "integer", - "minimum": 0, - "maximum": 15, - "description": "Set the random-detect ECN weight", - "title": "Weight" - } - }, - "required": [ - "units", - "min", - "max" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Threshold" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Ecn" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} + "interfaces": { + "type": "array", + "description": "List of node interfaces. Ex.- [ 'node1 interface1', 'node1 interface2' ].", + "items": { + "type": "string" }, - "title": "Random Detect" + "title": "Interfaces" } }, - "required": [ - "id" - ], "additionalProperties": false, "patternProperties": { "^_.+$": {} - } - }, - "title": "Uc TX Queues" - }, - "tx_queues": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "description": "TX-Queue ID", - "title": "ID" - }, - "random_detect": { - "type": "object", - "properties": { - "ecn": { - "description": "Explicit Congestion Notification", - "type": "object", - "properties": { - "count": { - "type": "boolean", - "description": "Enable counter for random-detect ECNs", - "title": "Count" - }, - "threshold": { - "type": "object", - "properties": { - "units": { - "type": "string", - "enum": [ - "segments", - "bytes", - "kbytes", - "mbytes", - "milliseconds" - ], - "description": "Indicate the units to be used for the threshold values", - "title": "Units" - }, - "min": { - "type": "integer", - "minimum": 1, - "maximum": 256000000, - "description": "Set the random-detect ECN minimum-threshold", - "title": "Min" - }, - "max": { - "type": "integer", - "minimum": 1, - "maximum": 256000000, - "description": "Set the random-detect ECN maximum-threshold", - "title": "Max" - }, - "max_probability": { - "type": "integer", - "minimum": 1, - "maximum": 100, - "description": "Set the random-detect ECN max-mark-probability", - "title": "Max Probability" - }, - "weight": { - "type": "integer", - "minimum": 0, - "maximum": 15, - "description": "Set the random-detect ECN weight", - "title": "Weight" - } - }, - "required": [ - "units", - "max", - "max_probability" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Threshold" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Ecn" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Random Detect" - } }, "required": [ - "id" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } + "node" + ] }, - "title": "TX Queues" + "title": "Nodes Child Interfaces" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Port Channel" + }, + "raw_eos_cli": { + "type": "string", + "description": "EOS CLI rendered directly on the point-to-point interface in the final EOS configuration.", + "title": "Raw EOS CLI" + }, + "structured_config": { + "type": "object", + "description": "Custom structured config for interfaces\nNote! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces.", + "title": "Structured Config" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "P2P Links Profiles" + }, + "p2p_links": { + "type": "array", + "items": { + "type": "object", + "properties": { + "nodes": { + "type": "array", + "description": "Nodes where this link should be configured.", + "items": { + "type": "string", + "description": "The values can be < node_a >, < node_b >.\nex.- [ core-1-isis-sr-ldp, core-2-ospf-ldp ].\n" + }, + "title": "Nodes" + }, + "profile": { + "type": "string", + "description": "P2P profile name. Profile defined under p2p_profiles.", + "title": "Profile" + }, + "id": { + "type": "integer", + "description": "Unique id per subnet_summary. Used to calculate ip addresses.\nRequired with ip_pool. ID starting from 1.\n", + "title": "ID" + }, + "speed": { + "type": "string", + "description": "Speed should be set in the format `` or `forced ` or `auto `.", + "title": "Speed" + }, + "ip_pool": { + "type": "string", + "description": "P2P pool name. IP Pool defined under p2p_links_ip_pools. A /31 will be taken from the pool per P2P link.", + "title": "IP Pool" + }, + "subnet": { + "type": "string", + "description": "IPv4 address/Mask. Subnet used on this P2P link.", + "title": "Subnet" + }, + "ip": { + "type": "array", + "description": "Specific IP addresses used on this P2P link.", + "items": { + "type": "string", + "description": "Node IPv4 address/Mask." + }, + "title": "IP" + }, + "ipv6_enable": { + "type": "boolean", + "default": false, + "description": "Allows turning on ipv6 for the link or profile (also autodetected based on underlay_rfc5549 and include_in_underlay_protocol).", + "title": "IPv6 Enable" + }, + "interfaces": { + "type": "array", + "description": "Interfaces where this link should be configured and Required unless using port-channels.", + "items": { + "type": "string", + "description": "The value can be like < node_a_interface >, < node_b_interface >.\nex. - [ Ethernet2, Ethernet2 ].\n" + }, + "title": "Interfaces" + }, + "as": { + "type": "array", + "description": "AS numbers for BGP.\nRequired with bgp peering.\n", + "items": { + "type": "string", + "description": "The values can be like [\"node_a_as\", \"node_b_as\"]." + }, + "title": "As" + }, + "descriptions": { + "type": "array", + "description": "Interface description.", + "items": { + "type": "string" + }, + "title": "Descriptions" + }, + "include_in_underlay_protocol": { + "type": "boolean", + "default": true, + "description": "Add this interface to underlay routing protocol.", + "title": "Include In Underlay Protocol" + }, + "isis_hello_padding": { + "type": "boolean", + "default": false, + "title": "ISIS Hello Padding" + }, + "isis_metric": { + "type": "integer", + "title": "ISIS Metric" + }, + "isis_circuit_type": { + "type": "string", + "enum": [ + "level-1", + "level-2", + "level-1-2" + ], + "title": "ISIS Circuit Type" + }, + "isis_authentication_mode": { + "type": "string", + "enum": [ + "md5", + "text" + ], + "title": "ISIS Authentication Mode" + }, + "isis_authentication_key": { + "type": "string", + "description": "Type-7 encrypted password.", + "title": "ISIS Authentication Key" + }, + "mpls_ip": { + "type": "boolean", + "description": "MPLS parameters. Default value is true if switch.mpls_lsr is true.", + "title": "MPLS IP" + }, + "mpls_ldp": { + "type": "boolean", + "description": "MPLS parameters. Default value is true for ldp underlay variants, otherwise false.", + "title": "MPLS LDP" + }, + "mtu": { + "type": "integer", + "description": "MTU for this P2P link. Default value same as p2p_uplinks_mtu.", + "title": "MTU" + }, + "bfd": { + "type": "boolean", + "default": false, + "description": "Enable BFD (only considered for BGP).", + "title": "BFD" + }, + "ptp": { + "description": "PTP parameters.", + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "default": false, + "description": "Enable PTP.", + "title": "Enabled" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "PTP" + }, + "sflow": { + "type": "boolean", + "description": "Enable sFlow. Overrides `fabric_sflow` setting.", + "title": "Sflow" + }, + "qos_profile": { + "type": "string", + "description": "QOS service profile.", + "title": "QOS Profile" + }, + "macsec_profile": { + "type": "string", + "description": "MAC security profile.", + "title": "Macsec Profile" + }, + "port_channel": { + "description": "Port-channel parameters.", + "type": "object", + "properties": { + "mode": { + "type": "string", + "default": "active", + "title": "Mode" }, - "vrrp_ids": { + "nodes_child_interfaces": { "type": "array", - "description": "VRRP model.", "items": { "type": "object", "properties": { - "id": { - "type": "integer", - "description": "VRID", - "title": "ID" - }, - "priority_level": { - "type": "integer", - "description": "Instance priority", - "minimum": 1, - "maximum": 254, - "title": "Priority Level" - }, - "advertisement": { - "type": "object", - "properties": { - "interval": { - "type": "integer", - "description": "Interval in seconds", - "minimum": 1, - "maximum": 255, - "title": "Interval" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Advertisement" - }, - "preempt": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "title": "Enabled" - }, - "delay": { - "type": "object", - "properties": { - "minimum": { - "type": "integer", - "description": "Minimum preempt delay in seconds", - "minimum": 0, - "maximum": 3600, - "title": "Minimum" - }, - "reload": { - "type": "integer", - "description": "Reload preempt delay in seconds", - "minimum": 0, - "maximum": 3600, - "title": "Reload" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Delay" - } - }, - "required": [ - "enabled" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Preempt" - }, - "timers": { - "type": "object", - "properties": { - "delay": { - "type": "object", - "properties": { - "reload": { - "type": "integer", - "description": "Delay after reload in seconds.", - "minimum": 0, - "maximum": 3600, - "title": "Reload" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Delay" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Timers" + "node": { + "type": "string", + "title": "Node" }, - "tracked_object": { + "interfaces": { "type": "array", + "description": "List of node interfaces. Ex.- [ 'node1 interface1', 'node1 interface2' ].", "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Tracked object name", - "title": "Name" - }, - "decrement": { - "type": "integer", - "minimum": 1, - "maximum": 254, - "description": "Decrement VRRP priority by 1-254", - "title": "Decrement" - }, - "shutdown": { - "type": "boolean", - "title": "Shutdown" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "name" - ] - }, - "title": "Tracked Object" - }, - "ipv4": { - "type": "object", - "properties": { - "address": { - "type": "string", - "description": "Virtual IPv4 address", - "title": "Address" - }, - "version": { - "type": "integer", - "enum": [ - 2, - 3 - ], - "title": "Version" - } - }, - "required": [ - "address" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "IPv4" - }, - "ipv6": { - "type": "object", - "properties": { - "address": { - "type": "string", - "description": "Virtual IPv6 address", - "title": "Address" - } - }, - "required": [ - "address" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} + "type": "string" }, - "title": "IPv6" + "title": "Interfaces" } }, "additionalProperties": false, @@ -12578,2699 +4896,2719 @@ "^_.+$": {} }, "required": [ - "id" + "node" ] }, - "title": "VRRP IDs" - }, - "eos_cli": { - "type": "string", - "description": "Multiline EOS CLI rendered directly on the ethernet interface in the final EOS configuration", - "title": "EOS CLI" + "title": "Nodes Child Interfaces" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} }, + "title": "Port Channel" + }, + "raw_eos_cli": { + "type": "string", + "description": "EOS CLI rendered directly on the point-to-point interface in the final EOS configuration.", + "title": "Raw EOS CLI" + }, + "structured_config": { + "type": "object", + "description": "Custom structured config for interfaces\nNote! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces.", "title": "Structured Config" } }, + "required": [ + "nodes" + ], "additionalProperties": false, "patternProperties": { "^_.+$": {} - }, - "required": [ - "profile" - ] + } }, - "title": "L3 Interfaces Profiles" - }, - "l3_interfaces": { - "type": "array", - "items": { - "type": "object", - "properties": { - "node": { - "type": "string", - "description": "Device on which the interface should be configured.", - "title": "Node" - }, - "profile": { - "type": "string", - "description": "L3 interface profile name. Profile defined under l3_interfaces_profiles.", - "title": "Profile" - }, - "interface": { + "title": "P2P Links" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "L3 Edge" + }, + "l3_interface_profiles": { + "type": "array", + "description": "PREVIEW: This key is currently not supported\n\nProfiles to inherit common settings for l3_interfaces defined under the node type key.\nThese profiles will *not* work for `l3_interfaces` defined under `vrfs`.", + "items": { + "type": "object", + "properties": { + "profile": { + "type": "string", + "description": "L3 interface profile name. Any variable supported under `l3_interfaces` can be inherited from a profile.", + "title": "Profile" + }, + "name": { + "type": "string", + "description": "Ethernet interface name like 'Ethernet2'.", + "pattern": "Ethernet[\\d/]+", + "title": "Name" + }, + "description": { + "type": "string", + "description": "Interface description.\nIf not set a default description will be configured with '[[ ]]'", + "title": "Description" + }, + "ip": { + "type": "string", + "description": "Node IPv4 address/Mask or 'dhcp'.", + "title": "IP" + }, + "set_default_route": { + "type": "boolean", + "default": false, + "description": "Insert a default route to the `peer_ip` if `ip` is an ip address\nor configure to accept a default route from DHCP if `ip` is `dhcp`.\n\nAVD will error out if set to true, `ip` is an ip address and `peer_ip` is missing.", + "title": "Set Default Route" + }, + "enabled": { + "type": "boolean", + "default": true, + "description": "Enable or Shutdown the interface.", + "title": "Enabled" + }, + "speed": { + "type": "string", + "description": "Speed should be set in the format `` or `forced ` or `auto `.", + "title": "Speed" + }, + "peer": { + "type": "string", + "description": "The peer device name. Used for description and documentation", + "title": "Peer" + }, + "peer_interface": { + "type": "string", + "description": "The peer device interface. Used for description and documentation", + "title": "Peer Interface" + }, + "peer_ip": { + "type": "string", + "description": "The peer device IPv4 address (no mask). Used as default route gateway if `set_default_route` is true and `ip` is an IP address.", + "title": "Peer IP" + }, + "qos_profile": { + "type": "string", + "description": "QOS service profile.", + "title": "QOS Profile" + }, + "wan_carrier": { + "type": "string", + "description": "The WAN Carrier this interface is connected to.\nThis is used to infer the path-groups in which this interface should be configured.", + "title": "Wan Carrier" + }, + "wan_circuit_id": { + "type": "string", + "description": "The WAN Circuit ID for this interface.\nThis is not rendered in the configuration but used for WAN designs.", + "title": "Wan Circuit ID" + }, + "connected_to_pathfinder": { + "type": "boolean", + "default": true, + "description": "For a WAN interface (`wan_path_group` is set), allow to disable the static tunnel towards Pathfinders.", + "title": "Connected To Pathfinder" + }, + "raw_eos_cli": { + "type": "string", + "description": "EOS CLI rendered directly on the interface in the final EOS configuration.", + "title": "Raw EOS CLI" + }, + "structured_config": { + "type": "object", + "description": "Custom structured config for the Ethernet interface.", + "properties": { + "name": { "type": "string", - "description": "Ethernet interface name like 'Ethernet2'.", - "pattern": "Ethernet[\\d/]+", - "title": "Interface" + "title": "Name" }, "description": { "type": "string", - "description": "Interface description.\nIf not set a default description will be configured with '[[ ]]'", "title": "Description" }, - "ip": { - "type": "string", - "description": "Node IPv4 address/Mask or 'dhcp'.", - "title": "IP" - }, - "dhcp_client_accept_default_route": { + "shutdown": { "type": "boolean", - "default": false, - "description": "Supported if `ip` is `dhcp`.\nAccepts default route from DHCP.", - "title": "DHCP Client Accept Default Route" + "title": "Shutdown" }, - "enabled": { - "type": "boolean", - "default": true, - "description": "Enable or Shutdown the interface.", - "title": "Enabled" + "load_interval": { + "type": "integer", + "minimum": 0, + "maximum": 600, + "description": "Interval in seconds for updating interface counters\"", + "title": "Load Interval" }, "speed": { "type": "string", "description": "Speed should be set in the format `` or `forced ` or `auto `.", "title": "Speed" }, - "peer": { - "type": "string", - "description": "The peer device name. Used for description and documentation", - "title": "Peer" + "mtu": { + "type": "integer", + "minimum": 68, + "maximum": 65535, + "title": "MTU" }, - "peer_interface": { - "type": "string", - "description": "The peer device interface. Used for description and documentation", - "title": "Peer Interface" + "l2_mtu": { + "type": "integer", + "minimum": 68, + "maximum": 65535, + "description": "\"l2_mtu\" should only be defined for platforms supporting the \"l2 mtu\" CLI\n", + "title": "L2 MTU" }, - "peer_ip": { - "type": "string", - "description": "The peer device IP. Used for description and documentation", - "title": "Peer IP" + "l2_mru": { + "type": "integer", + "minimum": 68, + "maximum": 65535, + "description": "\"l2_mru\" should only be defined for platforms supporting the \"l2 mru\" CLI\n", + "title": "L2 MRU" }, - "qos_profile": { + "vlans": { "type": "string", - "description": "QOS service profile.", - "title": "QOS Profile" + "description": "List of switchport vlans as string\nFor a trunk port this would be a range like \"1-200,300\"\nFor an access port this would be a single vlan \"123\"\n", + "title": "VLANs" }, - "raw_eos_cli": { + "native_vlan": { + "type": "integer", + "title": "Native VLAN" + }, + "native_vlan_tag": { + "type": "boolean", + "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence", + "title": "Native VLAN Tag" + }, + "mode": { "type": "string", - "description": "EOS CLI rendered directly on the interface in the final EOS configuration.", - "title": "Raw EOS CLI" + "enum": [ + "access", + "dot1q-tunnel", + "trunk", + "trunk phone" + ], + "title": "Mode" }, - "structured_config": { + "phone": { "type": "object", - "description": "Custom structured config for the Ethernet interface.", "properties": { - "name": { + "trunk": { "type": "string", - "title": "Name" + "enum": [ + "tagged", + "tagged phone", + "untagged", + "untagged phone" + ], + "title": "Trunk" }, - "description": { - "type": "string", - "title": "Description" + "vlan": { + "type": "integer", + "minimum": 1, + "maximum": 4094, + "title": "VLAN" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Phone" + }, + "l2_protocol": { + "type": "object", + "properties": { + "encapsulation_dot1q_vlan": { + "type": "integer", + "description": "Vlan tag to configure on sub-interface", + "title": "Encapsulation Dot1Q VLAN" }, - "shutdown": { + "forwarding_profile": { + "type": "string", + "description": "L2 protocol forwarding profile", + "title": "Forwarding Profile" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "L2 Protocol" + }, + "trunk_groups": { + "type": "array", + "items": { + "type": "string" + }, + "title": "Trunk Groups" + }, + "type": { + "type": "string", + "enum": [ + "routed", + "switched", + "l3dot1q", + "l2dot1q", + "port-channel-member" + ], + "description": "l3dot1q and l2dot1q are used for sub-interfaces. The parent interface should be defined as routed.\nInterface will not be listed in device documentation, unless \"type\" is set.\n", + "title": "Type" + }, + "snmp_trap_link_change": { + "type": "boolean", + "title": "Snmp Trap Link Change" + }, + "address_locking": { + "type": "object", + "properties": { + "ipv4": { "type": "boolean", - "title": "Shutdown" + "description": "Enable address locking for IPv4", + "title": "IPv4" }, - "load_interval": { - "type": "integer", - "minimum": 0, - "maximum": 600, - "description": "Interval in seconds for updating interface counters\"", - "title": "Load Interval" + "ipv6": { + "type": "boolean", + "description": "Enable address locking for IPv6", + "title": "IPv6" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Address Locking" + }, + "flowcontrol": { + "type": "object", + "properties": { + "received": { + "type": "string", + "enum": [ + "desired", + "on", + "off" + ], + "title": "Received" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Flowcontrol" + }, + "vrf": { + "type": "string", + "description": "VRF name", + "title": "VRF" + }, + "flow_tracker": { + "type": "object", + "properties": { + "sampled": { + "type": "string", + "description": "Sampled flow tracker name.", + "title": "Sampled" }, - "speed": { + "hardware": { "type": "string", - "description": "Speed should be set in the format `` or `forced ` or `auto `.", - "title": "Speed" + "description": "Hardware flow tracker name.", + "title": "Hardware" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Flow Tracker" + }, + "error_correction_encoding": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "default": true, + "title": "Enabled" }, - "mtu": { - "type": "integer", - "minimum": 68, - "maximum": 65535, - "title": "MTU" + "fire_code": { + "type": "boolean", + "title": "Fire Code" }, - "l2_mtu": { - "type": "integer", - "minimum": 68, - "maximum": 65535, - "description": "\"l2_mtu\" should only be defined for platforms supporting the \"l2 mtu\" CLI\n", - "title": "L2 MTU" + "reed_solomon": { + "type": "boolean", + "title": "Reed Solomon" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Error Correction Encoding" + }, + "link_tracking_groups": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Group name", + "title": "Name" + }, + "direction": { + "type": "string", + "enum": [ + "upstream", + "downstream" + ], + "title": "Direction" + } }, - "l2_mru": { - "type": "integer", - "minimum": 68, - "maximum": 65535, - "description": "\"l2_mru\" should only be defined for platforms supporting the \"l2 mru\" CLI\n", - "title": "L2 MRU" + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} }, - "vlans": { + "required": [ + "name" + ] + }, + "title": "Link Tracking Groups" + }, + "evpn_ethernet_segment": { + "type": "object", + "properties": { + "identifier": { "type": "string", - "description": "List of switchport vlans as string\nFor a trunk port this would be a range like \"1-200,300\"\nFor an access port this would be a single vlan \"123\"\n", - "title": "VLANs" - }, - "native_vlan": { - "type": "integer", - "title": "Native VLAN" - }, - "native_vlan_tag": { - "type": "boolean", - "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence", - "title": "Native VLAN Tag" + "description": "EVPN Ethernet Segment Identifier (Type 1 format)", + "title": "Identifier" }, - "mode": { + "redundancy": { "type": "string", "enum": [ - "access", - "dot1q-tunnel", - "trunk", - "trunk phone" + "all-active", + "single-active" ], - "title": "Mode" + "title": "Redundancy" }, - "phone": { + "designated_forwarder_election": { "type": "object", "properties": { - "trunk": { + "algorithm": { "type": "string", "enum": [ - "tagged", - "tagged phone", - "untagged", - "untagged phone" + "modulus", + "preference" ], - "title": "Trunk" + "title": "Algorithm" }, - "vlan": { - "type": "integer", - "minimum": 1, - "maximum": 4094, - "title": "VLAN" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Phone" - }, - "l2_protocol": { - "type": "object", - "properties": { - "encapsulation_dot1q_vlan": { + "preference_value": { "type": "integer", - "description": "Vlan tag to configure on sub-interface", - "title": "Encapsulation Dot1Q VLAN" + "minimum": 0, + "maximum": 65535, + "description": "Preference_value is only used when \"algorithm\" is \"preference\"", + "title": "Preference Value" }, - "forwarding_profile": { - "type": "string", - "description": "L2 protocol forwarding profile", - "title": "Forwarding Profile" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "L2 Protocol" - }, - "trunk_groups": { - "type": "array", - "items": { - "type": "string" - }, - "title": "Trunk Groups" - }, - "type": { - "type": "string", - "enum": [ - "routed", - "switched", - "l3dot1q", - "l2dot1q", - "port-channel-member" - ], - "description": "l3dot1q and l2dot1q are used for sub-interfaces. The parent interface should be defined as routed.\nInterface will not be listed in device documentation, unless \"type\" is set.\n", - "title": "Type" - }, - "snmp_trap_link_change": { - "type": "boolean", - "title": "Snmp Trap Link Change" - }, - "address_locking": { - "type": "object", - "properties": { - "ipv4": { + "dont_preempt": { "type": "boolean", - "description": "Enable address locking for IPv4", - "title": "IPv4" + "description": "Dont_preempt is only used when \"algorithm\" is \"preference\"", + "title": "Dont Preempt" }, - "ipv6": { - "type": "boolean", - "description": "Enable address locking for IPv6", - "title": "IPv6" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Address Locking" - }, - "flowcontrol": { - "type": "object", - "properties": { - "received": { - "type": "string", - "enum": [ - "desired", - "on", - "off" - ], - "title": "Received" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Flowcontrol" - }, - "vrf": { - "type": "string", - "description": "VRF name", - "title": "VRF" - }, - "flow_tracker": { - "type": "object", - "properties": { - "sampled": { - "type": "string", - "description": "Sampled flow tracker name.", - "title": "Sampled" + "hold_time": { + "type": "integer", + "title": "Hold Time" }, - "hardware": { - "type": "string", - "description": "Hardware flow tracker name.", - "title": "Hardware" + "subsequent_hold_time": { + "type": "integer", + "title": "Subsequent Hold Time" + }, + "candidate_reachability_required": { + "type": "boolean", + "title": "Candidate Reachability Required" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "Flow Tracker" + "title": "Designated Forwarder Election" }, - "error_correction_encoding": { + "mpls": { "type": "object", "properties": { - "enabled": { - "type": "boolean", - "default": true, - "title": "Enabled" - }, - "fire_code": { - "type": "boolean", - "title": "Fire Code" + "shared_index": { + "type": "integer", + "minimum": 1, + "maximum": 1024, + "title": "Shared Index" }, - "reed_solomon": { - "type": "boolean", - "title": "Reed Solomon" + "tunnel_flood_filter_time": { + "type": "integer", + "title": "Tunnel Flood Filter Time" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "Error Correction Encoding" - }, - "link_tracking_groups": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Group name", - "title": "Name" - }, - "direction": { - "type": "string", - "enum": [ - "upstream", - "downstream" - ], - "title": "Direction" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "name" - ] - }, - "title": "Link Tracking Groups" + "title": "MPLS" }, - "evpn_ethernet_segment": { + "route_target": { + "type": "string", + "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx", + "title": "Route Target" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "EVPN Ethernet Segment" + }, + "encapsulation_dot1q_vlan": { + "type": "integer", + "description": "VLAN tag to configure on sub-interface", + "title": "Encapsulation Dot1Q VLAN" + }, + "encapsulation_vlan": { + "type": "object", + "properties": { + "client": { "type": "object", "properties": { - "identifier": { - "type": "string", - "description": "EVPN Ethernet Segment Identifier (Type 1 format)", - "title": "Identifier" - }, - "redundancy": { - "type": "string", - "enum": [ - "all-active", - "single-active" - ], - "title": "Redundancy" - }, - "designated_forwarder_election": { + "dot1q": { "type": "object", "properties": { - "algorithm": { - "type": "string", - "enum": [ - "modulus", - "preference" - ], - "title": "Algorithm" - }, - "preference_value": { + "vlan": { "type": "integer", - "minimum": 0, - "maximum": 65535, - "description": "Preference_value is only used when \"algorithm\" is \"preference\"", - "title": "Preference Value" - }, - "dont_preempt": { - "type": "boolean", - "description": "Dont_preempt is only used when \"algorithm\" is \"preference\"", - "title": "Dont Preempt" + "description": "Client VLAN ID", + "title": "VLAN" }, - "hold_time": { + "outer": { "type": "integer", - "title": "Hold Time" + "description": "Client Outer VLAN ID", + "title": "Outer" }, - "subsequent_hold_time": { + "inner": { "type": "integer", - "title": "Subsequent Hold Time" - }, - "candidate_reachability_required": { - "type": "boolean", - "title": "Candidate Reachability Required" + "description": "Client Inner VLAN ID", + "title": "Inner" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "Designated Forwarder Election" + "title": "Dot1Q" }, - "mpls": { + "unmatched": { + "type": "boolean", + "title": "Unmatched" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Client" + }, + "network": { + "type": "object", + "description": "Network encapsulations are all optional and skipped if using client unmatched", + "properties": { + "dot1q": { "type": "object", "properties": { - "shared_index": { + "vlan": { "type": "integer", - "minimum": 1, - "maximum": 1024, - "title": "Shared Index" + "description": "Network VLAN ID", + "title": "VLAN" }, - "tunnel_flood_filter_time": { + "outer": { "type": "integer", - "title": "Tunnel Flood Filter Time" + "description": "Network outer VLAN ID", + "title": "Outer" + }, + "inner": { + "type": "integer", + "description": "Network inner VLAN ID", + "title": "Inner" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "MPLS" + "title": "Dot1Q" }, - "route_target": { - "type": "string", - "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx", - "title": "Route Target" + "client": { + "type": "boolean", + "title": "Client" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "EVPN Ethernet Segment" + "title": "Network" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Encapsulation VLAN" + }, + "vlan_id": { + "type": "integer", + "minimum": 1, + "maximum": 4094, + "title": "VLAN ID" + }, + "ip_address": { + "type": "string", + "description": "IPv4 address/mask or \"dhcp\"", + "title": "IP Address" + }, + "ip_address_secondaries": { + "type": "array", + "items": { + "type": "string" + }, + "title": "IP Address Secondaries" + }, + "dhcp_client_accept_default_route": { + "type": "boolean", + "description": "Install default-route obtained via DHCP", + "title": "DHCP Client Accept Default Route" + }, + "dhcp_server_ipv4": { + "type": "boolean", + "description": "Enable IPv4 DHCP server.", + "title": "DHCP Server IPv4" + }, + "dhcp_server_ipv6": { + "type": "boolean", + "description": "Enable IPv6 DHCP server.", + "title": "DHCP Server IPv6" + }, + "ip_helpers": { + "type": "array", + "items": { + "type": "object", + "properties": { + "ip_helper": { + "type": "string", + "title": "IP Helper" + }, + "source_interface": { + "type": "string", + "description": "Source interface name", + "title": "Source Interface" + }, + "vrf": { + "type": "string", + "description": "VRF name", + "title": "VRF" + } }, - "encapsulation_dot1q_vlan": { - "type": "integer", - "description": "VLAN tag to configure on sub-interface", - "title": "Encapsulation Dot1Q VLAN" + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} }, - "encapsulation_vlan": { + "required": [ + "ip_helper" + ] + }, + "title": "IP Helpers" + }, + "ip_nat": { + "type": "object", + "properties": { + "service_profile": { + "type": "string", + "description": "NAT interface profile.", + "title": "Service Profile" + }, + "destination": { "type": "object", "properties": { - "client": { - "type": "object", - "properties": { - "dot1q": { - "type": "object", - "properties": { - "vlan": { - "type": "integer", - "description": "Client VLAN ID", - "title": "VLAN" - }, - "outer": { - "type": "integer", - "description": "Client Outer VLAN ID", - "title": "Outer" - }, - "inner": { - "type": "integer", - "description": "Client Inner VLAN ID", - "title": "Inner" - } + "dynamic": { + "type": "array", + "items": { + "type": "object", + "properties": { + "access_list": { + "type": "string", + "title": "Access List" }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} + "comment": { + "type": "string", + "title": "Comment" }, - "title": "Dot1Q" + "pool_name": { + "type": "string", + "title": "Pool Name" + }, + "priority": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "title": "Priority" + } }, - "unmatched": { - "type": "boolean", - "title": "Unmatched" + "required": [ + "pool_name", + "access_list" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} } }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Client" + "title": "Dynamic" }, - "network": { - "type": "object", - "description": "Network encapsulations are all optional and skipped if using client unmatched", - "properties": { - "dot1q": { - "type": "object", - "properties": { - "vlan": { - "type": "integer", - "description": "Network VLAN ID", - "title": "VLAN" - }, - "outer": { - "type": "integer", - "description": "Network outer VLAN ID", - "title": "Outer" - }, - "inner": { - "type": "integer", - "description": "Network inner VLAN ID", - "title": "Inner" - } + "static": { + "type": "array", + "items": { + "type": "object", + "properties": { + "access_list": { + "type": "string", + "description": "'access_list' and 'group' are mutual exclusive", + "title": "Access List" + }, + "comment": { + "type": "string", + "title": "Comment" + }, + "direction": { + "type": "string", + "enum": [ + "egress", + "ingress" + ], + "description": "Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware platform.\nEOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW.\n", + "title": "Direction" }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} + "group": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "description": "'access_list' and 'group' are mutual exclusive", + "title": "Group" }, - "title": "Dot1Q" + "original_ip": { + "type": "string", + "description": "IPv4 address", + "title": "Original IP" + }, + "original_port": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "title": "Original Port" + }, + "priority": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "title": "Priority" + }, + "protocol": { + "type": "string", + "enum": [ + "udp", + "tcp" + ], + "title": "Protocol" + }, + "translated_ip": { + "type": "string", + "description": "IPv4 address", + "title": "Translated IP" + }, + "translated_port": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "description": "requires 'original_port'", + "title": "Translated Port" + } }, - "client": { - "type": "boolean", - "title": "Client" + "required": [ + "translated_ip", + "original_ip" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} } }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Network" + "title": "Static" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "Encapsulation VLAN" - }, - "vlan_id": { - "type": "integer", - "minimum": 1, - "maximum": 4094, - "title": "VLAN ID" - }, - "ip_address": { - "type": "string", - "description": "IPv4 address/mask or \"dhcp\"", - "title": "IP Address" - }, - "ip_address_secondaries": { - "type": "array", - "items": { - "type": "string" - }, - "title": "IP Address Secondaries" - }, - "dhcp_client_accept_default_route": { - "type": "boolean", - "description": "Install default-route obtained via DHCP", - "title": "DHCP Client Accept Default Route" - }, - "dhcp_server_ipv4": { - "type": "boolean", - "description": "Enable IPv4 DHCP server.", - "title": "DHCP Server IPv4" - }, - "dhcp_server_ipv6": { - "type": "boolean", - "description": "Enable IPv6 DHCP server.", - "title": "DHCP Server IPv6" - }, - "ip_helpers": { - "type": "array", - "items": { - "type": "object", - "properties": { - "ip_helper": { - "type": "string", - "title": "IP Helper" - }, - "source_interface": { - "type": "string", - "description": "Source interface name", - "title": "Source Interface" - }, - "vrf": { - "type": "string", - "description": "VRF name", - "title": "VRF" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "ip_helper" - ] - }, - "title": "IP Helpers" + "title": "Destination" }, - "ip_nat": { + "source": { "type": "object", "properties": { - "service_profile": { - "type": "string", - "description": "NAT interface profile.", - "title": "Service Profile" - }, - "destination": { - "type": "object", - "properties": { - "dynamic": { - "type": "array", - "items": { - "type": "object", - "properties": { - "access_list": { - "type": "string", - "title": "Access List" - }, - "comment": { - "type": "string", - "title": "Comment" - }, - "pool_name": { - "type": "string", - "title": "Pool Name" - }, - "priority": { - "type": "integer", - "minimum": 0, - "maximum": 4294967295, - "title": "Priority" - } - }, - "required": [ - "pool_name", - "access_list" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } + "dynamic": { + "type": "array", + "items": { + "type": "object", + "properties": { + "access_list": { + "type": "string", + "title": "Access List" }, - "title": "Dynamic" - }, - "static": { - "type": "array", - "items": { - "type": "object", - "properties": { - "access_list": { - "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", - "title": "Access List" - }, - "comment": { - "type": "string", - "title": "Comment" - }, - "direction": { - "type": "string", - "enum": [ - "egress", - "ingress" - ], - "description": "Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware platform.\nEOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW.\n", - "title": "Direction" - }, - "group": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", - "title": "Group" - }, - "original_ip": { - "type": "string", - "description": "IPv4 address", - "title": "Original IP" - }, - "original_port": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "title": "Original Port" - }, - "priority": { - "type": "integer", - "minimum": 0, - "maximum": 4294967295, - "title": "Priority" - }, - "protocol": { - "type": "string", - "enum": [ - "udp", - "tcp" - ], - "title": "Protocol" - }, - "translated_ip": { - "type": "string", - "description": "IPv4 address", - "title": "Translated IP" - }, - "translated_port": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "description": "requires 'original_port'", - "title": "Translated Port" - } - }, - "required": [ - "translated_ip", - "original_ip" + "comment": { + "type": "string", + "title": "Comment" + }, + "nat_type": { + "type": "string", + "enum": [ + "overload", + "pool", + "pool-address-only", + "pool-full-cone" ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } + "title": "Nat Type" }, - "title": "Static" + "pool_name": { + "type": "string", + "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone\nignored if 'nat_type' is overload\n", + "title": "Pool Name" + }, + "priority": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "title": "Priority" + } + }, + "required": [ + "nat_type", + "access_list" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} } }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Destination" + "title": "Dynamic" }, - "source": { - "type": "object", - "properties": { - "dynamic": { - "type": "array", - "items": { - "type": "object", - "properties": { - "access_list": { - "type": "string", - "title": "Access List" - }, - "comment": { - "type": "string", - "title": "Comment" - }, - "nat_type": { - "type": "string", - "enum": [ - "overload", - "pool", - "pool-address-only", - "pool-full-cone" - ], - "title": "Nat Type" - }, - "pool_name": { - "type": "string", - "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone\nignored if 'nat_type' is overload\n", - "title": "Pool Name" - }, - "priority": { - "type": "integer", - "minimum": 0, - "maximum": 4294967295, - "title": "Priority" - } - }, - "required": [ - "nat_type", - "access_list" + "static": { + "type": "array", + "items": { + "type": "object", + "properties": { + "access_list": { + "type": "string", + "description": "'access_list' and 'group' are mutual exclusive", + "title": "Access List" + }, + "comment": { + "type": "string", + "title": "Comment" + }, + "direction": { + "type": "string", + "enum": [ + "egress", + "ingress" ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } + "description": "Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware platform.\nEOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW.\n", + "title": "Direction" }, - "title": "Dynamic" - }, - "static": { - "type": "array", - "items": { - "type": "object", - "properties": { - "access_list": { - "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", - "title": "Access List" - }, - "comment": { - "type": "string", - "title": "Comment" - }, - "direction": { - "type": "string", - "enum": [ - "egress", - "ingress" - ], - "description": "Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware platform.\nEOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW.\n", - "title": "Direction" - }, - "group": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", - "title": "Group" - }, - "original_ip": { - "type": "string", - "description": "IPv4 address", - "title": "Original IP" - }, - "original_port": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "title": "Original Port" - }, - "priority": { - "type": "integer", - "minimum": 0, - "maximum": 4294967295, - "title": "Priority" - }, - "protocol": { - "type": "string", - "enum": [ - "udp", - "tcp" - ], - "title": "Protocol" - }, - "translated_ip": { - "type": "string", - "description": "IPv4 address", - "title": "Translated IP" - }, - "translated_port": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "description": "requires 'original_port'", - "title": "Translated Port" - } - }, - "required": [ - "translated_ip", - "original_ip" + "group": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "description": "'access_list' and 'group' are mutual exclusive", + "title": "Group" + }, + "original_ip": { + "type": "string", + "description": "IPv4 address", + "title": "Original IP" + }, + "original_port": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "title": "Original Port" + }, + "priority": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "title": "Priority" + }, + "protocol": { + "type": "string", + "enum": [ + "udp", + "tcp" ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } + "title": "Protocol" }, - "title": "Static" + "translated_ip": { + "type": "string", + "description": "IPv4 address", + "title": "Translated IP" + }, + "translated_port": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "description": "requires 'original_port'", + "title": "Translated Port" + } + }, + "required": [ + "translated_ip", + "original_ip" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} } }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Source" + "title": "Static" } }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Source" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IP Nat" + }, + "ipv6_enable": { + "type": "boolean", + "title": "IPv6 Enable" + }, + "ipv6_address": { + "type": "string", + "title": "IPv6 Address" + }, + "ipv6_address_link_local": { + "type": "string", + "description": "Link local IPv6 address/mask", + "title": "IPv6 Address Link Local" + }, + "ipv6_nd_ra_disabled": { + "type": "boolean", + "title": "IPv6 ND RA Disabled" + }, + "ipv6_nd_managed_config_flag": { + "type": "boolean", + "title": "IPv6 ND Managed Config Flag" + }, + "ipv6_nd_prefixes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "ipv6_prefix": { + "type": "string", + "title": "IPv6 Prefix" + }, + "valid_lifetime": { + "type": "string", + "description": "Infinite or lifetime in seconds", + "title": "Valid Lifetime" }, - "title": "IP Nat" - }, - "ipv6_enable": { - "type": "boolean", - "title": "IPv6 Enable" - }, - "ipv6_address": { - "type": "string", - "title": "IPv6 Address" + "preferred_lifetime": { + "type": "string", + "description": "Infinite or lifetime in seconds", + "title": "Preferred Lifetime" + }, + "no_autoconfig_flag": { + "type": "boolean", + "title": "No Autoconfig Flag" + } }, - "ipv6_address_link_local": { - "type": "string", - "description": "Link local IPv6 address/mask", - "title": "IPv6 Address Link Local" + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} }, - "ipv6_nd_ra_disabled": { - "type": "boolean", - "title": "IPv6 ND RA Disabled" + "required": [ + "ipv6_prefix" + ] + }, + "title": "IPv6 ND Prefixes" + }, + "ipv6_dhcp_relay_destinations": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "description": "DHCP server's IPv6 address", + "title": "Address" + }, + "vrf": { + "type": "string", + "title": "VRF" + }, + "local_interface": { + "type": "string", + "description": "Local interface to communicate with DHCP server - mutually exclusive to source_address", + "title": "Local Interface" + }, + "source_address": { + "type": "string", + "description": "Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface", + "title": "Source Address" + }, + "link_address": { + "type": "string", + "description": "Override the default link address specified in the relayed DHCP packet", + "title": "Link Address" + } }, - "ipv6_nd_managed_config_flag": { - "type": "boolean", - "title": "IPv6 ND Managed Config Flag" + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} }, - "ipv6_nd_prefixes": { - "type": "array", - "items": { - "type": "object", - "properties": { - "ipv6_prefix": { - "type": "string", - "title": "IPv6 Prefix" - }, - "valid_lifetime": { - "type": "string", - "description": "Infinite or lifetime in seconds", - "title": "Valid Lifetime" - }, - "preferred_lifetime": { - "type": "string", - "description": "Infinite or lifetime in seconds", - "title": "Preferred Lifetime" + "required": [ + "address" + ] + }, + "title": "IPv6 DHCP Relay Destinations" + }, + "access_group_in": { + "type": "string", + "description": "Access list name", + "title": "Access Group In" + }, + "access_group_out": { + "type": "string", + "description": "Access list name", + "title": "Access Group Out" + }, + "ipv6_access_group_in": { + "type": "string", + "description": "IPv6 access list name", + "title": "IPv6 Access Group In" + }, + "ipv6_access_group_out": { + "type": "string", + "description": "IPv6 access list name", + "title": "IPv6 Access Group Out" + }, + "mac_access_group_in": { + "type": "string", + "description": "MAC access list name", + "title": "MAC Access Group In" + }, + "mac_access_group_out": { + "type": "string", + "description": "MAC access list name", + "title": "MAC Access Group Out" + }, + "multicast": { + "type": "object", + "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both", + "properties": { + "ipv4": { + "type": "object", + "properties": { + "boundaries": { + "type": "array", + "items": { + "type": "object", + "properties": { + "boundary": { + "type": "string", + "description": "ACL name or multicast IP subnet", + "title": "Boundary" + }, + "out": { + "type": "boolean", + "title": "Out" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } }, - "no_autoconfig_flag": { - "type": "boolean", - "title": "No Autoconfig Flag" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} + "title": "Boundaries" }, - "required": [ - "ipv6_prefix" - ] + "static": { + "type": "boolean", + "title": "Static" + } }, - "title": "IPv6 ND Prefixes" - }, - "ipv6_dhcp_relay_destinations": { - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "type": "string", - "description": "DHCP server's IPv6 address", - "title": "Address" - }, - "vrf": { - "type": "string", - "title": "VRF" - }, - "local_interface": { - "type": "string", - "description": "Local interface to communicate with DHCP server - mutually exclusive to source_address", - "title": "Local Interface" - }, - "source_address": { - "type": "string", - "description": "Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface", - "title": "Source Address" - }, - "link_address": { - "type": "string", - "description": "Override the default link address specified in the relayed DHCP packet", - "title": "Link Address" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "address" - ] + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} }, - "title": "IPv6 DHCP Relay Destinations" - }, - "access_group_in": { - "type": "string", - "description": "Access list name", - "title": "Access Group In" - }, - "access_group_out": { - "type": "string", - "description": "Access list name", - "title": "Access Group Out" - }, - "ipv6_access_group_in": { - "type": "string", - "description": "IPv6 access list name", - "title": "IPv6 Access Group In" - }, - "ipv6_access_group_out": { - "type": "string", - "description": "IPv6 access list name", - "title": "IPv6 Access Group Out" - }, - "mac_access_group_in": { - "type": "string", - "description": "MAC access list name", - "title": "MAC Access Group In" - }, - "mac_access_group_out": { - "type": "string", - "description": "MAC access list name", - "title": "MAC Access Group Out" + "title": "IPv4" }, - "multicast": { + "ipv6": { "type": "object", - "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both", "properties": { - "ipv4": { - "type": "object", - "properties": { - "boundaries": { - "type": "array", - "items": { - "type": "object", - "properties": { - "boundary": { - "type": "string", - "description": "ACL name or multicast IP subnet", - "title": "Boundary" - }, - "out": { - "type": "boolean", - "title": "Out" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "Boundaries" + "boundaries": { + "type": "array", + "items": { + "type": "object", + "properties": { + "boundary": { + "type": "string", + "description": "ACL name or multicast IP subnet", + "title": "Boundary" + } }, - "static": { - "type": "boolean", - "title": "Static" + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} } }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "IPv4" + "title": "Boundaries" }, - "ipv6": { - "type": "object", - "properties": { - "boundaries": { - "type": "array", - "items": { - "type": "object", - "properties": { - "boundary": { - "type": "string", - "description": "ACL name or multicast IP subnet", - "title": "Boundary" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "Boundaries" - }, - "static": { - "type": "boolean", - "title": "Static" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "IPv6" + "static": { + "type": "boolean", + "title": "Static" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "Multicast" + "title": "IPv6" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Multicast" + }, + "ospf_network_point_to_point": { + "type": "boolean", + "title": "OSPF Network Point To Point" + }, + "ospf_area": { + "type": "string", + "title": "OSPF Area" + }, + "ospf_cost": { + "type": "integer", + "title": "OSPF Cost" + }, + "ospf_authentication": { + "type": "string", + "enum": [ + "none", + "simple", + "message-digest" + ], + "title": "OSPF Authentication" + }, + "ospf_authentication_key": { + "type": "string", + "description": "Encrypted password - only type 7 supported", + "title": "OSPF Authentication Key" + }, + "ospf_message_digest_keys": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "title": "ID" + }, + "hash_algorithm": { + "type": "string", + "enum": [ + "md5", + "sha1", + "sha256", + "sha384", + "sha512" + ], + "title": "Hash Algorithm" + }, + "key": { + "type": "string", + "description": "Encrypted password - only type 7 supported", + "title": "Key" + } }, - "ospf_network_point_to_point": { - "type": "boolean", - "title": "OSPF Network Point To Point" + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} }, - "ospf_area": { + "required": [ + "id" + ] + }, + "title": "OSPF Message Digest Keys" + }, + "pim": { + "type": "object", + "properties": { + "ipv4": { + "type": "object", + "properties": { + "dr_priority": { + "type": "integer", + "minimum": 0, + "maximum": 429467295, + "title": "DR Priority" + }, + "sparse_mode": { + "type": "boolean", + "title": "Sparse Mode" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv4" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "PIM" + }, + "mac_security": { + "type": "object", + "properties": { + "profile": { "type": "string", - "title": "OSPF Area" - }, - "ospf_cost": { + "title": "Profile" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "MAC Security" + }, + "channel_group": { + "type": "object", + "properties": { + "id": { "type": "integer", - "title": "OSPF Cost" + "title": "ID" }, - "ospf_authentication": { + "mode": { "type": "string", "enum": [ - "none", - "simple", - "message-digest" + "on", + "active", + "passive" ], - "title": "OSPF Authentication" - }, - "ospf_authentication_key": { - "type": "string", - "description": "Encrypted password - only type 7 supported", - "title": "OSPF Authentication Key" - }, - "ospf_message_digest_keys": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "title": "ID" - }, - "hash_algorithm": { - "type": "string", - "enum": [ - "md5", - "sha1", - "sha256", - "sha384", - "sha512" - ], - "title": "Hash Algorithm" - }, - "key": { - "type": "string", - "description": "Encrypted password - only type 7 supported", - "title": "Key" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "id" - ] - }, - "title": "OSPF Message Digest Keys" + "title": "Mode" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Channel Group" + }, + "isis_enable": { + "type": "string", + "description": "ISIS instance", + "title": "ISIS Enable" + }, + "isis_passive": { + "type": "boolean", + "title": "ISIS Passive" + }, + "isis_metric": { + "type": "integer", + "title": "ISIS Metric" + }, + "isis_network_point_to_point": { + "type": "boolean", + "title": "ISIS Network Point To Point" + }, + "isis_circuit_type": { + "type": "string", + "enum": [ + "level-1-2", + "level-1", + "level-2" + ], + "title": "ISIS Circuit Type" + }, + "isis_hello_padding": { + "type": "boolean", + "title": "ISIS Hello Padding" + }, + "isis_authentication_mode": { + "type": "string", + "enum": [ + "text", + "md5" + ], + "title": "ISIS Authentication Mode" + }, + "isis_authentication_key": { + "type": "string", + "description": "Type-7 encrypted password", + "title": "ISIS Authentication Key" + }, + "poe": { + "type": "object", + "properties": { + "disabled": { + "type": "boolean", + "description": "Disable PoE on a POE capable port. PoE is enabled on all ports that support it by default in EOS.", + "default": false, + "title": "Disabled" }, - "pim": { - "type": "object", - "properties": { - "ipv4": { - "type": "object", - "properties": { - "dr_priority": { - "type": "integer", - "minimum": 0, - "maximum": 429467295, - "title": "DR Priority" - }, - "sparse_mode": { - "type": "boolean", - "title": "Sparse Mode" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "IPv4" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "PIM" + "priority": { + "type": "string", + "enum": [ + "critical", + "high", + "medium", + "low" + ], + "description": "Prioritize a port's power in the event that one of the switch's power supplies loses power", + "title": "Priority" }, - "mac_security": { + "reboot": { + "description": "Set the PoE power behavior for a PoE port when the system is rebooted", "type": "object", "properties": { - "profile": { + "action": { "type": "string", - "title": "Profile" + "enum": [ + "maintain", + "power-off" + ], + "description": "PoE action for interface", + "title": "Action" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "MAC Security" + "title": "Reboot" }, - "channel_group": { + "link_down": { + "description": "Set the PoE power behavior for a PoE port when the port goes down", "type": "object", "properties": { - "id": { - "type": "integer", - "title": "ID" - }, - "mode": { + "action": { "type": "string", "enum": [ - "on", - "active", - "passive" + "maintain", + "power-off" ], - "title": "Mode" + "description": "PoE action for interface", + "title": "Action" + }, + "power_off_delay": { + "type": "integer", + "minimum": 1, + "maximum": 86400, + "description": "Number of seconds to delay shutting the power off after a link down event occurs. Default value is 5 seconds in EOS.", + "title": "Power Off Delay" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "Channel Group" - }, - "isis_enable": { - "type": "string", - "description": "ISIS instance", - "title": "ISIS Enable" - }, - "isis_passive": { - "type": "boolean", - "title": "ISIS Passive" - }, - "isis_metric": { - "type": "integer", - "title": "ISIS Metric" - }, - "isis_network_point_to_point": { - "type": "boolean", - "title": "ISIS Network Point To Point" - }, - "isis_circuit_type": { - "type": "string", - "enum": [ - "level-1-2", - "level-1", - "level-2" - ], - "title": "ISIS Circuit Type" - }, - "isis_hello_padding": { - "type": "boolean", - "title": "ISIS Hello Padding" - }, - "isis_authentication_mode": { - "type": "string", - "enum": [ - "text", - "md5" - ], - "title": "ISIS Authentication Mode" - }, - "isis_authentication_key": { - "type": "string", - "description": "Type-7 encrypted password", - "title": "ISIS Authentication Key" + "title": "Link Down" }, - "poe": { + "shutdown": { + "description": "Set the PoE power behavior for a PoE port when the port is admin down", "type": "object", "properties": { - "disabled": { - "type": "boolean", - "description": "Disable PoE on a POE capable port. PoE is enabled on all ports that support it by default in EOS.", - "default": false, - "title": "Disabled" - }, - "priority": { + "action": { "type": "string", "enum": [ - "critical", - "high", - "medium", - "low" + "maintain", + "power-off" ], - "description": "Prioritize a port's power in the event that one of the switch's power supplies loses power", - "title": "Priority" - }, - "reboot": { - "description": "Set the PoE power behavior for a PoE port when the system is rebooted", - "type": "object", - "properties": { - "action": { - "type": "string", - "enum": [ - "maintain", - "power-off" - ], - "description": "PoE action for interface", - "title": "Action" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Reboot" - }, - "link_down": { - "description": "Set the PoE power behavior for a PoE port when the port goes down", - "type": "object", - "properties": { - "action": { - "type": "string", - "enum": [ - "maintain", - "power-off" - ], - "description": "PoE action for interface", - "title": "Action" - }, - "power_off_delay": { - "type": "integer", - "minimum": 1, - "maximum": 86400, - "description": "Number of seconds to delay shutting the power off after a link down event occurs. Default value is 5 seconds in EOS.", - "title": "Power Off Delay" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Link Down" - }, - "shutdown": { - "description": "Set the PoE power behavior for a PoE port when the port is admin down", - "type": "object", - "properties": { - "action": { - "type": "string", - "enum": [ - "maintain", - "power-off" - ], - "description": "PoE action for interface", - "title": "Action" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Shutdown" - }, - "limit": { - "type": "object", - "description": "Override the hardware-negotiated power limit using either wattage or a power class. Note that if using a power class, AVD will automatically convert the class value to the wattage value corresponding to that power class.", - "properties": { - "class": { - "type": "integer", - "minimum": 0, - "maximum": 8, - "title": "Class" - }, - "watts": { - "type": "string", - "title": "Watts" - }, - "fixed": { - "type": "boolean", - "description": "Set to ignore hardware classification", - "title": "Fixed" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Limit" - }, - "negotiation_lldp": { - "type": "boolean", - "description": "Disable to prevent port from negotiating power with powered devices over LLDP. Enabled by default in EOS.", - "title": "Negotiation LLDP" - }, - "legacy_detect": { - "type": "boolean", - "description": "Allow a subset of legacy devices to work with the PoE switch. Disabled by default in EOS because it can cause false positive detections.", - "title": "Legacy Detect" + "description": "PoE action for interface", + "title": "Action" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "PoE" + "title": "Shutdown" }, - "ptp": { + "limit": { "type": "object", + "description": "Override the hardware-negotiated power limit using either wattage or a power class. Note that if using a power class, AVD will automatically convert the class value to the wattage value corresponding to that power class.", "properties": { - "enable": { - "type": "boolean", - "title": "Enable" - }, - "announce": { - "type": "object", - "properties": { - "interval": { - "type": "integer", - "title": "Interval" - }, - "timeout": { - "type": "integer", - "title": "Timeout" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Announce" - }, - "delay_req": { + "class": { "type": "integer", - "title": "Delay Req" - }, - "delay_mechanism": { - "type": "string", - "enum": [ - "e2e", - "p2p" - ], - "title": "Delay Mechanism" - }, - "sync_message": { - "type": "object", - "properties": { - "interval": { - "type": "integer", - "title": "Interval" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Sync Message" + "minimum": 0, + "maximum": 8, + "title": "Class" }, - "role": { + "watts": { "type": "string", - "enum": [ - "master", - "dynamic" - ], - "title": "Role" + "title": "Watts" }, - "vlan": { - "type": "string", - "description": "VLAN can be 'all' or list of vlans as string", - "title": "VLAN" + "fixed": { + "type": "boolean", + "description": "Set to ignore hardware classification", + "title": "Fixed" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Limit" + }, + "negotiation_lldp": { + "type": "boolean", + "description": "Disable to prevent port from negotiating power with powered devices over LLDP. Enabled by default in EOS.", + "title": "Negotiation LLDP" + }, + "legacy_detect": { + "type": "boolean", + "description": "Allow a subset of legacy devices to work with the PoE switch. Disabled by default in EOS because it can cause false positive detections.", + "title": "Legacy Detect" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "PoE" + }, + "ptp": { + "type": "object", + "properties": { + "enable": { + "type": "boolean", + "title": "Enable" + }, + "announce": { + "type": "object", + "properties": { + "interval": { + "type": "integer", + "title": "Interval" }, - "transport": { - "type": "string", - "enum": [ - "ipv4", - "ipv6", - "layer2" - ], - "title": "Transport" + "timeout": { + "type": "integer", + "title": "Timeout" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "PTP" + "title": "Announce" }, - "profile": { + "delay_req": { + "type": "integer", + "title": "Delay Req" + }, + "delay_mechanism": { "type": "string", - "description": "Interface profile", - "title": "Profile" + "enum": [ + "e2e", + "p2p" + ], + "title": "Delay Mechanism" }, - "storm_control": { + "sync_message": { "type": "object", "properties": { - "all": { - "type": "object", - "properties": { - "level": { - "type": "string", - "description": "Configure maximum storm-control level", - "title": "Level" - }, - "unit": { - "type": "string", - "default": "percent", - "enum": [ - "percent", - "pps" - ], - "description": "Optional field and is hardware dependent", - "title": "Unit" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "All" - }, - "broadcast": { - "type": "object", - "properties": { - "level": { - "type": "string", - "description": "Configure maximum storm-control level", - "title": "Level" - }, - "unit": { - "type": "string", - "default": "percent", - "enum": [ - "percent", - "pps" - ], - "description": "Optional field and is hardware dependent", - "title": "Unit" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Broadcast" - }, - "multicast": { - "type": "object", - "properties": { - "level": { - "type": "string", - "description": "Configure maximum storm-control level", - "title": "Level" - }, - "unit": { - "type": "string", - "default": "percent", - "enum": [ - "percent", - "pps" - ], - "description": "Optional field and is hardware dependent", - "title": "Unit" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Multicast" - }, - "unknown_unicast": { - "type": "object", - "properties": { - "level": { - "type": "string", - "description": "Configure maximum storm-control level", - "title": "Level" - }, - "unit": { - "type": "string", - "default": "percent", - "enum": [ - "percent", - "pps" - ], - "description": "Optional field and is hardware dependent", - "title": "Unit" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Unknown Unicast" + "interval": { + "type": "integer", + "title": "Interval" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "Storm Control" + "title": "Sync Message" }, - "logging": { + "role": { + "type": "string", + "enum": [ + "master", + "dynamic" + ], + "title": "Role" + }, + "vlan": { + "type": "string", + "description": "VLAN can be 'all' or list of vlans as string", + "title": "VLAN" + }, + "transport": { + "type": "string", + "enum": [ + "ipv4", + "ipv6", + "layer2" + ], + "title": "Transport" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "PTP" + }, + "profile": { + "type": "string", + "description": "Interface profile", + "title": "Profile" + }, + "storm_control": { + "type": "object", + "properties": { + "all": { "type": "object", "properties": { - "event": { - "type": "object", - "properties": { - "link_status": { - "type": "boolean", - "title": "Link Status" - }, - "congestion_drops": { - "type": "boolean", - "title": "Congestion Drops" - }, - "spanning_tree": { - "type": "boolean", - "title": "Spanning Tree" - }, - "storm_control_discards": { - "type": "boolean", - "title": "Storm Control Discards" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Event" + "level": { + "type": "string", + "description": "Configure maximum storm-control level", + "title": "Level" + }, + "unit": { + "type": "string", + "default": "percent", + "enum": [ + "percent", + "pps" + ], + "description": "Optional field and is hardware dependent", + "title": "Unit" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "Logging" + "title": "All" }, - "lldp": { + "broadcast": { "type": "object", "properties": { - "transmit": { - "type": "boolean", - "title": "Transmit" - }, - "receive": { - "type": "boolean", - "title": "Receive" + "level": { + "type": "string", + "description": "Configure maximum storm-control level", + "title": "Level" }, - "ztp_vlan": { - "type": "integer", - "description": "ZTP vlan number", - "title": "ZTP VLAN" + "unit": { + "type": "string", + "default": "percent", + "enum": [ + "percent", + "pps" + ], + "description": "Optional field and is hardware dependent", + "title": "Unit" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "LLDP" - }, - "trunk_private_vlan_secondary": { - "type": "boolean", - "title": "Trunk Private VLAN Secondary" - }, - "pvlan_mapping": { - "type": "string", - "description": "List of vlans as string", - "title": "PVLAN Mapping" + "title": "Broadcast" }, - "vlan_translations": { - "type": "array", - "items": { - "type": "object", - "properties": { - "from": { - "type": "string", - "description": "List of vlans as string (only one vlan if direction is \"both\")", - "title": "From" - }, - "to": { - "type": "integer", - "description": "VLAN ID", - "title": "To" - }, - "direction": { - "type": "string", - "enum": [ - "in", - "out", - "both" - ], - "default": "both", - "title": "Direction" - } + "multicast": { + "type": "object", + "properties": { + "level": { + "type": "string", + "description": "Configure maximum storm-control level", + "title": "Level" }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} + "unit": { + "type": "string", + "default": "percent", + "enum": [ + "percent", + "pps" + ], + "description": "Optional field and is hardware dependent", + "title": "Unit" } }, - "title": "VLAN Translations" + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Multicast" }, - "dot1x": { + "unknown_unicast": { "type": "object", "properties": { - "port_control": { + "level": { + "type": "string", + "description": "Configure maximum storm-control level", + "title": "Level" + }, + "unit": { "type": "string", + "default": "percent", "enum": [ - "auto", - "force-authorized", - "force-unauthorized" + "percent", + "pps" ], - "title": "Port Control" - }, - "port_control_force_authorized_phone": { + "description": "Optional field and is hardware dependent", + "title": "Unit" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Unknown Unicast" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Storm Control" + }, + "logging": { + "type": "object", + "properties": { + "event": { + "type": "object", + "properties": { + "link_status": { "type": "boolean", - "title": "Port Control Force Authorized Phone" + "title": "Link Status" }, - "reauthentication": { + "congestion_drops": { "type": "boolean", - "title": "Reauthentication" - }, - "pae": { - "type": "object", - "properties": { - "mode": { - "type": "string", - "enum": [ - "authenticator" - ], - "title": "Mode" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "PAE" - }, - "authentication_failure": { - "type": "object", - "properties": { - "action": { - "type": "string", - "enum": [ - "allow", - "drop" - ], - "title": "Action" - }, - "allow_vlan": { - "type": "integer", - "minimum": 1, - "maximum": 4094, - "title": "Allow VLAN" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Authentication Failure" - }, - "host_mode": { - "type": "object", - "properties": { - "mode": { - "type": "string", - "enum": [ - "multi-host", - "single-host" - ], - "title": "Mode" - }, - "multi_host_authenticated": { - "type": "boolean", - "title": "Multi Host Authenticated" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Host Mode" - }, - "mac_based_authentication": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "title": "Enabled" - }, - "always": { - "type": "boolean", - "title": "Always" - }, - "host_mode_common": { - "type": "boolean", - "title": "Host Mode Common" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "MAC Based Authentication" - }, - "timeout": { - "type": "object", - "properties": { - "idle_host": { - "type": "integer", - "minimum": 10, - "maximum": 65535, - "title": "Idle Host" - }, - "quiet_period": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "title": "Quiet Period" - }, - "reauth_period": { - "type": "string", - "description": "Value can be 60-4294967295 or 'server'", - "title": "Reauth Period" - }, - "reauth_timeout_ignore": { - "type": "boolean", - "title": "Reauth Timeout Ignore" - }, - "tx_period": { - "type": "integer", - "minimum": 1, - "maximum": 65535, - "title": "TX Period" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Timeout" - }, - "reauthorization_request_limit": { - "type": "integer", - "minimum": 1, - "maximum": 10, - "title": "Reauthorization Request Limit" + "title": "Congestion Drops" }, - "unauthorized": { - "type": "object", - "properties": { - "access_vlan_membership_egress": { - "type": "boolean", - "title": "Access VLAN Membership Egress" - }, - "native_vlan_membership_egress": { - "type": "boolean", - "title": "Native VLAN Membership Egress" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Unauthorized" + "spanning_tree": { + "type": "boolean", + "title": "Spanning Tree" }, - "eapol": { - "type": "object", - "properties": { - "disabled": { - "type": "boolean", - "title": "Disabled" - }, - "authentication_failure_fallback_mba": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "title": "Enabled" - }, - "timeout": { - "type": "integer", - "minimum": 0, - "maximum": 65535, - "title": "Timeout" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Authentication Failure Fallback Mba" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Eapol" + "storm_control_discards": { + "type": "boolean", + "title": "Storm Control Discards" } }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Event" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Logging" + }, + "lldp": { + "type": "object", + "properties": { + "transmit": { + "type": "boolean", + "title": "Transmit" + }, + "receive": { + "type": "boolean", + "title": "Receive" + }, + "ztp_vlan": { + "type": "integer", + "description": "ZTP vlan number", + "title": "ZTP VLAN" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "LLDP" + }, + "trunk_private_vlan_secondary": { + "type": "boolean", + "title": "Trunk Private VLAN Secondary" + }, + "pvlan_mapping": { + "type": "string", + "description": "List of vlans as string", + "title": "PVLAN Mapping" + }, + "vlan_translations": { + "type": "array", + "items": { + "type": "object", + "properties": { + "from": { + "type": "string", + "description": "List of vlans as string (only one vlan if direction is \"both\")", + "title": "From" + }, + "to": { + "type": "integer", + "description": "VLAN ID", + "title": "To" }, - "title": "dot1x" + "direction": { + "type": "string", + "enum": [ + "in", + "out", + "both" + ], + "default": "both", + "title": "Direction" + } }, - "service_profile": { + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "VLAN Translations" + }, + "dot1x": { + "type": "object", + "properties": { + "port_control": { "type": "string", - "description": "QOS profile", - "title": "Service Profile" + "enum": [ + "auto", + "force-authorized", + "force-unauthorized" + ], + "title": "Port Control" }, - "shape": { + "port_control_force_authorized_phone": { + "type": "boolean", + "title": "Port Control Force Authorized Phone" + }, + "reauthentication": { + "type": "boolean", + "title": "Reauthentication" + }, + "pae": { "type": "object", "properties": { - "rate": { + "mode": { "type": "string", - "description": "Rate in kbps, pps or percent\nSupported options are platform dependent\nExamples:\n- \"5000 kbps\"\n- \"1000 pps\"\n- \"20 percent\"\n", - "title": "Rate" + "enum": [ + "authenticator" + ], + "title": "Mode" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "Shape" + "title": "PAE" }, - "qos": { + "authentication_failure": { "type": "object", "properties": { - "trust": { + "action": { "type": "string", "enum": [ - "dscp", - "cos", - "disabled" + "allow", + "drop" ], - "title": "Trust" - }, - "dscp": { - "type": "integer", - "description": "DSCP value", - "title": "DSCP" + "title": "Action" }, - "cos": { + "allow_vlan": { "type": "integer", - "description": "COS value", - "title": "COS" + "minimum": 1, + "maximum": 4094, + "title": "Allow VLAN" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "QOS" - }, - "spanning_tree_bpdufilter": { - "type": "string", - "enum": [ - "enabled", - "disabled", - "True", - "False", - "true", - "false" - ], - "title": "Spanning Tree Bpdufilter" - }, - "spanning_tree_bpduguard": { - "type": "string", - "enum": [ - "enabled", - "disabled", - "True", - "False", - "true", - "false" - ], - "title": "Spanning Tree Bpduguard" - }, - "spanning_tree_guard": { - "type": "string", - "enum": [ - "loop", - "root", - "disabled" - ], - "title": "Spanning Tree Guard" - }, - "spanning_tree_portfast": { - "type": "string", - "enum": [ - "edge", - "network" - ], - "title": "Spanning Tree Portfast" + "title": "Authentication Failure" }, - "vmtracer": { - "type": "boolean", - "title": "VMTracer" + "host_mode": { + "type": "object", + "properties": { + "mode": { + "type": "string", + "enum": [ + "multi-host", + "single-host" + ], + "title": "Mode" + }, + "multi_host_authenticated": { + "type": "boolean", + "title": "Multi Host Authenticated" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Host Mode" }, - "priority_flow_control": { + "mac_based_authentication": { "type": "object", "properties": { "enabled": { "type": "boolean", "title": "Enabled" }, - "priorities": { - "type": "array", - "items": { - "type": "object", - "properties": { - "priority": { - "type": "integer", - "minimum": 0, - "maximum": 7, - "title": "Priority" - }, - "no_drop": { - "type": "boolean", - "title": "No Drop" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "priority" - ] - }, - "title": "Priorities" + "always": { + "type": "boolean", + "title": "Always" + }, + "host_mode_common": { + "type": "boolean", + "title": "Host Mode Common" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "Priority Flow Control" + "title": "MAC Based Authentication" }, - "bfd": { + "timeout": { "type": "object", "properties": { - "echo": { - "type": "boolean", - "title": "Echo" - }, - "interval": { + "idle_host": { "type": "integer", - "description": "Interval in milliseconds", - "title": "Interval" + "minimum": 10, + "maximum": 65535, + "title": "Idle Host" }, - "min_rx": { + "quiet_period": { "type": "integer", - "description": "Rate in milliseconds", - "title": "Min RX" + "minimum": 1, + "maximum": 65535, + "title": "Quiet Period" }, - "multiplier": { + "reauth_period": { + "type": "string", + "description": "Value can be 60-4294967295 or 'server'", + "title": "Reauth Period" + }, + "reauth_timeout_ignore": { + "type": "boolean", + "title": "Reauth Timeout Ignore" + }, + "tx_period": { "type": "integer", - "minimum": 3, - "maximum": 50, - "title": "Multiplier" + "minimum": 1, + "maximum": 65535, + "title": "TX Period" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "BFD" + "title": "Timeout" }, - "service_policy": { + "reauthorization_request_limit": { + "type": "integer", + "minimum": 1, + "maximum": 10, + "title": "Reauthorization Request Limit" + }, + "unauthorized": { "type": "object", "properties": { - "pbr": { - "type": "object", - "properties": { - "input": { - "type": "string", - "description": "Policy Based Routing Policy-map name", - "title": "Input" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "PBR" + "access_vlan_membership_egress": { + "type": "boolean", + "title": "Access VLAN Membership Egress" }, - "qos": { - "type": "object", - "properties": { - "input": { - "type": "string", - "description": "Quality of Service Policy-map name", - "title": "Input" - } - }, - "required": [ - "input" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "QOS" + "native_vlan_membership_egress": { + "type": "boolean", + "title": "Native VLAN Membership Egress" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "Service Policy" + "title": "Unauthorized" }, - "mpls": { + "eapol": { "type": "object", "properties": { - "ip": { + "disabled": { "type": "boolean", - "title": "IP" + "title": "Disabled" }, - "ldp": { + "authentication_failure_fallback_mba": { "type": "object", "properties": { - "interface": { + "enabled": { "type": "boolean", - "title": "Interface" + "title": "Enabled" }, - "igp_sync": { - "type": "boolean", - "title": "IGP Sync" + "timeout": { + "type": "integer", + "minimum": 0, + "maximum": 65535, + "title": "Timeout" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "LDP" + "title": "Authentication Failure Fallback Mba" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "MPLS" + "title": "Eapol" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "dot1x" + }, + "service_profile": { + "type": "string", + "description": "QOS profile", + "title": "Service Profile" + }, + "shape": { + "type": "object", + "properties": { + "rate": { + "type": "string", + "description": "Rate in kbps, pps or percent\nSupported options are platform dependent\nExamples:\n- \"5000 kbps\"\n- \"1000 pps\"\n- \"20 percent\"\n", + "title": "Rate" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Shape" + }, + "qos": { + "type": "object", + "properties": { + "trust": { + "type": "string", + "enum": [ + "dscp", + "cos", + "disabled" + ], + "title": "Trust" }, - "lacp_timer": { - "type": "object", - "properties": { - "mode": { - "type": "string", - "enum": [ - "fast", - "normal" - ], - "title": "Mode" + "dscp": { + "type": "integer", + "description": "DSCP value", + "title": "DSCP" + }, + "cos": { + "type": "integer", + "description": "COS value", + "title": "COS" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "QOS" + }, + "spanning_tree_bpdufilter": { + "type": "string", + "enum": [ + "enabled", + "disabled", + "True", + "False", + "true", + "false" + ], + "title": "Spanning Tree Bpdufilter" + }, + "spanning_tree_bpduguard": { + "type": "string", + "enum": [ + "enabled", + "disabled", + "True", + "False", + "true", + "false" + ], + "title": "Spanning Tree Bpduguard" + }, + "spanning_tree_guard": { + "type": "string", + "enum": [ + "loop", + "root", + "disabled" + ], + "title": "Spanning Tree Guard" + }, + "spanning_tree_portfast": { + "type": "string", + "enum": [ + "edge", + "network" + ], + "title": "Spanning Tree Portfast" + }, + "vmtracer": { + "type": "boolean", + "title": "VMTracer" + }, + "priority_flow_control": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "priorities": { + "type": "array", + "items": { + "type": "object", + "properties": { + "priority": { + "type": "integer", + "minimum": 0, + "maximum": 7, + "title": "Priority" + }, + "no_drop": { + "type": "boolean", + "title": "No Drop" + } }, - "multiplier": { - "type": "integer", - "minimum": 3, - "maximum": 3000, - "title": "Multiplier" + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "priority" + ] + }, + "title": "Priorities" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Priority Flow Control" + }, + "bfd": { + "type": "object", + "properties": { + "echo": { + "type": "boolean", + "title": "Echo" + }, + "interval": { + "type": "integer", + "description": "Interval in milliseconds", + "title": "Interval" + }, + "min_rx": { + "type": "integer", + "description": "Rate in milliseconds", + "title": "Min RX" + }, + "multiplier": { + "type": "integer", + "minimum": 3, + "maximum": 50, + "title": "Multiplier" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BFD" + }, + "service_policy": { + "type": "object", + "properties": { + "pbr": { + "type": "object", + "properties": { + "input": { + "type": "string", + "description": "Policy Based Routing Policy-map name", + "title": "Input" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "LACP Timer" - }, - "lacp_port_priority": { - "type": "integer", - "minimum": 0, - "maximum": 65535, - "title": "LACP Port Priority" + "title": "PBR" }, - "transceiver": { + "qos": { "type": "object", "properties": { - "media": { - "type": "object", - "properties": { - "override": { - "type": "string", - "description": "Transceiver type", - "title": "Override" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Media" + "input": { + "type": "string", + "description": "Quality of Service Policy-map name", + "title": "Input" } }, + "required": [ + "input" + ], "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "Transceiver" - }, - "ip_proxy_arp": { + "title": "QOS" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Service Policy" + }, + "mpls": { + "type": "object", + "properties": { + "ip": { "type": "boolean", - "title": "IP Proxy ARP" + "title": "IP" }, - "traffic_policy": { + "ldp": { "type": "object", "properties": { - "input": { - "type": "string", - "description": "Ingress traffic policy", - "title": "Input" + "interface": { + "type": "boolean", + "title": "Interface" }, - "output": { - "type": "string", - "description": "Egress traffic policy", - "title": "Output" + "igp_sync": { + "type": "boolean", + "title": "IGP Sync" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "Traffic Policy" + "title": "LDP" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "MPLS" + }, + "lacp_timer": { + "type": "object", + "properties": { + "mode": { + "type": "string", + "enum": [ + "fast", + "normal" + ], + "title": "Mode" }, - "bgp": { + "multiplier": { + "type": "integer", + "minimum": 3, + "maximum": 3000, + "title": "Multiplier" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "LACP Timer" + }, + "lacp_port_priority": { + "type": "integer", + "minimum": 0, + "maximum": 65535, + "title": "LACP Port Priority" + }, + "transceiver": { + "type": "object", + "properties": { + "media": { "type": "object", "properties": { - "session_tracker": { + "override": { "type": "string", - "description": "Name of session tracker", - "title": "Session Tracker" + "description": "Transceiver type", + "title": "Override" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "BGP" - }, - "peer": { + "title": "Media" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Transceiver" + }, + "ip_proxy_arp": { + "type": "boolean", + "title": "IP Proxy ARP" + }, + "traffic_policy": { + "type": "object", + "properties": { + "input": { "type": "string", - "description": "Key only used for documentation or validation purposes", - "title": "Peer" + "description": "Ingress traffic policy", + "title": "Input" }, - "peer_interface": { + "output": { "type": "string", - "description": "Key only used for documentation or validation purposes", - "title": "Peer Interface" - }, - "peer_type": { + "description": "Egress traffic policy", + "title": "Output" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Traffic Policy" + }, + "bgp": { + "type": "object", + "properties": { + "session_tracker": { "type": "string", - "description": "Key only used for documentation or validation purposes", - "title": "Peer Type" + "description": "Name of session tracker", + "title": "Session Tracker" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BGP" + }, + "peer": { + "type": "string", + "description": "Key only used for documentation or validation purposes", + "title": "Peer" + }, + "peer_interface": { + "type": "string", + "description": "Key only used for documentation or validation purposes", + "title": "Peer Interface" + }, + "peer_type": { + "type": "string", + "description": "Key only used for documentation or validation purposes", + "title": "Peer Type" + }, + "sflow": { + "type": "object", + "properties": { + "enable": { + "type": "boolean", + "title": "Enable" }, - "sflow": { + "egress": { "type": "object", "properties": { "enable": { "type": "boolean", "title": "Enable" }, - "egress": { - "type": "object", - "properties": { - "enable": { - "type": "boolean", - "title": "Enable" - }, - "unmodified_enable": { - "type": "boolean", - "title": "Unmodified Enable" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Egress" + "unmodified_enable": { + "type": "boolean", + "title": "Unmodified Enable" } }, "additionalProperties": false, "patternProperties": { - "^_.+$": {} - }, - "title": "Sflow" - }, - "port_profile": { - "type": "string", - "description": "Key only used for documentation or validation purposes", - "title": "Port Profile" - }, - "uc_tx_queues": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "description": "TX-Queue ID", - "title": "ID" - }, - "random_detect": { - "type": "object", - "properties": { - "ecn": { - "description": "Explicit Congestion Notification", - "type": "object", - "properties": { - "count": { - "type": "boolean", - "description": "Enable counter for random-detect ECNs", - "title": "Count" - }, - "threshold": { - "type": "object", - "properties": { - "units": { - "type": "string", - "enum": [ - "segments", - "bytes", - "kbytes", - "mbytes", - "milliseconds" - ], - "description": "Indicate the units to be used for the threshold values", - "title": "Units" - }, - "min": { - "type": "integer", - "minimum": 1, - "maximum": 256000000, - "description": "Set the random-detect ECN minimum-threshold", - "title": "Min" - }, - "max": { - "type": "integer", - "minimum": 1, - "maximum": 256000000, - "description": "Set the random-detect ECN maximum-threshold", - "title": "Max" - }, - "max_probability": { - "type": "integer", - "minimum": 1, - "maximum": 100, - "description": "Set the random-detect ECN max-mark-probability", - "title": "Max Probability" - }, - "weight": { - "type": "integer", - "minimum": 0, - "maximum": 15, - "description": "Set the random-detect ECN weight", - "title": "Weight" - } - }, - "required": [ - "units", - "min", - "max" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Threshold" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Ecn" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Random Detect" - } - }, - "required": [ - "id" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } + "^_.+$": {} }, - "title": "Uc TX Queues" - }, - "tx_queues": { - "type": "array", - "items": { + "title": "Egress" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Sflow" + }, + "port_profile": { + "type": "string", + "description": "Key only used for documentation or validation purposes", + "title": "Port Profile" + }, + "uc_tx_queues": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "TX-Queue ID", + "title": "ID" + }, + "random_detect": { "type": "object", "properties": { - "id": { - "type": "integer", - "description": "TX-Queue ID", - "title": "ID" - }, - "random_detect": { + "ecn": { + "description": "Explicit Congestion Notification", "type": "object", "properties": { - "ecn": { - "description": "Explicit Congestion Notification", + "count": { + "type": "boolean", + "description": "Enable counter for random-detect ECNs", + "title": "Count" + }, + "threshold": { "type": "object", "properties": { - "count": { - "type": "boolean", - "description": "Enable counter for random-detect ECNs", - "title": "Count" - }, - "threshold": { - "type": "object", - "properties": { - "units": { - "type": "string", - "enum": [ - "segments", - "bytes", - "kbytes", - "mbytes", - "milliseconds" - ], - "description": "Indicate the units to be used for the threshold values", - "title": "Units" - }, - "min": { - "type": "integer", - "minimum": 1, - "maximum": 256000000, - "description": "Set the random-detect ECN minimum-threshold", - "title": "Min" - }, - "max": { - "type": "integer", - "minimum": 1, - "maximum": 256000000, - "description": "Set the random-detect ECN maximum-threshold", - "title": "Max" - }, - "max_probability": { - "type": "integer", - "minimum": 1, - "maximum": 100, - "description": "Set the random-detect ECN max-mark-probability", - "title": "Max Probability" - }, - "weight": { - "type": "integer", - "minimum": 0, - "maximum": 15, - "description": "Set the random-detect ECN weight", - "title": "Weight" - } - }, - "required": [ - "units", - "max", - "max_probability" + "units": { + "type": "string", + "enum": [ + "segments", + "bytes", + "kbytes", + "mbytes", + "milliseconds" ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Threshold" + "description": "Indicate the units to be used for the threshold values", + "title": "Units" + }, + "min": { + "type": "integer", + "minimum": 1, + "maximum": 256000000, + "description": "Set the random-detect ECN minimum-threshold", + "title": "Min" + }, + "max": { + "type": "integer", + "minimum": 1, + "maximum": 256000000, + "description": "Set the random-detect ECN maximum-threshold", + "title": "Max" + }, + "max_probability": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "description": "Set the random-detect ECN max-mark-probability", + "title": "Max Probability" + }, + "weight": { + "type": "integer", + "minimum": 0, + "maximum": 15, + "description": "Set the random-detect ECN weight", + "title": "Weight" } }, + "required": [ + "units", + "min", + "max" + ], "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "Ecn" + "title": "Threshold" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "Random Detect" + "title": "Ecn" } }, - "required": [ - "id" - ], "additionalProperties": false, "patternProperties": { "^_.+$": {} - } - }, - "title": "TX Queues" + }, + "title": "Random Detect" + } }, - "vrrp_ids": { - "type": "array", - "description": "VRRP model.", - "items": { + "required": [ + "id" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Uc TX Queues" + }, + "tx_queues": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "TX-Queue ID", + "title": "ID" + }, + "random_detect": { "type": "object", "properties": { - "id": { - "type": "integer", - "description": "VRID", - "title": "ID" - }, - "priority_level": { - "type": "integer", - "description": "Instance priority", - "minimum": 1, - "maximum": 254, - "title": "Priority Level" - }, - "advertisement": { - "type": "object", - "properties": { - "interval": { - "type": "integer", - "description": "Interval in seconds", - "minimum": 1, - "maximum": 255, - "title": "Interval" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Advertisement" - }, - "preempt": { + "ecn": { + "description": "Explicit Congestion Notification", "type": "object", "properties": { - "enabled": { + "count": { "type": "boolean", - "title": "Enabled" + "description": "Enable counter for random-detect ECNs", + "title": "Count" }, - "delay": { + "threshold": { "type": "object", "properties": { - "minimum": { + "units": { + "type": "string", + "enum": [ + "segments", + "bytes", + "kbytes", + "mbytes", + "milliseconds" + ], + "description": "Indicate the units to be used for the threshold values", + "title": "Units" + }, + "min": { "type": "integer", - "description": "Minimum preempt delay in seconds", - "minimum": 0, - "maximum": 3600, - "title": "Minimum" + "minimum": 1, + "maximum": 256000000, + "description": "Set the random-detect ECN minimum-threshold", + "title": "Min" }, - "reload": { + "max": { "type": "integer", - "description": "Reload preempt delay in seconds", - "minimum": 0, - "maximum": 3600, - "title": "Reload" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Delay" - } - }, - "required": [ - "enabled" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Preempt" - }, - "timers": { - "type": "object", - "properties": { - "delay": { - "type": "object", - "properties": { - "reload": { + "minimum": 1, + "maximum": 256000000, + "description": "Set the random-detect ECN maximum-threshold", + "title": "Max" + }, + "max_probability": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "description": "Set the random-detect ECN max-mark-probability", + "title": "Max Probability" + }, + "weight": { "type": "integer", - "description": "Delay after reload in seconds.", "minimum": 0, - "maximum": 3600, - "title": "Reload" + "maximum": 15, + "description": "Set the random-detect ECN weight", + "title": "Weight" } }, + "required": [ + "units", + "max", + "max_probability" + ], "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "Delay" + "title": "Threshold" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "Timers" - }, - "tracked_object": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Tracked object name", - "title": "Name" - }, - "decrement": { - "type": "integer", - "minimum": 1, - "maximum": 254, - "description": "Decrement VRRP priority by 1-254", - "title": "Decrement" - }, - "shutdown": { - "type": "boolean", - "title": "Shutdown" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "name" - ] - }, - "title": "Tracked Object" + "title": "Ecn" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Random Detect" + } + }, + "required": [ + "id" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "TX Queues" + }, + "vrrp_ids": { + "type": "array", + "description": "VRRP model.", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "VRID", + "title": "ID" + }, + "priority_level": { + "type": "integer", + "description": "Instance priority", + "minimum": 1, + "maximum": 254, + "title": "Priority Level" + }, + "advertisement": { + "type": "object", + "properties": { + "interval": { + "type": "integer", + "description": "Interval in seconds", + "minimum": 1, + "maximum": 255, + "title": "Interval" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Advertisement" + }, + "preempt": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" }, - "ipv4": { + "delay": { "type": "object", "properties": { - "address": { - "type": "string", - "description": "Virtual IPv4 address", - "title": "Address" + "minimum": { + "type": "integer", + "description": "Minimum preempt delay in seconds", + "minimum": 0, + "maximum": 3600, + "title": "Minimum" }, - "version": { + "reload": { "type": "integer", - "enum": [ - 2, - 3 - ], - "title": "Version" + "description": "Reload preempt delay in seconds", + "minimum": 0, + "maximum": 3600, + "title": "Reload" } }, - "required": [ - "address" - ], "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "IPv4" - }, - "ipv6": { + "title": "Delay" + } + }, + "required": [ + "enabled" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Preempt" + }, + "timers": { + "type": "object", + "properties": { + "delay": { "type": "object", "properties": { - "address": { - "type": "string", - "description": "Virtual IPv6 address", - "title": "Address" + "reload": { + "type": "integer", + "description": "Delay after reload in seconds.", + "minimum": 0, + "maximum": 3600, + "title": "Reload" } }, - "required": [ - "address" - ], "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "IPv6" + "title": "Delay" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} }, + "title": "Timers" + }, + "tracked_object": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Tracked object name", + "title": "Name" + }, + "decrement": { + "type": "integer", + "minimum": 1, + "maximum": 254, + "description": "Decrement VRRP priority by 1-254", + "title": "Decrement" + }, + "shutdown": { + "type": "boolean", + "title": "Shutdown" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "Tracked Object" + }, + "ipv4": { + "type": "object", + "properties": { + "address": { + "type": "string", + "description": "Virtual IPv4 address", + "title": "Address" + }, + "version": { + "type": "integer", + "enum": [ + 2, + 3 + ], + "title": "Version" + } + }, "required": [ - "id" - ] + "address" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv4" }, - "title": "VRRP IDs" + "ipv6": { + "type": "object", + "properties": { + "address": { + "type": "string", + "description": "Virtual IPv6 address", + "title": "Address" + } + }, + "required": [ + "address" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv6" + } }, - "eos_cli": { - "type": "string", - "description": "Multiline EOS CLI rendered directly on the ethernet interface in the final EOS configuration", - "title": "EOS CLI" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "id" + ] }, - "title": "Structured Config" + "title": "VRRP IDs" + }, + "eos_cli": { + "type": "string", + "description": "Multiline EOS CLI rendered directly on the ethernet interface in the final EOS configuration", + "title": "EOS CLI" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} - } - }, - "title": "L3 Interfaces" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} + }, + "title": "Structured Config" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "profile" + ] }, - "title": "L3 Edge" + "title": "L3 Interface Profiles" }, "local_users": { "type": "array", @@ -30898,6 +23236,39 @@ "type": "string", "title": "Vtep Vvtep IP" }, + "wan_carriers": { + "description": "PREVIEW: This key is currently not supported\n\nList of carriers used for the WAN configuration and their mapping to path-groups.", + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Carrier name.", + "title": "Name" + }, + "description": { + "type": "string", + "description": "Additional information about the carrier for documentation purposes.", + "title": "Description" + }, + "path_group": { + "type": "string", + "description": "The path-group to which this carrier belongs.", + "title": "Path Group" + } + }, + "required": [ + "path_group", + "name" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Wan Carriers" + }, "wan_ipsec_profiles": { "description": "PREVIEW: This key is currently not supported\n\nDefine IPsec profiles parameters for WAN configuration.", "type": "object", @@ -31008,8 +23379,8 @@ "title": "Name" }, "id": { - "type": "string", - "description": "Path-group id.", + "type": "integer", + "description": "Path-group id.\n\nTODO: Required until an auto ID algorithm is implemented.", "title": "ID" }, "description": { @@ -31019,7 +23390,8 @@ }, "ipsec": { "type": "boolean", - "description": "Flag to configure IPsec on the carrier (default is True).", + "description": "Flag to configure IPsec at the path-group level.\n\nWhen set to `true`, IPsec is enabled for both the static and dynamic peers.", + "default": true, "title": "Ipsec" }, "import_path_groups": { @@ -31047,13 +23419,14 @@ "title": "Import Path Groups" } }, + "required": [ + "id", + "name" + ], "additionalProperties": false, "patternProperties": { "^_.+$": {} - }, - "required": [ - "name" - ] + } }, "title": "Wan Path Groups" }, @@ -31084,12 +23457,38 @@ "description": "Path-group name.", "title": "Name" }, - "ip_address": { - "type": "string", - "description": "The public IP address of the Route Reflector for this path-group.", - "title": "IP Address" + "interfaces": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Interface name.", + "title": "Name" + }, + "ip_address": { + "type": "string", + "description": "The public IP address of the Route Reflector for this path-group.", + "title": "IP Address" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "Interfaces" } }, + "required": [ + "interfaces", + "name" + ], "additionalProperties": false, "patternProperties": { "^_.+$": {} diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/eos_designs.schema.yml b/ansible_collections/arista/avd/roles/eos_designs/schemas/eos_designs.schema.yml index 56589157d41..33697224805 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/eos_designs.schema.yml +++ b/ansible_collections/arista/avd/roles/eos_designs/schemas/eos_designs.schema.yml @@ -1238,6 +1238,26 @@ keys: l3_edge: type: dict $ref: eos_designs#/$defs/l3_edge + l3_interface_profiles: + type: list + documentation_options: + table: wan-interfaces-settings + description: 'PREVIEW: This key is currently not supported + + + Profiles to inherit common settings for l3_interfaces defined under the node + type key. + + These profiles will *not* work for `l3_interfaces` defined under `vrfs`.' + primary_key: profile + $ref: eos_designs#/$defs/node_type_l3_interfaces + items: + type: dict + keys: + profile: + type: str + description: L3 interface profile name. Any variable supported under `l3_interfaces` + can be inherited from a profile. local_users: documentation_options: table: management-settings @@ -3225,6 +3245,27 @@ keys: remove_in_version: 4.0.0 type: bool default: false + wan_carriers: + description: 'PREVIEW: This key is currently not supported + + + List of carriers used for the WAN configuration and their mapping to path-groups.' + type: list + primary_key: name + items: + type: dict + keys: + name: + type: str + description: Carrier name. + description: + type: str + description: Additional information about the carrier for documentation + purposes. + path_group: + type: str + description: The path-group to which this carrier belongs. + required: true wan_ipsec_profiles: documentation_options: table: wan-settings @@ -3283,8 +3324,6 @@ keys: - autovpn - cv-pathfinder wan_path_groups: - documentation_options: - table: wan-settings description: 'PREVIEW: This key is currently not supported List of path-groups used for the WAN configuration.' @@ -3297,15 +3336,25 @@ keys: type: str description: Path-group name. id: - type: str - description: Path-group id. + type: int + convert_types: + - str + description: 'Path-group id. + + + TODO: Required until an auto ID algorithm is implemented.' + required: true description: type: str description: Additional information about the path-group for documentation purposes. ipsec: type: bool - description: Flag to configure IPsec on the carrier (default is True). + description: 'Flag to configure IPsec at the path-group level. + + + When set to `true`, IPsec is enabled for both the static and dynamic peers.' + default: true import_path_groups: type: list description: List of [ath-groups to import in this path-group. @@ -3348,16 +3397,28 @@ keys: type: list description: Path-groups through which the Route Reflector/Pathfinder is reached. + primary_key: name items: type: dict keys: name: type: str description: Path-group name. - ip_address: - type: str - description: The public IP address of the Route Reflector for this - path-group. + interfaces: + type: list + primary_key: name + required: true + min_length: 1 + items: + type: dict + keys: + name: + type: str + description: Interface name. + ip_address: + type: str + description: The public IP address of the Route Reflector for + this path-group. dynamic_keys: connected_endpoints_keys.key: $ref: eos_designs#/$defs/connected_endpoints @@ -4152,84 +4213,6 @@ $defs: profile: type: str description: P2P profile name. Profile defined under p2p_profiles. - l3_interfaces_profiles: - type: list - convert_types: - - dict - primary_key: profile - $ref: eos_designs#/$defs/l3_edge_l3_interfaces - items: - type: dict - keys: - profile: - type: str - description: L3 interface profile name. Any variable supported under - `l3_interfaces` can be inherited from a profile. - l3_interfaces: - type: list - $ref: eos_designs#/$defs/l3_edge_l3_interfaces - items: - type: dict - keys: - node: - type: str - description: Device on which the interface should be configured. - profile: - type: str - description: L3 interface profile name. Profile defined under l3_interfaces_profiles. - l3_edge_l3_interfaces: - type: list - items: - type: dict - keys: - interface: - type: str - description: Ethernet interface name like 'Ethernet2'. - pattern: Ethernet[\d/]+ - description: - type: str - description: 'Interface description. - - If not set a default description will be configured with ''[[ ]]''' - ip: - type: str - description: Node IPv4 address/Mask or 'dhcp'. - dhcp_client_accept_default_route: - type: bool - default: false - description: 'Supported if `ip` is `dhcp`. - - Accepts default route from DHCP.' - enabled: - type: bool - default: true - description: Enable or Shutdown the interface. - speed: - type: str - description: Speed should be set in the format `` or `forced - ` or `auto `. - peer: - type: str - description: The peer device name. Used for description and documentation - peer_interface: - type: str - description: The peer device interface. Used for description and documentation - peer_ip: - type: str - description: The peer device IP. Used for description and documentation - qos_profile: - type: str - description: QOS service profile. - raw_eos_cli: - type: str - description: EOS CLI rendered directly on the interface in the final EOS - configuration. - structured_config: - type: dict - documentation_options: - hide_keys: true - description: Custom structured config for the Ethernet interface. - $ref: eos_cli_config_gen#/keys/ethernet_interfaces/items/ network_services: documentation_options: table: network-services-common-settings @@ -7108,6 +7091,23 @@ $defs: If not set, and the device is WAN device, a default value of 1000 is used.' + l3_interfaces: + type: list + $ref: eos_designs#/$defs/node_type_l3_interfaces + documentation_options: + table: wan-interfaces-settings + description: 'PREVIEW: This key is currently not supported + + + L3 Interfaces currently only use for WAN interfaces.' + items: + type: dict + keys: + profile: + type: str + description: 'L3 interface profile name. Profile defined under `l3_interface_profiles`. + + ' node_groups: type: list description: Define variables related to all nodes part of this group. @@ -7144,6 +7144,83 @@ $defs: name: type: str description: The Node Name is used as "hostname". + node_type_l3_interfaces: + type: list + primary_key: name + items: + type: dict + keys: + name: + type: str + description: Ethernet interface name like 'Ethernet2'. + pattern: Ethernet[\d/]+ + description: + type: str + description: 'Interface description. + + If not set a default description will be configured with ''[[ ]]''' + ip: + type: str + description: Node IPv4 address/Mask or 'dhcp'. + set_default_route: + type: bool + default: false + description: 'Insert a default route to the `peer_ip` if `ip` is an ip address + + or configure to accept a default route from DHCP if `ip` is `dhcp`. + + + AVD will error out if set to true, `ip` is an ip address and `peer_ip` + is missing.' + enabled: + type: bool + default: true + description: Enable or Shutdown the interface. + speed: + type: str + description: Speed should be set in the format `` or `forced + ` or `auto `. + peer: + type: str + description: The peer device name. Used for description and documentation + peer_interface: + type: str + description: The peer device interface. Used for description and documentation + peer_ip: + type: str + description: The peer device IPv4 address (no mask). Used as default route + gateway if `set_default_route` is true and `ip` is an IP address. + qos_profile: + type: str + description: QOS service profile. + wan_carrier: + type: str + description: 'The WAN Carrier this interface is connected to. + + This is used to infer the path-groups in which this interface should be + configured.' + wan_circuit_id: + type: str + convert_types: + - int + description: 'The WAN Circuit ID for this interface. + + This is not rendered in the configuration but used for WAN designs.' + connected_to_pathfinder: + type: bool + default: true + description: For a WAN interface (`wan_path_group` is set), allow to disable + the static tunnel towards Pathfinders. + raw_eos_cli: + type: str + description: EOS CLI rendered directly on the interface in the final EOS + configuration. + structured_config: + type: dict + documentation_options: + hide_keys: true + description: Custom structured config for the Ethernet interface. + $ref: eos_cli_config_gen#/keys/ethernet_interfaces/items/ p2p_links: type: list items: diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_l3_edge.schema.yml b/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_l3_edge.schema.yml index df72e50c461..0709d779d25 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_l3_edge.schema.yml +++ b/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_l3_edge.schema.yml @@ -56,27 +56,3 @@ $defs: profile: type: str description: P2P profile name. Profile defined under p2p_profiles. - l3_interfaces_profiles: - type: list - convert_types: - - dict - primary_key: profile - $ref: "eos_designs#/$defs/l3_edge_l3_interfaces" - items: - type: dict - keys: - profile: - type: str - description: L3 interface profile name. Any variable supported under `l3_interfaces` can be inherited from a profile. - l3_interfaces: - type: list - $ref: "eos_designs#/$defs/l3_edge_l3_interfaces" - items: - type: dict - keys: - node: - type: str - description: Device on which the interface should be configured. - profile: - type: str - description: L3 interface profile name. Profile defined under l3_interfaces_profiles. diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_node_type.schema.yml b/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_node_type.schema.yml index 119c2789802..54f91aea3a4 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_node_type.schema.yml +++ b/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_node_type.schema.yml @@ -1159,6 +1159,22 @@ $defs: MSS value for IPv4 the DPS interface. If not set, and the device is WAN device, a default value of 1000 is used. + l3_interfaces: + type: list + $ref: "eos_designs#/$defs/node_type_l3_interfaces" + documentation_options: + table: wan-interfaces-settings + description: |- + PREVIEW: This key is currently not supported + + L3 Interfaces currently only use for WAN interfaces. + items: + type: dict + keys: + profile: + type: str + description: | + L3 interface profile name. Profile defined under `l3_interface_profiles`. node_groups: type: list description: Define variables related to all nodes part of this group. diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_l3_edge_l3_interfaces.schema.yml b/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_node_type_l3_interfaces.schema.yml similarity index 63% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_l3_edge_l3_interfaces.schema.yml rename to ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_node_type_l3_interfaces.schema.yml index 860fef0a87b..f138e9a8c0a 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_l3_edge_l3_interfaces.schema.yml +++ b/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_node_type_l3_interfaces.schema.yml @@ -6,12 +6,13 @@ # Use Ctrl + Space to get suggestions for every field. Autocomplete will pop up after typing 2 letters. type: dict $defs: - l3_edge_l3_interfaces: + node_type_l3_interfaces: type: list + primary_key: name items: type: dict keys: - interface: + name: type: str description: Ethernet interface name like 'Ethernet2'. pattern: "Ethernet[\\d/]+" @@ -23,15 +24,17 @@ $defs: ip: type: str description: Node IPv4 address/Mask or 'dhcp'. - dhcp_client_accept_default_route: + set_default_route: type: bool - default: False + default: false description: |- - Supported if `ip` is `dhcp`. - Accepts default route from DHCP. + Insert a default route to the `peer_ip` if `ip` is an ip address + or configure to accept a default route from DHCP if `ip` is `dhcp`. + + AVD will error out if set to true, `ip` is an ip address and `peer_ip` is missing. enabled: type: bool - default: True + default: true description: Enable or Shutdown the interface. speed: type: str @@ -48,10 +51,27 @@ $defs: peer_ip: type: str description: |- - The peer device IP. Used for description and documentation + The peer device IPv4 address (no mask). Used as default route gateway if `set_default_route` is true and `ip` is an IP address. qos_profile: type: str description: QOS service profile. + wan_carrier: + type: str + description: |- + The WAN Carrier this interface is connected to. + This is used to infer the path-groups in which this interface should be configured. + wan_circuit_id: + type: str + convert_types: + - int + description: |- + The WAN Circuit ID for this interface. + This is not rendered in the configuration but used for WAN designs. + connected_to_pathfinder: + type: bool + default: True + description: |- + For a WAN interface (`wan_path_group` is set), allow to disable the static tunnel towards Pathfinders. raw_eos_cli: type: str description: EOS CLI rendered directly on the interface in the final EOS configuration. diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/l3_interface_profiles.schema.yml b/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/l3_interface_profiles.schema.yml new file mode 100644 index 00000000000..4ba80292fc1 --- /dev/null +++ b/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/l3_interface_profiles.schema.yml @@ -0,0 +1,25 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +# yaml-language-server: $schema=../../../../plugins/plugin_utils/schema/avd_meta_schema.json +# Line above is used by RedHat's YAML Schema vscode extension +# Use Ctrl + Space to get suggestions for every field. Autocomplete will pop up after typing 2 letters. +type: dict +keys: + l3_interface_profiles: + type: list + documentation_options: + table: wan-interfaces-settings + description: |- + PREVIEW: This key is currently not supported + + Profiles to inherit common settings for l3_interfaces defined under the node type key. + These profiles will *not* work for `l3_interfaces` defined under `vrfs`. + primary_key: profile + $ref: "eos_designs#/$defs/node_type_l3_interfaces" + items: + type: dict + keys: + profile: + type: str + description: L3 interface profile name. Any variable supported under `l3_interfaces` can be inherited from a profile. diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_carriers.schema.yml b/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_carriers.schema.yml new file mode 100644 index 00000000000..7b823832bb5 --- /dev/null +++ b/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_carriers.schema.yml @@ -0,0 +1,28 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +# yaml-language-server: $schema=../../../../plugins/plugin_utils/schema/avd_meta_schema.json +# Line above is used by RedHat's YAML Schema vscode extension +# Use Ctrl + Space to get suggestions for every field. Autocomplete will pop up after typing 2 letters. +type: dict +keys: + wan_carriers: + description: |- + PREVIEW: This key is currently not supported + + List of carriers used for the WAN configuration and their mapping to path-groups. + type: list + primary_key: name + items: + type: dict + keys: + name: + type: str + description: Carrier name. + description: + type: str + description: Additional information about the carrier for documentation purposes. + path_group: + type: str + description: The path-group to which this carrier belongs. + required: true diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_path_groups.schema.yml b/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_path_groups.schema.yml index da5a6d22460..012fb99c4cb 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_path_groups.schema.yml +++ b/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_path_groups.schema.yml @@ -7,8 +7,6 @@ type: dict keys: wan_path_groups: - documentation_options: - table: wan-settings description: |- PREVIEW: This key is currently not supported List of path-groups used for the WAN configuration. @@ -21,14 +19,24 @@ keys: type: str description: Path-group name. id: - type: str - description: Path-group id. + type: int + convert_types: + - str + description: |- + Path-group id. + + TODO: Required until an auto ID algorithm is implemented. + required: true description: type: str description: Additional information about the path-group for documentation purposes. ipsec: type: bool - description: Flag to configure IPsec on the carrier (default is True). + description: |- + Flag to configure IPsec at the path-group level. + + When set to `true`, IPsec is enabled for both the static and dynamic peers. + default: true import_path_groups: type: list description: List of [ath-groups to import in this path-group. diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_route_servers.schema.yml b/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_route_servers.schema.yml index e2f57877fdc..cc6edfd17b0 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_route_servers.schema.yml +++ b/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_route_servers.schema.yml @@ -31,13 +31,24 @@ keys: path_groups: type: list description: Path-groups through which the Route Reflector/Pathfinder is reached. + primary_key: name items: type: dict keys: name: type: str description: Path-group name. - # TODO - should it be multiple IP address - ip_address: - type: str - description: The public IP address of the Route Reflector for this path-group. + interfaces: + type: list + primary_key: name + required: true + min_length: 1 + items: + type: dict + keys: + name: + type: str + description: Interface name. + ip_address: + type: str + description: The public IP address of the Route Reflector for this path-group. diff --git a/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestconnectivity.py b/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestconnectivity.py index cd2a4caf7b9..967a35e99b6 100644 --- a/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestconnectivity.py +++ b/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestconnectivity.py @@ -29,7 +29,7 @@ def test_definition(self) -> dict | None: """ anta_tests = [] - if (ethernet_interfaces := self.logged_get(key="ethernet_interfaces")) is None: + if (ethernet_interfaces := self.logged_get(key="ethernet_interfaces", logging_level="WARNING")) is None: return None required_keys = ["name", "peer", "peer_interface", "ip_address"] @@ -81,7 +81,7 @@ def test_definition(self) -> dict | None: """ anta_tests = [] - if (management_interfaces := self.logged_get(key="management_interfaces")) is None: + if (management_interfaces := self.logged_get(key="management_interfaces", logging_level="WARNING")) is None: return None for idx, interface in enumerate(management_interfaces): @@ -169,7 +169,7 @@ def test_definition(self) -> dict | None: """ anta_tests = [] - if (ethernet_interfaces := self.logged_get(key="ethernet_interfaces")) is None: + if (ethernet_interfaces := self.logged_get(key="ethernet_interfaces", logging_level="WARNING")) is None: return None required_keys = ["name", "peer", "peer_interface"] diff --git a/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestinterfaces.py b/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestinterfaces.py index d769f6e956a..7330ef69390 100644 --- a/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestinterfaces.py +++ b/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestinterfaces.py @@ -68,7 +68,7 @@ def generate_test_details(interface: dict, description_template: str) -> tuple(s return "adminDown", "down", description_template.format(state="adminDown") return "up", "up", description_template.format(state="up") - required_keys = ["name", "shutdown", "description"] + required_keys = ["name", "shutdown"] for interface_key, description_template in self.interface_types: interfaces = get(self.structured_config, interface_key, []) @@ -78,7 +78,8 @@ def generate_test_details(interface: dict, description_template: str) -> tuple(s if not self.validate_data(data=interface, data_path=f"{interface_key}.[{idx}]", required_keys=required_keys): continue state, proto, description = generate_test_details(interface, description_template) - custom_field = f"{interface['name']} - {interface['description']}" + intf_description = interface.get("description") + custom_field = interface["name"] if not intf_description else f"{interface['name']} - {intf_description}" add_test(str(interface["name"]), state, proto, description, custom_field) diff --git a/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestmlag.py b/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestmlag.py index d5a8f573fbe..3e6b6e77e5a 100644 --- a/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestmlag.py +++ b/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestmlag.py @@ -23,7 +23,7 @@ def test_definition(self) -> dict: Returns: test_definition (dict): ANTA test definition. """ - if self.logged_get(key="mlag_configuration", logging_level="INFO") is None: + if self.logged_get(key="mlag_configuration") is None: return None anta_tests = [ diff --git a/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestrouting.py b/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestrouting.py index 260468ea709..8b71e63050c 100644 --- a/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestrouting.py +++ b/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestrouting.py @@ -99,9 +99,7 @@ def add_test(description: str, afi: str, bgp_neighbor_ip: str, safi: str = None) } ) - if self.logged_get(key="router_bgp", logging_level="INFO") is None or not self.validate_data( - service_routing_protocols_model="multi-agent", logging_level="WARNING" - ): + if self.logged_get(key="router_bgp") is None or not self.validate_data(service_routing_protocols_model="multi-agent", logging_level="WARNING"): return None anta_tests.setdefault("generic", []).append( diff --git a/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestsecurity.py b/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestsecurity.py index 5a3b1331851..e2b82b92a12 100644 --- a/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestsecurity.py +++ b/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestsecurity.py @@ -24,7 +24,7 @@ def test_definition(self) -> dict | None: test_definition (dict): ANTA test definition. """ anta_tests = [] - if (profile := self.logged_get(key="management_api_http..https_ssl_profile", logging_level="INFO")) is None: + if (profile := self.logged_get(key="management_api_http..https_ssl_profile")) is None: return None anta_tests.append({"VerifyAPIHttpsSSL": {"profile": profile}}) diff --git a/ansible_collections/arista/avd/tests/unit/filters/test_snmp_hash.py b/ansible_collections/arista/avd/tests/unit/filters/test_snmp_hash.py index 2a676081669..1755a9d4131 100644 --- a/ansible_collections/arista/avd/tests/unit/filters/test_snmp_hash.py +++ b/ansible_collections/arista/avd/tests/unit/filters/test_snmp_hash.py @@ -193,4 +193,4 @@ def test_localize_passphrase(self, passphrase, auth_type, engine_id, priv_type, def test_snmp_hash_filter(self): resp = f.filters() assert isinstance(resp, dict) - assert "hash_passphrase" in resp.keys() + assert "snmp_hash" in resp.keys() diff --git a/containers/base/.devcontainer/Dockerfile b/containers/base/.devcontainer/Dockerfile index c47a79b6688..c33e1011d4c 100644 --- a/containers/base/.devcontainer/Dockerfile +++ b/containers/base/.devcontainer/Dockerfile @@ -7,6 +7,8 @@ RUN apt-get update \ && apt-get install -y --no-install-recommends \ make \ git \ + # xz-utils required for docker import to work + xz-utils \ && rm -rf /var/lib/apt/lists/* \ && rm -Rf /usr/share/doc && rm -Rf /usr/share/man \ && apt-get clean diff --git a/containers/dev/.devcontainer/Dockerfile b/containers/dev/.devcontainer/Dockerfile index b610559d866..7fe27420627 100644 --- a/containers/dev/.devcontainer/Dockerfile +++ b/containers/dev/.devcontainer/Dockerfile @@ -14,3 +14,5 @@ ENTRYPOINT [ "/bin/entrypoint.sh" ] # Switch user to given USERNAME otherwise Ansible will be installed as root. USER ${USERNAME} ENV PATH=$PATH:/home/${USERNAME}/.local/bin +# make sure that path required to mount Ansible collection exists +RUN mkdir -p /home/${USERNAME}/.ansible/collections/ansible_collections/arista/avd diff --git a/containers/universal/.devcontainer/Dockerfile b/containers/universal/.devcontainer/Dockerfile index d019be0f2c7..1ede90bc49e 100644 --- a/containers/universal/.devcontainer/Dockerfile +++ b/containers/universal/.devcontainer/Dockerfile @@ -13,4 +13,6 @@ ENV PATH=$PATH:/home/${USERNAME}/.local/bin # Install Ansible AVD collection. RUN pip3 install "${ANSIBLE_CORE_VERSION}" \ && ansible-galaxy collection install ${ANSIBLE_INSTALL_LOCATION} \ - && pip3 install -r /home/${USERNAME}/.ansible/collections/ansible_collections/arista/avd/requirements.txt + && pip3 install -r /home/${USERNAME}/.ansible/collections/ansible_collections/arista/avd/requirements.txt \ + # install community.general to support callback plugins in ansible.cfg, etc. + && ansible-galaxy collection install community.general diff --git a/pyproject.toml b/pyproject.toml index 3d14f6afd2b..c53d8fb3113 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,13 +1,6 @@ [tool.black] line-length = 160 -# Default in black is "false", but the code generator for Pydantic needs this forced. -skip-string-normalization = false - -# Version is locked to 22.8.0 where preview features are all something we like. -# If the version is changed later, we have to reconsider preview. -preview = true - [tool.isort] profile = "black" skip_gitignore = true diff --git a/python-avd/pyproject.toml b/python-avd/pyproject.toml index e15347ae497..84348d5ad77 100644 --- a/python-avd/pyproject.toml +++ b/python-avd/pyproject.toml @@ -60,13 +60,6 @@ optional-dependencies = {"mdtoc" = { file = ["requirements-mdtoc.txt"] }} [tool.black] line-length = 160 -# Default in black is "false", but the code generator for Pydantic needs this forced. -skip-string-normalization = false - -# Version is locked to 22.8.0 where preview features are all something we like. -# If the version is changed later, we have to reconsider preview. -preview = true - [tool.isort] profile = "black" skip_gitignore = true