From f9fefd4e0bc97d3187c4d1f142f2eb622300530d Mon Sep 17 00:00:00 2001 From: Guillaume Mulocher Date: Tue, 19 Dec 2023 11:11:49 +0100 Subject: [PATCH] Feat(eos_designs): Add l3_edge.l3_interfaces support (#3426) --- .../configs/l3_edge_l3_interfaces.cfg | 80 + .../l3_edge_l3_interfaces.yml | 94 + .../host_vars/l3_edge_l3_interfaces.yml | 46 + .../inventory/hosts.yml | 1 + .../docs/tables/core-interfaces.md | 120 +- .../roles/eos_designs/docs/tables/l3-edge.md | 120 +- .../ethernet_interfaces.py | 12 + .../core_interfaces_and_l3_edge/utils.py | 109 +- .../schemas/eos_designs.jsonschema.json | 13152 ++++++++++++++-- .../schemas/eos_designs.schema.yml | 80 +- .../schema_fragments/defs_l3_edge.schema.yml | 26 +- .../defs_l3_edge_l3_interfaces.schema.yml | 64 + 12 files changed, 12625 insertions(+), 1279 deletions(-) create mode 100644 ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/l3_edge_l3_interfaces.cfg create mode 100644 ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/l3_edge_l3_interfaces.yml create mode 100644 ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/l3_edge_l3_interfaces.yml create mode 100644 ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_l3_edge_l3_interfaces.schema.yml 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/l3_edge_l3_interfaces.cfg new file mode 100644 index 00000000000..14cd6198e71 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/l3_edge_l3_interfaces.cfg @@ -0,0 +1,80 @@ +!RANCID-CONTENT-TYPE: arista +! +vlan internal order ascending range 1006 1199 +! +transceiver qsfp default-mode 4x10G +! +service routing protocols model multi-agent +! +hostname l3_edge_l3_interfaces +! +spanning-tree mode none +! +no enable password +no aaa root +! +vrf instance MGMT +! +interface Ethernet1 + description peer1_eth1 + no shutdown + no switchport + ip address 192.168.1.2/31 + service-policy type qos input TEST_POLICY + service-profile TEST-QOS-PROFILE + ! TEST RAW_EOS_CLI + +! +interface Ethernet2/2 + description peer2 + no shutdown + no switchport + ip address dhcp + dhcp client accept default-route +! +interface Ethernet42 + description This is a custom description + shutdown + no switchport + ip address dhcp +! +interface Ethernet43 + shutdown + no switchport + ip address 192.168.42.42/24 +! +interface Loopback0 + description EVPN_Overlay_Peering + no shutdown + ip address 1.2.3.1/32 +! +ip routing +no ip routing vrf MGMT +! +ip prefix-list PL-LOOPBACKS-EVPN-OVERLAY + seq 10 permit 1.2.3.4/24 eq 32 +! +route-map RM-CONN-2-BGP permit 10 + match ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY +! +router bgp 65000 + router-id 1.2.3.1 + maximum-paths 4 ecmp 4 + update wait-install + no bgp default ipv4-unicast + neighbor IPv4-UNDERLAY-PEERS peer group + neighbor IPv4-UNDERLAY-PEERS send-community + neighbor IPv4-UNDERLAY-PEERS maximum-routes 12000 + redistribute connected route-map RM-CONN-2-BGP + ! + address-family ipv4 + neighbor IPv4-UNDERLAY-PEERS activate +! +management api http-commands + protocol https + no shutdown + ! + vrf MGMT + no shutdown +! +end 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/l3_edge_l3_interfaces.yml new file mode 100644 index 00000000000..84e26c60d4a --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/l3_edge_l3_interfaces.yml @@ -0,0 +1,94 @@ +hostname: l3_edge_l3_interfaces +is_deployed: true +router_bgp: + as: '65000' + router_id: 1.2.3.1 + bgp: + default: + ipv4_unicast: false + maximum_paths: + paths: 4 + ecmp: 4 + updates: + wait_install: true + peer_groups: + - name: IPv4-UNDERLAY-PEERS + type: ipv4 + maximum_routes: 12000 + send_community: all + address_family_ipv4: + peer_groups: + - name: IPv4-UNDERLAY-PEERS + activate: true + redistribute_routes: + - source_protocol: connected + route_map: RM-CONN-2-BGP +service_routing_protocols_model: multi-agent +ip_routing: true +vlan_internal_order: + allocation: ascending + range: + beginning: 1006 + ending: 1199 +spanning_tree: + mode: none +vrfs: +- name: MGMT + ip_routing: false +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 + peer: peer1 + peer_interface: eth1 + ip_address: 192.168.1.2/31 + shutdown: false + type: routed + description: peer1_eth1 + service_profile: TEST-QOS-PROFILE + eos_cli: '! TEST RAW_EOS_CLI + + ' + service_policy: + qos: + input: TEST_POLICY +- name: Ethernet2/2 + peer_type: l3_interface + peer: peer2 + ip_address: dhcp + shutdown: false + type: routed + description: peer2 + dhcp_client_accept_default_route: true +- name: Ethernet42 + peer_type: l3_interface + peer: peer3 + ip_address: dhcp + shutdown: true + type: routed + description: This is a custom description +- name: Ethernet43 + peer_type: l3_interface + ip_address: 192.168.42.42/24 + shutdown: true + type: routed 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 new file mode 100644 index 00000000000..0d9d69d9b28 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/l3_edge_l3_interfaces.yml @@ -0,0 +1,46 @@ +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/hosts.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/hosts.yml index 4fac3b2d306..c99097df8f4 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 @@ -264,6 +264,7 @@ 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/roles/eos_designs/docs/tables/core-interfaces.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/core-interfaces.md index a3e1e9b2ef4..4515f8cb8a3 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 @@ -13,7 +13,7 @@ | [      ipv4_pool](## "core_interfaces.p2p_links_ip_pools.[].ipv4_pool") | String | | | | IPv4 address/Mask. | | [      prefix_size](## "core_interfaces.p2p_links_ip_pools.[].prefix_size") | Integer | | `31` | Min: 8
Max: 31 | Subnet mask size. | | [  p2p_links_profiles](## "core_interfaces.p2p_links_profiles") | List, items: Dictionary | | | | | - | [    - name](## "core_interfaces.p2p_links_profiles.[].name") | String | Required, Unique | | | P2P profile name. Any variable supported under p2p_links can be inherited from a profile. | + | [    - name](## "core_interfaces.p2p_links_profiles.[].name") | String | Required, Unique | | | P2P profile name. Any variable supported under `p2p_links` can be inherited from a profile. | | [      id](## "core_interfaces.p2p_links_profiles.[].id") | Integer | | | | Unique id per subnet_summary. Used to calculate ip addresses.
Required with ip_pool. ID starting from 1.
| | [      speed](## "core_interfaces.p2p_links_profiles.[].speed") | String | | | | Speed should be set in the format `` or `forced ` or `auto `. | | [      ip_pool](## "core_interfaces.p2p_links_profiles.[].ip_pool") | String | | | | P2P pool name. IP Pool defined under p2p_links_ip_pools. A /31 will be taken from the pool per P2P link. | @@ -92,6 +92,35 @@ | [              - <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" @@ -109,7 +138,7 @@ prefix_size: p2p_links_profiles: - # P2P profile name. Any variable supported under p2p_links can be inherited from a profile. + # P2P profile name. Any variable supported under `p2p_links` can be inherited from a profile. - name: # Unique id per subnet_summary. Used to calculate ip addresses. @@ -317,4 +346,91 @@ # 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 8aff5aac1ad..817c05b32e5 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 @@ -13,7 +13,7 @@ | [      ipv4_pool](## "l3_edge.p2p_links_ip_pools.[].ipv4_pool") | String | | | | IPv4 address/Mask. | | [      prefix_size](## "l3_edge.p2p_links_ip_pools.[].prefix_size") | Integer | | `31` | Min: 8
Max: 31 | Subnet mask size. | | [  p2p_links_profiles](## "l3_edge.p2p_links_profiles") | List, items: Dictionary | | | | | - | [    - name](## "l3_edge.p2p_links_profiles.[].name") | String | Required, Unique | | | P2P profile name. Any variable supported under p2p_links can be inherited from a profile. | + | [    - name](## "l3_edge.p2p_links_profiles.[].name") | String | Required, Unique | | | P2P profile name. Any variable supported under `p2p_links` can be inherited from a profile. | | [      id](## "l3_edge.p2p_links_profiles.[].id") | Integer | | | | Unique id per subnet_summary. Used to calculate ip addresses.
Required with ip_pool. ID starting from 1.
| | [      speed](## "l3_edge.p2p_links_profiles.[].speed") | String | | | | Speed should be set in the format `` or `forced ` or `auto `. | | [      ip_pool](## "l3_edge.p2p_links_profiles.[].ip_pool") | String | | | | P2P pool name. IP Pool defined under p2p_links_ip_pools. A /31 will be taken from the pool per P2P link. | @@ -92,6 +92,35 @@ | [              - <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" @@ -109,7 +138,7 @@ prefix_size: p2p_links_profiles: - # P2P profile name. Any variable supported under p2p_links can be inherited from a profile. + # P2P profile name. Any variable supported under `p2p_links` can be inherited from a profile. - name: # Unique id per subnet_summary. Used to calculate ip addresses. @@ -317,4 +346,91 @@ # 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/python_modules/core_interfaces_and_l3_edge/ethernet_interfaces.py b/ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/ethernet_interfaces.py index 51a1d755283..750022eba34 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/ethernet_interfaces.py +++ b/ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/ethernet_interfaces.py @@ -56,6 +56,18 @@ def ethernet_interfaces(self) -> list | None: context_keys=["name", "peer", "peer_interface"], ) + for l3_interface in self._filtered_l3_interfaces: + # Ethernet interface + ethernet_interface = self._get_l3_interface_cfg(l3_interface) + + append_if_not_duplicate( + list_of_dicts=ethernet_interfaces, + primary_key="name", + new_dict=ethernet_interface, + context=f"Ethernet Interfaces defined under {self.data_model} l3_interfaces", + context_keys=["name", "peer", "peer_interface"], + ) + if ethernet_interfaces: return ethernet_interfaces diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/utils.py b/ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/utils.py index 3f794bdc236..c51c918a3d3 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/utils.py +++ b/ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/utils.py @@ -12,6 +12,7 @@ from ansible_collections.arista.avd.plugins.plugin_utils.eos_designs_shared_utils import SharedUtils from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdMissingVariableError from ansible_collections.arista.avd.plugins.plugin_utils.merge import merge +from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_empties_from_dict from ansible_collections.arista.avd.plugins.plugin_utils.utils import default, get, get_item @@ -37,6 +38,10 @@ def _p2p_links_ip_pools(self) -> list: def _p2p_links(self) -> list: return get(self._hostvars, f"{self.data_model}.p2p_links", default=[]) + @cached_property + def _p2p_links_sflow(self) -> bool | None: + return get(self._hostvars, f"fabric_sflow.{self.data_model}") + @cached_property def _filtered_p2p_links(self) -> list: """ @@ -50,7 +55,7 @@ def _filtered_p2p_links(self) -> list: # Apply p2p_profiles if set. Silently ignoring missing profile. if self._p2p_links_profiles: - p2p_links = [self._apply_p2p_profile(p2p_link) for p2p_link in p2p_links] + p2p_links = [self._apply_profile("p2p_links", p2p_link) for p2p_link in p2p_links] # Filter to only include p2p_links with our hostname under "nodes" p2p_links = [p2p_link for p2p_link in p2p_links if self.shared_utils.hostname in p2p_link.get("nodes", [])] @@ -65,16 +70,27 @@ def _filtered_p2p_links(self) -> list: return p2p_links - def _apply_p2p_profile(self, p2p_link: dict) -> dict: - if "profile" not in p2p_link: + def _apply_profile(self, type: str, target_dict: dict) -> dict: + """ + Apply a profile to a p2p_link or a l3_interface + """ + if "profile" not in target_dict: # Nothing to do - return p2p_link + return target_dict + + # Silently ignoring missing profile and wrong types. + if type == "l3_interfaces": + profile = get_item(self._l3_interfaces_profiles, "profile", target_dict["profile"], default={}) + target_dict.pop("profile", None) + elif type == "p2p_links": + profile = get_item(self._p2p_links_profiles, "name", target_dict["profile"], default={}) + target_dict.pop("name", None) + else: + return target_dict - # Silently ignoring missing profile. - profile = get_item(self._p2p_links_profiles, "name", p2p_link["profile"], default={}) - p2p_link = merge(profile, p2p_link, list_merge="replace", destructive_merge=False) - p2p_link.pop("name", None) - return p2p_link + target_dict = merge(profile, target_dict, list_merge="replace", destructive_merge=False) + + return target_dict def _resolve_p2p_ips(self, p2p_link: dict) -> dict: if "ip" in p2p_link: @@ -161,13 +177,13 @@ def _get_p2p_data(self, p2p_link: dict) -> dict: required=True, var_name=f"{peer} under {self.data_model}.p2p_links.[].port_channel.nodes_child_interfaces", )["interfaces"] - id = int("".join(re.findall(r"\d", member_interfaces[0]))) + pc_id = int("".join(re.findall(r"\d", member_interfaces[0]))) peer_id = int("".join(re.findall(r"\d", peer_member_interfaces[0]))) data.update( { - "interface": f"Port-Channel{id}", + "interface": f"Port-Channel{pc_id}", "peer_interface": f"Port-Channel{peer_id}", - "port_channel_id": id, + "port_channel_id": pc_id, "port_channel_members": [ { "interface": interface, @@ -316,6 +332,73 @@ def _get_port_channel_member_cfg(self, p2p_link: dict, member: dict) -> dict: }, } + # l3_interfaces here @cached_property - def _p2p_links_sflow(self) -> bool | None: + def _l3_interfaces_profiles(self) -> list: + return get(self._hostvars, f"{self.data_model}.l3_interfaces_profiles", default=[]) + + @cached_property + def _l3_interfaces(self) -> list: + return get(self._hostvars, f"{self.data_model}.l3_interfaces", default=[]) + + @cached_property + def _l3_interfaces_sflow(self) -> bool | None: return get(self._hostvars, f"fabric_sflow.{self.data_model}") + + @cached_property + def _filtered_l3_interfaces(self) -> list: + """ + Returns a filtered list of l3_interfaces, which only contains interfaces with our hostname. + For each interface any referenced profiles are applied. + """ + if not (l3_interfaces := self._l3_interfaces): + return [] + + # Apply l3_interfaces._profile if set. Silently ignoring missing profile. + if self._l3_interfaces_profiles: + l3_interfaces = [self._apply_profile("l3_interfaces", l3_interface) for l3_interface in l3_interfaces] + + # Filter to only include l3_interfaces with our hostname as node + l3_interfaces = [l3_interface for l3_interface in l3_interfaces if self.shared_utils.hostname == get(l3_interface, "node", required=True)] + if not l3_interfaces: + return [] + + return l3_interfaces + + def _get_l3_interface_cfg(self, l3_interface: dict) -> dict | None: + """ + Returns structured_configuration for one L3 Physical interface + """ + if l3_interface["node"] != self.shared_utils.hostname: + return None + + interface_name = l3_interface["interface"] + + # TODO move this to description module? + interface_description = ( + l3_interface.get("description") + or "_".join([elem for elem in [l3_interface.get("peer"), l3_interface.get("peer_interface")] if elem is not None]) + or None + ) + + # TODO catch if ip_address is not valid or not dhcp + ip_address = get(l3_interface, "ip", required=True) + + interface = { + "name": interface_name, + "peer_type": "l3_interface", + "peer": l3_interface.get("peer"), + "peer_interface": l3_interface.get("peer_interface"), + "ip_address": ip_address, + "shutdown": not l3_interface.get("enabled", True), + "type": "routed", + "description": interface_description, + "service_profile": l3_interface.get("qos_profile"), + "eos_cli": l3_interface.get("raw_eos_cli"), + "struct_cfg": l3_interface.get("structured_config"), + } + + if ip_address == "dhcp" and l3_interface.get("dhcp_client_accept_default_route", False): + interface["dhcp_client_accept_default_route"] = True + + return strip_empties_from_dict(interface) diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/eos_designs.jsonschema.json b/ansible_collections/arista/avd/roles/eos_designs/schemas/eos_designs.jsonschema.json index 70fcdfaa324..53d01f8ea88 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/eos_designs.jsonschema.json +++ b/ansible_collections/arista/avd/roles/eos_designs/schemas/eos_designs.jsonschema.json @@ -2431,7 +2431,7 @@ "properties": { "name": { "type": "string", - "description": "P2P profile name. Any variable supported under p2p_links can be inherited from a profile.", + "description": "P2P profile name. Any variable supported under `p2p_links` can be inherited from a profile.", "title": "Name" }, "id": { @@ -2893,1287 +2893,11927 @@ } }, "title": "P2P Links" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Core Interfaces" - }, - "custom_structured_configuration_list_merge": { - "type": "string", - "description": "The List-merge strategy used when merging custom structured configurations.\n\nThis applies to all vars prefixed by prefixes in `custom_structured_configuration_prefix`\nand all data under the various `structured_config` options.\n\nThe available list merge strategies:\n- `replace`:\n - Any list will be replaced with the list defined in custom structured configurations.\n- `append`:\n - Existing list items with the same \"Primary key\"-value will be updated.\n - New items will be appended to the existing list (including duplicates).\n- `keep`:\n - Only set list if there is no existing list or existing list is `None`.\n- `prepend`:\n - Existing list items with the same \"Primary key\"-value will be updated.\n - New items will be prepended to the existing list (including duplicates).\n- `append_rp`:\n - Existing list items with the same \"Primary key\"-value will be updated.\n - New unique items will be appended to the existing list.\n- `prepend_rp`:\n - Existing list items with the same \"Primary key\"-value will be updated.\n - New unique items will be prepended to the existing list.\n", - "enum": [ - "replace", - "append", - "keep", - "prepend", - "append_rp", - "prepend_rp" - ], - "default": "append_rp", - "title": "Custom Structured Configuration List Merge" - }, - "custom_structured_configuration_prefix": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Custom EOS Structured Configuration keys can be set on any group or host_var level using the name\nof the corresponding `eos_cli_config_gen` key prefixed with content of `custom_structured_configuration_prefix`.\n\nThe content of Custom Structured Configuration variables will be merged with the structured config generated by the eos_designs role.\n\nThe merge is done recursively, so it is possible to update a sub-key of a variable set by `eos_designs` role already.\n\nThe merge follow these recursive merge strategies:\n- New keys will be added for all types.\n- Existing keys of type \"List\" with a \"Primary key\" set in the schema:\n - Strategy can be changed with `custom_structured_configuration_list_merge`. Default strategy:\n - Existing list items with the same \"Primary key\"-value will be updated.\n - New unique items will be appended to the existing list\n- Other keys of type \"List\" will have new unique items appended the the existing list.\n- Existing keys of type \"Dictionary\" will recursively merge\n- Other existing keys will be replaced.\n", - "default": [ - "custom_structured_configuration_" - ], - "title": "Custom Structured Configuration Prefix" - }, - "cv_topology": { - "type": "array", - "description": "Generate AVD configurations directly from the given CloudVision topology.\nActivate this feature by setting `use_cv_topology` to `true`.\nRequires `default_interfaces` to be set for the relevant platforms and node types to detect the proper interface roles automatically.\nNeighbor hostnames must match the inventory hostnames of the AVD inventory to be taken into consideration.", - "items": { - "type": "object", - "properties": { - "hostname": { - "type": "string", - "title": "Hostname" - }, - "platform": { - "type": "string", - "title": "Platform" - }, - "interfaces": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "neighbor": { - "type": "string", - "title": "Neighbor" - }, - "neighbor_interface": { - "type": "string", - "title": "Neighbor Interface" - } + }, + "l3_interfaces_profiles": { + "type": "array", + "items": { + "type": "object", + "properties": { + "profile": { + "type": "string", + "description": "L3 interface profile name. Any variable supported under `l3_interfaces` can be inherited from a profile.", + "title": "Profile" }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} + "interface": { + "type": "string", + "description": "Ethernet interface name like 'Ethernet2'.", + "pattern": "Ethernet[\\d/]+", + "title": "Interface" }, - "required": [ - "name" - ] - }, - "title": "Interfaces" - } - }, - "required": [ - "platform", - "interfaces", - "hostname" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "Cv Topology" - }, - "cvp_ingestauth_key": { - "type": "string", - "description": "On-premise CVP ingest auth key. If set, TerminAttr will be configured with key-based authentication for on-premise CVP.\nIf not set, TerminAttr will be configured with certificate based authentication:\n- On-premise using token onboarding. Default token path is '/tmp/token'.\n- CVaaS using token-secure onboarding. Default token path is '/tmp/cv-onboarding-token'.\nToken must be copied to the device first.", - "title": "CVP Ingestauth Key" - }, - "cvp_instance_ip": { - "type": "string", - "description": "IPv4 address or DNS name for CloudVision.\nThis variable only supports an on-premise single-node cluster or the DNS name of a CloudVision as a Service instance.\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use cvp_instance_ips instead.", - "deprecated": true, - "title": "CVP Instance IP" - }, - "cvp_instance_ips": { - "type": "array", - "description": "List of IPv4 addresses or DNS names for CloudVision.\nFor on-premise CloudVision enter all the nodes of the cluster.\nFor CloudVision as a Service enter the DNS name of the instance.\n`eos_designs` only supports one CloudVision cluster.\n", - "items": { - "type": "string", - "description": "IPv4 address or DNS name for CloudVision" - }, - "title": "CVP Instance Ips" - }, - "cvp_token_file": { - "type": "string", - "description": "cvp_token_file is the path to the token file on the switch.\nIf not set the default locations for on-premise or CVaaS will be used.\nSee cvp_ingestauth_key for details.", - "title": "CVP Token File" - }, - "dc_name": { - "description": "POD Name is used in:\n- Fabric Documentation (Optional, falls back to fabric_name)\n- SNMP Location: `snmp_settings.location` (Optional)\n- HER Overlay DC scoped flood lists: `overlay_her_flood_list_scope: dc` (Required)\n", - "type": "string", - "title": "DC Name" - }, - "default_igmp_snooping_enabled": { - "description": "When set to false, disables IGMP snooping at fabric level and overrides per vlan settings.\n", - "type": "boolean", - "default": true, - "title": "Default IGMP Snooping Enabled" - }, - "default_interfaces": { - "type": "array", - "description": "Default uplink, downlink, and MLAG interfaces, which will be used if these interfaces are not defined on a device (either directly or through inheritance).\n", - "items": { - "type": "object", - "properties": { - "types": { - "type": "array", - "description": "List of node type keys.", - "items": { - "type": "string" - }, - "title": "Types" - }, - "platforms": { - "type": "array", - "description": "List of platform families.\nThis is defined as a Python regular expression that matches the full platform type.\n", - "items": { - "type": "string", - "description": "Arista platform family regular expression." - }, - "title": "Platforms" - }, - "uplink_interfaces": { - "type": "array", - "description": "List of uplink interfaces or uplink interface ranges.", - "items": { - "type": "string", - "description": "Interface range or interface." - }, - "title": "Uplink Interfaces" - }, - "mlag_interfaces": { - "type": "array", - "description": "List of MLAG interfaces or MLAG interface ranges.", - "items": { - "type": "string", - "description": "Interface range or interface." - }, - "title": "MLAG Interfaces" - }, - "downlink_interfaces": { - "type": "array", - "description": "List of downlink interfaces or downlink interface ranges.", - "items": { - "type": "string", - "description": "Interface range or interface." - }, - "title": "Downlink Interfaces" - } - }, - "required": [ - "types", - "platforms" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "Default Interfaces" - }, - "default_mgmt_method": { - "type": "string", - "description": "`default_mgmt_method` controls the default VRF and source interface used for the following management and monitoring protocols configured with `eos_designs`:\n - `cv_settings`\n - `dns_settings`\n - `ntp_settings`\n - `sflow_settings`\n\n`oob` means the protocols will be configured with the VRF set by `mgmt_interface_vrf` and `mgmt_interface` as the source interface.\n`inband` means the protocols will be configured with the VRF set by `inband_mgmt_vrf` and `inband_mgmt_interface` as the source interface.\n`none` means the VRF and or interface must be manually set for each protocol.\nThis can be overridden under the settings for each protocol.\n", - "enum": [ - "oob", - "inband", - "none" - ], - "default": "oob", - "title": "Default Management Method" - }, - "default_node_types": { - "type": "array", - "description": "Uses hostname matches against a regular expression to determine the node type.", - "items": { - "type": "object", - "properties": { - "node_type": { - "type": "string", - "description": "Resulting node type when regex matches.", - "title": "Node Type" - }, - "match_hostnames": { - "type": "array", - "description": "Regular expressions to match against hostnames.", - "items": { - "type": "string", - "description": "Regex needs to match full hostname (i.e. is bounded by ^ and $ elements)." - }, - "title": "Match Hostnames" - } - }, - "required": [ - "match_hostnames", - "node_type" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "Default Node Types" - }, - "design": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "By setting the design.type variable, the default node-types and templates described in these documents will be used.\n", - "enum": [ - "l3ls-evpn", - "mpls", - "l2ls" - ], - "default": "l3ls-evpn", - "title": "Type" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Design" - }, - "enable_trunk_groups": { - "type": "boolean", - "description": "Enable Trunk Group support across eos_designs.\nWarning: Because of the nature of the EOS Trunk Group feature, enabling this is \"all or nothing\".\n*All* vlans and *all* trunks towards connected endpoints must be using trunk groups as well.\nIf trunk groups are not assigned to a trunk, no vlans will be enabled on that trunk.\nSee \"Details on enable_trunk_groups\" below before enabling this feature.\n", - "default": false, - "title": "Enable Trunk Groups" - }, - "eos_designs_custom_templates": { - "type": "array", - "items": { - "type": "object", - "properties": { - "template": { - "type": "string", - "description": "Template file.", - "title": "Template" - }, - "options": { - "description": "Template options.", - "type": "object", - "properties": { - "list_merge": { + "description": { "type": "string", - "description": "Merge strategy for lists.", - "default": "append_rp", - "title": "List Merge" + "description": "Interface description.\nIf not set a default description will be configured with '[[ ]]'", + "title": "Description" }, - "strip_empty_keys": { + "ip": { + "type": "string", + "description": "Node IPv4 address/Mask or 'dhcp'.", + "title": "IP" + }, + "dhcp_client_accept_default_route": { + "type": "boolean", + "default": false, + "description": "Supported if `ip` is `dhcp`.\nAccepts default route from DHCP.", + "title": "DHCP Client Accept Default Route" + }, + "enabled": { "type": "boolean", - "description": "Filter out keys from the generated output if value is null/none/undefined.", "default": true, - "title": "Strip Empty Keys" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Options" - } - }, - "required": [ - "template" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "EOS Designs Custom Templates" - }, - "eos_designs_documentation": { - "description": "Control fabric documentation generation.\n", - "type": "object", - "properties": { - "connected_endpoints": { - "description": "Generate fabric-wide documentation for connected endpoints.\n", - "type": "boolean", - "default": false, - "title": "Connected Endpoints" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "EOS Designs Documentation" - }, - "event_handlers": { - "type": "array", - "description": "Gives the ability to monitor and react to Syslog messages.\nEvent Handlers provide a powerful and flexible tool that can be used to apply self-healing actions,\ncustomize the system behavior, and implement workarounds to problems discovered in the field.\n", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Event Handler Name", - "title": "Name" - }, - "action_type": { - "type": "string", - "enum": [ - "bash", - "increment", - "log" - ], - "title": "Action Type" - }, - "action": { - "type": "string", - "description": "Command to execute\n", - "title": "Action" - }, - "delay": { - "type": "integer", - "description": "Event-handler delay in seconds\n", - "title": "Delay" - }, - "trigger": { - "type": "string", - "description": "Configure event trigger condition.\n", - "enum": [ - "on-boot", - "on-logging", - "on-startup-config" - ], - "title": "Trigger" - }, - "regex": { - "type": "string", - "description": "Regular expression to use for searching log messages. Required for on-logging trigger\n", - "title": "Regex" - }, - "asynchronous": { - "type": "boolean", - "default": false, - "description": "Set the action to be non-blocking.", - "title": "Asynchronous" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "name" - ] - }, - "title": "Event Handlers" - }, - "evpn_ebgp_gateway_inter_domain": { - "type": "boolean", - "title": "EVPN Ebgp Gateway Inter Domain" - }, - "evpn_ebgp_gateway_multihop": { - "description": "Default of 15, considering a large value to avoid BGP reachability issues in very complex DCI networks.\nAdapt the value for your specific topology.\n", - "type": "integer", - "default": 15, - "title": "EVPN Ebgp Gateway Multihop" - }, - "evpn_ebgp_multihop": { - "description": "Default of 3, the recommended value for a 3 stage spine and leaf topology.\nSet to a higher value to allow for very large and complex topologies.\n", - "type": "integer", - "default": 3, - "title": "EVPN Ebgp Multihop" - }, - "evpn_hostflap_detection": { - "type": "object", - "properties": { - "enabled": { - "description": "If set to false it will disable EVPN host-flap detection.", - "type": "boolean", - "default": true, - "title": "Enabled" - }, - "threshold": { - "description": "Minimum number of MAC moves that indicate a MAC duplication issue.", - "type": "integer", - "default": 5, - "title": "Threshold" - }, - "window": { - "description": "Time (in seconds) to detect a MAC duplication issue.", - "type": "integer", - "default": 180, - "title": "Window" - }, - "expiry_timeout": { - "description": "Time (in seconds) to purge a MAC duplication issue.", - "type": "integer", - "title": "Expiry Timeout" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "EVPN Hostflap Detection" - }, - "evpn_import_pruning": { - "description": "Enable VPN import pruning (Min. EOS 4.24.2F).\nThe Route Target extended communities carried by incoming VPN paths will be examined.\nIf none of those Route Targets have been configured for import, the path will be immediately discarded.\n", - "type": "boolean", - "default": false, - "title": "EVPN Import Pruning" - }, - "evpn_multicast": { - "type": "boolean", - "description": "General Configuration required for EVPN Multicast. \"evpn_l2_multicast\" or \"evpn_l3_multicast\" must also be configured under the Network Services (tenants).\nRequires \"underlay_multicast: true\" and IGMP snooping enabled globally (default).\nFor MLAG devices Route Distinguisher must be unique since this feature will create multi-vtep configuration.\nWarning !!! For Trident3 based platforms i.e 7050X3, 7300X3, 720XP and 722XP\n The Following default platform setting will be configured: \"platform trident forwarding-table partition flexible exact-match 16384 l2-shared 98304 l3-shared 131072\"\n All forwarding agents will be restarted when this configuration is applied.\n You can tune the settings by overriding the default variable: \"platform_settings[platforms].trident_forwarding_table_partition:\"\n Please contact an Arista representative for help with determining the appropriate values for your environment.\n", - "default": false, - "title": "EVPN Multicast" - }, - "evpn_overlay_bgp_rtc": { - "description": "Enable Route Target Membership Constraint Address Family on EVPN overlay BGP peerings (Min. EOS 4.25.1F).\nRequires use eBGP as overlay protocol.\n", - "type": "boolean", - "default": false, - "title": "EVPN Overlay BGP Rtc" - }, - "evpn_prevent_readvertise_to_server": { - "description": "Configure route-map on eBGP sessions towards route-servers, where prefixes with the peer's ASN in the AS Path are filtered away.\nThis is very useful in large-scale networks, where convergence will be quicker by not returning all updates received\nfrom Route-server-1 to Router-server-2 just for Route-server-2 to throw them away because of AS Path loop detection.\n", - "type": "boolean", - "default": false, - "title": "EVPN Prevent Readvertise To Server" - }, - "evpn_short_esi_prefix": { - "description": "Configure prefix for \"short_esi\" values.", - "type": "string", - "default": "0000:0000:", - "title": "EVPN Short Esi Prefix" - }, - "evpn_vlan_aware_bundles": { - "description": "Enable vlan aware bundles for EVPN MAC-VRF.", - "type": "boolean", - "default": false, - "title": "EVPN VLAN Aware Bundles" - }, - "evpn_vlan_bundles": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Specify an EVPN vlan-aware-bundle name.\nEVPN vlan-aware-bundles group L2 VLANs and define common settings.\n", - "title": "Name" - }, - "id": { - "type": "integer", - "description": "\"id\" may be used for vlan-aware-bundle RD/RT ID so it should not overlap with l2vlan IDs which are not part of this bundle.\nSee \"overlay_rd_type\" and \"overlay_rt_type\" for details.\n", - "title": "ID" - }, - "rt_override": { - "type": "string", - "description": "By default the MAC VRF bundle RT will be derived from mac_vrf_id_base + bundle_id.\nThe rt_override allows us to override this value and statically define it.\nrt_override will default to vni_override if set.\n\nrt_override supports two formats:\n - A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details).\n - A full RT string with colon seperator which will override the full RT.\n", - "title": "Rt Override" - }, - "rd_override": { - "type": "string", - "description": "By default the MAC VRF bundle RD will be derived from mac_vrf_id_base + bundle_id.\nThe rt_override allows us to override this value and statically define it.\nrd_override will default to rt_override or vni_override if set.\n\nrd_override supports two formats:\n - A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details).\n - A full RD string with colon seperator which will override the full RD.\n", - "title": "Rd Override" - }, - "evpn_l2_multi_domain": { - "type": "boolean", - "description": "Explicitly extend VLAN-Aware Bundle to remote EVPN domains.\nOverrides `.[].evpn_l2_multi_domain`.\n", - "title": "EVPN L2 Multi Domain" - }, - "bgp": { - "type": "object", - "properties": { - "raw_eos_cli": { - "type": "string", - "description": "EOS cli commands rendered on router_bgp.vlans-aware-bundle.", - "title": "Raw EOS CLI" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "BGP" - } - }, - "required": [ - "id", - "name" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "EVPN VLAN Bundles" - }, - "fabric_evpn_encapsulation": { - "description": "Should be set to mpls for evpn-mpls scenario.", - "enum": [ - "vxlan", - "mpls" - ], - "default": "vxlan", - "type": "string", - "title": "Fabric EVPN Encapsulation" - }, - "fabric_ip_addressing": { - "type": "object", - "properties": { - "mlag": { - "type": "object", - "properties": { - "algorithm": { - "type": "string", - "default": "first_id", - "description": "This variable defines the Multi-chassis Link Aggregation (MLAG) algorithm used.\nEach MLAG link will have a /31 subnet with each subnet allocated from the relevant MLAG pool via a calculated offset.\nThe offset is calculated using one of the following algorithms:\n - first_id: `(mlag_primary_id - 1) * 2` where `mlag_primary_id` is the ID of the first node defined under the node_group.\n This allocation method will skip every other /31 subnet making it less space efficient than `odd_id`.\n - odd_id: `(odd_id - 1) / 2`. Requires the node_group to have a node with an odd ID and a node with an even ID.\n - same_subnet: the offset will always be zero.\n This allocation method will cause every MLAG link to be addressed with the same /31 subnet.\n", - "enum": [ - "first_id", - "odd_id", - "same_subnet" - ], - "title": "Algorithm" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "MLAG" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Fabric IP Addressing" - }, - "fabric_name": { - "description": "Fabric Name, required to match Ansible Group name covering all devices in the Fabric, **must** be an inventory group name.", - "type": "string", - "title": "Fabric Name" - }, - "hardware_counters": { - "type": "object", - "properties": { - "features": { - "type": "array", - "description": "This data model allows to configure the list of hardware counters feature\navailable on Arista platforms.\n\nThe `name` key accepts a list of valid_values which MUST be updated to support\nnew feature as they are released in EOS.\n\nThe available values of the different keys like 'direction' or 'address_type'\nare feature and hardware dependent and this model DOES NOT validate that the\ncombinations are valid. It is the responsability of the user of this data model\nto make sure that the rendered CLI is accepted by the targeted device.\n\nExamples:\n\n * Use:\n ```yaml\n hardware_counters:\n features:\n - name: ip\n direction: out\n layer3: true\n units_packets: true\n ```\n\n to render:\n ```eos\n hardware counter feature ip out layer3 units packets\n ```\n * Use:\n ```yaml\n hardware_counters:\n features:\n - name: route\n address_type: ipv4\n vrf: test\n prefix: 192.168.0.0/24\n ```\n\n to render:\n ```eos\n hardware counter feature route ipv4 vrf test 192.168.0.0/24\n ```\n", - "items": { - "type": "object", - "properties": { - "name": { + "description": "Enable or Shutdown the interface.", + "title": "Enabled" + }, + "speed": { "type": "string", - "enum": [ - "acl", - "decap-group", - "directflow", - "ecn", - "flow-spec", - "gre tunnel interface", - "ip", - "mpls interface", - "mpls lfib", - "mpls tunnel", - "multicast", - "nexthop", - "pbr", - "pdp", - "policing interface", - "qos", - "qos dual-rate-policer", - "route", - "routed-port", - "subinterface", - "tapagg", - "traffic-class", - "traffic-policy", - "vlan", - "vlan-interface", - "vni decap", - "vni encap", - "vtep decap", - "vtep encap" - ], - "title": "Name" + "description": "Speed should be set in the format `` or `forced ` or `auto `.", + "title": "Speed" }, - "direction": { + "peer": { "type": "string", - "enum": [ - "in", - "out", - "cpu" - ], - "description": "Most features support only 'in' and 'out'. Some like traffic-policy support 'cpu'.\nSome features DO NOT have any direction.\nThis validation IS NOT made by the schemas.\n", - "title": "Direction" + "description": "The peer device name. Used for description and documentation", + "title": "Peer" }, - "address_type": { + "peer_interface": { "type": "string", - "enum": [ - "ipv4", - "ipv6", - "mac" - ], - "description": "Supported only for the following features:\n- acl: [ipv4, ipv6, mac] if direction is 'out'\n- multicast: [ipv4, ipv6]\n- route: [ipv4, ipv6]\nThis validation IS NOT made by the schemas.\n", - "title": "Address Type" + "description": "The peer device interface. Used for description and documentation", + "title": "Peer Interface" }, - "layer3": { - "type": "boolean", - "description": "Supported only for the 'ip' feature\n", - "title": "Layer3" + "peer_ip": { + "type": "string", + "description": "The peer device IP. Used for description and documentation", + "title": "Peer IP" }, - "vrf": { + "qos_profile": { "type": "string", - "description": "Supported only for the 'route' feature.\nThis validation IS NOT made by the schemas.\n", - "title": "VRF" + "description": "QOS service profile.", + "title": "QOS Profile" }, - "prefix": { + "raw_eos_cli": { "type": "string", - "description": "Supported only for the 'route' feature.\nMandatory for the 'route' feature.\nThis validation IS NOT made by the schemas.\n", - "title": "Prefix" + "description": "EOS CLI rendered directly on the interface in the final EOS configuration.", + "title": "Raw EOS CLI" }, - "units_packets": { - "type": "boolean", - "title": "Units Packets" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - } - }, - "title": "Features" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Hardware Counters" - }, - "internal_vlan_order": { - "type": "object", - "description": "Internal vlan allocation order and range.", - "properties": { - "allocation": { - "type": "string", - "enum": [ - "ascending", - "descending" - ], - "title": "Allocation" - }, - "range": { - "type": "object", - "properties": { - "beginning": { - "type": "integer", - "description": "First VLAN ID.", - "minimum": 2, - "maximum": 4094, - "title": "Beginning" - }, - "ending": { - "type": "integer", - "description": "Last VLAN ID.", - "minimum": 2, - "maximum": 4094, - "title": "Ending" - } - }, - "required": [ - "beginning", - "ending" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Range" - } - }, - "required": [ - "allocation" - ], - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "default": { - "allocation": "ascending", - "range": { - "beginning": 1006, - "ending": 1199 - } - }, - "title": "Internal VLAN Order" - }, - "ipv6_mgmt_destination_networks": { - "description": "List of IPv6 prefixes to configure as static routes towards the OOB IPv6 Management interface gateway.\nReplaces the default route.\n", - "type": "array", - "items": { - "type": "string", - "description": "IPv6_network/Mask." - }, - "title": "IPv6 Management Destination Networks" - }, - "ipv6_mgmt_gateway": { - "type": "string", - "format": "ipv6", - "description": "OOB Management interface gateway in IPv6 format.\nUsed as next-hop for default gateway or static routes defined under 'ipv6_mgmt_destination_networks'.", - "title": "IPv6 Management Gateway" - }, - "is_deployed": { - "description": "If the device is already deployed in the fabric.\nWhen set to false, interfaces toward this device may be shutdown depending on the `shutdown_interfaces_towards_undeployed_peers` setting.\nFurthermore `eos_config_deploy_cvp` will not attempt to move or apply configurations to the device.\n", - "type": "boolean", - "default": true, - "title": "Is Deployed" - }, - "isis_advertise_passive_only": { - "type": "boolean", - "default": false, - "title": "ISIS Advertise Passive Only" - }, - "isis_area_id": { - "type": "string", - "default": "49.0001", - "title": "ISIS Area ID" - }, - "isis_default_circuit_type": { - "type": "string", - "enum": [ - "level-1-2", - "level-1", - "level-2" - ], - "default": "level-2", - "description": "These fabric level parameters can be used with core_interfaces running ISIS, and may be overridden on link profile or link level.", - "title": "ISIS Default Circuit Type" - }, - "isis_default_is_type": { - "title": "ISIS Default IS Type", - "type": "string", - "enum": [ - "level-1-2", - "level-1", - "level-2" - ], - "default": "level-2" - }, - "isis_default_metric": { - "type": "integer", - "default": 50, - "description": "These fabric level parameters can be used with core_interfaces running ISIS, and may be overridden at link profile or link level.", - "title": "ISIS Default Metric" - }, - "isis_maximum_paths": { - "description": "Number of path to configure in ECMP for ISIS.", - "type": "integer", - "title": "ISIS Maximum Paths" - }, - "isis_ti_lfa": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "default": false, - "title": "Enabled" - }, - "protection": { - "type": "string", - "enum": [ - "link", - "node" - ], - "title": "Protection" - }, - "local_convergence_delay": { - "description": "Local convergence delay in milliseconds.", - "type": "integer", - "default": 10000, - "title": "Local Convergence Delay" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "ISIS TI LFA" - }, - "l3_edge": { - "type": "object", - "properties": { - "p2p_links_ip_pools": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "P2P pool name.", - "title": "Name" - }, - "ipv4_pool": { - "type": "string", - "description": "IPv4 address/Mask.", - "title": "IPv4 Pool" - }, - "prefix_size": { - "type": "integer", - "description": "Subnet mask size.", - "default": 31, - "minimum": 8, - "maximum": 31, - "title": "Prefix Size" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "name" - ] - }, - "title": "P2P Links IP Pools" - }, - "p2p_links_profiles": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "P2P profile name. Any variable supported under p2p_links can be inherited from a profile.", - "title": "Name" - }, - "id": { - "type": "integer", - "description": "Unique id per subnet_summary. Used to calculate ip addresses.\nRequired with ip_pool. ID starting from 1.\n", - "title": "ID" - }, - "speed": { - "type": "string", - "description": "Speed should be set in the format `` or `forced ` or `auto `.", - "title": "Speed" - }, - "ip_pool": { - "type": "string", - "description": "P2P pool name. IP Pool defined under p2p_links_ip_pools. A /31 will be taken from the pool per P2P link.", - "title": "IP Pool" - }, - "subnet": { - "type": "string", - "description": "IPv4 address/Mask. Subnet used on this P2P link.", - "title": "Subnet" - }, - "ip": { - "type": "array", - "description": "Specific IP addresses used on this P2P link.", - "items": { - "type": "string", - "description": "Node IPv4 address/Mask." - }, - "title": "IP" - }, - "ipv6_enable": { - "type": "boolean", - "default": false, - "description": "Allows turning on ipv6 for the link or profile (also autodetected based on underlay_rfc5549 and include_in_underlay_protocol).", - "title": "IPv6 Enable" - }, - "nodes": { - "type": "array", - "description": "Nodes where this link should be configured.", - "items": { - "type": "string", - "description": "The values can be < node_a >, < node_b >.\nex.- [ core-1-isis-sr-ldp, core-2-ospf-ldp ].\n" - }, - "title": "Nodes" - }, - "interfaces": { - "type": "array", - "description": "Interfaces where this link should be configured and Required unless using port-channels.", - "items": { - "type": "string", - "description": "The value can be like < node_a_interface >, < node_b_interface >.\nex. - [ Ethernet2, Ethernet2 ].\n" - }, - "title": "Interfaces" - }, - "as": { - "type": "array", - "description": "AS numbers for BGP.\nRequired with bgp peering.\n", - "items": { - "type": "string", - "description": "The values can be like [\"node_a_as\", \"node_b_as\"]." - }, - "title": "As" - }, - "descriptions": { - "type": "array", - "description": "Interface description.", - "items": { - "type": "string" - }, - "title": "Descriptions" - }, - "include_in_underlay_protocol": { - "type": "boolean", - "default": true, - "description": "Add this interface to underlay routing protocol.", - "title": "Include In Underlay Protocol" - }, - "isis_hello_padding": { - "type": "boolean", - "default": false, - "title": "ISIS Hello Padding" - }, - "isis_metric": { - "type": "integer", - "title": "ISIS Metric" - }, - "isis_circuit_type": { - "type": "string", - "enum": [ - "level-1", - "level-2", - "level-1-2" - ], - "title": "ISIS Circuit Type" - }, - "isis_authentication_mode": { - "type": "string", - "enum": [ - "md5", - "text" - ], - "title": "ISIS Authentication Mode" - }, - "isis_authentication_key": { - "type": "string", - "description": "Type-7 encrypted password.", - "title": "ISIS Authentication Key" - }, - "mpls_ip": { - "type": "boolean", - "description": "MPLS parameters. Default value is true if switch.mpls_lsr is true.", - "title": "MPLS IP" - }, - "mpls_ldp": { - "type": "boolean", - "description": "MPLS parameters. Default value is true for ldp underlay variants, otherwise false.", - "title": "MPLS LDP" - }, - "mtu": { - "type": "integer", - "description": "MTU for this P2P link. Default value same as p2p_uplinks_mtu.", - "title": "MTU" - }, - "bfd": { - "type": "boolean", - "default": false, - "description": "Enable BFD (only considered for BGP).", - "title": "BFD" - }, - "ptp": { - "description": "PTP parameters.", + "structured_config": { "type": "object", + "description": "Custom structured config for the Ethernet interface.", "properties": { - "enabled": { + "name": { + "type": "string", + "title": "Name" + }, + "description": { + "type": "string", + "title": "Description" + }, + "shutdown": { "type": "boolean", - "default": false, - "description": "Enable PTP.", - "title": "Enabled" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "PTP" - }, - "sflow": { - "type": "boolean", - "description": "Enable sFlow. Overrides `fabric_sflow` setting.", - "title": "Sflow" - }, - "qos_profile": { - "type": "string", - "description": "QOS service profile.", - "title": "QOS Profile" - }, - "macsec_profile": { - "type": "string", - "description": "MAC security profile.", - "title": "Macsec Profile" - }, - "port_channel": { - "description": "Port-channel parameters.", - "type": "object", - "properties": { + "title": "Shutdown" + }, + "load_interval": { + "type": "integer", + "minimum": 0, + "maximum": 600, + "description": "Interval in seconds for updating interface counters\"", + "title": "Load Interval" + }, + "speed": { + "type": "string", + "description": "Speed should be set in the format `` or `forced ` or `auto `.", + "title": "Speed" + }, + "mtu": { + "type": "integer", + "minimum": 68, + "maximum": 65535, + "title": "MTU" + }, + "l2_mtu": { + "type": "integer", + "minimum": 68, + "maximum": 65535, + "description": "\"l2_mtu\" should only be defined for platforms supporting the \"l2 mtu\" CLI\n", + "title": "L2 MTU" + }, + "l2_mru": { + "type": "integer", + "minimum": 68, + "maximum": 65535, + "description": "\"l2_mru\" should only be defined for platforms supporting the \"l2 mru\" CLI\n", + "title": "L2 MRU" + }, + "vlans": { + "type": "string", + "description": "List of switchport vlans as string\nFor a trunk port this would be a range like \"1-200,300\"\nFor an access port this would be a single vlan \"123\"\n", + "title": "VLANs" + }, + "native_vlan": { + "type": "integer", + "title": "Native VLAN" + }, + "native_vlan_tag": { + "type": "boolean", + "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence", + "title": "Native VLAN Tag" + }, "mode": { "type": "string", - "default": "active", - "title": "Mode" + "enum": [ + "access", + "dot1q-tunnel", + "trunk", + "trunk phone" + ], + "title": "Mode" + }, + "phone": { + "type": "object", + "properties": { + "trunk": { + "type": "string", + "enum": [ + "tagged", + "tagged phone", + "untagged", + "untagged phone" + ], + "title": "Trunk" + }, + "vlan": { + "type": "integer", + "minimum": 1, + "maximum": 4094, + "title": "VLAN" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Phone" + }, + "l2_protocol": { + "type": "object", + "properties": { + "encapsulation_dot1q_vlan": { + "type": "integer", + "description": "Vlan tag to configure on sub-interface", + "title": "Encapsulation Dot1Q VLAN" + }, + "forwarding_profile": { + "type": "string", + "description": "L2 protocol forwarding profile", + "title": "Forwarding Profile" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "L2 Protocol" + }, + "trunk_groups": { + "type": "array", + "items": { + "type": "string" + }, + "title": "Trunk Groups" + }, + "type": { + "type": "string", + "enum": [ + "routed", + "switched", + "l3dot1q", + "l2dot1q", + "port-channel-member" + ], + "description": "l3dot1q and l2dot1q are used for sub-interfaces. The parent interface should be defined as routed.\nInterface will not be listed in device documentation, unless \"type\" is set.\n", + "title": "Type" + }, + "snmp_trap_link_change": { + "type": "boolean", + "title": "Snmp Trap Link Change" + }, + "address_locking": { + "type": "object", + "properties": { + "ipv4": { + "type": "boolean", + "description": "Enable address locking for IPv4", + "title": "IPv4" + }, + "ipv6": { + "type": "boolean", + "description": "Enable address locking for IPv6", + "title": "IPv6" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Address Locking" + }, + "flowcontrol": { + "type": "object", + "properties": { + "received": { + "type": "string", + "enum": [ + "desired", + "on", + "off" + ], + "title": "Received" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Flowcontrol" + }, + "vrf": { + "type": "string", + "description": "VRF name", + "title": "VRF" + }, + "flow_tracker": { + "type": "object", + "properties": { + "sampled": { + "type": "string", + "description": "Sampled flow tracker name.", + "title": "Sampled" + }, + "hardware": { + "type": "string", + "description": "Hardware flow tracker name.", + "title": "Hardware" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Flow Tracker" + }, + "error_correction_encoding": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "default": true, + "title": "Enabled" + }, + "fire_code": { + "type": "boolean", + "title": "Fire Code" + }, + "reed_solomon": { + "type": "boolean", + "title": "Reed Solomon" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Error Correction Encoding" + }, + "link_tracking_groups": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Group name", + "title": "Name" + }, + "direction": { + "type": "string", + "enum": [ + "upstream", + "downstream" + ], + "title": "Direction" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "Link Tracking Groups" + }, + "evpn_ethernet_segment": { + "type": "object", + "properties": { + "identifier": { + "type": "string", + "description": "EVPN Ethernet Segment Identifier (Type 1 format)", + "title": "Identifier" + }, + "redundancy": { + "type": "string", + "enum": [ + "all-active", + "single-active" + ], + "title": "Redundancy" + }, + "designated_forwarder_election": { + "type": "object", + "properties": { + "algorithm": { + "type": "string", + "enum": [ + "modulus", + "preference" + ], + "title": "Algorithm" + }, + "preference_value": { + "type": "integer", + "minimum": 0, + "maximum": 65535, + "description": "Preference_value is only used when \"algorithm\" is \"preference\"", + "title": "Preference Value" + }, + "dont_preempt": { + "type": "boolean", + "description": "Dont_preempt is only used when \"algorithm\" is \"preference\"", + "title": "Dont Preempt" + }, + "hold_time": { + "type": "integer", + "title": "Hold Time" + }, + "subsequent_hold_time": { + "type": "integer", + "title": "Subsequent Hold Time" + }, + "candidate_reachability_required": { + "type": "boolean", + "title": "Candidate Reachability Required" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Designated Forwarder Election" + }, + "mpls": { + "type": "object", + "properties": { + "shared_index": { + "type": "integer", + "minimum": 1, + "maximum": 1024, + "title": "Shared Index" + }, + "tunnel_flood_filter_time": { + "type": "integer", + "title": "Tunnel Flood Filter Time" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "MPLS" + }, + "route_target": { + "type": "string", + "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx", + "title": "Route Target" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "EVPN Ethernet Segment" + }, + "encapsulation_dot1q_vlan": { + "type": "integer", + "description": "VLAN tag to configure on sub-interface", + "title": "Encapsulation Dot1Q VLAN" + }, + "encapsulation_vlan": { + "type": "object", + "properties": { + "client": { + "type": "object", + "properties": { + "dot1q": { + "type": "object", + "properties": { + "vlan": { + "type": "integer", + "description": "Client VLAN ID", + "title": "VLAN" + }, + "outer": { + "type": "integer", + "description": "Client Outer VLAN ID", + "title": "Outer" + }, + "inner": { + "type": "integer", + "description": "Client Inner VLAN ID", + "title": "Inner" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Dot1Q" + }, + "unmatched": { + "type": "boolean", + "title": "Unmatched" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Client" + }, + "network": { + "type": "object", + "description": "Network encapsulations are all optional and skipped if using client unmatched", + "properties": { + "dot1q": { + "type": "object", + "properties": { + "vlan": { + "type": "integer", + "description": "Network VLAN ID", + "title": "VLAN" + }, + "outer": { + "type": "integer", + "description": "Network outer VLAN ID", + "title": "Outer" + }, + "inner": { + "type": "integer", + "description": "Network inner VLAN ID", + "title": "Inner" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Dot1Q" + }, + "client": { + "type": "boolean", + "title": "Client" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Network" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Encapsulation VLAN" + }, + "vlan_id": { + "type": "integer", + "minimum": 1, + "maximum": 4094, + "title": "VLAN ID" + }, + "ip_address": { + "type": "string", + "description": "IPv4 address/mask or \"dhcp\"", + "title": "IP Address" + }, + "ip_address_secondaries": { + "type": "array", + "items": { + "type": "string" + }, + "title": "IP Address Secondaries" + }, + "dhcp_client_accept_default_route": { + "type": "boolean", + "description": "Install default-route obtained via DHCP", + "title": "DHCP Client Accept Default Route" + }, + "dhcp_server_ipv4": { + "type": "boolean", + "description": "Enable IPv4 DHCP server.", + "title": "DHCP Server IPv4" + }, + "dhcp_server_ipv6": { + "type": "boolean", + "description": "Enable IPv6 DHCP server.", + "title": "DHCP Server IPv6" + }, + "ip_helpers": { + "type": "array", + "items": { + "type": "object", + "properties": { + "ip_helper": { + "type": "string", + "title": "IP Helper" + }, + "source_interface": { + "type": "string", + "description": "Source interface name", + "title": "Source Interface" + }, + "vrf": { + "type": "string", + "description": "VRF name", + "title": "VRF" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "ip_helper" + ] + }, + "title": "IP Helpers" + }, + "ip_nat": { + "type": "object", + "properties": { + "service_profile": { + "type": "string", + "description": "NAT interface profile.", + "title": "Service Profile" + }, + "destination": { + "type": "object", + "properties": { + "dynamic": { + "type": "array", + "items": { + "type": "object", + "properties": { + "access_list": { + "type": "string", + "title": "Access List" + }, + "comment": { + "type": "string", + "title": "Comment" + }, + "pool_name": { + "type": "string", + "title": "Pool Name" + }, + "priority": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "title": "Priority" + } + }, + "required": [ + "pool_name", + "access_list" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Dynamic" + }, + "static": { + "type": "array", + "items": { + "type": "object", + "properties": { + "access_list": { + "type": "string", + "description": "'access_list' and 'group' are mutual exclusive", + "title": "Access List" + }, + "comment": { + "type": "string", + "title": "Comment" + }, + "direction": { + "type": "string", + "enum": [ + "egress", + "ingress" + ], + "description": "Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware platform.\nEOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW.\n", + "title": "Direction" + }, + "group": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "description": "'access_list' and 'group' are mutual exclusive", + "title": "Group" + }, + "original_ip": { + "type": "string", + "description": "IPv4 address", + "title": "Original IP" + }, + "original_port": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "title": "Original Port" + }, + "priority": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "title": "Priority" + }, + "protocol": { + "type": "string", + "enum": [ + "udp", + "tcp" + ], + "title": "Protocol" + }, + "translated_ip": { + "type": "string", + "description": "IPv4 address", + "title": "Translated IP" + }, + "translated_port": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "description": "requires 'original_port'", + "title": "Translated Port" + } + }, + "required": [ + "translated_ip", + "original_ip" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Static" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Destination" + }, + "source": { + "type": "object", + "properties": { + "dynamic": { + "type": "array", + "items": { + "type": "object", + "properties": { + "access_list": { + "type": "string", + "title": "Access List" + }, + "comment": { + "type": "string", + "title": "Comment" + }, + "nat_type": { + "type": "string", + "enum": [ + "overload", + "pool", + "pool-address-only", + "pool-full-cone" + ], + "title": "Nat Type" + }, + "pool_name": { + "type": "string", + "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone\nignored if 'nat_type' is overload\n", + "title": "Pool Name" + }, + "priority": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "title": "Priority" + } + }, + "required": [ + "nat_type", + "access_list" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Dynamic" + }, + "static": { + "type": "array", + "items": { + "type": "object", + "properties": { + "access_list": { + "type": "string", + "description": "'access_list' and 'group' are mutual exclusive", + "title": "Access List" + }, + "comment": { + "type": "string", + "title": "Comment" + }, + "direction": { + "type": "string", + "enum": [ + "egress", + "ingress" + ], + "description": "Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware platform.\nEOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW.\n", + "title": "Direction" + }, + "group": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "description": "'access_list' and 'group' are mutual exclusive", + "title": "Group" + }, + "original_ip": { + "type": "string", + "description": "IPv4 address", + "title": "Original IP" + }, + "original_port": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "title": "Original Port" + }, + "priority": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "title": "Priority" + }, + "protocol": { + "type": "string", + "enum": [ + "udp", + "tcp" + ], + "title": "Protocol" + }, + "translated_ip": { + "type": "string", + "description": "IPv4 address", + "title": "Translated IP" + }, + "translated_port": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "description": "requires 'original_port'", + "title": "Translated Port" + } + }, + "required": [ + "translated_ip", + "original_ip" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Static" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Source" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IP Nat" + }, + "ipv6_enable": { + "type": "boolean", + "title": "IPv6 Enable" + }, + "ipv6_address": { + "type": "string", + "title": "IPv6 Address" + }, + "ipv6_address_link_local": { + "type": "string", + "description": "Link local IPv6 address/mask", + "title": "IPv6 Address Link Local" + }, + "ipv6_nd_ra_disabled": { + "type": "boolean", + "title": "IPv6 ND RA Disabled" + }, + "ipv6_nd_managed_config_flag": { + "type": "boolean", + "title": "IPv6 ND Managed Config Flag" + }, + "ipv6_nd_prefixes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "ipv6_prefix": { + "type": "string", + "title": "IPv6 Prefix" + }, + "valid_lifetime": { + "type": "string", + "description": "Infinite or lifetime in seconds", + "title": "Valid Lifetime" + }, + "preferred_lifetime": { + "type": "string", + "description": "Infinite or lifetime in seconds", + "title": "Preferred Lifetime" + }, + "no_autoconfig_flag": { + "type": "boolean", + "title": "No Autoconfig Flag" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "ipv6_prefix" + ] + }, + "title": "IPv6 ND Prefixes" + }, + "ipv6_dhcp_relay_destinations": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "description": "DHCP server's IPv6 address", + "title": "Address" + }, + "vrf": { + "type": "string", + "title": "VRF" + }, + "local_interface": { + "type": "string", + "description": "Local interface to communicate with DHCP server - mutually exclusive to source_address", + "title": "Local Interface" + }, + "source_address": { + "type": "string", + "description": "Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface", + "title": "Source Address" + }, + "link_address": { + "type": "string", + "description": "Override the default link address specified in the relayed DHCP packet", + "title": "Link Address" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "address" + ] + }, + "title": "IPv6 DHCP Relay Destinations" + }, + "access_group_in": { + "type": "string", + "description": "Access list name", + "title": "Access Group In" + }, + "access_group_out": { + "type": "string", + "description": "Access list name", + "title": "Access Group Out" + }, + "ipv6_access_group_in": { + "type": "string", + "description": "IPv6 access list name", + "title": "IPv6 Access Group In" + }, + "ipv6_access_group_out": { + "type": "string", + "description": "IPv6 access list name", + "title": "IPv6 Access Group Out" + }, + "mac_access_group_in": { + "type": "string", + "description": "MAC access list name", + "title": "MAC Access Group In" + }, + "mac_access_group_out": { + "type": "string", + "description": "MAC access list name", + "title": "MAC Access Group Out" + }, + "multicast": { + "type": "object", + "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both", + "properties": { + "ipv4": { + "type": "object", + "properties": { + "boundaries": { + "type": "array", + "items": { + "type": "object", + "properties": { + "boundary": { + "type": "string", + "description": "ACL name or multicast IP subnet", + "title": "Boundary" + }, + "out": { + "type": "boolean", + "title": "Out" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Boundaries" + }, + "static": { + "type": "boolean", + "title": "Static" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv4" + }, + "ipv6": { + "type": "object", + "properties": { + "boundaries": { + "type": "array", + "items": { + "type": "object", + "properties": { + "boundary": { + "type": "string", + "description": "ACL name or multicast IP subnet", + "title": "Boundary" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Boundaries" + }, + "static": { + "type": "boolean", + "title": "Static" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv6" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Multicast" + }, + "ospf_network_point_to_point": { + "type": "boolean", + "title": "OSPF Network Point To Point" + }, + "ospf_area": { + "type": "string", + "title": "OSPF Area" + }, + "ospf_cost": { + "type": "integer", + "title": "OSPF Cost" + }, + "ospf_authentication": { + "type": "string", + "enum": [ + "none", + "simple", + "message-digest" + ], + "title": "OSPF Authentication" + }, + "ospf_authentication_key": { + "type": "string", + "description": "Encrypted password - only type 7 supported", + "title": "OSPF Authentication Key" + }, + "ospf_message_digest_keys": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "title": "ID" + }, + "hash_algorithm": { + "type": "string", + "enum": [ + "md5", + "sha1", + "sha256", + "sha384", + "sha512" + ], + "title": "Hash Algorithm" + }, + "key": { + "type": "string", + "description": "Encrypted password - only type 7 supported", + "title": "Key" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "id" + ] + }, + "title": "OSPF Message Digest Keys" + }, + "pim": { + "type": "object", + "properties": { + "ipv4": { + "type": "object", + "properties": { + "dr_priority": { + "type": "integer", + "minimum": 0, + "maximum": 429467295, + "title": "DR Priority" + }, + "sparse_mode": { + "type": "boolean", + "title": "Sparse Mode" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv4" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "PIM" + }, + "mac_security": { + "type": "object", + "properties": { + "profile": { + "type": "string", + "title": "Profile" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "MAC Security" + }, + "channel_group": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "title": "ID" + }, + "mode": { + "type": "string", + "enum": [ + "on", + "active", + "passive" + ], + "title": "Mode" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Channel Group" + }, + "isis_enable": { + "type": "string", + "description": "ISIS instance", + "title": "ISIS Enable" + }, + "isis_passive": { + "type": "boolean", + "title": "ISIS Passive" + }, + "isis_metric": { + "type": "integer", + "title": "ISIS Metric" + }, + "isis_network_point_to_point": { + "type": "boolean", + "title": "ISIS Network Point To Point" + }, + "isis_circuit_type": { + "type": "string", + "enum": [ + "level-1-2", + "level-1", + "level-2" + ], + "title": "ISIS Circuit Type" + }, + "isis_hello_padding": { + "type": "boolean", + "title": "ISIS Hello Padding" + }, + "isis_authentication_mode": { + "type": "string", + "enum": [ + "text", + "md5" + ], + "title": "ISIS Authentication Mode" + }, + "isis_authentication_key": { + "type": "string", + "description": "Type-7 encrypted password", + "title": "ISIS Authentication Key" + }, + "poe": { + "type": "object", + "properties": { + "disabled": { + "type": "boolean", + "description": "Disable PoE on a POE capable port. PoE is enabled on all ports that support it by default in EOS.", + "default": false, + "title": "Disabled" + }, + "priority": { + "type": "string", + "enum": [ + "critical", + "high", + "medium", + "low" + ], + "description": "Prioritize a port's power in the event that one of the switch's power supplies loses power", + "title": "Priority" + }, + "reboot": { + "description": "Set the PoE power behavior for a PoE port when the system is rebooted", + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "maintain", + "power-off" + ], + "description": "PoE action for interface", + "title": "Action" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Reboot" + }, + "link_down": { + "description": "Set the PoE power behavior for a PoE port when the port goes down", + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "maintain", + "power-off" + ], + "description": "PoE action for interface", + "title": "Action" + }, + "power_off_delay": { + "type": "integer", + "minimum": 1, + "maximum": 86400, + "description": "Number of seconds to delay shutting the power off after a link down event occurs. Default value is 5 seconds in EOS.", + "title": "Power Off Delay" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Link Down" + }, + "shutdown": { + "description": "Set the PoE power behavior for a PoE port when the port is admin down", + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "maintain", + "power-off" + ], + "description": "PoE action for interface", + "title": "Action" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Shutdown" + }, + "limit": { + "type": "object", + "description": "Override the hardware-negotiated power limit using either wattage or a power class. Note that if using a power class, AVD will automatically convert the class value to the wattage value corresponding to that power class.", + "properties": { + "class": { + "type": "integer", + "minimum": 0, + "maximum": 8, + "title": "Class" + }, + "watts": { + "type": "string", + "title": "Watts" + }, + "fixed": { + "type": "boolean", + "description": "Set to ignore hardware classification", + "title": "Fixed" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Limit" + }, + "negotiation_lldp": { + "type": "boolean", + "description": "Disable to prevent port from negotiating power with powered devices over LLDP. Enabled by default in EOS.", + "title": "Negotiation LLDP" + }, + "legacy_detect": { + "type": "boolean", + "description": "Allow a subset of legacy devices to work with the PoE switch. Disabled by default in EOS because it can cause false positive detections.", + "title": "Legacy Detect" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "PoE" + }, + "ptp": { + "type": "object", + "properties": { + "enable": { + "type": "boolean", + "title": "Enable" + }, + "announce": { + "type": "object", + "properties": { + "interval": { + "type": "integer", + "title": "Interval" + }, + "timeout": { + "type": "integer", + "title": "Timeout" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Announce" + }, + "delay_req": { + "type": "integer", + "title": "Delay Req" + }, + "delay_mechanism": { + "type": "string", + "enum": [ + "e2e", + "p2p" + ], + "title": "Delay Mechanism" + }, + "sync_message": { + "type": "object", + "properties": { + "interval": { + "type": "integer", + "title": "Interval" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Sync Message" + }, + "role": { + "type": "string", + "enum": [ + "master", + "dynamic" + ], + "title": "Role" + }, + "vlan": { + "type": "string", + "description": "VLAN can be 'all' or list of vlans as string", + "title": "VLAN" + }, + "transport": { + "type": "string", + "enum": [ + "ipv4", + "ipv6", + "layer2" + ], + "title": "Transport" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "PTP" + }, + "profile": { + "type": "string", + "description": "Interface profile", + "title": "Profile" + }, + "storm_control": { + "type": "object", + "properties": { + "all": { + "type": "object", + "properties": { + "level": { + "type": "string", + "description": "Configure maximum storm-control level", + "title": "Level" + }, + "unit": { + "type": "string", + "default": "percent", + "enum": [ + "percent", + "pps" + ], + "description": "Optional field and is hardware dependent", + "title": "Unit" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "All" + }, + "broadcast": { + "type": "object", + "properties": { + "level": { + "type": "string", + "description": "Configure maximum storm-control level", + "title": "Level" + }, + "unit": { + "type": "string", + "default": "percent", + "enum": [ + "percent", + "pps" + ], + "description": "Optional field and is hardware dependent", + "title": "Unit" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Broadcast" + }, + "multicast": { + "type": "object", + "properties": { + "level": { + "type": "string", + "description": "Configure maximum storm-control level", + "title": "Level" + }, + "unit": { + "type": "string", + "default": "percent", + "enum": [ + "percent", + "pps" + ], + "description": "Optional field and is hardware dependent", + "title": "Unit" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Multicast" + }, + "unknown_unicast": { + "type": "object", + "properties": { + "level": { + "type": "string", + "description": "Configure maximum storm-control level", + "title": "Level" + }, + "unit": { + "type": "string", + "default": "percent", + "enum": [ + "percent", + "pps" + ], + "description": "Optional field and is hardware dependent", + "title": "Unit" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Unknown Unicast" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Storm Control" + }, + "logging": { + "type": "object", + "properties": { + "event": { + "type": "object", + "properties": { + "link_status": { + "type": "boolean", + "title": "Link Status" + }, + "congestion_drops": { + "type": "boolean", + "title": "Congestion Drops" + }, + "spanning_tree": { + "type": "boolean", + "title": "Spanning Tree" + }, + "storm_control_discards": { + "type": "boolean", + "title": "Storm Control Discards" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Event" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Logging" + }, + "lldp": { + "type": "object", + "properties": { + "transmit": { + "type": "boolean", + "title": "Transmit" + }, + "receive": { + "type": "boolean", + "title": "Receive" + }, + "ztp_vlan": { + "type": "integer", + "description": "ZTP vlan number", + "title": "ZTP VLAN" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "LLDP" + }, + "trunk_private_vlan_secondary": { + "type": "boolean", + "title": "Trunk Private VLAN Secondary" + }, + "pvlan_mapping": { + "type": "string", + "description": "List of vlans as string", + "title": "PVLAN Mapping" + }, + "vlan_translations": { + "type": "array", + "items": { + "type": "object", + "properties": { + "from": { + "type": "string", + "description": "List of vlans as string (only one vlan if direction is \"both\")", + "title": "From" + }, + "to": { + "type": "integer", + "description": "VLAN ID", + "title": "To" + }, + "direction": { + "type": "string", + "enum": [ + "in", + "out", + "both" + ], + "default": "both", + "title": "Direction" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "VLAN Translations" + }, + "dot1x": { + "type": "object", + "properties": { + "port_control": { + "type": "string", + "enum": [ + "auto", + "force-authorized", + "force-unauthorized" + ], + "title": "Port Control" + }, + "port_control_force_authorized_phone": { + "type": "boolean", + "title": "Port Control Force Authorized Phone" + }, + "reauthentication": { + "type": "boolean", + "title": "Reauthentication" + }, + "pae": { + "type": "object", + "properties": { + "mode": { + "type": "string", + "enum": [ + "authenticator" + ], + "title": "Mode" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "PAE" + }, + "authentication_failure": { + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "drop" + ], + "title": "Action" + }, + "allow_vlan": { + "type": "integer", + "minimum": 1, + "maximum": 4094, + "title": "Allow VLAN" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Authentication Failure" + }, + "host_mode": { + "type": "object", + "properties": { + "mode": { + "type": "string", + "enum": [ + "multi-host", + "single-host" + ], + "title": "Mode" + }, + "multi_host_authenticated": { + "type": "boolean", + "title": "Multi Host Authenticated" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Host Mode" + }, + "mac_based_authentication": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "always": { + "type": "boolean", + "title": "Always" + }, + "host_mode_common": { + "type": "boolean", + "title": "Host Mode Common" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "MAC Based Authentication" + }, + "timeout": { + "type": "object", + "properties": { + "idle_host": { + "type": "integer", + "minimum": 10, + "maximum": 65535, + "title": "Idle Host" + }, + "quiet_period": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "title": "Quiet Period" + }, + "reauth_period": { + "type": "string", + "description": "Value can be 60-4294967295 or 'server'", + "title": "Reauth Period" + }, + "reauth_timeout_ignore": { + "type": "boolean", + "title": "Reauth Timeout Ignore" + }, + "tx_period": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "title": "TX Period" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Timeout" + }, + "reauthorization_request_limit": { + "type": "integer", + "minimum": 1, + "maximum": 10, + "title": "Reauthorization Request Limit" + }, + "unauthorized": { + "type": "object", + "properties": { + "access_vlan_membership_egress": { + "type": "boolean", + "title": "Access VLAN Membership Egress" + }, + "native_vlan_membership_egress": { + "type": "boolean", + "title": "Native VLAN Membership Egress" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Unauthorized" + }, + "eapol": { + "type": "object", + "properties": { + "disabled": { + "type": "boolean", + "title": "Disabled" + }, + "authentication_failure_fallback_mba": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "timeout": { + "type": "integer", + "minimum": 0, + "maximum": 65535, + "title": "Timeout" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Authentication Failure Fallback Mba" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Eapol" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "dot1x" + }, + "service_profile": { + "type": "string", + "description": "QOS profile", + "title": "Service Profile" + }, + "shape": { + "type": "object", + "properties": { + "rate": { + "type": "string", + "description": "Rate in kbps, pps or percent\nSupported options are platform dependent\nExamples:\n- \"5000 kbps\"\n- \"1000 pps\"\n- \"20 percent\"\n", + "title": "Rate" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Shape" + }, + "qos": { + "type": "object", + "properties": { + "trust": { + "type": "string", + "enum": [ + "dscp", + "cos", + "disabled" + ], + "title": "Trust" + }, + "dscp": { + "type": "integer", + "description": "DSCP value", + "title": "DSCP" + }, + "cos": { + "type": "integer", + "description": "COS value", + "title": "COS" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "QOS" + }, + "spanning_tree_bpdufilter": { + "type": "string", + "enum": [ + "enabled", + "disabled", + "True", + "False", + "true", + "false" + ], + "title": "Spanning Tree Bpdufilter" + }, + "spanning_tree_bpduguard": { + "type": "string", + "enum": [ + "enabled", + "disabled", + "True", + "False", + "true", + "false" + ], + "title": "Spanning Tree Bpduguard" + }, + "spanning_tree_guard": { + "type": "string", + "enum": [ + "loop", + "root", + "disabled" + ], + "title": "Spanning Tree Guard" + }, + "spanning_tree_portfast": { + "type": "string", + "enum": [ + "edge", + "network" + ], + "title": "Spanning Tree Portfast" + }, + "vmtracer": { + "type": "boolean", + "title": "VMTracer" + }, + "priority_flow_control": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "priorities": { + "type": "array", + "items": { + "type": "object", + "properties": { + "priority": { + "type": "integer", + "minimum": 0, + "maximum": 7, + "title": "Priority" + }, + "no_drop": { + "type": "boolean", + "title": "No Drop" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "priority" + ] + }, + "title": "Priorities" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Priority Flow Control" + }, + "bfd": { + "type": "object", + "properties": { + "echo": { + "type": "boolean", + "title": "Echo" + }, + "interval": { + "type": "integer", + "description": "Interval in milliseconds", + "title": "Interval" + }, + "min_rx": { + "type": "integer", + "description": "Rate in milliseconds", + "title": "Min RX" + }, + "multiplier": { + "type": "integer", + "minimum": 3, + "maximum": 50, + "title": "Multiplier" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BFD" + }, + "service_policy": { + "type": "object", + "properties": { + "pbr": { + "type": "object", + "properties": { + "input": { + "type": "string", + "description": "Policy Based Routing Policy-map name", + "title": "Input" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "PBR" + }, + "qos": { + "type": "object", + "properties": { + "input": { + "type": "string", + "description": "Quality of Service Policy-map name", + "title": "Input" + } + }, + "required": [ + "input" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "QOS" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Service Policy" + }, + "mpls": { + "type": "object", + "properties": { + "ip": { + "type": "boolean", + "title": "IP" + }, + "ldp": { + "type": "object", + "properties": { + "interface": { + "type": "boolean", + "title": "Interface" + }, + "igp_sync": { + "type": "boolean", + "title": "IGP Sync" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "LDP" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "MPLS" + }, + "lacp_timer": { + "type": "object", + "properties": { + "mode": { + "type": "string", + "enum": [ + "fast", + "normal" + ], + "title": "Mode" + }, + "multiplier": { + "type": "integer", + "minimum": 3, + "maximum": 3000, + "title": "Multiplier" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "LACP Timer" + }, + "lacp_port_priority": { + "type": "integer", + "minimum": 0, + "maximum": 65535, + "title": "LACP Port Priority" + }, + "transceiver": { + "type": "object", + "properties": { + "media": { + "type": "object", + "properties": { + "override": { + "type": "string", + "description": "Transceiver type", + "title": "Override" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Media" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Transceiver" + }, + "ip_proxy_arp": { + "type": "boolean", + "title": "IP Proxy ARP" + }, + "traffic_policy": { + "type": "object", + "properties": { + "input": { + "type": "string", + "description": "Ingress traffic policy", + "title": "Input" + }, + "output": { + "type": "string", + "description": "Egress traffic policy", + "title": "Output" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Traffic Policy" + }, + "bgp": { + "type": "object", + "properties": { + "session_tracker": { + "type": "string", + "description": "Name of session tracker", + "title": "Session Tracker" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BGP" + }, + "peer": { + "type": "string", + "description": "Key only used for documentation or validation purposes", + "title": "Peer" + }, + "peer_interface": { + "type": "string", + "description": "Key only used for documentation or validation purposes", + "title": "Peer Interface" + }, + "peer_type": { + "type": "string", + "description": "Key only used for documentation or validation purposes", + "title": "Peer Type" + }, + "sflow": { + "type": "object", + "properties": { + "enable": { + "type": "boolean", + "title": "Enable" + }, + "egress": { + "type": "object", + "properties": { + "enable": { + "type": "boolean", + "title": "Enable" + }, + "unmodified_enable": { + "type": "boolean", + "title": "Unmodified Enable" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Egress" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Sflow" + }, + "port_profile": { + "type": "string", + "description": "Key only used for documentation or validation purposes", + "title": "Port Profile" + }, + "uc_tx_queues": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "TX-Queue ID", + "title": "ID" + }, + "random_detect": { + "type": "object", + "properties": { + "ecn": { + "description": "Explicit Congestion Notification", + "type": "object", + "properties": { + "count": { + "type": "boolean", + "description": "Enable counter for random-detect ECNs", + "title": "Count" + }, + "threshold": { + "type": "object", + "properties": { + "units": { + "type": "string", + "enum": [ + "segments", + "bytes", + "kbytes", + "mbytes", + "milliseconds" + ], + "description": "Indicate the units to be used for the threshold values", + "title": "Units" + }, + "min": { + "type": "integer", + "minimum": 1, + "maximum": 256000000, + "description": "Set the random-detect ECN minimum-threshold", + "title": "Min" + }, + "max": { + "type": "integer", + "minimum": 1, + "maximum": 256000000, + "description": "Set the random-detect ECN maximum-threshold", + "title": "Max" + }, + "max_probability": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "description": "Set the random-detect ECN max-mark-probability", + "title": "Max Probability" + }, + "weight": { + "type": "integer", + "minimum": 0, + "maximum": 15, + "description": "Set the random-detect ECN weight", + "title": "Weight" + } + }, + "required": [ + "units", + "min", + "max" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Threshold" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Ecn" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Random Detect" + } + }, + "required": [ + "id" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Uc TX Queues" + }, + "tx_queues": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "TX-Queue ID", + "title": "ID" + }, + "random_detect": { + "type": "object", + "properties": { + "ecn": { + "description": "Explicit Congestion Notification", + "type": "object", + "properties": { + "count": { + "type": "boolean", + "description": "Enable counter for random-detect ECNs", + "title": "Count" + }, + "threshold": { + "type": "object", + "properties": { + "units": { + "type": "string", + "enum": [ + "segments", + "bytes", + "kbytes", + "mbytes", + "milliseconds" + ], + "description": "Indicate the units to be used for the threshold values", + "title": "Units" + }, + "min": { + "type": "integer", + "minimum": 1, + "maximum": 256000000, + "description": "Set the random-detect ECN minimum-threshold", + "title": "Min" + }, + "max": { + "type": "integer", + "minimum": 1, + "maximum": 256000000, + "description": "Set the random-detect ECN maximum-threshold", + "title": "Max" + }, + "max_probability": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "description": "Set the random-detect ECN max-mark-probability", + "title": "Max Probability" + }, + "weight": { + "type": "integer", + "minimum": 0, + "maximum": 15, + "description": "Set the random-detect ECN weight", + "title": "Weight" + } + }, + "required": [ + "units", + "max", + "max_probability" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Threshold" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Ecn" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Random Detect" + } + }, + "required": [ + "id" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "TX Queues" + }, + "vrrp_ids": { + "type": "array", + "description": "VRRP model.", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "VRID", + "title": "ID" + }, + "priority_level": { + "type": "integer", + "description": "Instance priority", + "minimum": 1, + "maximum": 254, + "title": "Priority Level" + }, + "advertisement": { + "type": "object", + "properties": { + "interval": { + "type": "integer", + "description": "Interval in seconds", + "minimum": 1, + "maximum": 255, + "title": "Interval" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Advertisement" + }, + "preempt": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "delay": { + "type": "object", + "properties": { + "minimum": { + "type": "integer", + "description": "Minimum preempt delay in seconds", + "minimum": 0, + "maximum": 3600, + "title": "Minimum" + }, + "reload": { + "type": "integer", + "description": "Reload preempt delay in seconds", + "minimum": 0, + "maximum": 3600, + "title": "Reload" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Delay" + } + }, + "required": [ + "enabled" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Preempt" + }, + "timers": { + "type": "object", + "properties": { + "delay": { + "type": "object", + "properties": { + "reload": { + "type": "integer", + "description": "Delay after reload in seconds.", + "minimum": 0, + "maximum": 3600, + "title": "Reload" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Delay" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Timers" + }, + "tracked_object": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Tracked object name", + "title": "Name" + }, + "decrement": { + "type": "integer", + "minimum": 1, + "maximum": 254, + "description": "Decrement VRRP priority by 1-254", + "title": "Decrement" + }, + "shutdown": { + "type": "boolean", + "title": "Shutdown" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "Tracked Object" + }, + "ipv4": { + "type": "object", + "properties": { + "address": { + "type": "string", + "description": "Virtual IPv4 address", + "title": "Address" + }, + "version": { + "type": "integer", + "enum": [ + 2, + 3 + ], + "title": "Version" + } + }, + "required": [ + "address" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv4" + }, + "ipv6": { + "type": "object", + "properties": { + "address": { + "type": "string", + "description": "Virtual IPv6 address", + "title": "Address" + } + }, + "required": [ + "address" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv6" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "id" + ] + }, + "title": "VRRP IDs" + }, + "eos_cli": { + "type": "string", + "description": "Multiline EOS CLI rendered directly on the ethernet interface in the final EOS configuration", + "title": "EOS CLI" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Structured Config" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "profile" + ] + }, + "title": "L3 Interfaces Profiles" + }, + "l3_interfaces": { + "type": "array", + "items": { + "type": "object", + "properties": { + "node": { + "type": "string", + "description": "Device on which the interface should be configured.", + "title": "Node" + }, + "profile": { + "type": "string", + "description": "L3 interface profile name. Profile defined under l3_interfaces_profiles.", + "title": "Profile" + }, + "interface": { + "type": "string", + "description": "Ethernet interface name like 'Ethernet2'.", + "pattern": "Ethernet[\\d/]+", + "title": "Interface" + }, + "description": { + "type": "string", + "description": "Interface description.\nIf not set a default description will be configured with '[[ ]]'", + "title": "Description" + }, + "ip": { + "type": "string", + "description": "Node IPv4 address/Mask or 'dhcp'.", + "title": "IP" + }, + "dhcp_client_accept_default_route": { + "type": "boolean", + "default": false, + "description": "Supported if `ip` is `dhcp`.\nAccepts default route from DHCP.", + "title": "DHCP Client Accept Default Route" + }, + "enabled": { + "type": "boolean", + "default": true, + "description": "Enable or Shutdown the interface.", + "title": "Enabled" + }, + "speed": { + "type": "string", + "description": "Speed should be set in the format `` or `forced ` or `auto `.", + "title": "Speed" + }, + "peer": { + "type": "string", + "description": "The peer device name. Used for description and documentation", + "title": "Peer" + }, + "peer_interface": { + "type": "string", + "description": "The peer device interface. Used for description and documentation", + "title": "Peer Interface" + }, + "peer_ip": { + "type": "string", + "description": "The peer device IP. Used for description and documentation", + "title": "Peer IP" + }, + "qos_profile": { + "type": "string", + "description": "QOS service profile.", + "title": "QOS Profile" + }, + "raw_eos_cli": { + "type": "string", + "description": "EOS CLI rendered directly on the interface in the final EOS configuration.", + "title": "Raw EOS CLI" + }, + "structured_config": { + "type": "object", + "description": "Custom structured config for the Ethernet interface.", + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "description": { + "type": "string", + "title": "Description" + }, + "shutdown": { + "type": "boolean", + "title": "Shutdown" + }, + "load_interval": { + "type": "integer", + "minimum": 0, + "maximum": 600, + "description": "Interval in seconds for updating interface counters\"", + "title": "Load Interval" + }, + "speed": { + "type": "string", + "description": "Speed should be set in the format `` or `forced ` or `auto `.", + "title": "Speed" + }, + "mtu": { + "type": "integer", + "minimum": 68, + "maximum": 65535, + "title": "MTU" + }, + "l2_mtu": { + "type": "integer", + "minimum": 68, + "maximum": 65535, + "description": "\"l2_mtu\" should only be defined for platforms supporting the \"l2 mtu\" CLI\n", + "title": "L2 MTU" + }, + "l2_mru": { + "type": "integer", + "minimum": 68, + "maximum": 65535, + "description": "\"l2_mru\" should only be defined for platforms supporting the \"l2 mru\" CLI\n", + "title": "L2 MRU" + }, + "vlans": { + "type": "string", + "description": "List of switchport vlans as string\nFor a trunk port this would be a range like \"1-200,300\"\nFor an access port this would be a single vlan \"123\"\n", + "title": "VLANs" + }, + "native_vlan": { + "type": "integer", + "title": "Native VLAN" + }, + "native_vlan_tag": { + "type": "boolean", + "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence", + "title": "Native VLAN Tag" + }, + "mode": { + "type": "string", + "enum": [ + "access", + "dot1q-tunnel", + "trunk", + "trunk phone" + ], + "title": "Mode" + }, + "phone": { + "type": "object", + "properties": { + "trunk": { + "type": "string", + "enum": [ + "tagged", + "tagged phone", + "untagged", + "untagged phone" + ], + "title": "Trunk" + }, + "vlan": { + "type": "integer", + "minimum": 1, + "maximum": 4094, + "title": "VLAN" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Phone" + }, + "l2_protocol": { + "type": "object", + "properties": { + "encapsulation_dot1q_vlan": { + "type": "integer", + "description": "Vlan tag to configure on sub-interface", + "title": "Encapsulation Dot1Q VLAN" + }, + "forwarding_profile": { + "type": "string", + "description": "L2 protocol forwarding profile", + "title": "Forwarding Profile" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "L2 Protocol" + }, + "trunk_groups": { + "type": "array", + "items": { + "type": "string" + }, + "title": "Trunk Groups" + }, + "type": { + "type": "string", + "enum": [ + "routed", + "switched", + "l3dot1q", + "l2dot1q", + "port-channel-member" + ], + "description": "l3dot1q and l2dot1q are used for sub-interfaces. The parent interface should be defined as routed.\nInterface will not be listed in device documentation, unless \"type\" is set.\n", + "title": "Type" + }, + "snmp_trap_link_change": { + "type": "boolean", + "title": "Snmp Trap Link Change" + }, + "address_locking": { + "type": "object", + "properties": { + "ipv4": { + "type": "boolean", + "description": "Enable address locking for IPv4", + "title": "IPv4" + }, + "ipv6": { + "type": "boolean", + "description": "Enable address locking for IPv6", + "title": "IPv6" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Address Locking" + }, + "flowcontrol": { + "type": "object", + "properties": { + "received": { + "type": "string", + "enum": [ + "desired", + "on", + "off" + ], + "title": "Received" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Flowcontrol" + }, + "vrf": { + "type": "string", + "description": "VRF name", + "title": "VRF" + }, + "flow_tracker": { + "type": "object", + "properties": { + "sampled": { + "type": "string", + "description": "Sampled flow tracker name.", + "title": "Sampled" + }, + "hardware": { + "type": "string", + "description": "Hardware flow tracker name.", + "title": "Hardware" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Flow Tracker" + }, + "error_correction_encoding": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "default": true, + "title": "Enabled" + }, + "fire_code": { + "type": "boolean", + "title": "Fire Code" + }, + "reed_solomon": { + "type": "boolean", + "title": "Reed Solomon" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Error Correction Encoding" + }, + "link_tracking_groups": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Group name", + "title": "Name" + }, + "direction": { + "type": "string", + "enum": [ + "upstream", + "downstream" + ], + "title": "Direction" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "Link Tracking Groups" + }, + "evpn_ethernet_segment": { + "type": "object", + "properties": { + "identifier": { + "type": "string", + "description": "EVPN Ethernet Segment Identifier (Type 1 format)", + "title": "Identifier" + }, + "redundancy": { + "type": "string", + "enum": [ + "all-active", + "single-active" + ], + "title": "Redundancy" + }, + "designated_forwarder_election": { + "type": "object", + "properties": { + "algorithm": { + "type": "string", + "enum": [ + "modulus", + "preference" + ], + "title": "Algorithm" + }, + "preference_value": { + "type": "integer", + "minimum": 0, + "maximum": 65535, + "description": "Preference_value is only used when \"algorithm\" is \"preference\"", + "title": "Preference Value" + }, + "dont_preempt": { + "type": "boolean", + "description": "Dont_preempt is only used when \"algorithm\" is \"preference\"", + "title": "Dont Preempt" + }, + "hold_time": { + "type": "integer", + "title": "Hold Time" + }, + "subsequent_hold_time": { + "type": "integer", + "title": "Subsequent Hold Time" + }, + "candidate_reachability_required": { + "type": "boolean", + "title": "Candidate Reachability Required" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Designated Forwarder Election" + }, + "mpls": { + "type": "object", + "properties": { + "shared_index": { + "type": "integer", + "minimum": 1, + "maximum": 1024, + "title": "Shared Index" + }, + "tunnel_flood_filter_time": { + "type": "integer", + "title": "Tunnel Flood Filter Time" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "MPLS" + }, + "route_target": { + "type": "string", + "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx", + "title": "Route Target" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "EVPN Ethernet Segment" + }, + "encapsulation_dot1q_vlan": { + "type": "integer", + "description": "VLAN tag to configure on sub-interface", + "title": "Encapsulation Dot1Q VLAN" + }, + "encapsulation_vlan": { + "type": "object", + "properties": { + "client": { + "type": "object", + "properties": { + "dot1q": { + "type": "object", + "properties": { + "vlan": { + "type": "integer", + "description": "Client VLAN ID", + "title": "VLAN" + }, + "outer": { + "type": "integer", + "description": "Client Outer VLAN ID", + "title": "Outer" + }, + "inner": { + "type": "integer", + "description": "Client Inner VLAN ID", + "title": "Inner" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Dot1Q" + }, + "unmatched": { + "type": "boolean", + "title": "Unmatched" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Client" + }, + "network": { + "type": "object", + "description": "Network encapsulations are all optional and skipped if using client unmatched", + "properties": { + "dot1q": { + "type": "object", + "properties": { + "vlan": { + "type": "integer", + "description": "Network VLAN ID", + "title": "VLAN" + }, + "outer": { + "type": "integer", + "description": "Network outer VLAN ID", + "title": "Outer" + }, + "inner": { + "type": "integer", + "description": "Network inner VLAN ID", + "title": "Inner" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Dot1Q" + }, + "client": { + "type": "boolean", + "title": "Client" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Network" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Encapsulation VLAN" + }, + "vlan_id": { + "type": "integer", + "minimum": 1, + "maximum": 4094, + "title": "VLAN ID" + }, + "ip_address": { + "type": "string", + "description": "IPv4 address/mask or \"dhcp\"", + "title": "IP Address" + }, + "ip_address_secondaries": { + "type": "array", + "items": { + "type": "string" + }, + "title": "IP Address Secondaries" + }, + "dhcp_client_accept_default_route": { + "type": "boolean", + "description": "Install default-route obtained via DHCP", + "title": "DHCP Client Accept Default Route" + }, + "dhcp_server_ipv4": { + "type": "boolean", + "description": "Enable IPv4 DHCP server.", + "title": "DHCP Server IPv4" + }, + "dhcp_server_ipv6": { + "type": "boolean", + "description": "Enable IPv6 DHCP server.", + "title": "DHCP Server IPv6" + }, + "ip_helpers": { + "type": "array", + "items": { + "type": "object", + "properties": { + "ip_helper": { + "type": "string", + "title": "IP Helper" + }, + "source_interface": { + "type": "string", + "description": "Source interface name", + "title": "Source Interface" + }, + "vrf": { + "type": "string", + "description": "VRF name", + "title": "VRF" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "ip_helper" + ] + }, + "title": "IP Helpers" + }, + "ip_nat": { + "type": "object", + "properties": { + "service_profile": { + "type": "string", + "description": "NAT interface profile.", + "title": "Service Profile" + }, + "destination": { + "type": "object", + "properties": { + "dynamic": { + "type": "array", + "items": { + "type": "object", + "properties": { + "access_list": { + "type": "string", + "title": "Access List" + }, + "comment": { + "type": "string", + "title": "Comment" + }, + "pool_name": { + "type": "string", + "title": "Pool Name" + }, + "priority": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "title": "Priority" + } + }, + "required": [ + "pool_name", + "access_list" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Dynamic" + }, + "static": { + "type": "array", + "items": { + "type": "object", + "properties": { + "access_list": { + "type": "string", + "description": "'access_list' and 'group' are mutual exclusive", + "title": "Access List" + }, + "comment": { + "type": "string", + "title": "Comment" + }, + "direction": { + "type": "string", + "enum": [ + "egress", + "ingress" + ], + "description": "Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware platform.\nEOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW.\n", + "title": "Direction" + }, + "group": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "description": "'access_list' and 'group' are mutual exclusive", + "title": "Group" + }, + "original_ip": { + "type": "string", + "description": "IPv4 address", + "title": "Original IP" + }, + "original_port": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "title": "Original Port" + }, + "priority": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "title": "Priority" + }, + "protocol": { + "type": "string", + "enum": [ + "udp", + "tcp" + ], + "title": "Protocol" + }, + "translated_ip": { + "type": "string", + "description": "IPv4 address", + "title": "Translated IP" + }, + "translated_port": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "description": "requires 'original_port'", + "title": "Translated Port" + } + }, + "required": [ + "translated_ip", + "original_ip" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Static" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Destination" + }, + "source": { + "type": "object", + "properties": { + "dynamic": { + "type": "array", + "items": { + "type": "object", + "properties": { + "access_list": { + "type": "string", + "title": "Access List" + }, + "comment": { + "type": "string", + "title": "Comment" + }, + "nat_type": { + "type": "string", + "enum": [ + "overload", + "pool", + "pool-address-only", + "pool-full-cone" + ], + "title": "Nat Type" + }, + "pool_name": { + "type": "string", + "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone\nignored if 'nat_type' is overload\n", + "title": "Pool Name" + }, + "priority": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "title": "Priority" + } + }, + "required": [ + "nat_type", + "access_list" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Dynamic" + }, + "static": { + "type": "array", + "items": { + "type": "object", + "properties": { + "access_list": { + "type": "string", + "description": "'access_list' and 'group' are mutual exclusive", + "title": "Access List" + }, + "comment": { + "type": "string", + "title": "Comment" + }, + "direction": { + "type": "string", + "enum": [ + "egress", + "ingress" + ], + "description": "Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware platform.\nEOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW.\n", + "title": "Direction" + }, + "group": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "description": "'access_list' and 'group' are mutual exclusive", + "title": "Group" + }, + "original_ip": { + "type": "string", + "description": "IPv4 address", + "title": "Original IP" + }, + "original_port": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "title": "Original Port" + }, + "priority": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "title": "Priority" + }, + "protocol": { + "type": "string", + "enum": [ + "udp", + "tcp" + ], + "title": "Protocol" + }, + "translated_ip": { + "type": "string", + "description": "IPv4 address", + "title": "Translated IP" + }, + "translated_port": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "description": "requires 'original_port'", + "title": "Translated Port" + } + }, + "required": [ + "translated_ip", + "original_ip" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Static" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Source" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IP Nat" + }, + "ipv6_enable": { + "type": "boolean", + "title": "IPv6 Enable" + }, + "ipv6_address": { + "type": "string", + "title": "IPv6 Address" + }, + "ipv6_address_link_local": { + "type": "string", + "description": "Link local IPv6 address/mask", + "title": "IPv6 Address Link Local" + }, + "ipv6_nd_ra_disabled": { + "type": "boolean", + "title": "IPv6 ND RA Disabled" + }, + "ipv6_nd_managed_config_flag": { + "type": "boolean", + "title": "IPv6 ND Managed Config Flag" + }, + "ipv6_nd_prefixes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "ipv6_prefix": { + "type": "string", + "title": "IPv6 Prefix" + }, + "valid_lifetime": { + "type": "string", + "description": "Infinite or lifetime in seconds", + "title": "Valid Lifetime" + }, + "preferred_lifetime": { + "type": "string", + "description": "Infinite or lifetime in seconds", + "title": "Preferred Lifetime" + }, + "no_autoconfig_flag": { + "type": "boolean", + "title": "No Autoconfig Flag" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "ipv6_prefix" + ] + }, + "title": "IPv6 ND Prefixes" + }, + "ipv6_dhcp_relay_destinations": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "description": "DHCP server's IPv6 address", + "title": "Address" + }, + "vrf": { + "type": "string", + "title": "VRF" + }, + "local_interface": { + "type": "string", + "description": "Local interface to communicate with DHCP server - mutually exclusive to source_address", + "title": "Local Interface" + }, + "source_address": { + "type": "string", + "description": "Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface", + "title": "Source Address" + }, + "link_address": { + "type": "string", + "description": "Override the default link address specified in the relayed DHCP packet", + "title": "Link Address" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "address" + ] + }, + "title": "IPv6 DHCP Relay Destinations" + }, + "access_group_in": { + "type": "string", + "description": "Access list name", + "title": "Access Group In" + }, + "access_group_out": { + "type": "string", + "description": "Access list name", + "title": "Access Group Out" + }, + "ipv6_access_group_in": { + "type": "string", + "description": "IPv6 access list name", + "title": "IPv6 Access Group In" + }, + "ipv6_access_group_out": { + "type": "string", + "description": "IPv6 access list name", + "title": "IPv6 Access Group Out" + }, + "mac_access_group_in": { + "type": "string", + "description": "MAC access list name", + "title": "MAC Access Group In" + }, + "mac_access_group_out": { + "type": "string", + "description": "MAC access list name", + "title": "MAC Access Group Out" + }, + "multicast": { + "type": "object", + "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both", + "properties": { + "ipv4": { + "type": "object", + "properties": { + "boundaries": { + "type": "array", + "items": { + "type": "object", + "properties": { + "boundary": { + "type": "string", + "description": "ACL name or multicast IP subnet", + "title": "Boundary" + }, + "out": { + "type": "boolean", + "title": "Out" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Boundaries" + }, + "static": { + "type": "boolean", + "title": "Static" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv4" + }, + "ipv6": { + "type": "object", + "properties": { + "boundaries": { + "type": "array", + "items": { + "type": "object", + "properties": { + "boundary": { + "type": "string", + "description": "ACL name or multicast IP subnet", + "title": "Boundary" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Boundaries" + }, + "static": { + "type": "boolean", + "title": "Static" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv6" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Multicast" + }, + "ospf_network_point_to_point": { + "type": "boolean", + "title": "OSPF Network Point To Point" + }, + "ospf_area": { + "type": "string", + "title": "OSPF Area" + }, + "ospf_cost": { + "type": "integer", + "title": "OSPF Cost" + }, + "ospf_authentication": { + "type": "string", + "enum": [ + "none", + "simple", + "message-digest" + ], + "title": "OSPF Authentication" + }, + "ospf_authentication_key": { + "type": "string", + "description": "Encrypted password - only type 7 supported", + "title": "OSPF Authentication Key" + }, + "ospf_message_digest_keys": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "title": "ID" + }, + "hash_algorithm": { + "type": "string", + "enum": [ + "md5", + "sha1", + "sha256", + "sha384", + "sha512" + ], + "title": "Hash Algorithm" + }, + "key": { + "type": "string", + "description": "Encrypted password - only type 7 supported", + "title": "Key" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "id" + ] + }, + "title": "OSPF Message Digest Keys" + }, + "pim": { + "type": "object", + "properties": { + "ipv4": { + "type": "object", + "properties": { + "dr_priority": { + "type": "integer", + "minimum": 0, + "maximum": 429467295, + "title": "DR Priority" + }, + "sparse_mode": { + "type": "boolean", + "title": "Sparse Mode" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv4" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "PIM" + }, + "mac_security": { + "type": "object", + "properties": { + "profile": { + "type": "string", + "title": "Profile" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "MAC Security" + }, + "channel_group": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "title": "ID" + }, + "mode": { + "type": "string", + "enum": [ + "on", + "active", + "passive" + ], + "title": "Mode" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Channel Group" + }, + "isis_enable": { + "type": "string", + "description": "ISIS instance", + "title": "ISIS Enable" + }, + "isis_passive": { + "type": "boolean", + "title": "ISIS Passive" + }, + "isis_metric": { + "type": "integer", + "title": "ISIS Metric" + }, + "isis_network_point_to_point": { + "type": "boolean", + "title": "ISIS Network Point To Point" + }, + "isis_circuit_type": { + "type": "string", + "enum": [ + "level-1-2", + "level-1", + "level-2" + ], + "title": "ISIS Circuit Type" + }, + "isis_hello_padding": { + "type": "boolean", + "title": "ISIS Hello Padding" + }, + "isis_authentication_mode": { + "type": "string", + "enum": [ + "text", + "md5" + ], + "title": "ISIS Authentication Mode" + }, + "isis_authentication_key": { + "type": "string", + "description": "Type-7 encrypted password", + "title": "ISIS Authentication Key" + }, + "poe": { + "type": "object", + "properties": { + "disabled": { + "type": "boolean", + "description": "Disable PoE on a POE capable port. PoE is enabled on all ports that support it by default in EOS.", + "default": false, + "title": "Disabled" + }, + "priority": { + "type": "string", + "enum": [ + "critical", + "high", + "medium", + "low" + ], + "description": "Prioritize a port's power in the event that one of the switch's power supplies loses power", + "title": "Priority" + }, + "reboot": { + "description": "Set the PoE power behavior for a PoE port when the system is rebooted", + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "maintain", + "power-off" + ], + "description": "PoE action for interface", + "title": "Action" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Reboot" + }, + "link_down": { + "description": "Set the PoE power behavior for a PoE port when the port goes down", + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "maintain", + "power-off" + ], + "description": "PoE action for interface", + "title": "Action" + }, + "power_off_delay": { + "type": "integer", + "minimum": 1, + "maximum": 86400, + "description": "Number of seconds to delay shutting the power off after a link down event occurs. Default value is 5 seconds in EOS.", + "title": "Power Off Delay" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Link Down" + }, + "shutdown": { + "description": "Set the PoE power behavior for a PoE port when the port is admin down", + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "maintain", + "power-off" + ], + "description": "PoE action for interface", + "title": "Action" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Shutdown" + }, + "limit": { + "type": "object", + "description": "Override the hardware-negotiated power limit using either wattage or a power class. Note that if using a power class, AVD will automatically convert the class value to the wattage value corresponding to that power class.", + "properties": { + "class": { + "type": "integer", + "minimum": 0, + "maximum": 8, + "title": "Class" + }, + "watts": { + "type": "string", + "title": "Watts" + }, + "fixed": { + "type": "boolean", + "description": "Set to ignore hardware classification", + "title": "Fixed" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Limit" + }, + "negotiation_lldp": { + "type": "boolean", + "description": "Disable to prevent port from negotiating power with powered devices over LLDP. Enabled by default in EOS.", + "title": "Negotiation LLDP" + }, + "legacy_detect": { + "type": "boolean", + "description": "Allow a subset of legacy devices to work with the PoE switch. Disabled by default in EOS because it can cause false positive detections.", + "title": "Legacy Detect" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "PoE" + }, + "ptp": { + "type": "object", + "properties": { + "enable": { + "type": "boolean", + "title": "Enable" + }, + "announce": { + "type": "object", + "properties": { + "interval": { + "type": "integer", + "title": "Interval" + }, + "timeout": { + "type": "integer", + "title": "Timeout" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Announce" + }, + "delay_req": { + "type": "integer", + "title": "Delay Req" + }, + "delay_mechanism": { + "type": "string", + "enum": [ + "e2e", + "p2p" + ], + "title": "Delay Mechanism" + }, + "sync_message": { + "type": "object", + "properties": { + "interval": { + "type": "integer", + "title": "Interval" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Sync Message" + }, + "role": { + "type": "string", + "enum": [ + "master", + "dynamic" + ], + "title": "Role" + }, + "vlan": { + "type": "string", + "description": "VLAN can be 'all' or list of vlans as string", + "title": "VLAN" + }, + "transport": { + "type": "string", + "enum": [ + "ipv4", + "ipv6", + "layer2" + ], + "title": "Transport" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "PTP" + }, + "profile": { + "type": "string", + "description": "Interface profile", + "title": "Profile" + }, + "storm_control": { + "type": "object", + "properties": { + "all": { + "type": "object", + "properties": { + "level": { + "type": "string", + "description": "Configure maximum storm-control level", + "title": "Level" + }, + "unit": { + "type": "string", + "default": "percent", + "enum": [ + "percent", + "pps" + ], + "description": "Optional field and is hardware dependent", + "title": "Unit" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "All" + }, + "broadcast": { + "type": "object", + "properties": { + "level": { + "type": "string", + "description": "Configure maximum storm-control level", + "title": "Level" + }, + "unit": { + "type": "string", + "default": "percent", + "enum": [ + "percent", + "pps" + ], + "description": "Optional field and is hardware dependent", + "title": "Unit" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Broadcast" + }, + "multicast": { + "type": "object", + "properties": { + "level": { + "type": "string", + "description": "Configure maximum storm-control level", + "title": "Level" + }, + "unit": { + "type": "string", + "default": "percent", + "enum": [ + "percent", + "pps" + ], + "description": "Optional field and is hardware dependent", + "title": "Unit" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Multicast" + }, + "unknown_unicast": { + "type": "object", + "properties": { + "level": { + "type": "string", + "description": "Configure maximum storm-control level", + "title": "Level" + }, + "unit": { + "type": "string", + "default": "percent", + "enum": [ + "percent", + "pps" + ], + "description": "Optional field and is hardware dependent", + "title": "Unit" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Unknown Unicast" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Storm Control" + }, + "logging": { + "type": "object", + "properties": { + "event": { + "type": "object", + "properties": { + "link_status": { + "type": "boolean", + "title": "Link Status" + }, + "congestion_drops": { + "type": "boolean", + "title": "Congestion Drops" + }, + "spanning_tree": { + "type": "boolean", + "title": "Spanning Tree" + }, + "storm_control_discards": { + "type": "boolean", + "title": "Storm Control Discards" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Event" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Logging" + }, + "lldp": { + "type": "object", + "properties": { + "transmit": { + "type": "boolean", + "title": "Transmit" + }, + "receive": { + "type": "boolean", + "title": "Receive" + }, + "ztp_vlan": { + "type": "integer", + "description": "ZTP vlan number", + "title": "ZTP VLAN" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "LLDP" + }, + "trunk_private_vlan_secondary": { + "type": "boolean", + "title": "Trunk Private VLAN Secondary" + }, + "pvlan_mapping": { + "type": "string", + "description": "List of vlans as string", + "title": "PVLAN Mapping" + }, + "vlan_translations": { + "type": "array", + "items": { + "type": "object", + "properties": { + "from": { + "type": "string", + "description": "List of vlans as string (only one vlan if direction is \"both\")", + "title": "From" + }, + "to": { + "type": "integer", + "description": "VLAN ID", + "title": "To" + }, + "direction": { + "type": "string", + "enum": [ + "in", + "out", + "both" + ], + "default": "both", + "title": "Direction" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "VLAN Translations" + }, + "dot1x": { + "type": "object", + "properties": { + "port_control": { + "type": "string", + "enum": [ + "auto", + "force-authorized", + "force-unauthorized" + ], + "title": "Port Control" + }, + "port_control_force_authorized_phone": { + "type": "boolean", + "title": "Port Control Force Authorized Phone" + }, + "reauthentication": { + "type": "boolean", + "title": "Reauthentication" + }, + "pae": { + "type": "object", + "properties": { + "mode": { + "type": "string", + "enum": [ + "authenticator" + ], + "title": "Mode" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "PAE" + }, + "authentication_failure": { + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "drop" + ], + "title": "Action" + }, + "allow_vlan": { + "type": "integer", + "minimum": 1, + "maximum": 4094, + "title": "Allow VLAN" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Authentication Failure" + }, + "host_mode": { + "type": "object", + "properties": { + "mode": { + "type": "string", + "enum": [ + "multi-host", + "single-host" + ], + "title": "Mode" + }, + "multi_host_authenticated": { + "type": "boolean", + "title": "Multi Host Authenticated" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Host Mode" + }, + "mac_based_authentication": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "always": { + "type": "boolean", + "title": "Always" + }, + "host_mode_common": { + "type": "boolean", + "title": "Host Mode Common" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "MAC Based Authentication" + }, + "timeout": { + "type": "object", + "properties": { + "idle_host": { + "type": "integer", + "minimum": 10, + "maximum": 65535, + "title": "Idle Host" + }, + "quiet_period": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "title": "Quiet Period" + }, + "reauth_period": { + "type": "string", + "description": "Value can be 60-4294967295 or 'server'", + "title": "Reauth Period" + }, + "reauth_timeout_ignore": { + "type": "boolean", + "title": "Reauth Timeout Ignore" + }, + "tx_period": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "title": "TX Period" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Timeout" + }, + "reauthorization_request_limit": { + "type": "integer", + "minimum": 1, + "maximum": 10, + "title": "Reauthorization Request Limit" + }, + "unauthorized": { + "type": "object", + "properties": { + "access_vlan_membership_egress": { + "type": "boolean", + "title": "Access VLAN Membership Egress" + }, + "native_vlan_membership_egress": { + "type": "boolean", + "title": "Native VLAN Membership Egress" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Unauthorized" + }, + "eapol": { + "type": "object", + "properties": { + "disabled": { + "type": "boolean", + "title": "Disabled" + }, + "authentication_failure_fallback_mba": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "timeout": { + "type": "integer", + "minimum": 0, + "maximum": 65535, + "title": "Timeout" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Authentication Failure Fallback Mba" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Eapol" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "dot1x" + }, + "service_profile": { + "type": "string", + "description": "QOS profile", + "title": "Service Profile" + }, + "shape": { + "type": "object", + "properties": { + "rate": { + "type": "string", + "description": "Rate in kbps, pps or percent\nSupported options are platform dependent\nExamples:\n- \"5000 kbps\"\n- \"1000 pps\"\n- \"20 percent\"\n", + "title": "Rate" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Shape" + }, + "qos": { + "type": "object", + "properties": { + "trust": { + "type": "string", + "enum": [ + "dscp", + "cos", + "disabled" + ], + "title": "Trust" + }, + "dscp": { + "type": "integer", + "description": "DSCP value", + "title": "DSCP" + }, + "cos": { + "type": "integer", + "description": "COS value", + "title": "COS" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "QOS" + }, + "spanning_tree_bpdufilter": { + "type": "string", + "enum": [ + "enabled", + "disabled", + "True", + "False", + "true", + "false" + ], + "title": "Spanning Tree Bpdufilter" + }, + "spanning_tree_bpduguard": { + "type": "string", + "enum": [ + "enabled", + "disabled", + "True", + "False", + "true", + "false" + ], + "title": "Spanning Tree Bpduguard" + }, + "spanning_tree_guard": { + "type": "string", + "enum": [ + "loop", + "root", + "disabled" + ], + "title": "Spanning Tree Guard" + }, + "spanning_tree_portfast": { + "type": "string", + "enum": [ + "edge", + "network" + ], + "title": "Spanning Tree Portfast" + }, + "vmtracer": { + "type": "boolean", + "title": "VMTracer" + }, + "priority_flow_control": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "priorities": { + "type": "array", + "items": { + "type": "object", + "properties": { + "priority": { + "type": "integer", + "minimum": 0, + "maximum": 7, + "title": "Priority" + }, + "no_drop": { + "type": "boolean", + "title": "No Drop" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "priority" + ] + }, + "title": "Priorities" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Priority Flow Control" + }, + "bfd": { + "type": "object", + "properties": { + "echo": { + "type": "boolean", + "title": "Echo" + }, + "interval": { + "type": "integer", + "description": "Interval in milliseconds", + "title": "Interval" + }, + "min_rx": { + "type": "integer", + "description": "Rate in milliseconds", + "title": "Min RX" + }, + "multiplier": { + "type": "integer", + "minimum": 3, + "maximum": 50, + "title": "Multiplier" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BFD" + }, + "service_policy": { + "type": "object", + "properties": { + "pbr": { + "type": "object", + "properties": { + "input": { + "type": "string", + "description": "Policy Based Routing Policy-map name", + "title": "Input" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "PBR" + }, + "qos": { + "type": "object", + "properties": { + "input": { + "type": "string", + "description": "Quality of Service Policy-map name", + "title": "Input" + } + }, + "required": [ + "input" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "QOS" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Service Policy" + }, + "mpls": { + "type": "object", + "properties": { + "ip": { + "type": "boolean", + "title": "IP" + }, + "ldp": { + "type": "object", + "properties": { + "interface": { + "type": "boolean", + "title": "Interface" + }, + "igp_sync": { + "type": "boolean", + "title": "IGP Sync" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "LDP" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "MPLS" + }, + "lacp_timer": { + "type": "object", + "properties": { + "mode": { + "type": "string", + "enum": [ + "fast", + "normal" + ], + "title": "Mode" + }, + "multiplier": { + "type": "integer", + "minimum": 3, + "maximum": 3000, + "title": "Multiplier" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "LACP Timer" + }, + "lacp_port_priority": { + "type": "integer", + "minimum": 0, + "maximum": 65535, + "title": "LACP Port Priority" + }, + "transceiver": { + "type": "object", + "properties": { + "media": { + "type": "object", + "properties": { + "override": { + "type": "string", + "description": "Transceiver type", + "title": "Override" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Media" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Transceiver" + }, + "ip_proxy_arp": { + "type": "boolean", + "title": "IP Proxy ARP" + }, + "traffic_policy": { + "type": "object", + "properties": { + "input": { + "type": "string", + "description": "Ingress traffic policy", + "title": "Input" + }, + "output": { + "type": "string", + "description": "Egress traffic policy", + "title": "Output" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Traffic Policy" + }, + "bgp": { + "type": "object", + "properties": { + "session_tracker": { + "type": "string", + "description": "Name of session tracker", + "title": "Session Tracker" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BGP" + }, + "peer": { + "type": "string", + "description": "Key only used for documentation or validation purposes", + "title": "Peer" + }, + "peer_interface": { + "type": "string", + "description": "Key only used for documentation or validation purposes", + "title": "Peer Interface" + }, + "peer_type": { + "type": "string", + "description": "Key only used for documentation or validation purposes", + "title": "Peer Type" + }, + "sflow": { + "type": "object", + "properties": { + "enable": { + "type": "boolean", + "title": "Enable" + }, + "egress": { + "type": "object", + "properties": { + "enable": { + "type": "boolean", + "title": "Enable" + }, + "unmodified_enable": { + "type": "boolean", + "title": "Unmodified Enable" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Egress" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Sflow" + }, + "port_profile": { + "type": "string", + "description": "Key only used for documentation or validation purposes", + "title": "Port Profile" + }, + "uc_tx_queues": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "TX-Queue ID", + "title": "ID" + }, + "random_detect": { + "type": "object", + "properties": { + "ecn": { + "description": "Explicit Congestion Notification", + "type": "object", + "properties": { + "count": { + "type": "boolean", + "description": "Enable counter for random-detect ECNs", + "title": "Count" + }, + "threshold": { + "type": "object", + "properties": { + "units": { + "type": "string", + "enum": [ + "segments", + "bytes", + "kbytes", + "mbytes", + "milliseconds" + ], + "description": "Indicate the units to be used for the threshold values", + "title": "Units" + }, + "min": { + "type": "integer", + "minimum": 1, + "maximum": 256000000, + "description": "Set the random-detect ECN minimum-threshold", + "title": "Min" + }, + "max": { + "type": "integer", + "minimum": 1, + "maximum": 256000000, + "description": "Set the random-detect ECN maximum-threshold", + "title": "Max" + }, + "max_probability": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "description": "Set the random-detect ECN max-mark-probability", + "title": "Max Probability" + }, + "weight": { + "type": "integer", + "minimum": 0, + "maximum": 15, + "description": "Set the random-detect ECN weight", + "title": "Weight" + } + }, + "required": [ + "units", + "min", + "max" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Threshold" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Ecn" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Random Detect" + } + }, + "required": [ + "id" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Uc TX Queues" + }, + "tx_queues": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "TX-Queue ID", + "title": "ID" + }, + "random_detect": { + "type": "object", + "properties": { + "ecn": { + "description": "Explicit Congestion Notification", + "type": "object", + "properties": { + "count": { + "type": "boolean", + "description": "Enable counter for random-detect ECNs", + "title": "Count" + }, + "threshold": { + "type": "object", + "properties": { + "units": { + "type": "string", + "enum": [ + "segments", + "bytes", + "kbytes", + "mbytes", + "milliseconds" + ], + "description": "Indicate the units to be used for the threshold values", + "title": "Units" + }, + "min": { + "type": "integer", + "minimum": 1, + "maximum": 256000000, + "description": "Set the random-detect ECN minimum-threshold", + "title": "Min" + }, + "max": { + "type": "integer", + "minimum": 1, + "maximum": 256000000, + "description": "Set the random-detect ECN maximum-threshold", + "title": "Max" + }, + "max_probability": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "description": "Set the random-detect ECN max-mark-probability", + "title": "Max Probability" + }, + "weight": { + "type": "integer", + "minimum": 0, + "maximum": 15, + "description": "Set the random-detect ECN weight", + "title": "Weight" + } + }, + "required": [ + "units", + "max", + "max_probability" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Threshold" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Ecn" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Random Detect" + } + }, + "required": [ + "id" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "TX Queues" + }, + "vrrp_ids": { + "type": "array", + "description": "VRRP model.", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "VRID", + "title": "ID" + }, + "priority_level": { + "type": "integer", + "description": "Instance priority", + "minimum": 1, + "maximum": 254, + "title": "Priority Level" + }, + "advertisement": { + "type": "object", + "properties": { + "interval": { + "type": "integer", + "description": "Interval in seconds", + "minimum": 1, + "maximum": 255, + "title": "Interval" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Advertisement" + }, + "preempt": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "delay": { + "type": "object", + "properties": { + "minimum": { + "type": "integer", + "description": "Minimum preempt delay in seconds", + "minimum": 0, + "maximum": 3600, + "title": "Minimum" + }, + "reload": { + "type": "integer", + "description": "Reload preempt delay in seconds", + "minimum": 0, + "maximum": 3600, + "title": "Reload" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Delay" + } + }, + "required": [ + "enabled" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Preempt" + }, + "timers": { + "type": "object", + "properties": { + "delay": { + "type": "object", + "properties": { + "reload": { + "type": "integer", + "description": "Delay after reload in seconds.", + "minimum": 0, + "maximum": 3600, + "title": "Reload" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Delay" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Timers" + }, + "tracked_object": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Tracked object name", + "title": "Name" + }, + "decrement": { + "type": "integer", + "minimum": 1, + "maximum": 254, + "description": "Decrement VRRP priority by 1-254", + "title": "Decrement" + }, + "shutdown": { + "type": "boolean", + "title": "Shutdown" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "Tracked Object" + }, + "ipv4": { + "type": "object", + "properties": { + "address": { + "type": "string", + "description": "Virtual IPv4 address", + "title": "Address" + }, + "version": { + "type": "integer", + "enum": [ + 2, + 3 + ], + "title": "Version" + } + }, + "required": [ + "address" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv4" + }, + "ipv6": { + "type": "object", + "properties": { + "address": { + "type": "string", + "description": "Virtual IPv6 address", + "title": "Address" + } + }, + "required": [ + "address" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv6" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "id" + ] + }, + "title": "VRRP IDs" + }, + "eos_cli": { + "type": "string", + "description": "Multiline EOS CLI rendered directly on the ethernet interface in the final EOS configuration", + "title": "EOS CLI" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Structured Config" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "L3 Interfaces" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Core Interfaces" + }, + "custom_structured_configuration_list_merge": { + "type": "string", + "description": "The List-merge strategy used when merging custom structured configurations.\n\nThis applies to all vars prefixed by prefixes in `custom_structured_configuration_prefix`\nand all data under the various `structured_config` options.\n\nThe available list merge strategies:\n- `replace`:\n - Any list will be replaced with the list defined in custom structured configurations.\n- `append`:\n - Existing list items with the same \"Primary key\"-value will be updated.\n - New items will be appended to the existing list (including duplicates).\n- `keep`:\n - Only set list if there is no existing list or existing list is `None`.\n- `prepend`:\n - Existing list items with the same \"Primary key\"-value will be updated.\n - New items will be prepended to the existing list (including duplicates).\n- `append_rp`:\n - Existing list items with the same \"Primary key\"-value will be updated.\n - New unique items will be appended to the existing list.\n- `prepend_rp`:\n - Existing list items with the same \"Primary key\"-value will be updated.\n - New unique items will be prepended to the existing list.\n", + "enum": [ + "replace", + "append", + "keep", + "prepend", + "append_rp", + "prepend_rp" + ], + "default": "append_rp", + "title": "Custom Structured Configuration List Merge" + }, + "custom_structured_configuration_prefix": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Custom EOS Structured Configuration keys can be set on any group or host_var level using the name\nof the corresponding `eos_cli_config_gen` key prefixed with content of `custom_structured_configuration_prefix`.\n\nThe content of Custom Structured Configuration variables will be merged with the structured config generated by the eos_designs role.\n\nThe merge is done recursively, so it is possible to update a sub-key of a variable set by `eos_designs` role already.\n\nThe merge follow these recursive merge strategies:\n- New keys will be added for all types.\n- Existing keys of type \"List\" with a \"Primary key\" set in the schema:\n - Strategy can be changed with `custom_structured_configuration_list_merge`. Default strategy:\n - Existing list items with the same \"Primary key\"-value will be updated.\n - New unique items will be appended to the existing list\n- Other keys of type \"List\" will have new unique items appended the the existing list.\n- Existing keys of type \"Dictionary\" will recursively merge\n- Other existing keys will be replaced.\n", + "default": [ + "custom_structured_configuration_" + ], + "title": "Custom Structured Configuration Prefix" + }, + "cv_topology": { + "type": "array", + "description": "Generate AVD configurations directly from the given CloudVision topology.\nActivate this feature by setting `use_cv_topology` to `true`.\nRequires `default_interfaces` to be set for the relevant platforms and node types to detect the proper interface roles automatically.\nNeighbor hostnames must match the inventory hostnames of the AVD inventory to be taken into consideration.", + "items": { + "type": "object", + "properties": { + "hostname": { + "type": "string", + "title": "Hostname" + }, + "platform": { + "type": "string", + "title": "Platform" + }, + "interfaces": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "neighbor": { + "type": "string", + "title": "Neighbor" + }, + "neighbor_interface": { + "type": "string", + "title": "Neighbor Interface" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "Interfaces" + } + }, + "required": [ + "platform", + "interfaces", + "hostname" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Cv Topology" + }, + "cvp_ingestauth_key": { + "type": "string", + "description": "On-premise CVP ingest auth key. If set, TerminAttr will be configured with key-based authentication for on-premise CVP.\nIf not set, TerminAttr will be configured with certificate based authentication:\n- On-premise using token onboarding. Default token path is '/tmp/token'.\n- CVaaS using token-secure onboarding. Default token path is '/tmp/cv-onboarding-token'.\nToken must be copied to the device first.", + "title": "CVP Ingestauth Key" + }, + "cvp_instance_ip": { + "type": "string", + "description": "IPv4 address or DNS name for CloudVision.\nThis variable only supports an on-premise single-node cluster or the DNS name of a CloudVision as a Service instance.\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use cvp_instance_ips instead.", + "deprecated": true, + "title": "CVP Instance IP" + }, + "cvp_instance_ips": { + "type": "array", + "description": "List of IPv4 addresses or DNS names for CloudVision.\nFor on-premise CloudVision enter all the nodes of the cluster.\nFor CloudVision as a Service enter the DNS name of the instance.\n`eos_designs` only supports one CloudVision cluster.\n", + "items": { + "type": "string", + "description": "IPv4 address or DNS name for CloudVision" + }, + "title": "CVP Instance Ips" + }, + "cvp_token_file": { + "type": "string", + "description": "cvp_token_file is the path to the token file on the switch.\nIf not set the default locations for on-premise or CVaaS will be used.\nSee cvp_ingestauth_key for details.", + "title": "CVP Token File" + }, + "dc_name": { + "description": "POD Name is used in:\n- Fabric Documentation (Optional, falls back to fabric_name)\n- SNMP Location: `snmp_settings.location` (Optional)\n- HER Overlay DC scoped flood lists: `overlay_her_flood_list_scope: dc` (Required)\n", + "type": "string", + "title": "DC Name" + }, + "default_igmp_snooping_enabled": { + "description": "When set to false, disables IGMP snooping at fabric level and overrides per vlan settings.\n", + "type": "boolean", + "default": true, + "title": "Default IGMP Snooping Enabled" + }, + "default_interfaces": { + "type": "array", + "description": "Default uplink, downlink, and MLAG interfaces, which will be used if these interfaces are not defined on a device (either directly or through inheritance).\n", + "items": { + "type": "object", + "properties": { + "types": { + "type": "array", + "description": "List of node type keys.", + "items": { + "type": "string" + }, + "title": "Types" + }, + "platforms": { + "type": "array", + "description": "List of platform families.\nThis is defined as a Python regular expression that matches the full platform type.\n", + "items": { + "type": "string", + "description": "Arista platform family regular expression." + }, + "title": "Platforms" + }, + "uplink_interfaces": { + "type": "array", + "description": "List of uplink interfaces or uplink interface ranges.", + "items": { + "type": "string", + "description": "Interface range or interface." + }, + "title": "Uplink Interfaces" + }, + "mlag_interfaces": { + "type": "array", + "description": "List of MLAG interfaces or MLAG interface ranges.", + "items": { + "type": "string", + "description": "Interface range or interface." + }, + "title": "MLAG Interfaces" + }, + "downlink_interfaces": { + "type": "array", + "description": "List of downlink interfaces or downlink interface ranges.", + "items": { + "type": "string", + "description": "Interface range or interface." + }, + "title": "Downlink Interfaces" + } + }, + "required": [ + "types", + "platforms" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Default Interfaces" + }, + "default_mgmt_method": { + "type": "string", + "description": "`default_mgmt_method` controls the default VRF and source interface used for the following management and monitoring protocols configured with `eos_designs`:\n - `cv_settings`\n - `dns_settings`\n - `ntp_settings`\n - `sflow_settings`\n\n`oob` means the protocols will be configured with the VRF set by `mgmt_interface_vrf` and `mgmt_interface` as the source interface.\n`inband` means the protocols will be configured with the VRF set by `inband_mgmt_vrf` and `inband_mgmt_interface` as the source interface.\n`none` means the VRF and or interface must be manually set for each protocol.\nThis can be overridden under the settings for each protocol.\n", + "enum": [ + "oob", + "inband", + "none" + ], + "default": "oob", + "title": "Default Management Method" + }, + "default_node_types": { + "type": "array", + "description": "Uses hostname matches against a regular expression to determine the node type.", + "items": { + "type": "object", + "properties": { + "node_type": { + "type": "string", + "description": "Resulting node type when regex matches.", + "title": "Node Type" + }, + "match_hostnames": { + "type": "array", + "description": "Regular expressions to match against hostnames.", + "items": { + "type": "string", + "description": "Regex needs to match full hostname (i.e. is bounded by ^ and $ elements)." + }, + "title": "Match Hostnames" + } + }, + "required": [ + "match_hostnames", + "node_type" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Default Node Types" + }, + "design": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "By setting the design.type variable, the default node-types and templates described in these documents will be used.\n", + "enum": [ + "l3ls-evpn", + "mpls", + "l2ls" + ], + "default": "l3ls-evpn", + "title": "Type" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Design" + }, + "enable_trunk_groups": { + "type": "boolean", + "description": "Enable Trunk Group support across eos_designs.\nWarning: Because of the nature of the EOS Trunk Group feature, enabling this is \"all or nothing\".\n*All* vlans and *all* trunks towards connected endpoints must be using trunk groups as well.\nIf trunk groups are not assigned to a trunk, no vlans will be enabled on that trunk.\nSee \"Details on enable_trunk_groups\" below before enabling this feature.\n", + "default": false, + "title": "Enable Trunk Groups" + }, + "eos_designs_custom_templates": { + "type": "array", + "items": { + "type": "object", + "properties": { + "template": { + "type": "string", + "description": "Template file.", + "title": "Template" + }, + "options": { + "description": "Template options.", + "type": "object", + "properties": { + "list_merge": { + "type": "string", + "description": "Merge strategy for lists.", + "default": "append_rp", + "title": "List Merge" + }, + "strip_empty_keys": { + "type": "boolean", + "description": "Filter out keys from the generated output if value is null/none/undefined.", + "default": true, + "title": "Strip Empty Keys" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Options" + } + }, + "required": [ + "template" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "EOS Designs Custom Templates" + }, + "eos_designs_documentation": { + "description": "Control fabric documentation generation.\n", + "type": "object", + "properties": { + "connected_endpoints": { + "description": "Generate fabric-wide documentation for connected endpoints.\n", + "type": "boolean", + "default": false, + "title": "Connected Endpoints" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "EOS Designs Documentation" + }, + "event_handlers": { + "type": "array", + "description": "Gives the ability to monitor and react to Syslog messages.\nEvent Handlers provide a powerful and flexible tool that can be used to apply self-healing actions,\ncustomize the system behavior, and implement workarounds to problems discovered in the field.\n", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Event Handler Name", + "title": "Name" + }, + "action_type": { + "type": "string", + "enum": [ + "bash", + "increment", + "log" + ], + "title": "Action Type" + }, + "action": { + "type": "string", + "description": "Command to execute\n", + "title": "Action" + }, + "delay": { + "type": "integer", + "description": "Event-handler delay in seconds\n", + "title": "Delay" + }, + "trigger": { + "type": "string", + "description": "Configure event trigger condition.\n", + "enum": [ + "on-boot", + "on-logging", + "on-startup-config" + ], + "title": "Trigger" + }, + "regex": { + "type": "string", + "description": "Regular expression to use for searching log messages. Required for on-logging trigger\n", + "title": "Regex" + }, + "asynchronous": { + "type": "boolean", + "default": false, + "description": "Set the action to be non-blocking.", + "title": "Asynchronous" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "Event Handlers" + }, + "evpn_ebgp_gateway_inter_domain": { + "type": "boolean", + "title": "EVPN Ebgp Gateway Inter Domain" + }, + "evpn_ebgp_gateway_multihop": { + "description": "Default of 15, considering a large value to avoid BGP reachability issues in very complex DCI networks.\nAdapt the value for your specific topology.\n", + "type": "integer", + "default": 15, + "title": "EVPN Ebgp Gateway Multihop" + }, + "evpn_ebgp_multihop": { + "description": "Default of 3, the recommended value for a 3 stage spine and leaf topology.\nSet to a higher value to allow for very large and complex topologies.\n", + "type": "integer", + "default": 3, + "title": "EVPN Ebgp Multihop" + }, + "evpn_hostflap_detection": { + "type": "object", + "properties": { + "enabled": { + "description": "If set to false it will disable EVPN host-flap detection.", + "type": "boolean", + "default": true, + "title": "Enabled" + }, + "threshold": { + "description": "Minimum number of MAC moves that indicate a MAC duplication issue.", + "type": "integer", + "default": 5, + "title": "Threshold" + }, + "window": { + "description": "Time (in seconds) to detect a MAC duplication issue.", + "type": "integer", + "default": 180, + "title": "Window" + }, + "expiry_timeout": { + "description": "Time (in seconds) to purge a MAC duplication issue.", + "type": "integer", + "title": "Expiry Timeout" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "EVPN Hostflap Detection" + }, + "evpn_import_pruning": { + "description": "Enable VPN import pruning (Min. EOS 4.24.2F).\nThe Route Target extended communities carried by incoming VPN paths will be examined.\nIf none of those Route Targets have been configured for import, the path will be immediately discarded.\n", + "type": "boolean", + "default": false, + "title": "EVPN Import Pruning" + }, + "evpn_multicast": { + "type": "boolean", + "description": "General Configuration required for EVPN Multicast. \"evpn_l2_multicast\" or \"evpn_l3_multicast\" must also be configured under the Network Services (tenants).\nRequires \"underlay_multicast: true\" and IGMP snooping enabled globally (default).\nFor MLAG devices Route Distinguisher must be unique since this feature will create multi-vtep configuration.\nWarning !!! For Trident3 based platforms i.e 7050X3, 7300X3, 720XP and 722XP\n The Following default platform setting will be configured: \"platform trident forwarding-table partition flexible exact-match 16384 l2-shared 98304 l3-shared 131072\"\n All forwarding agents will be restarted when this configuration is applied.\n You can tune the settings by overriding the default variable: \"platform_settings[platforms].trident_forwarding_table_partition:\"\n Please contact an Arista representative for help with determining the appropriate values for your environment.\n", + "default": false, + "title": "EVPN Multicast" + }, + "evpn_overlay_bgp_rtc": { + "description": "Enable Route Target Membership Constraint Address Family on EVPN overlay BGP peerings (Min. EOS 4.25.1F).\nRequires use eBGP as overlay protocol.\n", + "type": "boolean", + "default": false, + "title": "EVPN Overlay BGP Rtc" + }, + "evpn_prevent_readvertise_to_server": { + "description": "Configure route-map on eBGP sessions towards route-servers, where prefixes with the peer's ASN in the AS Path are filtered away.\nThis is very useful in large-scale networks, where convergence will be quicker by not returning all updates received\nfrom Route-server-1 to Router-server-2 just for Route-server-2 to throw them away because of AS Path loop detection.\n", + "type": "boolean", + "default": false, + "title": "EVPN Prevent Readvertise To Server" + }, + "evpn_short_esi_prefix": { + "description": "Configure prefix for \"short_esi\" values.", + "type": "string", + "default": "0000:0000:", + "title": "EVPN Short Esi Prefix" + }, + "evpn_vlan_aware_bundles": { + "description": "Enable vlan aware bundles for EVPN MAC-VRF.", + "type": "boolean", + "default": false, + "title": "EVPN VLAN Aware Bundles" + }, + "evpn_vlan_bundles": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Specify an EVPN vlan-aware-bundle name.\nEVPN vlan-aware-bundles group L2 VLANs and define common settings.\n", + "title": "Name" + }, + "id": { + "type": "integer", + "description": "\"id\" may be used for vlan-aware-bundle RD/RT ID so it should not overlap with l2vlan IDs which are not part of this bundle.\nSee \"overlay_rd_type\" and \"overlay_rt_type\" for details.\n", + "title": "ID" + }, + "rt_override": { + "type": "string", + "description": "By default the MAC VRF bundle RT will be derived from mac_vrf_id_base + bundle_id.\nThe rt_override allows us to override this value and statically define it.\nrt_override will default to vni_override if set.\n\nrt_override supports two formats:\n - A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details).\n - A full RT string with colon seperator which will override the full RT.\n", + "title": "Rt Override" + }, + "rd_override": { + "type": "string", + "description": "By default the MAC VRF bundle RD will be derived from mac_vrf_id_base + bundle_id.\nThe rt_override allows us to override this value and statically define it.\nrd_override will default to rt_override or vni_override if set.\n\nrd_override supports two formats:\n - A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details).\n - A full RD string with colon seperator which will override the full RD.\n", + "title": "Rd Override" + }, + "evpn_l2_multi_domain": { + "type": "boolean", + "description": "Explicitly extend VLAN-Aware Bundle to remote EVPN domains.\nOverrides `.[].evpn_l2_multi_domain`.\n", + "title": "EVPN L2 Multi Domain" + }, + "bgp": { + "type": "object", + "properties": { + "raw_eos_cli": { + "type": "string", + "description": "EOS cli commands rendered on router_bgp.vlans-aware-bundle.", + "title": "Raw EOS CLI" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BGP" + } + }, + "required": [ + "id", + "name" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "EVPN VLAN Bundles" + }, + "fabric_evpn_encapsulation": { + "description": "Should be set to mpls for evpn-mpls scenario.", + "enum": [ + "vxlan", + "mpls" + ], + "default": "vxlan", + "type": "string", + "title": "Fabric EVPN Encapsulation" + }, + "fabric_ip_addressing": { + "type": "object", + "properties": { + "mlag": { + "type": "object", + "properties": { + "algorithm": { + "type": "string", + "default": "first_id", + "description": "This variable defines the Multi-chassis Link Aggregation (MLAG) algorithm used.\nEach MLAG link will have a /31 subnet with each subnet allocated from the relevant MLAG pool via a calculated offset.\nThe offset is calculated using one of the following algorithms:\n - first_id: `(mlag_primary_id - 1) * 2` where `mlag_primary_id` is the ID of the first node defined under the node_group.\n This allocation method will skip every other /31 subnet making it less space efficient than `odd_id`.\n - odd_id: `(odd_id - 1) / 2`. Requires the node_group to have a node with an odd ID and a node with an even ID.\n - same_subnet: the offset will always be zero.\n This allocation method will cause every MLAG link to be addressed with the same /31 subnet.\n", + "enum": [ + "first_id", + "odd_id", + "same_subnet" + ], + "title": "Algorithm" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "MLAG" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Fabric IP Addressing" + }, + "fabric_name": { + "description": "Fabric Name, required to match Ansible Group name covering all devices in the Fabric, **must** be an inventory group name.", + "type": "string", + "title": "Fabric Name" + }, + "hardware_counters": { + "type": "object", + "properties": { + "features": { + "type": "array", + "description": "This data model allows to configure the list of hardware counters feature\navailable on Arista platforms.\n\nThe `name` key accepts a list of valid_values which MUST be updated to support\nnew feature as they are released in EOS.\n\nThe available values of the different keys like 'direction' or 'address_type'\nare feature and hardware dependent and this model DOES NOT validate that the\ncombinations are valid. It is the responsability of the user of this data model\nto make sure that the rendered CLI is accepted by the targeted device.\n\nExamples:\n\n * Use:\n ```yaml\n hardware_counters:\n features:\n - name: ip\n direction: out\n layer3: true\n units_packets: true\n ```\n\n to render:\n ```eos\n hardware counter feature ip out layer3 units packets\n ```\n * Use:\n ```yaml\n hardware_counters:\n features:\n - name: route\n address_type: ipv4\n vrf: test\n prefix: 192.168.0.0/24\n ```\n\n to render:\n ```eos\n hardware counter feature route ipv4 vrf test 192.168.0.0/24\n ```\n", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "enum": [ + "acl", + "decap-group", + "directflow", + "ecn", + "flow-spec", + "gre tunnel interface", + "ip", + "mpls interface", + "mpls lfib", + "mpls tunnel", + "multicast", + "nexthop", + "pbr", + "pdp", + "policing interface", + "qos", + "qos dual-rate-policer", + "route", + "routed-port", + "subinterface", + "tapagg", + "traffic-class", + "traffic-policy", + "vlan", + "vlan-interface", + "vni decap", + "vni encap", + "vtep decap", + "vtep encap" + ], + "title": "Name" + }, + "direction": { + "type": "string", + "enum": [ + "in", + "out", + "cpu" + ], + "description": "Most features support only 'in' and 'out'. Some like traffic-policy support 'cpu'.\nSome features DO NOT have any direction.\nThis validation IS NOT made by the schemas.\n", + "title": "Direction" + }, + "address_type": { + "type": "string", + "enum": [ + "ipv4", + "ipv6", + "mac" + ], + "description": "Supported only for the following features:\n- acl: [ipv4, ipv6, mac] if direction is 'out'\n- multicast: [ipv4, ipv6]\n- route: [ipv4, ipv6]\nThis validation IS NOT made by the schemas.\n", + "title": "Address Type" + }, + "layer3": { + "type": "boolean", + "description": "Supported only for the 'ip' feature\n", + "title": "Layer3" + }, + "vrf": { + "type": "string", + "description": "Supported only for the 'route' feature.\nThis validation IS NOT made by the schemas.\n", + "title": "VRF" + }, + "prefix": { + "type": "string", + "description": "Supported only for the 'route' feature.\nMandatory for the 'route' feature.\nThis validation IS NOT made by the schemas.\n", + "title": "Prefix" + }, + "units_packets": { + "type": "boolean", + "title": "Units Packets" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Features" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Hardware Counters" + }, + "internal_vlan_order": { + "type": "object", + "description": "Internal vlan allocation order and range.", + "properties": { + "allocation": { + "type": "string", + "enum": [ + "ascending", + "descending" + ], + "title": "Allocation" + }, + "range": { + "type": "object", + "properties": { + "beginning": { + "type": "integer", + "description": "First VLAN ID.", + "minimum": 2, + "maximum": 4094, + "title": "Beginning" + }, + "ending": { + "type": "integer", + "description": "Last VLAN ID.", + "minimum": 2, + "maximum": 4094, + "title": "Ending" + } + }, + "required": [ + "beginning", + "ending" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Range" + } + }, + "required": [ + "allocation" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "default": { + "allocation": "ascending", + "range": { + "beginning": 1006, + "ending": 1199 + } + }, + "title": "Internal VLAN Order" + }, + "ipv6_mgmt_destination_networks": { + "description": "List of IPv6 prefixes to configure as static routes towards the OOB IPv6 Management interface gateway.\nReplaces the default route.\n", + "type": "array", + "items": { + "type": "string", + "description": "IPv6_network/Mask." + }, + "title": "IPv6 Management Destination Networks" + }, + "ipv6_mgmt_gateway": { + "type": "string", + "format": "ipv6", + "description": "OOB Management interface gateway in IPv6 format.\nUsed as next-hop for default gateway or static routes defined under 'ipv6_mgmt_destination_networks'.", + "title": "IPv6 Management Gateway" + }, + "is_deployed": { + "description": "If the device is already deployed in the fabric.\nWhen set to false, interfaces toward this device may be shutdown depending on the `shutdown_interfaces_towards_undeployed_peers` setting.\nFurthermore `eos_config_deploy_cvp` will not attempt to move or apply configurations to the device.\n", + "type": "boolean", + "default": true, + "title": "Is Deployed" + }, + "isis_advertise_passive_only": { + "type": "boolean", + "default": false, + "title": "ISIS Advertise Passive Only" + }, + "isis_area_id": { + "type": "string", + "default": "49.0001", + "title": "ISIS Area ID" + }, + "isis_default_circuit_type": { + "type": "string", + "enum": [ + "level-1-2", + "level-1", + "level-2" + ], + "default": "level-2", + "description": "These fabric level parameters can be used with core_interfaces running ISIS, and may be overridden on link profile or link level.", + "title": "ISIS Default Circuit Type" + }, + "isis_default_is_type": { + "title": "ISIS Default IS Type", + "type": "string", + "enum": [ + "level-1-2", + "level-1", + "level-2" + ], + "default": "level-2" + }, + "isis_default_metric": { + "type": "integer", + "default": 50, + "description": "These fabric level parameters can be used with core_interfaces running ISIS, and may be overridden at link profile or link level.", + "title": "ISIS Default Metric" + }, + "isis_maximum_paths": { + "description": "Number of path to configure in ECMP for ISIS.", + "type": "integer", + "title": "ISIS Maximum Paths" + }, + "isis_ti_lfa": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "default": false, + "title": "Enabled" + }, + "protection": { + "type": "string", + "enum": [ + "link", + "node" + ], + "title": "Protection" + }, + "local_convergence_delay": { + "description": "Local convergence delay in milliseconds.", + "type": "integer", + "default": 10000, + "title": "Local Convergence Delay" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "ISIS TI LFA" + }, + "l3_edge": { + "type": "object", + "properties": { + "p2p_links_ip_pools": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "P2P pool name.", + "title": "Name" + }, + "ipv4_pool": { + "type": "string", + "description": "IPv4 address/Mask.", + "title": "IPv4 Pool" + }, + "prefix_size": { + "type": "integer", + "description": "Subnet mask size.", + "default": 31, + "minimum": 8, + "maximum": 31, + "title": "Prefix Size" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "P2P Links IP Pools" + }, + "p2p_links_profiles": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "P2P profile name. Any variable supported under `p2p_links` can be inherited from a profile.", + "title": "Name" + }, + "id": { + "type": "integer", + "description": "Unique id per subnet_summary. Used to calculate ip addresses.\nRequired with ip_pool. ID starting from 1.\n", + "title": "ID" + }, + "speed": { + "type": "string", + "description": "Speed should be set in the format `` or `forced ` or `auto `.", + "title": "Speed" + }, + "ip_pool": { + "type": "string", + "description": "P2P pool name. IP Pool defined under p2p_links_ip_pools. A /31 will be taken from the pool per P2P link.", + "title": "IP Pool" + }, + "subnet": { + "type": "string", + "description": "IPv4 address/Mask. Subnet used on this P2P link.", + "title": "Subnet" + }, + "ip": { + "type": "array", + "description": "Specific IP addresses used on this P2P link.", + "items": { + "type": "string", + "description": "Node IPv4 address/Mask." + }, + "title": "IP" + }, + "ipv6_enable": { + "type": "boolean", + "default": false, + "description": "Allows turning on ipv6 for the link or profile (also autodetected based on underlay_rfc5549 and include_in_underlay_protocol).", + "title": "IPv6 Enable" + }, + "nodes": { + "type": "array", + "description": "Nodes where this link should be configured.", + "items": { + "type": "string", + "description": "The values can be < node_a >, < node_b >.\nex.- [ core-1-isis-sr-ldp, core-2-ospf-ldp ].\n" + }, + "title": "Nodes" + }, + "interfaces": { + "type": "array", + "description": "Interfaces where this link should be configured and Required unless using port-channels.", + "items": { + "type": "string", + "description": "The value can be like < node_a_interface >, < node_b_interface >.\nex. - [ Ethernet2, Ethernet2 ].\n" + }, + "title": "Interfaces" + }, + "as": { + "type": "array", + "description": "AS numbers for BGP.\nRequired with bgp peering.\n", + "items": { + "type": "string", + "description": "The values can be like [\"node_a_as\", \"node_b_as\"]." + }, + "title": "As" + }, + "descriptions": { + "type": "array", + "description": "Interface description.", + "items": { + "type": "string" + }, + "title": "Descriptions" + }, + "include_in_underlay_protocol": { + "type": "boolean", + "default": true, + "description": "Add this interface to underlay routing protocol.", + "title": "Include In Underlay Protocol" + }, + "isis_hello_padding": { + "type": "boolean", + "default": false, + "title": "ISIS Hello Padding" + }, + "isis_metric": { + "type": "integer", + "title": "ISIS Metric" + }, + "isis_circuit_type": { + "type": "string", + "enum": [ + "level-1", + "level-2", + "level-1-2" + ], + "title": "ISIS Circuit Type" + }, + "isis_authentication_mode": { + "type": "string", + "enum": [ + "md5", + "text" + ], + "title": "ISIS Authentication Mode" + }, + "isis_authentication_key": { + "type": "string", + "description": "Type-7 encrypted password.", + "title": "ISIS Authentication Key" + }, + "mpls_ip": { + "type": "boolean", + "description": "MPLS parameters. Default value is true if switch.mpls_lsr is true.", + "title": "MPLS IP" + }, + "mpls_ldp": { + "type": "boolean", + "description": "MPLS parameters. Default value is true for ldp underlay variants, otherwise false.", + "title": "MPLS LDP" + }, + "mtu": { + "type": "integer", + "description": "MTU for this P2P link. Default value same as p2p_uplinks_mtu.", + "title": "MTU" + }, + "bfd": { + "type": "boolean", + "default": false, + "description": "Enable BFD (only considered for BGP).", + "title": "BFD" + }, + "ptp": { + "description": "PTP parameters.", + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "default": false, + "description": "Enable PTP.", + "title": "Enabled" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "PTP" + }, + "sflow": { + "type": "boolean", + "description": "Enable sFlow. Overrides `fabric_sflow` setting.", + "title": "Sflow" + }, + "qos_profile": { + "type": "string", + "description": "QOS service profile.", + "title": "QOS Profile" + }, + "macsec_profile": { + "type": "string", + "description": "MAC security profile.", + "title": "Macsec Profile" + }, + "port_channel": { + "description": "Port-channel parameters.", + "type": "object", + "properties": { + "mode": { + "type": "string", + "default": "active", + "title": "Mode" + }, + "nodes_child_interfaces": { + "type": "array", + "items": { + "type": "object", + "properties": { + "node": { + "type": "string", + "title": "Node" + }, + "interfaces": { + "type": "array", + "description": "List of node interfaces. Ex.- [ 'node1 interface1', 'node1 interface2' ].", + "items": { + "type": "string" + }, + "title": "Interfaces" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "node" + ] + }, + "title": "Nodes Child Interfaces" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Port Channel" + }, + "raw_eos_cli": { + "type": "string", + "description": "EOS CLI rendered directly on the point-to-point interface in the final EOS configuration.", + "title": "Raw EOS CLI" + }, + "structured_config": { + "type": "object", + "description": "Custom structured config for interfaces\nNote! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces.", + "title": "Structured Config" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "P2P Links Profiles" + }, + "p2p_links": { + "type": "array", + "items": { + "type": "object", + "properties": { + "nodes": { + "type": "array", + "description": "Nodes where this link should be configured.", + "items": { + "type": "string", + "description": "The values can be < node_a >, < node_b >.\nex.- [ core-1-isis-sr-ldp, core-2-ospf-ldp ].\n" + }, + "title": "Nodes" + }, + "profile": { + "type": "string", + "description": "P2P profile name. Profile defined under p2p_profiles.", + "title": "Profile" + }, + "id": { + "type": "integer", + "description": "Unique id per subnet_summary. Used to calculate ip addresses.\nRequired with ip_pool. ID starting from 1.\n", + "title": "ID" + }, + "speed": { + "type": "string", + "description": "Speed should be set in the format `` or `forced ` or `auto `.", + "title": "Speed" + }, + "ip_pool": { + "type": "string", + "description": "P2P pool name. IP Pool defined under p2p_links_ip_pools. A /31 will be taken from the pool per P2P link.", + "title": "IP Pool" + }, + "subnet": { + "type": "string", + "description": "IPv4 address/Mask. Subnet used on this P2P link.", + "title": "Subnet" + }, + "ip": { + "type": "array", + "description": "Specific IP addresses used on this P2P link.", + "items": { + "type": "string", + "description": "Node IPv4 address/Mask." + }, + "title": "IP" + }, + "ipv6_enable": { + "type": "boolean", + "default": false, + "description": "Allows turning on ipv6 for the link or profile (also autodetected based on underlay_rfc5549 and include_in_underlay_protocol).", + "title": "IPv6 Enable" + }, + "interfaces": { + "type": "array", + "description": "Interfaces where this link should be configured and Required unless using port-channels.", + "items": { + "type": "string", + "description": "The value can be like < node_a_interface >, < node_b_interface >.\nex. - [ Ethernet2, Ethernet2 ].\n" + }, + "title": "Interfaces" + }, + "as": { + "type": "array", + "description": "AS numbers for BGP.\nRequired with bgp peering.\n", + "items": { + "type": "string", + "description": "The values can be like [\"node_a_as\", \"node_b_as\"]." + }, + "title": "As" + }, + "descriptions": { + "type": "array", + "description": "Interface description.", + "items": { + "type": "string" + }, + "title": "Descriptions" + }, + "include_in_underlay_protocol": { + "type": "boolean", + "default": true, + "description": "Add this interface to underlay routing protocol.", + "title": "Include In Underlay Protocol" + }, + "isis_hello_padding": { + "type": "boolean", + "default": false, + "title": "ISIS Hello Padding" + }, + "isis_metric": { + "type": "integer", + "title": "ISIS Metric" + }, + "isis_circuit_type": { + "type": "string", + "enum": [ + "level-1", + "level-2", + "level-1-2" + ], + "title": "ISIS Circuit Type" + }, + "isis_authentication_mode": { + "type": "string", + "enum": [ + "md5", + "text" + ], + "title": "ISIS Authentication Mode" + }, + "isis_authentication_key": { + "type": "string", + "description": "Type-7 encrypted password.", + "title": "ISIS Authentication Key" + }, + "mpls_ip": { + "type": "boolean", + "description": "MPLS parameters. Default value is true if switch.mpls_lsr is true.", + "title": "MPLS IP" + }, + "mpls_ldp": { + "type": "boolean", + "description": "MPLS parameters. Default value is true for ldp underlay variants, otherwise false.", + "title": "MPLS LDP" + }, + "mtu": { + "type": "integer", + "description": "MTU for this P2P link. Default value same as p2p_uplinks_mtu.", + "title": "MTU" + }, + "bfd": { + "type": "boolean", + "default": false, + "description": "Enable BFD (only considered for BGP).", + "title": "BFD" + }, + "ptp": { + "description": "PTP parameters.", + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "default": false, + "description": "Enable PTP.", + "title": "Enabled" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "PTP" + }, + "sflow": { + "type": "boolean", + "description": "Enable sFlow. Overrides `fabric_sflow` setting.", + "title": "Sflow" + }, + "qos_profile": { + "type": "string", + "description": "QOS service profile.", + "title": "QOS Profile" + }, + "macsec_profile": { + "type": "string", + "description": "MAC security profile.", + "title": "Macsec Profile" + }, + "port_channel": { + "description": "Port-channel parameters.", + "type": "object", + "properties": { + "mode": { + "type": "string", + "default": "active", + "title": "Mode" + }, + "nodes_child_interfaces": { + "type": "array", + "items": { + "type": "object", + "properties": { + "node": { + "type": "string", + "title": "Node" + }, + "interfaces": { + "type": "array", + "description": "List of node interfaces. Ex.- [ 'node1 interface1', 'node1 interface2' ].", + "items": { + "type": "string" + }, + "title": "Interfaces" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "node" + ] + }, + "title": "Nodes Child Interfaces" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Port Channel" + }, + "raw_eos_cli": { + "type": "string", + "description": "EOS CLI rendered directly on the point-to-point interface in the final EOS configuration.", + "title": "Raw EOS CLI" + }, + "structured_config": { + "type": "object", + "description": "Custom structured config for interfaces\nNote! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces.", + "title": "Structured Config" + } + }, + "required": [ + "nodes" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "P2P Links" + }, + "l3_interfaces_profiles": { + "type": "array", + "items": { + "type": "object", + "properties": { + "profile": { + "type": "string", + "description": "L3 interface profile name. Any variable supported under `l3_interfaces` can be inherited from a profile.", + "title": "Profile" + }, + "interface": { + "type": "string", + "description": "Ethernet interface name like 'Ethernet2'.", + "pattern": "Ethernet[\\d/]+", + "title": "Interface" + }, + "description": { + "type": "string", + "description": "Interface description.\nIf not set a default description will be configured with '[[ ]]'", + "title": "Description" + }, + "ip": { + "type": "string", + "description": "Node IPv4 address/Mask or 'dhcp'.", + "title": "IP" + }, + "dhcp_client_accept_default_route": { + "type": "boolean", + "default": false, + "description": "Supported if `ip` is `dhcp`.\nAccepts default route from DHCP.", + "title": "DHCP Client Accept Default Route" + }, + "enabled": { + "type": "boolean", + "default": true, + "description": "Enable or Shutdown the interface.", + "title": "Enabled" + }, + "speed": { + "type": "string", + "description": "Speed should be set in the format `` or `forced ` or `auto `.", + "title": "Speed" + }, + "peer": { + "type": "string", + "description": "The peer device name. Used for description and documentation", + "title": "Peer" + }, + "peer_interface": { + "type": "string", + "description": "The peer device interface. Used for description and documentation", + "title": "Peer Interface" + }, + "peer_ip": { + "type": "string", + "description": "The peer device IP. Used for description and documentation", + "title": "Peer IP" + }, + "qos_profile": { + "type": "string", + "description": "QOS service profile.", + "title": "QOS Profile" + }, + "raw_eos_cli": { + "type": "string", + "description": "EOS CLI rendered directly on the interface in the final EOS configuration.", + "title": "Raw EOS CLI" + }, + "structured_config": { + "type": "object", + "description": "Custom structured config for the Ethernet interface.", + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "description": { + "type": "string", + "title": "Description" + }, + "shutdown": { + "type": "boolean", + "title": "Shutdown" + }, + "load_interval": { + "type": "integer", + "minimum": 0, + "maximum": 600, + "description": "Interval in seconds for updating interface counters\"", + "title": "Load Interval" + }, + "speed": { + "type": "string", + "description": "Speed should be set in the format `` or `forced ` or `auto `.", + "title": "Speed" + }, + "mtu": { + "type": "integer", + "minimum": 68, + "maximum": 65535, + "title": "MTU" + }, + "l2_mtu": { + "type": "integer", + "minimum": 68, + "maximum": 65535, + "description": "\"l2_mtu\" should only be defined for platforms supporting the \"l2 mtu\" CLI\n", + "title": "L2 MTU" + }, + "l2_mru": { + "type": "integer", + "minimum": 68, + "maximum": 65535, + "description": "\"l2_mru\" should only be defined for platforms supporting the \"l2 mru\" CLI\n", + "title": "L2 MRU" + }, + "vlans": { + "type": "string", + "description": "List of switchport vlans as string\nFor a trunk port this would be a range like \"1-200,300\"\nFor an access port this would be a single vlan \"123\"\n", + "title": "VLANs" + }, + "native_vlan": { + "type": "integer", + "title": "Native VLAN" + }, + "native_vlan_tag": { + "type": "boolean", + "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence", + "title": "Native VLAN Tag" + }, + "mode": { + "type": "string", + "enum": [ + "access", + "dot1q-tunnel", + "trunk", + "trunk phone" + ], + "title": "Mode" + }, + "phone": { + "type": "object", + "properties": { + "trunk": { + "type": "string", + "enum": [ + "tagged", + "tagged phone", + "untagged", + "untagged phone" + ], + "title": "Trunk" + }, + "vlan": { + "type": "integer", + "minimum": 1, + "maximum": 4094, + "title": "VLAN" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Phone" + }, + "l2_protocol": { + "type": "object", + "properties": { + "encapsulation_dot1q_vlan": { + "type": "integer", + "description": "Vlan tag to configure on sub-interface", + "title": "Encapsulation Dot1Q VLAN" + }, + "forwarding_profile": { + "type": "string", + "description": "L2 protocol forwarding profile", + "title": "Forwarding Profile" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "L2 Protocol" + }, + "trunk_groups": { + "type": "array", + "items": { + "type": "string" + }, + "title": "Trunk Groups" + }, + "type": { + "type": "string", + "enum": [ + "routed", + "switched", + "l3dot1q", + "l2dot1q", + "port-channel-member" + ], + "description": "l3dot1q and l2dot1q are used for sub-interfaces. The parent interface should be defined as routed.\nInterface will not be listed in device documentation, unless \"type\" is set.\n", + "title": "Type" + }, + "snmp_trap_link_change": { + "type": "boolean", + "title": "Snmp Trap Link Change" + }, + "address_locking": { + "type": "object", + "properties": { + "ipv4": { + "type": "boolean", + "description": "Enable address locking for IPv4", + "title": "IPv4" + }, + "ipv6": { + "type": "boolean", + "description": "Enable address locking for IPv6", + "title": "IPv6" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Address Locking" + }, + "flowcontrol": { + "type": "object", + "properties": { + "received": { + "type": "string", + "enum": [ + "desired", + "on", + "off" + ], + "title": "Received" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Flowcontrol" + }, + "vrf": { + "type": "string", + "description": "VRF name", + "title": "VRF" + }, + "flow_tracker": { + "type": "object", + "properties": { + "sampled": { + "type": "string", + "description": "Sampled flow tracker name.", + "title": "Sampled" + }, + "hardware": { + "type": "string", + "description": "Hardware flow tracker name.", + "title": "Hardware" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Flow Tracker" + }, + "error_correction_encoding": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "default": true, + "title": "Enabled" + }, + "fire_code": { + "type": "boolean", + "title": "Fire Code" + }, + "reed_solomon": { + "type": "boolean", + "title": "Reed Solomon" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Error Correction Encoding" + }, + "link_tracking_groups": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Group name", + "title": "Name" + }, + "direction": { + "type": "string", + "enum": [ + "upstream", + "downstream" + ], + "title": "Direction" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "Link Tracking Groups" + }, + "evpn_ethernet_segment": { + "type": "object", + "properties": { + "identifier": { + "type": "string", + "description": "EVPN Ethernet Segment Identifier (Type 1 format)", + "title": "Identifier" + }, + "redundancy": { + "type": "string", + "enum": [ + "all-active", + "single-active" + ], + "title": "Redundancy" + }, + "designated_forwarder_election": { + "type": "object", + "properties": { + "algorithm": { + "type": "string", + "enum": [ + "modulus", + "preference" + ], + "title": "Algorithm" + }, + "preference_value": { + "type": "integer", + "minimum": 0, + "maximum": 65535, + "description": "Preference_value is only used when \"algorithm\" is \"preference\"", + "title": "Preference Value" + }, + "dont_preempt": { + "type": "boolean", + "description": "Dont_preempt is only used when \"algorithm\" is \"preference\"", + "title": "Dont Preempt" + }, + "hold_time": { + "type": "integer", + "title": "Hold Time" + }, + "subsequent_hold_time": { + "type": "integer", + "title": "Subsequent Hold Time" + }, + "candidate_reachability_required": { + "type": "boolean", + "title": "Candidate Reachability Required" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Designated Forwarder Election" + }, + "mpls": { + "type": "object", + "properties": { + "shared_index": { + "type": "integer", + "minimum": 1, + "maximum": 1024, + "title": "Shared Index" + }, + "tunnel_flood_filter_time": { + "type": "integer", + "title": "Tunnel Flood Filter Time" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "MPLS" + }, + "route_target": { + "type": "string", + "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx", + "title": "Route Target" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "EVPN Ethernet Segment" + }, + "encapsulation_dot1q_vlan": { + "type": "integer", + "description": "VLAN tag to configure on sub-interface", + "title": "Encapsulation Dot1Q VLAN" + }, + "encapsulation_vlan": { + "type": "object", + "properties": { + "client": { + "type": "object", + "properties": { + "dot1q": { + "type": "object", + "properties": { + "vlan": { + "type": "integer", + "description": "Client VLAN ID", + "title": "VLAN" + }, + "outer": { + "type": "integer", + "description": "Client Outer VLAN ID", + "title": "Outer" + }, + "inner": { + "type": "integer", + "description": "Client Inner VLAN ID", + "title": "Inner" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Dot1Q" + }, + "unmatched": { + "type": "boolean", + "title": "Unmatched" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Client" + }, + "network": { + "type": "object", + "description": "Network encapsulations are all optional and skipped if using client unmatched", + "properties": { + "dot1q": { + "type": "object", + "properties": { + "vlan": { + "type": "integer", + "description": "Network VLAN ID", + "title": "VLAN" + }, + "outer": { + "type": "integer", + "description": "Network outer VLAN ID", + "title": "Outer" + }, + "inner": { + "type": "integer", + "description": "Network inner VLAN ID", + "title": "Inner" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Dot1Q" + }, + "client": { + "type": "boolean", + "title": "Client" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Network" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Encapsulation VLAN" + }, + "vlan_id": { + "type": "integer", + "minimum": 1, + "maximum": 4094, + "title": "VLAN ID" + }, + "ip_address": { + "type": "string", + "description": "IPv4 address/mask or \"dhcp\"", + "title": "IP Address" + }, + "ip_address_secondaries": { + "type": "array", + "items": { + "type": "string" + }, + "title": "IP Address Secondaries" + }, + "dhcp_client_accept_default_route": { + "type": "boolean", + "description": "Install default-route obtained via DHCP", + "title": "DHCP Client Accept Default Route" + }, + "dhcp_server_ipv4": { + "type": "boolean", + "description": "Enable IPv4 DHCP server.", + "title": "DHCP Server IPv4" + }, + "dhcp_server_ipv6": { + "type": "boolean", + "description": "Enable IPv6 DHCP server.", + "title": "DHCP Server IPv6" + }, + "ip_helpers": { + "type": "array", + "items": { + "type": "object", + "properties": { + "ip_helper": { + "type": "string", + "title": "IP Helper" + }, + "source_interface": { + "type": "string", + "description": "Source interface name", + "title": "Source Interface" + }, + "vrf": { + "type": "string", + "description": "VRF name", + "title": "VRF" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "ip_helper" + ] + }, + "title": "IP Helpers" + }, + "ip_nat": { + "type": "object", + "properties": { + "service_profile": { + "type": "string", + "description": "NAT interface profile.", + "title": "Service Profile" + }, + "destination": { + "type": "object", + "properties": { + "dynamic": { + "type": "array", + "items": { + "type": "object", + "properties": { + "access_list": { + "type": "string", + "title": "Access List" + }, + "comment": { + "type": "string", + "title": "Comment" + }, + "pool_name": { + "type": "string", + "title": "Pool Name" + }, + "priority": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "title": "Priority" + } + }, + "required": [ + "pool_name", + "access_list" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Dynamic" + }, + "static": { + "type": "array", + "items": { + "type": "object", + "properties": { + "access_list": { + "type": "string", + "description": "'access_list' and 'group' are mutual exclusive", + "title": "Access List" + }, + "comment": { + "type": "string", + "title": "Comment" + }, + "direction": { + "type": "string", + "enum": [ + "egress", + "ingress" + ], + "description": "Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware platform.\nEOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW.\n", + "title": "Direction" + }, + "group": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "description": "'access_list' and 'group' are mutual exclusive", + "title": "Group" + }, + "original_ip": { + "type": "string", + "description": "IPv4 address", + "title": "Original IP" + }, + "original_port": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "title": "Original Port" + }, + "priority": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "title": "Priority" + }, + "protocol": { + "type": "string", + "enum": [ + "udp", + "tcp" + ], + "title": "Protocol" + }, + "translated_ip": { + "type": "string", + "description": "IPv4 address", + "title": "Translated IP" + }, + "translated_port": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "description": "requires 'original_port'", + "title": "Translated Port" + } + }, + "required": [ + "translated_ip", + "original_ip" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Static" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Destination" + }, + "source": { + "type": "object", + "properties": { + "dynamic": { + "type": "array", + "items": { + "type": "object", + "properties": { + "access_list": { + "type": "string", + "title": "Access List" + }, + "comment": { + "type": "string", + "title": "Comment" + }, + "nat_type": { + "type": "string", + "enum": [ + "overload", + "pool", + "pool-address-only", + "pool-full-cone" + ], + "title": "Nat Type" + }, + "pool_name": { + "type": "string", + "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone\nignored if 'nat_type' is overload\n", + "title": "Pool Name" + }, + "priority": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "title": "Priority" + } + }, + "required": [ + "nat_type", + "access_list" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Dynamic" + }, + "static": { + "type": "array", + "items": { + "type": "object", + "properties": { + "access_list": { + "type": "string", + "description": "'access_list' and 'group' are mutual exclusive", + "title": "Access List" + }, + "comment": { + "type": "string", + "title": "Comment" + }, + "direction": { + "type": "string", + "enum": [ + "egress", + "ingress" + ], + "description": "Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware platform.\nEOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW.\n", + "title": "Direction" + }, + "group": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "description": "'access_list' and 'group' are mutual exclusive", + "title": "Group" + }, + "original_ip": { + "type": "string", + "description": "IPv4 address", + "title": "Original IP" + }, + "original_port": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "title": "Original Port" + }, + "priority": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "title": "Priority" + }, + "protocol": { + "type": "string", + "enum": [ + "udp", + "tcp" + ], + "title": "Protocol" + }, + "translated_ip": { + "type": "string", + "description": "IPv4 address", + "title": "Translated IP" + }, + "translated_port": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "description": "requires 'original_port'", + "title": "Translated Port" + } + }, + "required": [ + "translated_ip", + "original_ip" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Static" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Source" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IP Nat" + }, + "ipv6_enable": { + "type": "boolean", + "title": "IPv6 Enable" + }, + "ipv6_address": { + "type": "string", + "title": "IPv6 Address" + }, + "ipv6_address_link_local": { + "type": "string", + "description": "Link local IPv6 address/mask", + "title": "IPv6 Address Link Local" + }, + "ipv6_nd_ra_disabled": { + "type": "boolean", + "title": "IPv6 ND RA Disabled" + }, + "ipv6_nd_managed_config_flag": { + "type": "boolean", + "title": "IPv6 ND Managed Config Flag" + }, + "ipv6_nd_prefixes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "ipv6_prefix": { + "type": "string", + "title": "IPv6 Prefix" + }, + "valid_lifetime": { + "type": "string", + "description": "Infinite or lifetime in seconds", + "title": "Valid Lifetime" + }, + "preferred_lifetime": { + "type": "string", + "description": "Infinite or lifetime in seconds", + "title": "Preferred Lifetime" + }, + "no_autoconfig_flag": { + "type": "boolean", + "title": "No Autoconfig Flag" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "ipv6_prefix" + ] + }, + "title": "IPv6 ND Prefixes" + }, + "ipv6_dhcp_relay_destinations": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "description": "DHCP server's IPv6 address", + "title": "Address" + }, + "vrf": { + "type": "string", + "title": "VRF" + }, + "local_interface": { + "type": "string", + "description": "Local interface to communicate with DHCP server - mutually exclusive to source_address", + "title": "Local Interface" + }, + "source_address": { + "type": "string", + "description": "Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface", + "title": "Source Address" + }, + "link_address": { + "type": "string", + "description": "Override the default link address specified in the relayed DHCP packet", + "title": "Link Address" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "address" + ] + }, + "title": "IPv6 DHCP Relay Destinations" + }, + "access_group_in": { + "type": "string", + "description": "Access list name", + "title": "Access Group In" + }, + "access_group_out": { + "type": "string", + "description": "Access list name", + "title": "Access Group Out" + }, + "ipv6_access_group_in": { + "type": "string", + "description": "IPv6 access list name", + "title": "IPv6 Access Group In" + }, + "ipv6_access_group_out": { + "type": "string", + "description": "IPv6 access list name", + "title": "IPv6 Access Group Out" + }, + "mac_access_group_in": { + "type": "string", + "description": "MAC access list name", + "title": "MAC Access Group In" + }, + "mac_access_group_out": { + "type": "string", + "description": "MAC access list name", + "title": "MAC Access Group Out" + }, + "multicast": { + "type": "object", + "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both", + "properties": { + "ipv4": { + "type": "object", + "properties": { + "boundaries": { + "type": "array", + "items": { + "type": "object", + "properties": { + "boundary": { + "type": "string", + "description": "ACL name or multicast IP subnet", + "title": "Boundary" + }, + "out": { + "type": "boolean", + "title": "Out" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Boundaries" + }, + "static": { + "type": "boolean", + "title": "Static" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv4" + }, + "ipv6": { + "type": "object", + "properties": { + "boundaries": { + "type": "array", + "items": { + "type": "object", + "properties": { + "boundary": { + "type": "string", + "description": "ACL name or multicast IP subnet", + "title": "Boundary" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Boundaries" + }, + "static": { + "type": "boolean", + "title": "Static" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv6" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Multicast" + }, + "ospf_network_point_to_point": { + "type": "boolean", + "title": "OSPF Network Point To Point" + }, + "ospf_area": { + "type": "string", + "title": "OSPF Area" + }, + "ospf_cost": { + "type": "integer", + "title": "OSPF Cost" + }, + "ospf_authentication": { + "type": "string", + "enum": [ + "none", + "simple", + "message-digest" + ], + "title": "OSPF Authentication" + }, + "ospf_authentication_key": { + "type": "string", + "description": "Encrypted password - only type 7 supported", + "title": "OSPF Authentication Key" + }, + "ospf_message_digest_keys": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "title": "ID" + }, + "hash_algorithm": { + "type": "string", + "enum": [ + "md5", + "sha1", + "sha256", + "sha384", + "sha512" + ], + "title": "Hash Algorithm" + }, + "key": { + "type": "string", + "description": "Encrypted password - only type 7 supported", + "title": "Key" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "id" + ] + }, + "title": "OSPF Message Digest Keys" + }, + "pim": { + "type": "object", + "properties": { + "ipv4": { + "type": "object", + "properties": { + "dr_priority": { + "type": "integer", + "minimum": 0, + "maximum": 429467295, + "title": "DR Priority" + }, + "sparse_mode": { + "type": "boolean", + "title": "Sparse Mode" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv4" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "PIM" + }, + "mac_security": { + "type": "object", + "properties": { + "profile": { + "type": "string", + "title": "Profile" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "MAC Security" + }, + "channel_group": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "title": "ID" + }, + "mode": { + "type": "string", + "enum": [ + "on", + "active", + "passive" + ], + "title": "Mode" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Channel Group" + }, + "isis_enable": { + "type": "string", + "description": "ISIS instance", + "title": "ISIS Enable" + }, + "isis_passive": { + "type": "boolean", + "title": "ISIS Passive" + }, + "isis_metric": { + "type": "integer", + "title": "ISIS Metric" + }, + "isis_network_point_to_point": { + "type": "boolean", + "title": "ISIS Network Point To Point" + }, + "isis_circuit_type": { + "type": "string", + "enum": [ + "level-1-2", + "level-1", + "level-2" + ], + "title": "ISIS Circuit Type" + }, + "isis_hello_padding": { + "type": "boolean", + "title": "ISIS Hello Padding" + }, + "isis_authentication_mode": { + "type": "string", + "enum": [ + "text", + "md5" + ], + "title": "ISIS Authentication Mode" + }, + "isis_authentication_key": { + "type": "string", + "description": "Type-7 encrypted password", + "title": "ISIS Authentication Key" + }, + "poe": { + "type": "object", + "properties": { + "disabled": { + "type": "boolean", + "description": "Disable PoE on a POE capable port. PoE is enabled on all ports that support it by default in EOS.", + "default": false, + "title": "Disabled" + }, + "priority": { + "type": "string", + "enum": [ + "critical", + "high", + "medium", + "low" + ], + "description": "Prioritize a port's power in the event that one of the switch's power supplies loses power", + "title": "Priority" + }, + "reboot": { + "description": "Set the PoE power behavior for a PoE port when the system is rebooted", + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "maintain", + "power-off" + ], + "description": "PoE action for interface", + "title": "Action" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Reboot" + }, + "link_down": { + "description": "Set the PoE power behavior for a PoE port when the port goes down", + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "maintain", + "power-off" + ], + "description": "PoE action for interface", + "title": "Action" + }, + "power_off_delay": { + "type": "integer", + "minimum": 1, + "maximum": 86400, + "description": "Number of seconds to delay shutting the power off after a link down event occurs. Default value is 5 seconds in EOS.", + "title": "Power Off Delay" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Link Down" + }, + "shutdown": { + "description": "Set the PoE power behavior for a PoE port when the port is admin down", + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "maintain", + "power-off" + ], + "description": "PoE action for interface", + "title": "Action" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Shutdown" + }, + "limit": { + "type": "object", + "description": "Override the hardware-negotiated power limit using either wattage or a power class. Note that if using a power class, AVD will automatically convert the class value to the wattage value corresponding to that power class.", + "properties": { + "class": { + "type": "integer", + "minimum": 0, + "maximum": 8, + "title": "Class" + }, + "watts": { + "type": "string", + "title": "Watts" + }, + "fixed": { + "type": "boolean", + "description": "Set to ignore hardware classification", + "title": "Fixed" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Limit" + }, + "negotiation_lldp": { + "type": "boolean", + "description": "Disable to prevent port from negotiating power with powered devices over LLDP. Enabled by default in EOS.", + "title": "Negotiation LLDP" + }, + "legacy_detect": { + "type": "boolean", + "description": "Allow a subset of legacy devices to work with the PoE switch. Disabled by default in EOS because it can cause false positive detections.", + "title": "Legacy Detect" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "PoE" + }, + "ptp": { + "type": "object", + "properties": { + "enable": { + "type": "boolean", + "title": "Enable" + }, + "announce": { + "type": "object", + "properties": { + "interval": { + "type": "integer", + "title": "Interval" + }, + "timeout": { + "type": "integer", + "title": "Timeout" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Announce" + }, + "delay_req": { + "type": "integer", + "title": "Delay Req" + }, + "delay_mechanism": { + "type": "string", + "enum": [ + "e2e", + "p2p" + ], + "title": "Delay Mechanism" + }, + "sync_message": { + "type": "object", + "properties": { + "interval": { + "type": "integer", + "title": "Interval" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Sync Message" + }, + "role": { + "type": "string", + "enum": [ + "master", + "dynamic" + ], + "title": "Role" + }, + "vlan": { + "type": "string", + "description": "VLAN can be 'all' or list of vlans as string", + "title": "VLAN" + }, + "transport": { + "type": "string", + "enum": [ + "ipv4", + "ipv6", + "layer2" + ], + "title": "Transport" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "PTP" + }, + "profile": { + "type": "string", + "description": "Interface profile", + "title": "Profile" + }, + "storm_control": { + "type": "object", + "properties": { + "all": { + "type": "object", + "properties": { + "level": { + "type": "string", + "description": "Configure maximum storm-control level", + "title": "Level" + }, + "unit": { + "type": "string", + "default": "percent", + "enum": [ + "percent", + "pps" + ], + "description": "Optional field and is hardware dependent", + "title": "Unit" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "All" + }, + "broadcast": { + "type": "object", + "properties": { + "level": { + "type": "string", + "description": "Configure maximum storm-control level", + "title": "Level" + }, + "unit": { + "type": "string", + "default": "percent", + "enum": [ + "percent", + "pps" + ], + "description": "Optional field and is hardware dependent", + "title": "Unit" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Broadcast" + }, + "multicast": { + "type": "object", + "properties": { + "level": { + "type": "string", + "description": "Configure maximum storm-control level", + "title": "Level" + }, + "unit": { + "type": "string", + "default": "percent", + "enum": [ + "percent", + "pps" + ], + "description": "Optional field and is hardware dependent", + "title": "Unit" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Multicast" + }, + "unknown_unicast": { + "type": "object", + "properties": { + "level": { + "type": "string", + "description": "Configure maximum storm-control level", + "title": "Level" + }, + "unit": { + "type": "string", + "default": "percent", + "enum": [ + "percent", + "pps" + ], + "description": "Optional field and is hardware dependent", + "title": "Unit" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Unknown Unicast" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Storm Control" + }, + "logging": { + "type": "object", + "properties": { + "event": { + "type": "object", + "properties": { + "link_status": { + "type": "boolean", + "title": "Link Status" + }, + "congestion_drops": { + "type": "boolean", + "title": "Congestion Drops" + }, + "spanning_tree": { + "type": "boolean", + "title": "Spanning Tree" + }, + "storm_control_discards": { + "type": "boolean", + "title": "Storm Control Discards" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Event" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Logging" + }, + "lldp": { + "type": "object", + "properties": { + "transmit": { + "type": "boolean", + "title": "Transmit" + }, + "receive": { + "type": "boolean", + "title": "Receive" + }, + "ztp_vlan": { + "type": "integer", + "description": "ZTP vlan number", + "title": "ZTP VLAN" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "LLDP" + }, + "trunk_private_vlan_secondary": { + "type": "boolean", + "title": "Trunk Private VLAN Secondary" + }, + "pvlan_mapping": { + "type": "string", + "description": "List of vlans as string", + "title": "PVLAN Mapping" + }, + "vlan_translations": { + "type": "array", + "items": { + "type": "object", + "properties": { + "from": { + "type": "string", + "description": "List of vlans as string (only one vlan if direction is \"both\")", + "title": "From" + }, + "to": { + "type": "integer", + "description": "VLAN ID", + "title": "To" + }, + "direction": { + "type": "string", + "enum": [ + "in", + "out", + "both" + ], + "default": "both", + "title": "Direction" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "VLAN Translations" + }, + "dot1x": { + "type": "object", + "properties": { + "port_control": { + "type": "string", + "enum": [ + "auto", + "force-authorized", + "force-unauthorized" + ], + "title": "Port Control" + }, + "port_control_force_authorized_phone": { + "type": "boolean", + "title": "Port Control Force Authorized Phone" + }, + "reauthentication": { + "type": "boolean", + "title": "Reauthentication" + }, + "pae": { + "type": "object", + "properties": { + "mode": { + "type": "string", + "enum": [ + "authenticator" + ], + "title": "Mode" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "PAE" + }, + "authentication_failure": { + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "drop" + ], + "title": "Action" + }, + "allow_vlan": { + "type": "integer", + "minimum": 1, + "maximum": 4094, + "title": "Allow VLAN" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Authentication Failure" + }, + "host_mode": { + "type": "object", + "properties": { + "mode": { + "type": "string", + "enum": [ + "multi-host", + "single-host" + ], + "title": "Mode" + }, + "multi_host_authenticated": { + "type": "boolean", + "title": "Multi Host Authenticated" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Host Mode" + }, + "mac_based_authentication": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "always": { + "type": "boolean", + "title": "Always" + }, + "host_mode_common": { + "type": "boolean", + "title": "Host Mode Common" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "MAC Based Authentication" + }, + "timeout": { + "type": "object", + "properties": { + "idle_host": { + "type": "integer", + "minimum": 10, + "maximum": 65535, + "title": "Idle Host" + }, + "quiet_period": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "title": "Quiet Period" + }, + "reauth_period": { + "type": "string", + "description": "Value can be 60-4294967295 or 'server'", + "title": "Reauth Period" + }, + "reauth_timeout_ignore": { + "type": "boolean", + "title": "Reauth Timeout Ignore" + }, + "tx_period": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "title": "TX Period" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Timeout" + }, + "reauthorization_request_limit": { + "type": "integer", + "minimum": 1, + "maximum": 10, + "title": "Reauthorization Request Limit" + }, + "unauthorized": { + "type": "object", + "properties": { + "access_vlan_membership_egress": { + "type": "boolean", + "title": "Access VLAN Membership Egress" + }, + "native_vlan_membership_egress": { + "type": "boolean", + "title": "Native VLAN Membership Egress" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Unauthorized" + }, + "eapol": { + "type": "object", + "properties": { + "disabled": { + "type": "boolean", + "title": "Disabled" + }, + "authentication_failure_fallback_mba": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "timeout": { + "type": "integer", + "minimum": 0, + "maximum": 65535, + "title": "Timeout" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Authentication Failure Fallback Mba" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Eapol" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "dot1x" + }, + "service_profile": { + "type": "string", + "description": "QOS profile", + "title": "Service Profile" + }, + "shape": { + "type": "object", + "properties": { + "rate": { + "type": "string", + "description": "Rate in kbps, pps or percent\nSupported options are platform dependent\nExamples:\n- \"5000 kbps\"\n- \"1000 pps\"\n- \"20 percent\"\n", + "title": "Rate" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Shape" + }, + "qos": { + "type": "object", + "properties": { + "trust": { + "type": "string", + "enum": [ + "dscp", + "cos", + "disabled" + ], + "title": "Trust" + }, + "dscp": { + "type": "integer", + "description": "DSCP value", + "title": "DSCP" + }, + "cos": { + "type": "integer", + "description": "COS value", + "title": "COS" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "QOS" + }, + "spanning_tree_bpdufilter": { + "type": "string", + "enum": [ + "enabled", + "disabled", + "True", + "False", + "true", + "false" + ], + "title": "Spanning Tree Bpdufilter" + }, + "spanning_tree_bpduguard": { + "type": "string", + "enum": [ + "enabled", + "disabled", + "True", + "False", + "true", + "false" + ], + "title": "Spanning Tree Bpduguard" + }, + "spanning_tree_guard": { + "type": "string", + "enum": [ + "loop", + "root", + "disabled" + ], + "title": "Spanning Tree Guard" + }, + "spanning_tree_portfast": { + "type": "string", + "enum": [ + "edge", + "network" + ], + "title": "Spanning Tree Portfast" + }, + "vmtracer": { + "type": "boolean", + "title": "VMTracer" + }, + "priority_flow_control": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "priorities": { + "type": "array", + "items": { + "type": "object", + "properties": { + "priority": { + "type": "integer", + "minimum": 0, + "maximum": 7, + "title": "Priority" + }, + "no_drop": { + "type": "boolean", + "title": "No Drop" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "priority" + ] + }, + "title": "Priorities" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Priority Flow Control" + }, + "bfd": { + "type": "object", + "properties": { + "echo": { + "type": "boolean", + "title": "Echo" + }, + "interval": { + "type": "integer", + "description": "Interval in milliseconds", + "title": "Interval" + }, + "min_rx": { + "type": "integer", + "description": "Rate in milliseconds", + "title": "Min RX" + }, + "multiplier": { + "type": "integer", + "minimum": 3, + "maximum": 50, + "title": "Multiplier" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BFD" + }, + "service_policy": { + "type": "object", + "properties": { + "pbr": { + "type": "object", + "properties": { + "input": { + "type": "string", + "description": "Policy Based Routing Policy-map name", + "title": "Input" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "PBR" + }, + "qos": { + "type": "object", + "properties": { + "input": { + "type": "string", + "description": "Quality of Service Policy-map name", + "title": "Input" + } + }, + "required": [ + "input" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "QOS" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Service Policy" + }, + "mpls": { + "type": "object", + "properties": { + "ip": { + "type": "boolean", + "title": "IP" + }, + "ldp": { + "type": "object", + "properties": { + "interface": { + "type": "boolean", + "title": "Interface" + }, + "igp_sync": { + "type": "boolean", + "title": "IGP Sync" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "LDP" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "MPLS" + }, + "lacp_timer": { + "type": "object", + "properties": { + "mode": { + "type": "string", + "enum": [ + "fast", + "normal" + ], + "title": "Mode" + }, + "multiplier": { + "type": "integer", + "minimum": 3, + "maximum": 3000, + "title": "Multiplier" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "LACP Timer" + }, + "lacp_port_priority": { + "type": "integer", + "minimum": 0, + "maximum": 65535, + "title": "LACP Port Priority" + }, + "transceiver": { + "type": "object", + "properties": { + "media": { + "type": "object", + "properties": { + "override": { + "type": "string", + "description": "Transceiver type", + "title": "Override" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Media" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Transceiver" + }, + "ip_proxy_arp": { + "type": "boolean", + "title": "IP Proxy ARP" + }, + "traffic_policy": { + "type": "object", + "properties": { + "input": { + "type": "string", + "description": "Ingress traffic policy", + "title": "Input" + }, + "output": { + "type": "string", + "description": "Egress traffic policy", + "title": "Output" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Traffic Policy" + }, + "bgp": { + "type": "object", + "properties": { + "session_tracker": { + "type": "string", + "description": "Name of session tracker", + "title": "Session Tracker" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BGP" + }, + "peer": { + "type": "string", + "description": "Key only used for documentation or validation purposes", + "title": "Peer" + }, + "peer_interface": { + "type": "string", + "description": "Key only used for documentation or validation purposes", + "title": "Peer Interface" + }, + "peer_type": { + "type": "string", + "description": "Key only used for documentation or validation purposes", + "title": "Peer Type" + }, + "sflow": { + "type": "object", + "properties": { + "enable": { + "type": "boolean", + "title": "Enable" + }, + "egress": { + "type": "object", + "properties": { + "enable": { + "type": "boolean", + "title": "Enable" + }, + "unmodified_enable": { + "type": "boolean", + "title": "Unmodified Enable" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Egress" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Sflow" + }, + "port_profile": { + "type": "string", + "description": "Key only used for documentation or validation purposes", + "title": "Port Profile" + }, + "uc_tx_queues": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "TX-Queue ID", + "title": "ID" + }, + "random_detect": { + "type": "object", + "properties": { + "ecn": { + "description": "Explicit Congestion Notification", + "type": "object", + "properties": { + "count": { + "type": "boolean", + "description": "Enable counter for random-detect ECNs", + "title": "Count" + }, + "threshold": { + "type": "object", + "properties": { + "units": { + "type": "string", + "enum": [ + "segments", + "bytes", + "kbytes", + "mbytes", + "milliseconds" + ], + "description": "Indicate the units to be used for the threshold values", + "title": "Units" + }, + "min": { + "type": "integer", + "minimum": 1, + "maximum": 256000000, + "description": "Set the random-detect ECN minimum-threshold", + "title": "Min" + }, + "max": { + "type": "integer", + "minimum": 1, + "maximum": 256000000, + "description": "Set the random-detect ECN maximum-threshold", + "title": "Max" + }, + "max_probability": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "description": "Set the random-detect ECN max-mark-probability", + "title": "Max Probability" + }, + "weight": { + "type": "integer", + "minimum": 0, + "maximum": 15, + "description": "Set the random-detect ECN weight", + "title": "Weight" + } + }, + "required": [ + "units", + "min", + "max" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Threshold" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Ecn" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Random Detect" + } + }, + "required": [ + "id" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Uc TX Queues" + }, + "tx_queues": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "TX-Queue ID", + "title": "ID" + }, + "random_detect": { + "type": "object", + "properties": { + "ecn": { + "description": "Explicit Congestion Notification", + "type": "object", + "properties": { + "count": { + "type": "boolean", + "description": "Enable counter for random-detect ECNs", + "title": "Count" + }, + "threshold": { + "type": "object", + "properties": { + "units": { + "type": "string", + "enum": [ + "segments", + "bytes", + "kbytes", + "mbytes", + "milliseconds" + ], + "description": "Indicate the units to be used for the threshold values", + "title": "Units" + }, + "min": { + "type": "integer", + "minimum": 1, + "maximum": 256000000, + "description": "Set the random-detect ECN minimum-threshold", + "title": "Min" + }, + "max": { + "type": "integer", + "minimum": 1, + "maximum": 256000000, + "description": "Set the random-detect ECN maximum-threshold", + "title": "Max" + }, + "max_probability": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "description": "Set the random-detect ECN max-mark-probability", + "title": "Max Probability" + }, + "weight": { + "type": "integer", + "minimum": 0, + "maximum": 15, + "description": "Set the random-detect ECN weight", + "title": "Weight" + } + }, + "required": [ + "units", + "max", + "max_probability" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Threshold" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Ecn" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Random Detect" + } + }, + "required": [ + "id" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "TX Queues" + }, + "vrrp_ids": { + "type": "array", + "description": "VRRP model.", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "VRID", + "title": "ID" + }, + "priority_level": { + "type": "integer", + "description": "Instance priority", + "minimum": 1, + "maximum": 254, + "title": "Priority Level" + }, + "advertisement": { + "type": "object", + "properties": { + "interval": { + "type": "integer", + "description": "Interval in seconds", + "minimum": 1, + "maximum": 255, + "title": "Interval" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Advertisement" + }, + "preempt": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "delay": { + "type": "object", + "properties": { + "minimum": { + "type": "integer", + "description": "Minimum preempt delay in seconds", + "minimum": 0, + "maximum": 3600, + "title": "Minimum" + }, + "reload": { + "type": "integer", + "description": "Reload preempt delay in seconds", + "minimum": 0, + "maximum": 3600, + "title": "Reload" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Delay" + } + }, + "required": [ + "enabled" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Preempt" + }, + "timers": { + "type": "object", + "properties": { + "delay": { + "type": "object", + "properties": { + "reload": { + "type": "integer", + "description": "Delay after reload in seconds.", + "minimum": 0, + "maximum": 3600, + "title": "Reload" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Delay" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Timers" + }, + "tracked_object": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Tracked object name", + "title": "Name" + }, + "decrement": { + "type": "integer", + "minimum": 1, + "maximum": 254, + "description": "Decrement VRRP priority by 1-254", + "title": "Decrement" + }, + "shutdown": { + "type": "boolean", + "title": "Shutdown" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "Tracked Object" + }, + "ipv4": { + "type": "object", + "properties": { + "address": { + "type": "string", + "description": "Virtual IPv4 address", + "title": "Address" + }, + "version": { + "type": "integer", + "enum": [ + 2, + 3 + ], + "title": "Version" + } + }, + "required": [ + "address" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv4" + }, + "ipv6": { + "type": "object", + "properties": { + "address": { + "type": "string", + "description": "Virtual IPv6 address", + "title": "Address" + } + }, + "required": [ + "address" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv6" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "id" + ] + }, + "title": "VRRP IDs" + }, + "eos_cli": { + "type": "string", + "description": "Multiline EOS CLI rendered directly on the ethernet interface in the final EOS configuration", + "title": "EOS CLI" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Structured Config" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "profile" + ] + }, + "title": "L3 Interfaces Profiles" + }, + "l3_interfaces": { + "type": "array", + "items": { + "type": "object", + "properties": { + "node": { + "type": "string", + "description": "Device on which the interface should be configured.", + "title": "Node" + }, + "profile": { + "type": "string", + "description": "L3 interface profile name. Profile defined under l3_interfaces_profiles.", + "title": "Profile" + }, + "interface": { + "type": "string", + "description": "Ethernet interface name like 'Ethernet2'.", + "pattern": "Ethernet[\\d/]+", + "title": "Interface" + }, + "description": { + "type": "string", + "description": "Interface description.\nIf not set a default description will be configured with '[[ ]]'", + "title": "Description" + }, + "ip": { + "type": "string", + "description": "Node IPv4 address/Mask or 'dhcp'.", + "title": "IP" + }, + "dhcp_client_accept_default_route": { + "type": "boolean", + "default": false, + "description": "Supported if `ip` is `dhcp`.\nAccepts default route from DHCP.", + "title": "DHCP Client Accept Default Route" + }, + "enabled": { + "type": "boolean", + "default": true, + "description": "Enable or Shutdown the interface.", + "title": "Enabled" + }, + "speed": { + "type": "string", + "description": "Speed should be set in the format `` or `forced ` or `auto `.", + "title": "Speed" + }, + "peer": { + "type": "string", + "description": "The peer device name. Used for description and documentation", + "title": "Peer" + }, + "peer_interface": { + "type": "string", + "description": "The peer device interface. Used for description and documentation", + "title": "Peer Interface" + }, + "peer_ip": { + "type": "string", + "description": "The peer device IP. Used for description and documentation", + "title": "Peer IP" + }, + "qos_profile": { + "type": "string", + "description": "QOS service profile.", + "title": "QOS Profile" + }, + "raw_eos_cli": { + "type": "string", + "description": "EOS CLI rendered directly on the interface in the final EOS configuration.", + "title": "Raw EOS CLI" + }, + "structured_config": { + "type": "object", + "description": "Custom structured config for the Ethernet interface.", + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "description": { + "type": "string", + "title": "Description" + }, + "shutdown": { + "type": "boolean", + "title": "Shutdown" + }, + "load_interval": { + "type": "integer", + "minimum": 0, + "maximum": 600, + "description": "Interval in seconds for updating interface counters\"", + "title": "Load Interval" + }, + "speed": { + "type": "string", + "description": "Speed should be set in the format `` or `forced ` or `auto `.", + "title": "Speed" + }, + "mtu": { + "type": "integer", + "minimum": 68, + "maximum": 65535, + "title": "MTU" + }, + "l2_mtu": { + "type": "integer", + "minimum": 68, + "maximum": 65535, + "description": "\"l2_mtu\" should only be defined for platforms supporting the \"l2 mtu\" CLI\n", + "title": "L2 MTU" + }, + "l2_mru": { + "type": "integer", + "minimum": 68, + "maximum": 65535, + "description": "\"l2_mru\" should only be defined for platforms supporting the \"l2 mru\" CLI\n", + "title": "L2 MRU" + }, + "vlans": { + "type": "string", + "description": "List of switchport vlans as string\nFor a trunk port this would be a range like \"1-200,300\"\nFor an access port this would be a single vlan \"123\"\n", + "title": "VLANs" + }, + "native_vlan": { + "type": "integer", + "title": "Native VLAN" + }, + "native_vlan_tag": { + "type": "boolean", + "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence", + "title": "Native VLAN Tag" + }, + "mode": { + "type": "string", + "enum": [ + "access", + "dot1q-tunnel", + "trunk", + "trunk phone" + ], + "title": "Mode" + }, + "phone": { + "type": "object", + "properties": { + "trunk": { + "type": "string", + "enum": [ + "tagged", + "tagged phone", + "untagged", + "untagged phone" + ], + "title": "Trunk" + }, + "vlan": { + "type": "integer", + "minimum": 1, + "maximum": 4094, + "title": "VLAN" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Phone" + }, + "l2_protocol": { + "type": "object", + "properties": { + "encapsulation_dot1q_vlan": { + "type": "integer", + "description": "Vlan tag to configure on sub-interface", + "title": "Encapsulation Dot1Q VLAN" + }, + "forwarding_profile": { + "type": "string", + "description": "L2 protocol forwarding profile", + "title": "Forwarding Profile" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "L2 Protocol" + }, + "trunk_groups": { + "type": "array", + "items": { + "type": "string" + }, + "title": "Trunk Groups" + }, + "type": { + "type": "string", + "enum": [ + "routed", + "switched", + "l3dot1q", + "l2dot1q", + "port-channel-member" + ], + "description": "l3dot1q and l2dot1q are used for sub-interfaces. The parent interface should be defined as routed.\nInterface will not be listed in device documentation, unless \"type\" is set.\n", + "title": "Type" + }, + "snmp_trap_link_change": { + "type": "boolean", + "title": "Snmp Trap Link Change" + }, + "address_locking": { + "type": "object", + "properties": { + "ipv4": { + "type": "boolean", + "description": "Enable address locking for IPv4", + "title": "IPv4" + }, + "ipv6": { + "type": "boolean", + "description": "Enable address locking for IPv6", + "title": "IPv6" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Address Locking" + }, + "flowcontrol": { + "type": "object", + "properties": { + "received": { + "type": "string", + "enum": [ + "desired", + "on", + "off" + ], + "title": "Received" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Flowcontrol" + }, + "vrf": { + "type": "string", + "description": "VRF name", + "title": "VRF" + }, + "flow_tracker": { + "type": "object", + "properties": { + "sampled": { + "type": "string", + "description": "Sampled flow tracker name.", + "title": "Sampled" + }, + "hardware": { + "type": "string", + "description": "Hardware flow tracker name.", + "title": "Hardware" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Flow Tracker" + }, + "error_correction_encoding": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "default": true, + "title": "Enabled" + }, + "fire_code": { + "type": "boolean", + "title": "Fire Code" + }, + "reed_solomon": { + "type": "boolean", + "title": "Reed Solomon" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Error Correction Encoding" + }, + "link_tracking_groups": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Group name", + "title": "Name" + }, + "direction": { + "type": "string", + "enum": [ + "upstream", + "downstream" + ], + "title": "Direction" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "Link Tracking Groups" + }, + "evpn_ethernet_segment": { + "type": "object", + "properties": { + "identifier": { + "type": "string", + "description": "EVPN Ethernet Segment Identifier (Type 1 format)", + "title": "Identifier" + }, + "redundancy": { + "type": "string", + "enum": [ + "all-active", + "single-active" + ], + "title": "Redundancy" + }, + "designated_forwarder_election": { + "type": "object", + "properties": { + "algorithm": { + "type": "string", + "enum": [ + "modulus", + "preference" + ], + "title": "Algorithm" + }, + "preference_value": { + "type": "integer", + "minimum": 0, + "maximum": 65535, + "description": "Preference_value is only used when \"algorithm\" is \"preference\"", + "title": "Preference Value" + }, + "dont_preempt": { + "type": "boolean", + "description": "Dont_preempt is only used when \"algorithm\" is \"preference\"", + "title": "Dont Preempt" + }, + "hold_time": { + "type": "integer", + "title": "Hold Time" + }, + "subsequent_hold_time": { + "type": "integer", + "title": "Subsequent Hold Time" + }, + "candidate_reachability_required": { + "type": "boolean", + "title": "Candidate Reachability Required" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Designated Forwarder Election" + }, + "mpls": { + "type": "object", + "properties": { + "shared_index": { + "type": "integer", + "minimum": 1, + "maximum": 1024, + "title": "Shared Index" + }, + "tunnel_flood_filter_time": { + "type": "integer", + "title": "Tunnel Flood Filter Time" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "MPLS" + }, + "route_target": { + "type": "string", + "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx", + "title": "Route Target" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "EVPN Ethernet Segment" + }, + "encapsulation_dot1q_vlan": { + "type": "integer", + "description": "VLAN tag to configure on sub-interface", + "title": "Encapsulation Dot1Q VLAN" + }, + "encapsulation_vlan": { + "type": "object", + "properties": { + "client": { + "type": "object", + "properties": { + "dot1q": { + "type": "object", + "properties": { + "vlan": { + "type": "integer", + "description": "Client VLAN ID", + "title": "VLAN" + }, + "outer": { + "type": "integer", + "description": "Client Outer VLAN ID", + "title": "Outer" + }, + "inner": { + "type": "integer", + "description": "Client Inner VLAN ID", + "title": "Inner" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Dot1Q" + }, + "unmatched": { + "type": "boolean", + "title": "Unmatched" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Client" + }, + "network": { + "type": "object", + "description": "Network encapsulations are all optional and skipped if using client unmatched", + "properties": { + "dot1q": { + "type": "object", + "properties": { + "vlan": { + "type": "integer", + "description": "Network VLAN ID", + "title": "VLAN" + }, + "outer": { + "type": "integer", + "description": "Network outer VLAN ID", + "title": "Outer" + }, + "inner": { + "type": "integer", + "description": "Network inner VLAN ID", + "title": "Inner" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Dot1Q" + }, + "client": { + "type": "boolean", + "title": "Client" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Network" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Encapsulation VLAN" + }, + "vlan_id": { + "type": "integer", + "minimum": 1, + "maximum": 4094, + "title": "VLAN ID" + }, + "ip_address": { + "type": "string", + "description": "IPv4 address/mask or \"dhcp\"", + "title": "IP Address" + }, + "ip_address_secondaries": { + "type": "array", + "items": { + "type": "string" + }, + "title": "IP Address Secondaries" + }, + "dhcp_client_accept_default_route": { + "type": "boolean", + "description": "Install default-route obtained via DHCP", + "title": "DHCP Client Accept Default Route" + }, + "dhcp_server_ipv4": { + "type": "boolean", + "description": "Enable IPv4 DHCP server.", + "title": "DHCP Server IPv4" + }, + "dhcp_server_ipv6": { + "type": "boolean", + "description": "Enable IPv6 DHCP server.", + "title": "DHCP Server IPv6" + }, + "ip_helpers": { + "type": "array", + "items": { + "type": "object", + "properties": { + "ip_helper": { + "type": "string", + "title": "IP Helper" + }, + "source_interface": { + "type": "string", + "description": "Source interface name", + "title": "Source Interface" + }, + "vrf": { + "type": "string", + "description": "VRF name", + "title": "VRF" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "ip_helper" + ] + }, + "title": "IP Helpers" + }, + "ip_nat": { + "type": "object", + "properties": { + "service_profile": { + "type": "string", + "description": "NAT interface profile.", + "title": "Service Profile" + }, + "destination": { + "type": "object", + "properties": { + "dynamic": { + "type": "array", + "items": { + "type": "object", + "properties": { + "access_list": { + "type": "string", + "title": "Access List" + }, + "comment": { + "type": "string", + "title": "Comment" + }, + "pool_name": { + "type": "string", + "title": "Pool Name" + }, + "priority": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "title": "Priority" + } + }, + "required": [ + "pool_name", + "access_list" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Dynamic" + }, + "static": { + "type": "array", + "items": { + "type": "object", + "properties": { + "access_list": { + "type": "string", + "description": "'access_list' and 'group' are mutual exclusive", + "title": "Access List" + }, + "comment": { + "type": "string", + "title": "Comment" + }, + "direction": { + "type": "string", + "enum": [ + "egress", + "ingress" + ], + "description": "Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware platform.\nEOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW.\n", + "title": "Direction" + }, + "group": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "description": "'access_list' and 'group' are mutual exclusive", + "title": "Group" + }, + "original_ip": { + "type": "string", + "description": "IPv4 address", + "title": "Original IP" + }, + "original_port": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "title": "Original Port" + }, + "priority": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "title": "Priority" + }, + "protocol": { + "type": "string", + "enum": [ + "udp", + "tcp" + ], + "title": "Protocol" + }, + "translated_ip": { + "type": "string", + "description": "IPv4 address", + "title": "Translated IP" + }, + "translated_port": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "description": "requires 'original_port'", + "title": "Translated Port" + } + }, + "required": [ + "translated_ip", + "original_ip" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Static" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Destination" + }, + "source": { + "type": "object", + "properties": { + "dynamic": { + "type": "array", + "items": { + "type": "object", + "properties": { + "access_list": { + "type": "string", + "title": "Access List" + }, + "comment": { + "type": "string", + "title": "Comment" + }, + "nat_type": { + "type": "string", + "enum": [ + "overload", + "pool", + "pool-address-only", + "pool-full-cone" + ], + "title": "Nat Type" + }, + "pool_name": { + "type": "string", + "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone\nignored if 'nat_type' is overload\n", + "title": "Pool Name" + }, + "priority": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "title": "Priority" + } + }, + "required": [ + "nat_type", + "access_list" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Dynamic" + }, + "static": { + "type": "array", + "items": { + "type": "object", + "properties": { + "access_list": { + "type": "string", + "description": "'access_list' and 'group' are mutual exclusive", + "title": "Access List" + }, + "comment": { + "type": "string", + "title": "Comment" + }, + "direction": { + "type": "string", + "enum": [ + "egress", + "ingress" + ], + "description": "Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware platform.\nEOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW.\n", + "title": "Direction" + }, + "group": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "description": "'access_list' and 'group' are mutual exclusive", + "title": "Group" + }, + "original_ip": { + "type": "string", + "description": "IPv4 address", + "title": "Original IP" + }, + "original_port": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "title": "Original Port" + }, + "priority": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "title": "Priority" + }, + "protocol": { + "type": "string", + "enum": [ + "udp", + "tcp" + ], + "title": "Protocol" + }, + "translated_ip": { + "type": "string", + "description": "IPv4 address", + "title": "Translated IP" + }, + "translated_port": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "description": "requires 'original_port'", + "title": "Translated Port" + } + }, + "required": [ + "translated_ip", + "original_ip" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Static" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Source" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IP Nat" + }, + "ipv6_enable": { + "type": "boolean", + "title": "IPv6 Enable" + }, + "ipv6_address": { + "type": "string", + "title": "IPv6 Address" + }, + "ipv6_address_link_local": { + "type": "string", + "description": "Link local IPv6 address/mask", + "title": "IPv6 Address Link Local" + }, + "ipv6_nd_ra_disabled": { + "type": "boolean", + "title": "IPv6 ND RA Disabled" + }, + "ipv6_nd_managed_config_flag": { + "type": "boolean", + "title": "IPv6 ND Managed Config Flag" + }, + "ipv6_nd_prefixes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "ipv6_prefix": { + "type": "string", + "title": "IPv6 Prefix" + }, + "valid_lifetime": { + "type": "string", + "description": "Infinite or lifetime in seconds", + "title": "Valid Lifetime" + }, + "preferred_lifetime": { + "type": "string", + "description": "Infinite or lifetime in seconds", + "title": "Preferred Lifetime" + }, + "no_autoconfig_flag": { + "type": "boolean", + "title": "No Autoconfig Flag" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "ipv6_prefix" + ] + }, + "title": "IPv6 ND Prefixes" + }, + "ipv6_dhcp_relay_destinations": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "description": "DHCP server's IPv6 address", + "title": "Address" + }, + "vrf": { + "type": "string", + "title": "VRF" + }, + "local_interface": { + "type": "string", + "description": "Local interface to communicate with DHCP server - mutually exclusive to source_address", + "title": "Local Interface" + }, + "source_address": { + "type": "string", + "description": "Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface", + "title": "Source Address" + }, + "link_address": { + "type": "string", + "description": "Override the default link address specified in the relayed DHCP packet", + "title": "Link Address" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "address" + ] + }, + "title": "IPv6 DHCP Relay Destinations" + }, + "access_group_in": { + "type": "string", + "description": "Access list name", + "title": "Access Group In" + }, + "access_group_out": { + "type": "string", + "description": "Access list name", + "title": "Access Group Out" + }, + "ipv6_access_group_in": { + "type": "string", + "description": "IPv6 access list name", + "title": "IPv6 Access Group In" + }, + "ipv6_access_group_out": { + "type": "string", + "description": "IPv6 access list name", + "title": "IPv6 Access Group Out" + }, + "mac_access_group_in": { + "type": "string", + "description": "MAC access list name", + "title": "MAC Access Group In" + }, + "mac_access_group_out": { + "type": "string", + "description": "MAC access list name", + "title": "MAC Access Group Out" + }, + "multicast": { + "type": "object", + "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both", + "properties": { + "ipv4": { + "type": "object", + "properties": { + "boundaries": { + "type": "array", + "items": { + "type": "object", + "properties": { + "boundary": { + "type": "string", + "description": "ACL name or multicast IP subnet", + "title": "Boundary" + }, + "out": { + "type": "boolean", + "title": "Out" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Boundaries" + }, + "static": { + "type": "boolean", + "title": "Static" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv4" + }, + "ipv6": { + "type": "object", + "properties": { + "boundaries": { + "type": "array", + "items": { + "type": "object", + "properties": { + "boundary": { + "type": "string", + "description": "ACL name or multicast IP subnet", + "title": "Boundary" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Boundaries" + }, + "static": { + "type": "boolean", + "title": "Static" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv6" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Multicast" + }, + "ospf_network_point_to_point": { + "type": "boolean", + "title": "OSPF Network Point To Point" + }, + "ospf_area": { + "type": "string", + "title": "OSPF Area" + }, + "ospf_cost": { + "type": "integer", + "title": "OSPF Cost" + }, + "ospf_authentication": { + "type": "string", + "enum": [ + "none", + "simple", + "message-digest" + ], + "title": "OSPF Authentication" + }, + "ospf_authentication_key": { + "type": "string", + "description": "Encrypted password - only type 7 supported", + "title": "OSPF Authentication Key" + }, + "ospf_message_digest_keys": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "title": "ID" + }, + "hash_algorithm": { + "type": "string", + "enum": [ + "md5", + "sha1", + "sha256", + "sha384", + "sha512" + ], + "title": "Hash Algorithm" + }, + "key": { + "type": "string", + "description": "Encrypted password - only type 7 supported", + "title": "Key" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "id" + ] + }, + "title": "OSPF Message Digest Keys" + }, + "pim": { + "type": "object", + "properties": { + "ipv4": { + "type": "object", + "properties": { + "dr_priority": { + "type": "integer", + "minimum": 0, + "maximum": 429467295, + "title": "DR Priority" + }, + "sparse_mode": { + "type": "boolean", + "title": "Sparse Mode" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv4" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "PIM" + }, + "mac_security": { + "type": "object", + "properties": { + "profile": { + "type": "string", + "title": "Profile" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "MAC Security" + }, + "channel_group": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "title": "ID" + }, + "mode": { + "type": "string", + "enum": [ + "on", + "active", + "passive" + ], + "title": "Mode" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Channel Group" + }, + "isis_enable": { + "type": "string", + "description": "ISIS instance", + "title": "ISIS Enable" + }, + "isis_passive": { + "type": "boolean", + "title": "ISIS Passive" + }, + "isis_metric": { + "type": "integer", + "title": "ISIS Metric" + }, + "isis_network_point_to_point": { + "type": "boolean", + "title": "ISIS Network Point To Point" + }, + "isis_circuit_type": { + "type": "string", + "enum": [ + "level-1-2", + "level-1", + "level-2" + ], + "title": "ISIS Circuit Type" + }, + "isis_hello_padding": { + "type": "boolean", + "title": "ISIS Hello Padding" + }, + "isis_authentication_mode": { + "type": "string", + "enum": [ + "text", + "md5" + ], + "title": "ISIS Authentication Mode" + }, + "isis_authentication_key": { + "type": "string", + "description": "Type-7 encrypted password", + "title": "ISIS Authentication Key" + }, + "poe": { + "type": "object", + "properties": { + "disabled": { + "type": "boolean", + "description": "Disable PoE on a POE capable port. PoE is enabled on all ports that support it by default in EOS.", + "default": false, + "title": "Disabled" + }, + "priority": { + "type": "string", + "enum": [ + "critical", + "high", + "medium", + "low" + ], + "description": "Prioritize a port's power in the event that one of the switch's power supplies loses power", + "title": "Priority" + }, + "reboot": { + "description": "Set the PoE power behavior for a PoE port when the system is rebooted", + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "maintain", + "power-off" + ], + "description": "PoE action for interface", + "title": "Action" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Reboot" + }, + "link_down": { + "description": "Set the PoE power behavior for a PoE port when the port goes down", + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "maintain", + "power-off" + ], + "description": "PoE action for interface", + "title": "Action" + }, + "power_off_delay": { + "type": "integer", + "minimum": 1, + "maximum": 86400, + "description": "Number of seconds to delay shutting the power off after a link down event occurs. Default value is 5 seconds in EOS.", + "title": "Power Off Delay" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Link Down" + }, + "shutdown": { + "description": "Set the PoE power behavior for a PoE port when the port is admin down", + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "maintain", + "power-off" + ], + "description": "PoE action for interface", + "title": "Action" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Shutdown" + }, + "limit": { + "type": "object", + "description": "Override the hardware-negotiated power limit using either wattage or a power class. Note that if using a power class, AVD will automatically convert the class value to the wattage value corresponding to that power class.", + "properties": { + "class": { + "type": "integer", + "minimum": 0, + "maximum": 8, + "title": "Class" + }, + "watts": { + "type": "string", + "title": "Watts" + }, + "fixed": { + "type": "boolean", + "description": "Set to ignore hardware classification", + "title": "Fixed" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Limit" + }, + "negotiation_lldp": { + "type": "boolean", + "description": "Disable to prevent port from negotiating power with powered devices over LLDP. Enabled by default in EOS.", + "title": "Negotiation LLDP" + }, + "legacy_detect": { + "type": "boolean", + "description": "Allow a subset of legacy devices to work with the PoE switch. Disabled by default in EOS because it can cause false positive detections.", + "title": "Legacy Detect" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "PoE" + }, + "ptp": { + "type": "object", + "properties": { + "enable": { + "type": "boolean", + "title": "Enable" + }, + "announce": { + "type": "object", + "properties": { + "interval": { + "type": "integer", + "title": "Interval" + }, + "timeout": { + "type": "integer", + "title": "Timeout" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Announce" + }, + "delay_req": { + "type": "integer", + "title": "Delay Req" + }, + "delay_mechanism": { + "type": "string", + "enum": [ + "e2e", + "p2p" + ], + "title": "Delay Mechanism" + }, + "sync_message": { + "type": "object", + "properties": { + "interval": { + "type": "integer", + "title": "Interval" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Sync Message" + }, + "role": { + "type": "string", + "enum": [ + "master", + "dynamic" + ], + "title": "Role" + }, + "vlan": { + "type": "string", + "description": "VLAN can be 'all' or list of vlans as string", + "title": "VLAN" + }, + "transport": { + "type": "string", + "enum": [ + "ipv4", + "ipv6", + "layer2" + ], + "title": "Transport" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "PTP" + }, + "profile": { + "type": "string", + "description": "Interface profile", + "title": "Profile" + }, + "storm_control": { + "type": "object", + "properties": { + "all": { + "type": "object", + "properties": { + "level": { + "type": "string", + "description": "Configure maximum storm-control level", + "title": "Level" + }, + "unit": { + "type": "string", + "default": "percent", + "enum": [ + "percent", + "pps" + ], + "description": "Optional field and is hardware dependent", + "title": "Unit" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "All" + }, + "broadcast": { + "type": "object", + "properties": { + "level": { + "type": "string", + "description": "Configure maximum storm-control level", + "title": "Level" + }, + "unit": { + "type": "string", + "default": "percent", + "enum": [ + "percent", + "pps" + ], + "description": "Optional field and is hardware dependent", + "title": "Unit" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Broadcast" + }, + "multicast": { + "type": "object", + "properties": { + "level": { + "type": "string", + "description": "Configure maximum storm-control level", + "title": "Level" + }, + "unit": { + "type": "string", + "default": "percent", + "enum": [ + "percent", + "pps" + ], + "description": "Optional field and is hardware dependent", + "title": "Unit" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Multicast" + }, + "unknown_unicast": { + "type": "object", + "properties": { + "level": { + "type": "string", + "description": "Configure maximum storm-control level", + "title": "Level" + }, + "unit": { + "type": "string", + "default": "percent", + "enum": [ + "percent", + "pps" + ], + "description": "Optional field and is hardware dependent", + "title": "Unit" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Unknown Unicast" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Storm Control" + }, + "logging": { + "type": "object", + "properties": { + "event": { + "type": "object", + "properties": { + "link_status": { + "type": "boolean", + "title": "Link Status" + }, + "congestion_drops": { + "type": "boolean", + "title": "Congestion Drops" + }, + "spanning_tree": { + "type": "boolean", + "title": "Spanning Tree" + }, + "storm_control_discards": { + "type": "boolean", + "title": "Storm Control Discards" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Event" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Logging" + }, + "lldp": { + "type": "object", + "properties": { + "transmit": { + "type": "boolean", + "title": "Transmit" + }, + "receive": { + "type": "boolean", + "title": "Receive" + }, + "ztp_vlan": { + "type": "integer", + "description": "ZTP vlan number", + "title": "ZTP VLAN" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "LLDP" + }, + "trunk_private_vlan_secondary": { + "type": "boolean", + "title": "Trunk Private VLAN Secondary" + }, + "pvlan_mapping": { + "type": "string", + "description": "List of vlans as string", + "title": "PVLAN Mapping" + }, + "vlan_translations": { + "type": "array", + "items": { + "type": "object", + "properties": { + "from": { + "type": "string", + "description": "List of vlans as string (only one vlan if direction is \"both\")", + "title": "From" + }, + "to": { + "type": "integer", + "description": "VLAN ID", + "title": "To" + }, + "direction": { + "type": "string", + "enum": [ + "in", + "out", + "both" + ], + "default": "both", + "title": "Direction" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "VLAN Translations" + }, + "dot1x": { + "type": "object", + "properties": { + "port_control": { + "type": "string", + "enum": [ + "auto", + "force-authorized", + "force-unauthorized" + ], + "title": "Port Control" + }, + "port_control_force_authorized_phone": { + "type": "boolean", + "title": "Port Control Force Authorized Phone" + }, + "reauthentication": { + "type": "boolean", + "title": "Reauthentication" + }, + "pae": { + "type": "object", + "properties": { + "mode": { + "type": "string", + "enum": [ + "authenticator" + ], + "title": "Mode" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "PAE" + }, + "authentication_failure": { + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "drop" + ], + "title": "Action" + }, + "allow_vlan": { + "type": "integer", + "minimum": 1, + "maximum": 4094, + "title": "Allow VLAN" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Authentication Failure" + }, + "host_mode": { + "type": "object", + "properties": { + "mode": { + "type": "string", + "enum": [ + "multi-host", + "single-host" + ], + "title": "Mode" + }, + "multi_host_authenticated": { + "type": "boolean", + "title": "Multi Host Authenticated" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Host Mode" + }, + "mac_based_authentication": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "always": { + "type": "boolean", + "title": "Always" + }, + "host_mode_common": { + "type": "boolean", + "title": "Host Mode Common" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "MAC Based Authentication" + }, + "timeout": { + "type": "object", + "properties": { + "idle_host": { + "type": "integer", + "minimum": 10, + "maximum": 65535, + "title": "Idle Host" + }, + "quiet_period": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "title": "Quiet Period" + }, + "reauth_period": { + "type": "string", + "description": "Value can be 60-4294967295 or 'server'", + "title": "Reauth Period" + }, + "reauth_timeout_ignore": { + "type": "boolean", + "title": "Reauth Timeout Ignore" + }, + "tx_period": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "title": "TX Period" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Timeout" + }, + "reauthorization_request_limit": { + "type": "integer", + "minimum": 1, + "maximum": 10, + "title": "Reauthorization Request Limit" + }, + "unauthorized": { + "type": "object", + "properties": { + "access_vlan_membership_egress": { + "type": "boolean", + "title": "Access VLAN Membership Egress" + }, + "native_vlan_membership_egress": { + "type": "boolean", + "title": "Native VLAN Membership Egress" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Unauthorized" + }, + "eapol": { + "type": "object", + "properties": { + "disabled": { + "type": "boolean", + "title": "Disabled" + }, + "authentication_failure_fallback_mba": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "timeout": { + "type": "integer", + "minimum": 0, + "maximum": 65535, + "title": "Timeout" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Authentication Failure Fallback Mba" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Eapol" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "dot1x" + }, + "service_profile": { + "type": "string", + "description": "QOS profile", + "title": "Service Profile" + }, + "shape": { + "type": "object", + "properties": { + "rate": { + "type": "string", + "description": "Rate in kbps, pps or percent\nSupported options are platform dependent\nExamples:\n- \"5000 kbps\"\n- \"1000 pps\"\n- \"20 percent\"\n", + "title": "Rate" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Shape" + }, + "qos": { + "type": "object", + "properties": { + "trust": { + "type": "string", + "enum": [ + "dscp", + "cos", + "disabled" + ], + "title": "Trust" + }, + "dscp": { + "type": "integer", + "description": "DSCP value", + "title": "DSCP" + }, + "cos": { + "type": "integer", + "description": "COS value", + "title": "COS" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "QOS" + }, + "spanning_tree_bpdufilter": { + "type": "string", + "enum": [ + "enabled", + "disabled", + "True", + "False", + "true", + "false" + ], + "title": "Spanning Tree Bpdufilter" }, - "nodes_child_interfaces": { - "type": "array", - "items": { - "type": "object", - "properties": { - "node": { - "type": "string", - "title": "Node" - }, - "interfaces": { - "type": "array", - "description": "List of node interfaces. Ex.- [ 'node1 interface1', 'node1 interface2' ].", - "items": { - "type": "string" + "spanning_tree_bpduguard": { + "type": "string", + "enum": [ + "enabled", + "disabled", + "True", + "False", + "true", + "false" + ], + "title": "Spanning Tree Bpduguard" + }, + "spanning_tree_guard": { + "type": "string", + "enum": [ + "loop", + "root", + "disabled" + ], + "title": "Spanning Tree Guard" + }, + "spanning_tree_portfast": { + "type": "string", + "enum": [ + "edge", + "network" + ], + "title": "Spanning Tree Portfast" + }, + "vmtracer": { + "type": "boolean", + "title": "VMTracer" + }, + "priority_flow_control": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "priorities": { + "type": "array", + "items": { + "type": "object", + "properties": { + "priority": { + "type": "integer", + "minimum": 0, + "maximum": 7, + "title": "Priority" + }, + "no_drop": { + "type": "boolean", + "title": "No Drop" + } }, - "title": "Interfaces" - } + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "priority" + ] + }, + "title": "Priorities" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Priority Flow Control" + }, + "bfd": { + "type": "object", + "properties": { + "echo": { + "type": "boolean", + "title": "Echo" }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} + "interval": { + "type": "integer", + "description": "Interval in milliseconds", + "title": "Interval" }, - "required": [ - "node" - ] + "min_rx": { + "type": "integer", + "description": "Rate in milliseconds", + "title": "Min RX" + }, + "multiplier": { + "type": "integer", + "minimum": 3, + "maximum": 50, + "title": "Multiplier" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BFD" + }, + "service_policy": { + "type": "object", + "properties": { + "pbr": { + "type": "object", + "properties": { + "input": { + "type": "string", + "description": "Policy Based Routing Policy-map name", + "title": "Input" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "PBR" + }, + "qos": { + "type": "object", + "properties": { + "input": { + "type": "string", + "description": "Quality of Service Policy-map name", + "title": "Input" + } + }, + "required": [ + "input" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "QOS" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Service Policy" + }, + "mpls": { + "type": "object", + "properties": { + "ip": { + "type": "boolean", + "title": "IP" + }, + "ldp": { + "type": "object", + "properties": { + "interface": { + "type": "boolean", + "title": "Interface" + }, + "igp_sync": { + "type": "boolean", + "title": "IGP Sync" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "LDP" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "MPLS" + }, + "lacp_timer": { + "type": "object", + "properties": { + "mode": { + "type": "string", + "enum": [ + "fast", + "normal" + ], + "title": "Mode" + }, + "multiplier": { + "type": "integer", + "minimum": 3, + "maximum": 3000, + "title": "Multiplier" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "LACP Timer" + }, + "lacp_port_priority": { + "type": "integer", + "minimum": 0, + "maximum": 65535, + "title": "LACP Port Priority" + }, + "transceiver": { + "type": "object", + "properties": { + "media": { + "type": "object", + "properties": { + "override": { + "type": "string", + "description": "Transceiver type", + "title": "Override" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Media" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} }, - "title": "Nodes Child Interfaces" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Port Channel" - }, - "raw_eos_cli": { - "type": "string", - "description": "EOS CLI rendered directly on the point-to-point interface in the final EOS configuration.", - "title": "Raw EOS CLI" - }, - "structured_config": { - "type": "object", - "description": "Custom structured config for interfaces\nNote! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces.", - "title": "Structured Config" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "name" - ] - }, - "title": "P2P Links Profiles" - }, - "p2p_links": { - "type": "array", - "items": { - "type": "object", - "properties": { - "nodes": { - "type": "array", - "description": "Nodes where this link should be configured.", - "items": { - "type": "string", - "description": "The values can be < node_a >, < node_b >.\nex.- [ core-1-isis-sr-ldp, core-2-ospf-ldp ].\n" - }, - "title": "Nodes" - }, - "profile": { - "type": "string", - "description": "P2P profile name. Profile defined under p2p_profiles.", - "title": "Profile" - }, - "id": { - "type": "integer", - "description": "Unique id per subnet_summary. Used to calculate ip addresses.\nRequired with ip_pool. ID starting from 1.\n", - "title": "ID" - }, - "speed": { - "type": "string", - "description": "Speed should be set in the format `` or `forced ` or `auto `.", - "title": "Speed" - }, - "ip_pool": { - "type": "string", - "description": "P2P pool name. IP Pool defined under p2p_links_ip_pools. A /31 will be taken from the pool per P2P link.", - "title": "IP Pool" - }, - "subnet": { - "type": "string", - "description": "IPv4 address/Mask. Subnet used on this P2P link.", - "title": "Subnet" - }, - "ip": { - "type": "array", - "description": "Specific IP addresses used on this P2P link.", - "items": { - "type": "string", - "description": "Node IPv4 address/Mask." - }, - "title": "IP" - }, - "ipv6_enable": { - "type": "boolean", - "default": false, - "description": "Allows turning on ipv6 for the link or profile (also autodetected based on underlay_rfc5549 and include_in_underlay_protocol).", - "title": "IPv6 Enable" - }, - "interfaces": { - "type": "array", - "description": "Interfaces where this link should be configured and Required unless using port-channels.", - "items": { - "type": "string", - "description": "The value can be like < node_a_interface >, < node_b_interface >.\nex. - [ Ethernet2, Ethernet2 ].\n" - }, - "title": "Interfaces" - }, - "as": { - "type": "array", - "description": "AS numbers for BGP.\nRequired with bgp peering.\n", - "items": { - "type": "string", - "description": "The values can be like [\"node_a_as\", \"node_b_as\"]." - }, - "title": "As" - }, - "descriptions": { - "type": "array", - "description": "Interface description.", - "items": { - "type": "string" - }, - "title": "Descriptions" - }, - "include_in_underlay_protocol": { - "type": "boolean", - "default": true, - "description": "Add this interface to underlay routing protocol.", - "title": "Include In Underlay Protocol" - }, - "isis_hello_padding": { - "type": "boolean", - "default": false, - "title": "ISIS Hello Padding" - }, - "isis_metric": { - "type": "integer", - "title": "ISIS Metric" - }, - "isis_circuit_type": { - "type": "string", - "enum": [ - "level-1", - "level-2", - "level-1-2" - ], - "title": "ISIS Circuit Type" - }, - "isis_authentication_mode": { - "type": "string", - "enum": [ - "md5", - "text" - ], - "title": "ISIS Authentication Mode" - }, - "isis_authentication_key": { - "type": "string", - "description": "Type-7 encrypted password.", - "title": "ISIS Authentication Key" - }, - "mpls_ip": { - "type": "boolean", - "description": "MPLS parameters. Default value is true if switch.mpls_lsr is true.", - "title": "MPLS IP" - }, - "mpls_ldp": { - "type": "boolean", - "description": "MPLS parameters. Default value is true for ldp underlay variants, otherwise false.", - "title": "MPLS LDP" - }, - "mtu": { - "type": "integer", - "description": "MTU for this P2P link. Default value same as p2p_uplinks_mtu.", - "title": "MTU" - }, - "bfd": { - "type": "boolean", - "default": false, - "description": "Enable BFD (only considered for BGP).", - "title": "BFD" - }, - "ptp": { - "description": "PTP parameters.", - "type": "object", - "properties": { - "enabled": { + "title": "Transceiver" + }, + "ip_proxy_arp": { "type": "boolean", - "default": false, - "description": "Enable PTP.", - "title": "Enabled" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "PTP" - }, - "sflow": { - "type": "boolean", - "description": "Enable sFlow. Overrides `fabric_sflow` setting.", - "title": "Sflow" - }, - "qos_profile": { - "type": "string", - "description": "QOS service profile.", - "title": "QOS Profile" - }, - "macsec_profile": { - "type": "string", - "description": "MAC security profile.", - "title": "Macsec Profile" - }, - "port_channel": { - "description": "Port-channel parameters.", - "type": "object", - "properties": { - "mode": { + "title": "IP Proxy ARP" + }, + "traffic_policy": { + "type": "object", + "properties": { + "input": { + "type": "string", + "description": "Ingress traffic policy", + "title": "Input" + }, + "output": { + "type": "string", + "description": "Egress traffic policy", + "title": "Output" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Traffic Policy" + }, + "bgp": { + "type": "object", + "properties": { + "session_tracker": { + "type": "string", + "description": "Name of session tracker", + "title": "Session Tracker" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BGP" + }, + "peer": { + "type": "string", + "description": "Key only used for documentation or validation purposes", + "title": "Peer" + }, + "peer_interface": { + "type": "string", + "description": "Key only used for documentation or validation purposes", + "title": "Peer Interface" + }, + "peer_type": { + "type": "string", + "description": "Key only used for documentation or validation purposes", + "title": "Peer Type" + }, + "sflow": { + "type": "object", + "properties": { + "enable": { + "type": "boolean", + "title": "Enable" + }, + "egress": { + "type": "object", + "properties": { + "enable": { + "type": "boolean", + "title": "Enable" + }, + "unmodified_enable": { + "type": "boolean", + "title": "Unmodified Enable" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Egress" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Sflow" + }, + "port_profile": { "type": "string", - "default": "active", - "title": "Mode" + "description": "Key only used for documentation or validation purposes", + "title": "Port Profile" }, - "nodes_child_interfaces": { + "uc_tx_queues": { "type": "array", "items": { "type": "object", "properties": { - "node": { - "type": "string", - "title": "Node" + "id": { + "type": "integer", + "description": "TX-Queue ID", + "title": "ID" }, - "interfaces": { + "random_detect": { + "type": "object", + "properties": { + "ecn": { + "description": "Explicit Congestion Notification", + "type": "object", + "properties": { + "count": { + "type": "boolean", + "description": "Enable counter for random-detect ECNs", + "title": "Count" + }, + "threshold": { + "type": "object", + "properties": { + "units": { + "type": "string", + "enum": [ + "segments", + "bytes", + "kbytes", + "mbytes", + "milliseconds" + ], + "description": "Indicate the units to be used for the threshold values", + "title": "Units" + }, + "min": { + "type": "integer", + "minimum": 1, + "maximum": 256000000, + "description": "Set the random-detect ECN minimum-threshold", + "title": "Min" + }, + "max": { + "type": "integer", + "minimum": 1, + "maximum": 256000000, + "description": "Set the random-detect ECN maximum-threshold", + "title": "Max" + }, + "max_probability": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "description": "Set the random-detect ECN max-mark-probability", + "title": "Max Probability" + }, + "weight": { + "type": "integer", + "minimum": 0, + "maximum": 15, + "description": "Set the random-detect ECN weight", + "title": "Weight" + } + }, + "required": [ + "units", + "min", + "max" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Threshold" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Ecn" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Random Detect" + } + }, + "required": [ + "id" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Uc TX Queues" + }, + "tx_queues": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "TX-Queue ID", + "title": "ID" + }, + "random_detect": { + "type": "object", + "properties": { + "ecn": { + "description": "Explicit Congestion Notification", + "type": "object", + "properties": { + "count": { + "type": "boolean", + "description": "Enable counter for random-detect ECNs", + "title": "Count" + }, + "threshold": { + "type": "object", + "properties": { + "units": { + "type": "string", + "enum": [ + "segments", + "bytes", + "kbytes", + "mbytes", + "milliseconds" + ], + "description": "Indicate the units to be used for the threshold values", + "title": "Units" + }, + "min": { + "type": "integer", + "minimum": 1, + "maximum": 256000000, + "description": "Set the random-detect ECN minimum-threshold", + "title": "Min" + }, + "max": { + "type": "integer", + "minimum": 1, + "maximum": 256000000, + "description": "Set the random-detect ECN maximum-threshold", + "title": "Max" + }, + "max_probability": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "description": "Set the random-detect ECN max-mark-probability", + "title": "Max Probability" + }, + "weight": { + "type": "integer", + "minimum": 0, + "maximum": 15, + "description": "Set the random-detect ECN weight", + "title": "Weight" + } + }, + "required": [ + "units", + "max", + "max_probability" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Threshold" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Ecn" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Random Detect" + } + }, + "required": [ + "id" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "TX Queues" + }, + "vrrp_ids": { + "type": "array", + "description": "VRRP model.", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "VRID", + "title": "ID" + }, + "priority_level": { + "type": "integer", + "description": "Instance priority", + "minimum": 1, + "maximum": 254, + "title": "Priority Level" + }, + "advertisement": { + "type": "object", + "properties": { + "interval": { + "type": "integer", + "description": "Interval in seconds", + "minimum": 1, + "maximum": 255, + "title": "Interval" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Advertisement" + }, + "preempt": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "delay": { + "type": "object", + "properties": { + "minimum": { + "type": "integer", + "description": "Minimum preempt delay in seconds", + "minimum": 0, + "maximum": 3600, + "title": "Minimum" + }, + "reload": { + "type": "integer", + "description": "Reload preempt delay in seconds", + "minimum": 0, + "maximum": 3600, + "title": "Reload" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Delay" + } + }, + "required": [ + "enabled" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Preempt" + }, + "timers": { + "type": "object", + "properties": { + "delay": { + "type": "object", + "properties": { + "reload": { + "type": "integer", + "description": "Delay after reload in seconds.", + "minimum": 0, + "maximum": 3600, + "title": "Reload" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Delay" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Timers" + }, + "tracked_object": { "type": "array", - "description": "List of node interfaces. Ex.- [ 'node1 interface1', 'node1 interface2' ].", "items": { - "type": "string" + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Tracked object name", + "title": "Name" + }, + "decrement": { + "type": "integer", + "minimum": 1, + "maximum": 254, + "description": "Decrement VRRP priority by 1-254", + "title": "Decrement" + }, + "shutdown": { + "type": "boolean", + "title": "Shutdown" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] }, - "title": "Interfaces" + "title": "Tracked Object" + }, + "ipv4": { + "type": "object", + "properties": { + "address": { + "type": "string", + "description": "Virtual IPv4 address", + "title": "Address" + }, + "version": { + "type": "integer", + "enum": [ + 2, + 3 + ], + "title": "Version" + } + }, + "required": [ + "address" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv4" + }, + "ipv6": { + "type": "object", + "properties": { + "address": { + "type": "string", + "description": "Virtual IPv6 address", + "title": "Address" + } + }, + "required": [ + "address" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv6" } }, "additionalProperties": false, @@ -4181,38 +14821,30 @@ "^_.+$": {} }, "required": [ - "node" + "id" ] }, - "title": "Nodes Child Interfaces" + "title": "VRRP IDs" + }, + "eos_cli": { + "type": "string", + "description": "Multiline EOS CLI rendered directly on the ethernet interface in the final EOS configuration", + "title": "EOS CLI" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "Port Channel" - }, - "raw_eos_cli": { - "type": "string", - "description": "EOS CLI rendered directly on the point-to-point interface in the final EOS configuration.", - "title": "Raw EOS CLI" - }, - "structured_config": { - "type": "object", - "description": "Custom structured config for interfaces\nNote! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces.", "title": "Structured Config" } }, - "required": [ - "nodes" - ], "additionalProperties": false, "patternProperties": { "^_.+$": {} } }, - "title": "P2P Links" + "title": "L3 Interfaces" } }, "additionalProperties": false, diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/eos_designs.schema.yml b/ansible_collections/arista/avd/roles/eos_designs/schemas/eos_designs.schema.yml index a159982b05f..a48839f4e99 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/eos_designs.schema.yml +++ b/ansible_collections/arista/avd/roles/eos_designs/schemas/eos_designs.schema.yml @@ -3824,7 +3824,7 @@ $defs: keys: name: type: str - description: P2P profile name. Any variable supported under p2p_links + description: P2P profile name. Any variable supported under `p2p_links` can be inherited from a profile. p2p_links: type: list @@ -3838,6 +3838,84 @@ $defs: profile: type: str description: P2P profile name. Profile defined under p2p_profiles. + l3_interfaces_profiles: + type: list + convert_types: + - dict + primary_key: profile + $ref: eos_designs#/$defs/l3_edge_l3_interfaces + items: + type: dict + keys: + profile: + type: str + description: L3 interface profile name. Any variable supported under + `l3_interfaces` can be inherited from a profile. + l3_interfaces: + type: list + $ref: eos_designs#/$defs/l3_edge_l3_interfaces + items: + type: dict + keys: + node: + type: str + description: Device on which the interface should be configured. + profile: + type: str + description: L3 interface profile name. Profile defined under l3_interfaces_profiles. + l3_edge_l3_interfaces: + type: list + items: + type: dict + keys: + interface: + type: str + description: Ethernet interface name like 'Ethernet2'. + pattern: Ethernet[\d/]+ + description: + type: str + description: 'Interface description. + + If not set a default description will be configured with ''[[ ]]''' + ip: + type: str + description: Node IPv4 address/Mask or 'dhcp'. + dhcp_client_accept_default_route: + type: bool + default: false + description: 'Supported if `ip` is `dhcp`. + + Accepts default route from DHCP.' + enabled: + type: bool + default: true + description: Enable or Shutdown the interface. + speed: + type: str + description: Speed should be set in the format `` or `forced + ` or `auto `. + peer: + type: str + description: The peer device name. Used for description and documentation + peer_interface: + type: str + description: The peer device interface. Used for description and documentation + peer_ip: + type: str + description: The peer device IP. Used for description and documentation + qos_profile: + type: str + description: QOS service profile. + raw_eos_cli: + type: str + description: EOS CLI rendered directly on the interface in the final EOS + configuration. + structured_config: + type: dict + documentation_options: + hide_keys: true + description: Custom structured config for the Ethernet interface. + $ref: eos_cli_config_gen#/keys/ethernet_interfaces/items/ network_services: documentation_options: table: network-services-common-settings diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_l3_edge.schema.yml b/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_l3_edge.schema.yml index bee3dff06ce..ceffe9d8ebe 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_l3_edge.schema.yml +++ b/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_l3_edge.schema.yml @@ -43,7 +43,7 @@ $defs: keys: name: type: str - description: P2P profile name. Any variable supported under p2p_links can be inherited from a profile. + description: P2P profile name. Any variable supported under `p2p_links` can be inherited from a profile. p2p_links: type: list $ref: "eos_designs#/$defs/p2p_links" @@ -56,3 +56,27 @@ $defs: profile: type: str description: P2P profile name. Profile defined under p2p_profiles. + l3_interfaces_profiles: + type: list + convert_types: + - dict + primary_key: profile + $ref: "eos_designs#/$defs/l3_edge_l3_interfaces" + items: + type: dict + keys: + profile: + type: str + description: L3 interface profile name. Any variable supported under `l3_interfaces` can be inherited from a profile. + l3_interfaces: + type: list + $ref: "eos_designs#/$defs/l3_edge_l3_interfaces" + items: + type: dict + keys: + node: + type: str + description: Device on which the interface should be configured. + profile: + type: str + description: L3 interface profile name. Profile defined under l3_interfaces_profiles. diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_l3_edge_l3_interfaces.schema.yml b/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_l3_edge_l3_interfaces.schema.yml new file mode 100644 index 00000000000..b2bd48ea7ed --- /dev/null +++ b/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_l3_edge_l3_interfaces.schema.yml @@ -0,0 +1,64 @@ +# Copyright (c) 2023 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 +$defs: + l3_edge_l3_interfaces: + type: list + items: + type: dict + keys: + interface: + type: str + description: Ethernet interface name like 'Ethernet2'. + pattern: "Ethernet[\\d/]+" + description: + type: str + description: |- + Interface description. + If not set a default description will be configured with '[[ ]]' + ip: + type: str + description: Node IPv4 address/Mask or 'dhcp'. + dhcp_client_accept_default_route: + type: bool + default: False + description: |- + Supported if `ip` is `dhcp`. + Accepts default route from DHCP. + enabled: + type: bool + default: True + description: Enable or Shutdown the interface. + speed: + type: str + description: |- + Speed should be set in the format `` or `forced ` or `auto `. + peer: + type: str + description: |- + The peer device name. Used for description and documentation + peer_interface: + type: str + description: |- + The peer device interface. Used for description and documentation + peer_ip: + type: str + description: |- + The peer device IP. Used for description and documentation + qos_profile: + type: str + description: QOS service profile. + raw_eos_cli: + type: str + description: EOS CLI rendered directly on the interface in the final EOS configuration. + structured_config: + type: dict + documentation_options: + hide_keys: true + description: |- + Custom structured config for the Ethernet interface. + $ref: "eos_cli_config_gen#/keys/ethernet_interfaces/items/"