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. |
+ | [