diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/host1.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/host1.md index 093907ebd10..728b9e0be8f 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/host1.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/host1.md @@ -4758,6 +4758,49 @@ interface Ethernet81/2 interface Ethernet81/10 description isis_port_channel_member channel-group 110 mode active +! +interface Ethernet82 + description Switchport_tap_tool + switchport tap native vlan 10 + switchport tap identity 3 inner 5 + switchport tap mac-address dest 01:00:00:00:00:00 src 01:23:45:67:89:ab + switchport tap encapsulation gre destination 1.1.1.1 source 1.1.1.2 protocol 0x0 strip + switchport tap encapsulation gre destination 1.1.1.1 source 1.1.1.2 strip + switchport tap encapsulation gre destination 2.1.1.2 protocol 0x10 strip + switchport tap encapsulation gre destination 2.1.1.2 protocol 0x11 feature header length 2 strip re-encapsulation ethernet + switchport tap encapsulation gre destination 2.1.1.2 protocol 0x12 strip re-encapsulation ethernet + switchport tap encapsulation gre destination 2.1.1.3 source 2.1.1.4 strip + switchport tap mpls pop all + switchport tool mpls pop all + switchport tool encapsulation vn-tag strip + switchport tool encapsulation dot1br strip + switchport tap allowed vlan 25 + switchport tool allowed vlan 23 + switchport tool identity qinq + switchport tool identity dot1q source dzgre port + switchport tap truncation 150 + switchport tap default group g1 group g2 group g3 + switchport tap default nexthop-group nexthop_g1 nexthop_g2 nexthop_g3 + switchport tap default interface ethernet4 + switchport tap default interface port-channel10 + switchport tool group set group1 group2 group3 + switchport tool dot1q remove outer 1 +! +interface Ethernet83 + description Test_tap_tool + switchport tap identity 5 + switchport tap mac-address dest 01:00:00:00:00:00 + switchport tap encapsulation vxlan strip + switchport tap encapsulation gre strip + switchport tool identity dot1q + switchport tool identity qinq source dzgre policy inner port + switchport tap truncation +! +interface Ethernet84 + switchport tap encapsulation gre protocol 0x1 strip + switchport tap encapsulation gre protocol 0x2 feature header length 3 strip + switchport tap encapsulation gre protocol 0x3 feature header length 2 strip re-encapsulation ethernet + switchport tap encapsulation gre protocol 0x4 strip re-encapsulation ethernet ``` ### Port-Channel Interfaces @@ -5111,7 +5154,7 @@ interface Port-Channel16 isis authentication mode md5 isis authentication key 0 spanning-tree guard none - switchport backup-link Port-Channel100.102 prefer vlan 20 + switchport backup-link Port-Channel100 prefer vlan 20 ! interface Port-Channel17 description PBR Description @@ -5502,6 +5545,47 @@ interface Port-Channel131.10 interface Port-Channel132 profile test-interface-profile description Test_port-channel_interface-profile +! +interface Port-Channel133 + description Test1_switchport_tap_tool + switchport tap native vlan 10 + switchport tap identity 3 + switchport tap mac-address dest 01:00:00:00:00:00 src 01:23:45:67:89:ab + switchport tap encapsulation gre destination 1.1.1.1 source 1.1.1.2 protocol 0x0 strip + switchport tap encapsulation gre destination 1.1.1.1 source 1.1.1.2 strip + switchport tap encapsulation gre destination 1.1.1.3 source 1.1.1.4 strip + switchport tap encapsulation gre destination 2.1.1.2 protocol 0x1 strip + switchport tap encapsulation gre destination 2.1.1.2 protocol 0x2 feature header length 2 strip re-encapsulation ethernet + switchport tap mpls pop all + switchport tool mpls pop all + switchport tool encapsulation vn-tag strip + switchport tool encapsulation dot1br strip + switchport tap allowed vlan 25 + switchport tool allowed vlan 23 + switchport tool identity qinq + switchport tool identity qinq source dzgre port inner policy + switchport tap truncation + switchport tap default group g1 group g2 group g3 + switchport tap default nexthop-group nexthop_g1 nexthop_g2 nexthop_g3 + switchport tap default interface ethernet4 + switchport tap default interface port-channel10 + switchport tool group set group1 group2 group3 + switchport tool dot1q remove outer 1-2 +! +interface Port-Channel134 + description Test2_switchport_tap_tool + switchport tap identity 3 inner 10 + switchport tap mac-address dest 01:00:00:00:00:00 + switchport tap encapsulation vxlan strip + switchport tap encapsulation gre strip + switchport tool identity dot1q + switchport tool identity dot1q source dzgre policy + switchport tap truncation 120 +! +interface Port-Channel135 + switchport tap encapsulation gre protocol 0x2 feature header length 3 strip + switchport tap encapsulation gre protocol 0x3 feature header length 2 strip re-encapsulation ethernet + switchport tap encapsulation gre protocol 0x10 strip ``` ### Loopback Interfaces diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/host1.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/host1.cfg index 1bccdbcf856..60c6848eda4 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/host1.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/host1.cfg @@ -1783,7 +1783,7 @@ interface Port-Channel16 isis authentication mode md5 isis authentication key 0 password spanning-tree guard none - switchport backup-link Port-Channel100.102 prefer vlan 20 + switchport backup-link Port-Channel100 prefer vlan 20 ! interface Port-Channel17 description PBR Description @@ -2175,6 +2175,47 @@ interface Port-Channel132 profile test-interface-profile description Test_port-channel_interface-profile ! +interface Port-Channel133 + description Test1_switchport_tap_tool + switchport tap native vlan 10 + switchport tap identity 3 + switchport tap mac-address dest 01:00:00:00:00:00 src 01:23:45:67:89:ab + switchport tap encapsulation gre destination 1.1.1.1 source 1.1.1.2 protocol 0x0 strip + switchport tap encapsulation gre destination 1.1.1.1 source 1.1.1.2 strip + switchport tap encapsulation gre destination 1.1.1.3 source 1.1.1.4 strip + switchport tap encapsulation gre destination 2.1.1.2 protocol 0x1 strip + switchport tap encapsulation gre destination 2.1.1.2 protocol 0x2 feature header length 2 strip re-encapsulation ethernet + switchport tap mpls pop all + switchport tool mpls pop all + switchport tool encapsulation vn-tag strip + switchport tool encapsulation dot1br strip + switchport tap allowed vlan 25 + switchport tool allowed vlan 23 + switchport tool identity qinq + switchport tool identity qinq source dzgre port inner policy + switchport tap truncation + switchport tap default group g1 group g2 group g3 + switchport tap default nexthop-group nexthop_g1 nexthop_g2 nexthop_g3 + switchport tap default interface ethernet4 + switchport tap default interface port-channel10 + switchport tool group set group1 group2 group3 + switchport tool dot1q remove outer 1-2 +! +interface Port-Channel134 + description Test2_switchport_tap_tool + switchport tap identity 3 inner 10 + switchport tap mac-address dest 01:00:00:00:00:00 + switchport tap encapsulation vxlan strip + switchport tap encapsulation gre strip + switchport tool identity dot1q + switchport tool identity dot1q source dzgre policy + switchport tap truncation 120 +! +interface Port-Channel135 + switchport tap encapsulation gre protocol 0x2 feature header length 3 strip + switchport tap encapsulation gre protocol 0x3 feature header length 2 strip re-encapsulation ethernet + switchport tap encapsulation gre protocol 0x10 strip +! interface Dps1 description Test DPS Interface shutdown @@ -3155,6 +3196,49 @@ interface Ethernet81/10 description isis_port_channel_member channel-group 110 mode active ! +interface Ethernet82 + description Switchport_tap_tool + switchport tap native vlan 10 + switchport tap identity 3 inner 5 + switchport tap mac-address dest 01:00:00:00:00:00 src 01:23:45:67:89:ab + switchport tap encapsulation gre destination 1.1.1.1 source 1.1.1.2 protocol 0x0 strip + switchport tap encapsulation gre destination 1.1.1.1 source 1.1.1.2 strip + switchport tap encapsulation gre destination 2.1.1.2 protocol 0x10 strip + switchport tap encapsulation gre destination 2.1.1.2 protocol 0x11 feature header length 2 strip re-encapsulation ethernet + switchport tap encapsulation gre destination 2.1.1.2 protocol 0x12 strip re-encapsulation ethernet + switchport tap encapsulation gre destination 2.1.1.3 source 2.1.1.4 strip + switchport tap mpls pop all + switchport tool mpls pop all + switchport tool encapsulation vn-tag strip + switchport tool encapsulation dot1br strip + switchport tap allowed vlan 25 + switchport tool allowed vlan 23 + switchport tool identity qinq + switchport tool identity dot1q source dzgre port + switchport tap truncation 150 + switchport tap default group g1 group g2 group g3 + switchport tap default nexthop-group nexthop_g1 nexthop_g2 nexthop_g3 + switchport tap default interface ethernet4 + switchport tap default interface port-channel10 + switchport tool group set group1 group2 group3 + switchport tool dot1q remove outer 1 +! +interface Ethernet83 + description Test_tap_tool + switchport tap identity 5 + switchport tap mac-address dest 01:00:00:00:00:00 + switchport tap encapsulation vxlan strip + switchport tap encapsulation gre strip + switchport tool identity dot1q + switchport tool identity qinq source dzgre policy inner port + switchport tap truncation +! +interface Ethernet84 + switchport tap encapsulation gre protocol 0x1 strip + switchport tap encapsulation gre protocol 0x2 feature header length 3 strip + switchport tap encapsulation gre protocol 0x3 feature header length 2 strip re-encapsulation ethernet + switchport tap encapsulation gre protocol 0x4 strip re-encapsulation ethernet +! interface Loopback0 description EVPN_Overlay_Peering ip address 192.168.255.3/32 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/host1/ethernet-interfaces.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/host1/ethernet-interfaces.yml index ea1e1d17356..b6c5faea864 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/host1/ethernet-interfaces.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/host1/ethernet-interfaces.yml @@ -1656,6 +1656,7 @@ ethernet_interfaces: inner_vlan: 11 network: encapsulation: client inner + - name: Ethernet70 description: dot1x_aaa_unresponsive shutdown: false @@ -1674,6 +1675,7 @@ ethernet_interfaces: traffic_allow: true apply_alternate: true mac_based_access_list: true + - name: Ethernet71 description: dot1x_aaa_unresponsive1 shutdown: false @@ -1690,6 +1692,7 @@ ethernet_interfaces: time_duration: 10 time_duration_unit: hours mac_based_access_list: true + - name: Ethernet72 description: dot1x_aaa_unresponsive2 shutdown: false @@ -1845,3 +1848,107 @@ ethernet_interfaces: spanning_tree_portfast: edge lldp: ztp_vlan: 112 + + - name: Ethernet82 + description: Switchport_tap_tool + switchport: + tap: + allowed_vlan: 25 + default: + groups: + - g2 + - g1 + - g3 + nexthop_groups: + - nexthop_g1 + - nexthop_g3 + - nexthop_g2 + interfaces: + - port-channel10 + - ethernet4 + identity: + id: 3 + inner_vlan: 5 + mpls_pop_all: true + native_vlan: 10 + truncation: + enabled: true + size: 150 + mac_address: + destination: 01:00:00:00:00:00 + source: 01:23:45:67:89:ab + encapsulation: + gre: + destinations: + - destination: 1.1.1.1 + source: 1.1.1.2 + protocols: + - protocol: "0x0" + strip: true + strip: true + - destination: 2.1.1.2 + protocols: + - protocol: "0x10" + strip: true + - protocol: "0x11" + feature_header_length: 2 + re_encapsulation_ethernet_header: true + strip: true + - protocol: "0x12" + re_encapsulation_ethernet_header: true + strip: true + - destination: 2.1.1.3 + source: 2.1.1.4 + strip: true + tool: + mpls_pop_all: true + encapsulation: + dot1br_strip: true + vn_tag_strip: true + allowed_vlan: 23 + identity: + tag: qinq + dot1q_dzgre_source: port + groups: + - group1 + - group2 + - group3 + dot1q_remove_outer_vlan_tag: 1 + + - name: Ethernet83 + description: Test_tap_tool + switchport: + tap: + identity: + id: 5 + mac_address: + destination: 01:00:00:00:00:00 + encapsulation: + vxlan_strip: true + gre: + strip: true + truncation: + enabled: true + tool: + identity: + tag: dot1q + qinq_dzgre_source: policy inner port + + - name: Ethernet84 + switchport: + tap: + encapsulation: + gre: + protocols: + - protocol: "0x1" + strip: true + - protocol: "0x2" + feature_header_length: 3 + strip: true + - protocol: "0x3" + feature_header_length: 2 + re_encapsulation_ethernet_header: true + strip: true + - protocol: "0x4" + re_encapsulation_ethernet_header: true + strip: true diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/host1/port-channel-interfaces.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/host1/port-channel-interfaces.yml index f0e20267983..16709ce88ce 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/host1/port-channel-interfaces.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/host1/port-channel-interfaces.yml @@ -141,7 +141,7 @@ port_channel_interfaces: - from: 23 dot1q_tunnel_to: 22 backup_link: - interface: Port-Channel100.102 + interface: Port-Channel100 prefer_vlan: 20 - name: Port-Channel3 @@ -947,3 +947,102 @@ port_channel_interfaces: - name: Port-Channel132 description: Test_port-channel_interface-profile profile: test-interface-profile + + - name: Port-Channel133 + description: Test1_switchport_tap_tool + switchport: + tap: + allowed_vlan: 25 + default: + groups: + - g2 + - g1 + - g3 + nexthop_groups: + - nexthop_g1 + - nexthop_g3 + - nexthop_g2 + interfaces: + - port-channel10 + - ethernet4 + identity: + id: 3 + mpls_pop_all: true + native_vlan: 10 + truncation: + enabled: true + mac_address: + destination: 01:00:00:00:00:00 + source: 01:23:45:67:89:ab + encapsulation: + gre: + destinations: + - destination: 1.1.1.1 + source: 1.1.1.2 + protocols: + # the protocol value must be enclosed in quotes + - protocol: "0x0" + strip: true + strip: true + - destination: 2.1.1.2 + protocols: + - protocol: "0x1" + strip: true + - protocol: "0x2" + feature_header_length: 2 + re_encapsulation_ethernet_header: true + strip: true + - destination: 1.1.1.3 + source: 1.1.1.4 + strip: true + tool: + mpls_pop_all: true + encapsulation: + dot1br_strip: true + vn_tag_strip: true + allowed_vlan: 23 + identity: + tag: qinq + qinq_dzgre_source: port inner policy + groups: + - group1 + - group2 + - group3 + dot1q_remove_outer_vlan_tag: 1-2 + + - name: Port-Channel134 + description: Test2_switchport_tap_tool + switchport: + tap: + identity: + id: 3 + inner_vlan: 10 + mac_address: + destination: 01:00:00:00:00:00 + encapsulation: + vxlan_strip: true + gre: + strip: true + truncation: + enabled: true + size: 120 + tool: + identity: + tag: dot1q + dot1q_dzgre_source: policy + + - name: Port-Channel135 + switchport: + tap: + encapsulation: + gre: + protocols: + - protocol: "0x10" + strip: true + - protocol: "0x2" + feature_header_length: 3 + strip: true + - protocol: "0x3" + feature_header_length: 2 + re_encapsulation_ethernet_header: true + strip: true diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ethernet-interfaces.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ethernet-interfaces.md index 1c560ba600c..2222322c542 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ethernet-interfaces.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ethernet-interfaces.md @@ -548,6 +548,57 @@ | [        vlans](## "ethernet_interfaces.[].switchport.port_security.vlans") | List, items: Dictionary | | | | | | [          - range](## "ethernet_interfaces.[].switchport.port_security.vlans.[].range") | String | Required, Unique | | | VLAN ID or range(s) of VLAN IDs, <1-4094>.
Example:
- 3
- 1,3
- 1-10
| | [            mac_address_maximum](## "ethernet_interfaces.[].switchport.port_security.vlans.[].mac_address_maximum") | Integer | Required | | | | + | [      tap](## "ethernet_interfaces.[].switchport.tap") | Dictionary | | | | In tap mode, the interface operates as a tap port.
Tap ports receive traffic for replication on one or more tool ports.
This setting applies only to parent interfaces. | + | [        allowed_vlan](## "ethernet_interfaces.[].switchport.tap.allowed_vlan") | String | | | | VLAN ID or range(s) of VLAN IDs within range 1-4094. | + | [        default](## "ethernet_interfaces.[].switchport.tap.default") | Dictionary | | | | Default tap destination config. | + | [          groups](## "ethernet_interfaces.[].switchport.tap.default.groups") | List, items: String | | | | Tap group names for the interface. | + | [            - <str>](## "ethernet_interfaces.[].switchport.tap.default.groups.[]") | String | | | | | + | [          interfaces](## "ethernet_interfaces.[].switchport.tap.default.interfaces") | List, items: String | | | | Interfaces like - Ethernet1, InternalRecirc1, Port-Channel1, Recirc-Channel1. | + | [            - <str>](## "ethernet_interfaces.[].switchport.tap.default.interfaces.[]") | String | | | | | + | [          nexthop_groups](## "ethernet_interfaces.[].switchport.tap.default.nexthop_groups") | List, items: String | | | | Default nexthop-group names. | + | [            - <str>](## "ethernet_interfaces.[].switchport.tap.default.nexthop_groups.[]") | String | | | | | + | [        identity](## "ethernet_interfaces.[].switchport.tap.identity") | Dictionary | | | | | + | [          id](## "ethernet_interfaces.[].switchport.tap.identity.id") | Integer | | | Min: 1
Max: 65535 | Tap port VLAN ID (1-4094) or DzGRE extended ID (1-65535). | + | [          inner_vlan](## "ethernet_interfaces.[].switchport.tap.identity.inner_vlan") | Integer | | | Min: 1
Max: 4094 | Tap port inner VLAN ID. Only applicable if `id` is a VLAN ID (1-4094). | + | [        mpls_pop_all](## "ethernet_interfaces.[].switchport.tap.mpls_pop_all") | Boolean | | | | Pop all MPLS labels. | + | [        native_vlan](## "ethernet_interfaces.[].switchport.tap.native_vlan") | Integer | | | Min: 1
Max: 4094 | Native VLAN ID when interface is in tap mode. | + | [        truncation](## "ethernet_interfaces.[].switchport.tap.truncation") | Dictionary | | | | | + | [          enabled](## "ethernet_interfaces.[].switchport.tap.truncation.enabled") | Boolean | | | | | + | [          size](## "ethernet_interfaces.[].switchport.tap.truncation.size") | Integer | | | Min: 100
Max: 9236 | Ingress packet truncation size in bytes. | + | [        mac_address](## "ethernet_interfaces.[].switchport.tap.mac_address") | Dictionary | | | | | + | [          source](## "ethernet_interfaces.[].switchport.tap.mac_address.source") | String | | | Pattern: `^([0-9a-f]{2}:){5}[0-9a-f]{2}$` | MAC address for the source. | + | [          destination](## "ethernet_interfaces.[].switchport.tap.mac_address.destination") | String | | | Pattern: `^([0-9a-f]{2}:){5}[0-9a-f]{2}$` | MAC address for the destination. | + | [        encapsulation](## "ethernet_interfaces.[].switchport.tap.encapsulation") | Dictionary | | | | | + | [          vxlan_strip](## "ethernet_interfaces.[].switchport.tap.encapsulation.vxlan_strip") | Boolean | | | | Strip VXLAN encapsulation header.
`encapsulation.vxlan_strip` and `mpls_pop_all` are mutually exclusive.
`mpls_pop_all` takes precedence. | + | [          gre](## "ethernet_interfaces.[].switchport.tap.encapsulation.gre") | Dictionary | | | | | + | [            strip](## "ethernet_interfaces.[].switchport.tap.encapsulation.gre.strip") | Boolean | | | | Strip GRE encapsulation header for all GRE tunnels. | + | [            protocols](## "ethernet_interfaces.[].switchport.tap.encapsulation.gre.protocols") | List, items: Dictionary | | | | Protocols for all destinations; destination-specific protocols should be set under the `destinations[].protocols` key. | + | [              - protocol](## "ethernet_interfaces.[].switchport.tap.encapsulation.gre.protocols.[].protocol") | String | Required, Unique | | | Protocol type in GRE header.
Valid range: 0x0-0xFFFF. The value must be enclosed in quotes, e.g., "0x0". | + | [                strip](## "ethernet_interfaces.[].switchport.tap.encapsulation.gre.protocols.[].strip") | Boolean | | | | This is a required key to strip GRE encapsulation header with protocols. | + | [                feature_header_length](## "ethernet_interfaces.[].switchport.tap.encapsulation.gre.protocols.[].feature_header_length") | Integer | | | Min: 1
Max: 16 | Feature header length in bytes.
Note: This setting does not appear in the EOS running-config for protocol 0x0. | + | [                re_encapsulation_ethernet_header](## "ethernet_interfaces.[].switchport.tap.encapsulation.gre.protocols.[].re_encapsulation_ethernet_header") | Boolean | | | | Extra ethernet header to prepend to the terminated packet.
Note: This setting does not appear in the EOS running-config for protocol 0x0. | + | [            destinations](## "ethernet_interfaces.[].switchport.tap.encapsulation.gre.destinations") | List, items: Dictionary | | | | In EOS, `gre.strip` and `destinations.destination/source.strip` (without defining protocols) are mutually exclusive. | + | [              - destination](## "ethernet_interfaces.[].switchport.tap.encapsulation.gre.destinations.[].destination") | String | Required, Unique | | | Destination IP address of tunnel packets. | + | [                source](## "ethernet_interfaces.[].switchport.tap.encapsulation.gre.destinations.[].source") | String | | | | Source IP address of tunnel packets. Applied only when destination is defined. When not defined; any GRE packet that matches the `destination` is terminated. | + | [                strip](## "ethernet_interfaces.[].switchport.tap.encapsulation.gre.destinations.[].strip") | Boolean | | | | Strip GRE encapsulation header for specific destination. | + | [                protocols](## "ethernet_interfaces.[].switchport.tap.encapsulation.gre.destinations.[].protocols") | List, items: Dictionary | | | | | + | [                  - protocol](## "ethernet_interfaces.[].switchport.tap.encapsulation.gre.destinations.[].protocols.[].protocol") | String | Required, Unique | | | Protocol type in GRE header.
Valid range: 0x0-0xFFFF. The value must be enclosed in quotes, e.g., "0x0". | + | [                    strip](## "ethernet_interfaces.[].switchport.tap.encapsulation.gre.destinations.[].protocols.[].strip") | Boolean | | | | This is a required key to strip GRE encapsulation header for specific destination with protocols. | + | [                    feature_header_length](## "ethernet_interfaces.[].switchport.tap.encapsulation.gre.destinations.[].protocols.[].feature_header_length") | Integer | | | Min: 1
Max: 16 | Feature header length in bytes.
Note: This setting does not appear in the EOS running-config for protocol 0x0. | + | [                    re_encapsulation_ethernet_header](## "ethernet_interfaces.[].switchport.tap.encapsulation.gre.destinations.[].protocols.[].re_encapsulation_ethernet_header") | Boolean | | | | Extra ethernet header to prepend to the terminated packet.
Note: This setting does not appear in the EOS running-config for protocol 0x0. | + | [      tool](## "ethernet_interfaces.[].switchport.tool") | Dictionary | | | | In tool mode, the interface operates as a tool port.
Tool ports replicate traffic received by tap ports.
This setting applies only to parent interfaces. | + | [        mpls_pop_all](## "ethernet_interfaces.[].switchport.tool.mpls_pop_all") | Boolean | | | | Pop all MPLS labels. | + | [        encapsulation](## "ethernet_interfaces.[].switchport.tool.encapsulation") | Dictionary | | | | | + | [          dot1br_strip](## "ethernet_interfaces.[].switchport.tool.encapsulation.dot1br_strip") | Boolean | | | | Remove a 802.1 BR tag in packet header. 'mpls_pop_all' takes precedence over 'dot1br_strip' in EOS. | + | [          vn_tag_strip](## "ethernet_interfaces.[].switchport.tool.encapsulation.vn_tag_strip") | Boolean | | | | Remove a VN-tag in packet header. 'mpls_pop_all' takes precedence over 'vn_tag_strip' in EOS. | + | [        allowed_vlan](## "ethernet_interfaces.[].switchport.tool.allowed_vlan") | String | | | | VLAN ID or range of VLAN IDs within range 1-4094. | + | [        identity](## "ethernet_interfaces.[].switchport.tool.identity") | Dictionary | | | | | + | [          tag](## "ethernet_interfaces.[].switchport.tool.identity.tag") | String | | | Valid Values:
- dot1q
- qinq | | + | [          dot1q_dzgre_source](## "ethernet_interfaces.[].switchport.tool.identity.dot1q_dzgre_source") | String | | | Valid Values:
- policy
- port | | + | [          qinq_dzgre_source](## "ethernet_interfaces.[].switchport.tool.identity.qinq_dzgre_source") | String | | | Valid Values:
- policy inner port
- port inner policy | | + | [        groups](## "ethernet_interfaces.[].switchport.tool.groups") | List, items: String | | | | Tool groups for the interface. | + | [          - <str>](## "ethernet_interfaces.[].switchport.tool.groups.[]") | String | | | | | + | [        dot1q_remove_outer_vlan_tag](## "ethernet_interfaces.[].switchport.tool.dot1q_remove_outer_vlan_tag") | String | | | | Indices of vlan tags to be removed.
Range: 1-2 | | [    eos_cli](## "ethernet_interfaces.[].eos_cli") | String | | | | Multiline EOS CLI rendered directly on the ethernet interface in the final EOS configuration. | === "YAML" @@ -1729,6 +1780,140 @@ - range: mac_address_maximum: + # In tap mode, the interface operates as a tap port. + # Tap ports receive traffic for replication on one or more tool ports. + # This setting applies only to parent interfaces. + tap: + + # VLAN ID or range(s) of VLAN IDs within range 1-4094. + allowed_vlan: + + # Default tap destination config. + default: + + # Tap group names for the interface. + groups: + - + + # Interfaces like - Ethernet1, InternalRecirc1, Port-Channel1, Recirc-Channel1. + interfaces: + - + + # Default nexthop-group names. + nexthop_groups: + - + identity: + + # Tap port VLAN ID (1-4094) or DzGRE extended ID (1-65535). + id: + + # Tap port inner VLAN ID. Only applicable if `id` is a VLAN ID (1-4094). + inner_vlan: + + # Pop all MPLS labels. + mpls_pop_all: + + # Native VLAN ID when interface is in tap mode. + native_vlan: + truncation: + enabled: + + # Ingress packet truncation size in bytes. + size: + mac_address: + + # MAC address for the source. + source: + + # MAC address for the destination. + destination: + encapsulation: + + # Strip VXLAN encapsulation header. + # `encapsulation.vxlan_strip` and `mpls_pop_all` are mutually exclusive. + # `mpls_pop_all` takes precedence. + vxlan_strip: + gre: + + # Strip GRE encapsulation header for all GRE tunnels. + strip: + + # Protocols for all destinations; destination-specific protocols should be set under the `destinations[].protocols` key. + protocols: + + # Protocol type in GRE header. + # Valid range: 0x0-0xFFFF. The value must be enclosed in quotes, e.g., "0x0". + - protocol: + + # This is a required key to strip GRE encapsulation header with protocols. + strip: + + # Feature header length in bytes. + # Note: This setting does not appear in the EOS running-config for protocol 0x0. + feature_header_length: + + # Extra ethernet header to prepend to the terminated packet. + # Note: This setting does not appear in the EOS running-config for protocol 0x0. + re_encapsulation_ethernet_header: + + # In EOS, `gre.strip` and `destinations.destination/source.strip` (without defining protocols) are mutually exclusive. + destinations: + + # Destination IP address of tunnel packets. + - destination: + + # Source IP address of tunnel packets. Applied only when destination is defined. When not defined; any GRE packet that matches the `destination` is terminated. + source: + + # Strip GRE encapsulation header for specific destination. + strip: + protocols: + + # Protocol type in GRE header. + # Valid range: 0x0-0xFFFF. The value must be enclosed in quotes, e.g., "0x0". + - protocol: + + # This is a required key to strip GRE encapsulation header for specific destination with protocols. + strip: + + # Feature header length in bytes. + # Note: This setting does not appear in the EOS running-config for protocol 0x0. + feature_header_length: + + # Extra ethernet header to prepend to the terminated packet. + # Note: This setting does not appear in the EOS running-config for protocol 0x0. + re_encapsulation_ethernet_header: + + # In tool mode, the interface operates as a tool port. + # Tool ports replicate traffic received by tap ports. + # This setting applies only to parent interfaces. + tool: + + # Pop all MPLS labels. + mpls_pop_all: + encapsulation: + + # Remove a 802.1 BR tag in packet header. 'mpls_pop_all' takes precedence over 'dot1br_strip' in EOS. + dot1br_strip: + + # Remove a VN-tag in packet header. 'mpls_pop_all' takes precedence over 'vn_tag_strip' in EOS. + vn_tag_strip: + + # VLAN ID or range of VLAN IDs within range 1-4094. + allowed_vlan: + identity: + tag: + dot1q_dzgre_source: + qinq_dzgre_source: + + # Tool groups for the interface. + groups: + - + + # Indices of vlan tags to be removed. + # Range: 1-2 + dot1q_remove_outer_vlan_tag: + # Multiline EOS CLI rendered directly on the ethernet interface in the final EOS configuration. eos_cli: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/port-channel-interfaces.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/port-channel-interfaces.md index 2966bf18859..91739aff4a7 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/port-channel-interfaces.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/port-channel-interfaces.md @@ -375,6 +375,57 @@ | [        vlans](## "port_channel_interfaces.[].switchport.port_security.vlans") | List, items: Dictionary | | | | | | [          - range](## "port_channel_interfaces.[].switchport.port_security.vlans.[].range") | String | Required, Unique | | | VLAN ID or range(s) of VLAN IDs, <1-4094>.
Example:
- 3
- 1,3
- 1-10
| | [            mac_address_maximum](## "port_channel_interfaces.[].switchport.port_security.vlans.[].mac_address_maximum") | Integer | | | | | + | [      tap](## "port_channel_interfaces.[].switchport.tap") | Dictionary | | | | In tap mode, the interface operates as a tap port.
Tap ports receive traffic for replication on one or more tool ports.
This setting applies only to parent interfaces. | + | [        allowed_vlan](## "port_channel_interfaces.[].switchport.tap.allowed_vlan") | String | | | | VLAN ID or range(s) of VLAN IDs within range 1-4094. | + | [        default](## "port_channel_interfaces.[].switchport.tap.default") | Dictionary | | | | Default tap destination config. | + | [          groups](## "port_channel_interfaces.[].switchport.tap.default.groups") | List, items: String | | | | Tap group names for the interface. | + | [            - <str>](## "port_channel_interfaces.[].switchport.tap.default.groups.[]") | String | | | | | + | [          interfaces](## "port_channel_interfaces.[].switchport.tap.default.interfaces") | List, items: String | | | | Interfaces like - Ethernet1, InternalRecirc1, Port-Channel1, Recirc-Channel1. | + | [            - <str>](## "port_channel_interfaces.[].switchport.tap.default.interfaces.[]") | String | | | | | + | [          nexthop_groups](## "port_channel_interfaces.[].switchport.tap.default.nexthop_groups") | List, items: String | | | | Default nexthop-group names. | + | [            - <str>](## "port_channel_interfaces.[].switchport.tap.default.nexthop_groups.[]") | String | | | | | + | [        identity](## "port_channel_interfaces.[].switchport.tap.identity") | Dictionary | | | | | + | [          id](## "port_channel_interfaces.[].switchport.tap.identity.id") | Integer | | | Min: 1
Max: 65535 | Tap port VLAN ID (1-4094) or DzGRE extended ID (1-65535). | + | [          inner_vlan](## "port_channel_interfaces.[].switchport.tap.identity.inner_vlan") | Integer | | | Min: 1
Max: 4094 | Tap port inner VLAN ID. Only applicable if `id` is a VLAN ID (1-4094). | + | [        mpls_pop_all](## "port_channel_interfaces.[].switchport.tap.mpls_pop_all") | Boolean | | | | Pop all MPLS labels. | + | [        native_vlan](## "port_channel_interfaces.[].switchport.tap.native_vlan") | Integer | | | Min: 1
Max: 4094 | Native VLAN ID when interface is in tap mode. | + | [        truncation](## "port_channel_interfaces.[].switchport.tap.truncation") | Dictionary | | | | | + | [          enabled](## "port_channel_interfaces.[].switchport.tap.truncation.enabled") | Boolean | | | | | + | [          size](## "port_channel_interfaces.[].switchport.tap.truncation.size") | Integer | | | Min: 100
Max: 9236 | Ingress packet truncation size in bytes. | + | [        mac_address](## "port_channel_interfaces.[].switchport.tap.mac_address") | Dictionary | | | | | + | [          source](## "port_channel_interfaces.[].switchport.tap.mac_address.source") | String | | | Pattern: `^([0-9a-f]{2}:){5}[0-9a-f]{2}$` | MAC address for the source. | + | [          destination](## "port_channel_interfaces.[].switchport.tap.mac_address.destination") | String | | | Pattern: `^([0-9a-f]{2}:){5}[0-9a-f]{2}$` | MAC address for the destination. | + | [        encapsulation](## "port_channel_interfaces.[].switchport.tap.encapsulation") | Dictionary | | | | | + | [          vxlan_strip](## "port_channel_interfaces.[].switchport.tap.encapsulation.vxlan_strip") | Boolean | | | | Strip VXLAN encapsulation header.
`encapsulation.vxlan_strip` and `mpls_pop_all` are mutually exclusive.
`mpls_pop_all` takes precedence. | + | [          gre](## "port_channel_interfaces.[].switchport.tap.encapsulation.gre") | Dictionary | | | | | + | [            strip](## "port_channel_interfaces.[].switchport.tap.encapsulation.gre.strip") | Boolean | | | | Strip GRE encapsulation header for all GRE tunnels. | + | [            protocols](## "port_channel_interfaces.[].switchport.tap.encapsulation.gre.protocols") | List, items: Dictionary | | | | Protocols for all destinations; destination-specific protocols should be set under the `destinations[].protocols` key. | + | [              - protocol](## "port_channel_interfaces.[].switchport.tap.encapsulation.gre.protocols.[].protocol") | String | Required, Unique | | | Protocol type in GRE header.
Valid range: 0x0-0xFFFF. The value must be enclosed in quotes, e.g., "0x0". | + | [                strip](## "port_channel_interfaces.[].switchport.tap.encapsulation.gre.protocols.[].strip") | Boolean | | | | This is a required key to strip GRE encapsulation header with protocols. | + | [                feature_header_length](## "port_channel_interfaces.[].switchport.tap.encapsulation.gre.protocols.[].feature_header_length") | Integer | | | Min: 1
Max: 16 | Feature header length in bytes.
Note: This setting does not appear in the EOS running-config for protocol 0x0. | + | [                re_encapsulation_ethernet_header](## "port_channel_interfaces.[].switchport.tap.encapsulation.gre.protocols.[].re_encapsulation_ethernet_header") | Boolean | | | | Extra ethernet header to prepend to the terminated packet.
Note: This setting does not appear in the EOS running-config for protocol 0x0. | + | [            destinations](## "port_channel_interfaces.[].switchport.tap.encapsulation.gre.destinations") | List, items: Dictionary | | | | In EOS, `gre.strip` and `destinations.destination/source.strip` (without defining protocols) are mutually exclusive. | + | [              - destination](## "port_channel_interfaces.[].switchport.tap.encapsulation.gre.destinations.[].destination") | String | Required, Unique | | | Destination IP address of tunnel packets. | + | [                source](## "port_channel_interfaces.[].switchport.tap.encapsulation.gre.destinations.[].source") | String | | | | Source IP address of tunnel packets. Applied only when destination is defined. When not defined; any GRE packet that matches the `destination` is terminated. | + | [                strip](## "port_channel_interfaces.[].switchport.tap.encapsulation.gre.destinations.[].strip") | Boolean | | | | Strip GRE encapsulation header for specific destination. | + | [                protocols](## "port_channel_interfaces.[].switchport.tap.encapsulation.gre.destinations.[].protocols") | List, items: Dictionary | | | | | + | [                  - protocol](## "port_channel_interfaces.[].switchport.tap.encapsulation.gre.destinations.[].protocols.[].protocol") | String | Required, Unique | | | Protocol type in GRE header.
Valid range: 0x0-0xFFFF. The value must be enclosed in quotes, e.g., "0x0". | + | [                    strip](## "port_channel_interfaces.[].switchport.tap.encapsulation.gre.destinations.[].protocols.[].strip") | Boolean | | | | This is a required key to strip GRE encapsulation header for specific destination with protocols. | + | [                    feature_header_length](## "port_channel_interfaces.[].switchport.tap.encapsulation.gre.destinations.[].protocols.[].feature_header_length") | Integer | | | Min: 1
Max: 16 | Feature header length in bytes.
Note: This setting does not appear in the EOS running-config for protocol 0x0. | + | [                    re_encapsulation_ethernet_header](## "port_channel_interfaces.[].switchport.tap.encapsulation.gre.destinations.[].protocols.[].re_encapsulation_ethernet_header") | Boolean | | | | Extra ethernet header to prepend to the terminated packet.
Note: This setting does not appear in the EOS running-config for protocol 0x0. | + | [      tool](## "port_channel_interfaces.[].switchport.tool") | Dictionary | | | | In tool mode, the interface operates as a tool port.
Tool ports replicate traffic received by tap ports.
This setting applies only to parent interfaces. | + | [        mpls_pop_all](## "port_channel_interfaces.[].switchport.tool.mpls_pop_all") | Boolean | | | | Pop all MPLS labels. | + | [        encapsulation](## "port_channel_interfaces.[].switchport.tool.encapsulation") | Dictionary | | | | | + | [          dot1br_strip](## "port_channel_interfaces.[].switchport.tool.encapsulation.dot1br_strip") | Boolean | | | | Remove a 802.1 BR tag in packet header. 'mpls_pop_all' takes precedence over 'dot1br_strip' in EOS. | + | [          vn_tag_strip](## "port_channel_interfaces.[].switchport.tool.encapsulation.vn_tag_strip") | Boolean | | | | Remove a VN-tag in packet header. 'mpls_pop_all' takes precedence over 'vn_tag_strip' in EOS. | + | [        allowed_vlan](## "port_channel_interfaces.[].switchport.tool.allowed_vlan") | String | | | | VLAN ID or range of VLAN IDs within range 1-4094. | + | [        identity](## "port_channel_interfaces.[].switchport.tool.identity") | Dictionary | | | | | + | [          tag](## "port_channel_interfaces.[].switchport.tool.identity.tag") | String | | | Valid Values:
- dot1q
- qinq | | + | [          dot1q_dzgre_source](## "port_channel_interfaces.[].switchport.tool.identity.dot1q_dzgre_source") | String | | | Valid Values:
- policy
- port | | + | [          qinq_dzgre_source](## "port_channel_interfaces.[].switchport.tool.identity.qinq_dzgre_source") | String | | | Valid Values:
- policy inner port
- port inner policy | | + | [        groups](## "port_channel_interfaces.[].switchport.tool.groups") | List, items: String | | | | Tool groups for the interface. | + | [          - <str>](## "port_channel_interfaces.[].switchport.tool.groups.[]") | String | | | | | + | [        dot1q_remove_outer_vlan_tag](## "port_channel_interfaces.[].switchport.tool.dot1q_remove_outer_vlan_tag") | String | | | | Indices of vlan tags to be removed.
Range: 1-2 | | [    validate_state](## "port_channel_interfaces.[].validate_state") | Boolean | | | | Set to false to disable interface state and LLDP topology validation performed by the `eos_validate_state` role. | | [    validate_lldp](## "port_channel_interfaces.[].validate_lldp") | Boolean | | | | Set to false to disable the LLDP topology validation performed by the `eos_validate_state` role. | | [    eos_cli](## "port_channel_interfaces.[].eos_cli") | String | | | | Multiline EOS CLI rendered directly on the port-channel interface in the final EOS configuration. | @@ -1223,6 +1274,140 @@ - range: mac_address_maximum: + # In tap mode, the interface operates as a tap port. + # Tap ports receive traffic for replication on one or more tool ports. + # This setting applies only to parent interfaces. + tap: + + # VLAN ID or range(s) of VLAN IDs within range 1-4094. + allowed_vlan: + + # Default tap destination config. + default: + + # Tap group names for the interface. + groups: + - + + # Interfaces like - Ethernet1, InternalRecirc1, Port-Channel1, Recirc-Channel1. + interfaces: + - + + # Default nexthop-group names. + nexthop_groups: + - + identity: + + # Tap port VLAN ID (1-4094) or DzGRE extended ID (1-65535). + id: + + # Tap port inner VLAN ID. Only applicable if `id` is a VLAN ID (1-4094). + inner_vlan: + + # Pop all MPLS labels. + mpls_pop_all: + + # Native VLAN ID when interface is in tap mode. + native_vlan: + truncation: + enabled: + + # Ingress packet truncation size in bytes. + size: + mac_address: + + # MAC address for the source. + source: + + # MAC address for the destination. + destination: + encapsulation: + + # Strip VXLAN encapsulation header. + # `encapsulation.vxlan_strip` and `mpls_pop_all` are mutually exclusive. + # `mpls_pop_all` takes precedence. + vxlan_strip: + gre: + + # Strip GRE encapsulation header for all GRE tunnels. + strip: + + # Protocols for all destinations; destination-specific protocols should be set under the `destinations[].protocols` key. + protocols: + + # Protocol type in GRE header. + # Valid range: 0x0-0xFFFF. The value must be enclosed in quotes, e.g., "0x0". + - protocol: + + # This is a required key to strip GRE encapsulation header with protocols. + strip: + + # Feature header length in bytes. + # Note: This setting does not appear in the EOS running-config for protocol 0x0. + feature_header_length: + + # Extra ethernet header to prepend to the terminated packet. + # Note: This setting does not appear in the EOS running-config for protocol 0x0. + re_encapsulation_ethernet_header: + + # In EOS, `gre.strip` and `destinations.destination/source.strip` (without defining protocols) are mutually exclusive. + destinations: + + # Destination IP address of tunnel packets. + - destination: + + # Source IP address of tunnel packets. Applied only when destination is defined. When not defined; any GRE packet that matches the `destination` is terminated. + source: + + # Strip GRE encapsulation header for specific destination. + strip: + protocols: + + # Protocol type in GRE header. + # Valid range: 0x0-0xFFFF. The value must be enclosed in quotes, e.g., "0x0". + - protocol: + + # This is a required key to strip GRE encapsulation header for specific destination with protocols. + strip: + + # Feature header length in bytes. + # Note: This setting does not appear in the EOS running-config for protocol 0x0. + feature_header_length: + + # Extra ethernet header to prepend to the terminated packet. + # Note: This setting does not appear in the EOS running-config for protocol 0x0. + re_encapsulation_ethernet_header: + + # In tool mode, the interface operates as a tool port. + # Tool ports replicate traffic received by tap ports. + # This setting applies only to parent interfaces. + tool: + + # Pop all MPLS labels. + mpls_pop_all: + encapsulation: + + # Remove a 802.1 BR tag in packet header. 'mpls_pop_all' takes precedence over 'dot1br_strip' in EOS. + dot1br_strip: + + # Remove a VN-tag in packet header. 'mpls_pop_all' takes precedence over 'vn_tag_strip' in EOS. + vn_tag_strip: + + # VLAN ID or range of VLAN IDs within range 1-4094. + allowed_vlan: + identity: + tag: + dot1q_dzgre_source: + qinq_dzgre_source: + + # Tool groups for the interface. + groups: + - + + # Indices of vlan tags to be removed. + # Range: 1-2 + dot1q_remove_outer_vlan_tag: + # Set to false to disable interface state and LLDP topology validation performed by the `eos_validate_state` role. validate_state: diff --git a/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ethernet-interfaces.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ethernet-interfaces.j2 index 93c177d3056..9467cd18e05 100644 --- a/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ethernet-interfaces.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ethernet-interfaces.j2 @@ -990,6 +990,119 @@ interface {{ ethernet_interface.name }} priority {{ ethernet_interface.sync_e.priority }} {% endif %} {% endif %} +{% if ethernet_interface.switchport.tap is arista.avd.defined or ethernet_interface.switchport.tool is arista.avd.defined %} +{% if ethernet_interface.switchport.tap.native_vlan is arista.avd.defined %} + switchport tap native vlan {{ ethernet_interface.switchport.tap.native_vlan }} +{% endif %} +{% if ethernet_interface.switchport.tap.identity.id is arista.avd.defined %} +{% set tap_identity_cli = "switchport tap identity " ~ ethernet_interface.switchport.tap.identity.id %} +{% if ethernet_interface.switchport.tap.identity.inner_vlan is arista.avd.defined %} +{% set tap_identity_cli = tap_identity_cli ~ " inner " ~ ethernet_interface.switchport.tap.identity.inner_vlan %} +{% endif %} + {{ tap_identity_cli }} +{% endif %} +{% if ethernet_interface.switchport.tap.mac_address.destination is arista.avd.defined %} +{% set tap_mac_address_cli = "switchport tap mac-address dest " ~ ethernet_interface.switchport.tap.mac_address.destination %} +{% if ethernet_interface.switchport.tap.mac_address.source is arista.avd.defined %} +{% set tap_mac_address_cli = tap_mac_address_cli ~ " src " ~ ethernet_interface.switchport.tap.mac_address.source %} +{% endif %} + {{ tap_mac_address_cli }} +{% endif %} +{% if ethernet_interface.switchport.tap.encapsulation.vxlan_strip is arista.avd.defined(true) and ethernet_interface.switchport.tap.mpls_pop_all is not arista.avd.defined(true) %} + switchport tap encapsulation vxlan strip +{% endif %} +{% for protocol in ethernet_interface.switchport.tap.encapsulation.gre.protocols | arista.avd.natural_sort('protocol') %} +{% if protocol.strip is arista.avd.defined(true) %} +{% set tap_encapsulation_cli = "switchport tap encapsulation gre protocol " ~ protocol.protocol %} +{% if protocol.feature_header_length is arista.avd.defined %} +{% set tap_encapsulation_cli = tap_encapsulation_cli ~ " feature header length " ~ protocol.feature_header_length %} +{% endif %} +{% set tap_encapsulation_cli = tap_encapsulation_cli ~ " strip" %} +{% if protocol.re_encapsulation_ethernet_header is arista.avd.defined(true) %} +{% set tap_encapsulation_cli = tap_encapsulation_cli ~ " re-encapsulation ethernet" %} +{% endif %} + {{ tap_encapsulation_cli }} +{% endif %} +{% endfor %} +{% if ethernet_interface.switchport.tap.encapsulation.gre.strip is arista.avd.defined(true) %} + switchport tap encapsulation gre strip +{% endif %} +{% for destination in ethernet_interface.switchport.tap.encapsulation.gre.destinations | arista.avd.natural_sort('destination') %} +{% set tap_encapsulation_cli = "switchport tap encapsulation gre destination " ~ destination.destination %} +{% if destination.source is arista.avd.defined %} +{% set tap_encapsulation_cli = tap_encapsulation_cli ~ " source " ~ destination.source %} +{% endif %} +{% for destination_protocol in destination.protocols | arista.avd.natural_sort('protocol') %} +{% if destination_protocol.strip is arista.avd.defined(true) %} +{% set tap_encapsulation_protocol_cli = tap_encapsulation_cli ~ " protocol " ~ destination_protocol.protocol %} +{% if destination_protocol.feature_header_length is arista.avd.defined %} +{% set tap_encapsulation_protocol_cli = tap_encapsulation_protocol_cli ~ " feature header length " ~ destination_protocol.feature_header_length %} +{% endif %} +{% set tap_encapsulation_protocol_cli = tap_encapsulation_protocol_cli ~ " strip" %} +{% if destination_protocol.re_encapsulation_ethernet_header is arista.avd.defined(true) %} +{% set tap_encapsulation_protocol_cli = tap_encapsulation_protocol_cli ~ " re-encapsulation ethernet" %} +{% endif %} + {{ tap_encapsulation_protocol_cli }} +{% endif %} +{% endfor %} +{% if destination.strip is arista.avd.defined(true) %} +{% set tap_encapsulation_cli = tap_encapsulation_cli ~ " strip" %} + {{ tap_encapsulation_cli }} +{% endif %} +{% endfor %} +{% if ethernet_interface.switchport.tap.mpls_pop_all is arista.avd.defined(true) %} + switchport tap mpls pop all +{% endif %} +{% if ethernet_interface.switchport.tool.mpls_pop_all is arista.avd.defined(true) %} + switchport tool mpls pop all +{% endif %} +{% if ethernet_interface.switchport.tool.encapsulation.vn_tag_strip is arista.avd.defined(true) %} + switchport tool encapsulation vn-tag strip +{% endif %} +{% if ethernet_interface.switchport.tool.encapsulation.dot1br_strip is arista.avd.defined(true) %} + switchport tool encapsulation dot1br strip +{% endif %} +{% if ethernet_interface.switchport.tap.allowed_vlan is arista.avd.defined %} + switchport tap allowed vlan {{ ethernet_interface.switchport.tap.allowed_vlan }} +{% endif %} +{% if ethernet_interface.switchport.tool.allowed_vlan is arista.avd.defined %} + switchport tool allowed vlan {{ ethernet_interface.switchport.tool.allowed_vlan }} +{% endif %} +{% if ethernet_interface.switchport.tool.identity.tag is arista.avd.defined %} + switchport tool identity {{ ethernet_interface.switchport.tool.identity.tag }} +{% endif %} +{% if ethernet_interface.switchport.tool.identity.dot1q_dzgre_source is arista.avd.defined %} + switchport tool identity dot1q source dzgre {{ ethernet_interface.switchport.tool.identity.dot1q_dzgre_source }} +{% elif ethernet_interface.switchport.tool.identity.qinq_dzgre_source is arista.avd.defined %} + switchport tool identity qinq source dzgre {{ ethernet_interface.switchport.tool.identity.qinq_dzgre_source }} +{% endif %} +{% if ethernet_interface.switchport.tap.truncation.enabled is arista.avd.defined(true) %} +{% set tap_truncation_cli = "switchport tap truncation" %} +{% if ethernet_interface.switchport.tap.truncation.size is arista.avd.defined %} +{% set tap_truncation_cli = tap_truncation_cli ~ " " ~ ethernet_interface.switchport.tap.truncation.size %} +{% endif %} + {{ tap_truncation_cli }} +{% endif %} +{% if ethernet_interface.switchport.tap.default.groups is arista.avd.defined %} + switchport tap default group {{ ethernet_interface.switchport.tap.default.groups | arista.avd.natural_sort | join(" group ") }} +{% endif %} +{% if ethernet_interface.switchport.tap.default.nexthop_groups is arista.avd.defined %} + switchport tap default nexthop-group {{ ethernet_interface.switchport.tap.default.nexthop_groups | arista.avd.natural_sort | join(" ") }} +{% endif %} +{% for interface in ethernet_interface.switchport.tap.default.interfaces | arista.avd.natural_sort %} + switchport tap default interface {{ interface }} +{% endfor %} +{% if ethernet_interface.switchport.tool.groups is arista.avd.defined %} +{% set tool_groups = ethernet_interface.switchport.tool.groups | arista.avd.natural_sort | join(" ") %} + switchport tool group set {{ tool_groups }} +{% endif %} +{% if ethernet_interface.switchport.tool.dot1q_remove_outer_vlan_tag is arista.avd.defined %} + switchport tool dot1q remove outer {{ ethernet_interface.switchport.tool.dot1q_remove_outer_vlan_tag }} +{% endif %} +{% if ethernet_interface.switchport.tool.dzgre_preserve is arista.avd.defined(true) %} + switchport tool dzgre preserve +{% endif %} +{% endif %} {% for link_tracking_group in ethernet_interface.link_tracking_groups | arista.avd.natural_sort %} {% if link_tracking_group.name is arista.avd.defined and link_tracking_group.direction is arista.avd.defined %} link tracking group {{ link_tracking_group.name }} {{ link_tracking_group.direction }} diff --git a/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/port-channel-interfaces.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/port-channel-interfaces.j2 index 2184b778ab4..25cdb756206 100644 --- a/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/port-channel-interfaces.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/port-channel-interfaces.j2 @@ -813,6 +813,116 @@ interface {{ port_channel_interface.name }} switchport backup dest-macaddr {{ port_channel_interface.switchport.backup.dest_macaddr }} {% endif %} {% endif %} +{% if port_channel_interface.switchport.tap is arista.avd.defined or port_channel_interface.switchport.tool is arista.avd.defined %} +{% if port_channel_interface.switchport.tap.native_vlan is arista.avd.defined %} + switchport tap native vlan {{ port_channel_interface.switchport.tap.native_vlan }} +{% endif %} +{% if port_channel_interface.switchport.tap.identity.id is arista.avd.defined %} +{% set tap_identity_cli = "switchport tap identity " ~ port_channel_interface.switchport.tap.identity.id %} +{% if port_channel_interface.switchport.tap.identity.inner_vlan is arista.avd.defined %} +{% set tap_identity_cli = tap_identity_cli ~ " inner " ~ port_channel_interface.switchport.tap.identity.inner_vlan %} +{% endif %} + {{ tap_identity_cli }} +{% endif %} +{% if port_channel_interface.switchport.tap.mac_address.destination is arista.avd.defined %} +{% set tap_mac_address_cli = "switchport tap mac-address dest " ~ port_channel_interface.switchport.tap.mac_address.destination %} +{% if port_channel_interface.switchport.tap.mac_address.source is arista.avd.defined %} +{% set tap_mac_address_cli = tap_mac_address_cli ~ " src " ~ port_channel_interface.switchport.tap.mac_address.source %} +{% endif %} + {{ tap_mac_address_cli }} +{% endif %} +{% if port_channel_interface.switchport.tap.encapsulation.vxlan_strip is arista.avd.defined(true) and port_channel_interface.switchport.tap.mpls_pop_all is not arista.avd.defined(true) %} + switchport tap encapsulation vxlan strip +{% endif %} +{% for protocol in port_channel_interface.switchport.tap.encapsulation.gre.protocols | arista.avd.natural_sort('protocol') %} +{% if protocol.strip is arista.avd.defined(true) %} +{% set tap_encapsulation_cli = "switchport tap encapsulation gre protocol " ~ protocol.protocol %} +{% if protocol.feature_header_length is arista.avd.defined %} +{% set tap_encapsulation_cli = tap_encapsulation_cli ~ " feature header length " ~ protocol.feature_header_length %} +{% endif %} +{% set tap_encapsulation_cli = tap_encapsulation_cli ~ " strip" %} +{% if protocol.re_encapsulation_ethernet_header is arista.avd.defined(true) %} +{% set tap_encapsulation_cli = tap_encapsulation_cli ~ " re-encapsulation ethernet" %} +{% endif %} + {{ tap_encapsulation_cli }} +{% endif %} +{% endfor %} +{% if port_channel_interface.switchport.tap.encapsulation.gre.strip is arista.avd.defined(true) %} + switchport tap encapsulation gre strip +{% endif %} +{% for destination in port_channel_interface.switchport.tap.encapsulation.gre.destinations | arista.avd.natural_sort('destination') %} +{% set tap_encapsulation_cli = "switchport tap encapsulation gre destination " ~ destination.destination %} +{% if destination.source is arista.avd.defined %} +{% set tap_encapsulation_cli = tap_encapsulation_cli ~ " source " ~ destination.source %} +{% endif %} +{% for destination_protocol in destination.protocols | arista.avd.natural_sort('protocol') %} +{% if destination_protocol.strip is arista.avd.defined(true) %} +{% set tap_encapsulation_protocol_cli = tap_encapsulation_cli ~ " protocol " ~ destination_protocol.protocol %} +{% if destination_protocol.feature_header_length is arista.avd.defined %} +{% set tap_encapsulation_protocol_cli = tap_encapsulation_protocol_cli ~ " feature header length " ~ destination_protocol.feature_header_length %} +{% endif %} +{% set tap_encapsulation_protocol_cli = tap_encapsulation_protocol_cli ~ " strip" %} +{% if destination_protocol.re_encapsulation_ethernet_header is arista.avd.defined(true) %} +{% set tap_encapsulation_protocol_cli = tap_encapsulation_protocol_cli ~ " re-encapsulation ethernet" %} +{% endif %} + {{ tap_encapsulation_protocol_cli }} +{% endif %} +{% endfor %} +{% if destination.strip is arista.avd.defined(true) %} +{% set tap_encapsulation_cli = tap_encapsulation_cli ~ " strip" %} + {{ tap_encapsulation_cli }} +{% endif %} +{% endfor %} +{% if port_channel_interface.switchport.tap.mpls_pop_all is arista.avd.defined(true) %} + switchport tap mpls pop all +{% endif %} +{% if port_channel_interface.switchport.tool.mpls_pop_all is arista.avd.defined(true) %} + switchport tool mpls pop all +{% endif %} +{% if port_channel_interface.switchport.tool.encapsulation.vn_tag_strip is arista.avd.defined(true) %} + switchport tool encapsulation vn-tag strip +{% endif %} +{% if port_channel_interface.switchport.tool.encapsulation.dot1br_strip is arista.avd.defined(true) %} + switchport tool encapsulation dot1br strip +{% endif %} +{% if port_channel_interface.switchport.tap.allowed_vlan is arista.avd.defined %} + switchport tap allowed vlan {{ port_channel_interface.switchport.tap.allowed_vlan }} +{% endif %} +{% if port_channel_interface.switchport.tool.allowed_vlan is arista.avd.defined %} + switchport tool allowed vlan {{ port_channel_interface.switchport.tool.allowed_vlan }} +{% endif %} +{% if port_channel_interface.switchport.tool.identity.tag is arista.avd.defined %} + switchport tool identity {{ port_channel_interface.switchport.tool.identity.tag }} +{% endif %} +{% if port_channel_interface.switchport.tool.identity.dot1q_dzgre_source is arista.avd.defined %} + switchport tool identity dot1q source dzgre {{ port_channel_interface.switchport.tool.identity.dot1q_dzgre_source }} +{% elif port_channel_interface.switchport.tool.identity.qinq_dzgre_source is arista.avd.defined %} + switchport tool identity qinq source dzgre {{ port_channel_interface.switchport.tool.identity.qinq_dzgre_source }} +{% endif %} +{% if port_channel_interface.switchport.tap.truncation.enabled is arista.avd.defined(true) %} +{% set tap_truncation_cli = "switchport tap truncation" %} +{% if port_channel_interface.switchport.tap.truncation.size is arista.avd.defined %} +{% set tap_truncation_cli = tap_truncation_cli ~ " " ~ port_channel_interface.switchport.tap.truncation.size %} +{% endif %} + {{ tap_truncation_cli }} +{% endif %} +{% if port_channel_interface.switchport.tap.default.groups is arista.avd.defined %} + switchport tap default group {{ port_channel_interface.switchport.tap.default.groups | arista.avd.natural_sort | join(" group ") }} +{% endif %} +{% if port_channel_interface.switchport.tap.default.nexthop_groups is arista.avd.defined %} + switchport tap default nexthop-group {{ port_channel_interface.switchport.tap.default.nexthop_groups | arista.avd.natural_sort | join(" ") }} +{% endif %} +{% for interface in port_channel_interface.switchport.tap.default.interfaces | arista.avd.natural_sort %} + switchport tap default interface {{ interface }} +{% endfor %} +{% if port_channel_interface.switchport.tool.groups is arista.avd.defined %} +{% set tool_groups = port_channel_interface.switchport.tool.groups | arista.avd.natural_sort | join(" ") %} + switchport tool group set {{ tool_groups }} +{% endif %} +{% if port_channel_interface.switchport.tool.dot1q_remove_outer_vlan_tag is arista.avd.defined %} + switchport tool dot1q remove outer {{ port_channel_interface.switchport.tool.dot1q_remove_outer_vlan_tag }} +{% endif %} +{% endif %} {% for link_tracking_group in port_channel_interface.link_tracking_groups | arista.avd.natural_sort('name') %} {% if link_tracking_group.name is arista.avd.defined and link_tracking_group.direction is arista.avd.defined %} link tracking group {{ link_tracking_group.name }} {{ link_tracking_group.direction }} diff --git a/python-avd/pyavd/_eos_cli_config_gen/schema/__init__.py b/python-avd/pyavd/_eos_cli_config_gen/schema/__init__.py index d2f8786e347..a40a32fa721 100644 --- a/python-avd/pyavd/_eos_cli_config_gen/schema/__init__.py +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/__init__.py @@ -11317,6 +11317,706 @@ def __init__( """ + class Tap(AvdModel): + """Subclass of AvdModel.""" + + class Default(AvdModel): + """Subclass of AvdModel.""" + + class Groups(AvdList[str]): + """Subclass of AvdList with `str` items.""" + + Groups._item_type = str + + class Interfaces(AvdList[str]): + """Subclass of AvdList with `str` items.""" + + Interfaces._item_type = str + + class NexthopGroups(AvdList[str]): + """Subclass of AvdList with `str` items.""" + + NexthopGroups._item_type = str + + _fields: ClassVar[dict] = { + "groups": {"type": Groups}, + "interfaces": {"type": Interfaces}, + "nexthop_groups": {"type": NexthopGroups}, + "_custom_data": {"type": dict}, + } + groups: Groups + """ + Tap group names for the interface. + + Subclass of AvdList with `str` items. + """ + interfaces: Interfaces + """ + Interfaces like - Ethernet1, InternalRecirc1, Port-Channel1, Recirc-Channel1. + + Subclass of AvdList + with `str` items. + """ + nexthop_groups: NexthopGroups + """ + Default nexthop-group names. + + Subclass of AvdList with `str` items. + """ + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__( + self, + *, + groups: Groups | UndefinedType = Undefined, + interfaces: Interfaces | UndefinedType = Undefined, + nexthop_groups: NexthopGroups | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + Default. + + + Subclass of AvdModel. + + Args: + groups: + Tap group names for the interface. + + Subclass of AvdList with `str` items. + interfaces: + Interfaces like - Ethernet1, InternalRecirc1, Port-Channel1, Recirc-Channel1. + + Subclass of AvdList + with `str` items. + nexthop_groups: + Default nexthop-group names. + + Subclass of AvdList with `str` items. + _custom_data: _custom_data + + """ + + class Identity(AvdModel): + """Subclass of AvdModel.""" + + _fields: ClassVar[dict] = {"id": {"type": int}, "inner_vlan": {"type": int}, "_custom_data": {"type": dict}} + id: int | None + """Tap port VLAN ID (1-4094) or DzGRE extended ID (1-65535).""" + inner_vlan: int | None + """Tap port inner VLAN ID. Only applicable if `id` is a VLAN ID (1-4094).""" + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__( + self, + *, + id: int | None | UndefinedType = Undefined, + inner_vlan: int | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + Identity. + + + Subclass of AvdModel. + + Args: + id: Tap port VLAN ID (1-4094) or DzGRE extended ID (1-65535). + inner_vlan: Tap port inner VLAN ID. Only applicable if `id` is a VLAN ID (1-4094). + _custom_data: _custom_data + + """ + + class Truncation(AvdModel): + """Subclass of AvdModel.""" + + _fields: ClassVar[dict] = {"enabled": {"type": bool}, "size": {"type": int}, "_custom_data": {"type": dict}} + enabled: bool | None + size: int | None + """Ingress packet truncation size in bytes.""" + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__( + self, + *, + enabled: bool | None | UndefinedType = Undefined, + size: int | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + Truncation. + + + Subclass of AvdModel. + + Args: + enabled: enabled + size: Ingress packet truncation size in bytes. + _custom_data: _custom_data + + """ + + class MacAddress(AvdModel): + """Subclass of AvdModel.""" + + _fields: ClassVar[dict] = {"source": {"type": str}, "destination": {"type": str}, "_custom_data": {"type": dict}} + source: str | None + """MAC address for the source.""" + destination: str | None + """MAC address for the destination.""" + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__( + self, + *, + source: str | None | UndefinedType = Undefined, + destination: str | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + MacAddress. + + + Subclass of AvdModel. + + Args: + source: MAC address for the source. + destination: MAC address for the destination. + _custom_data: _custom_data + + """ + + class Encapsulation(AvdModel): + """Subclass of AvdModel.""" + + class Gre(AvdModel): + """Subclass of AvdModel.""" + + class ProtocolsItem(AvdModel): + """Subclass of AvdModel.""" + + _fields: ClassVar[dict] = { + "protocol": {"type": str}, + "strip": {"type": bool}, + "feature_header_length": {"type": int}, + "re_encapsulation_ethernet_header": {"type": bool}, + "_custom_data": {"type": dict}, + } + protocol: str + """ + Protocol type in GRE header. + Valid range: 0x0-0xFFFF. The value must be enclosed in quotes, e.g., + "0x0". + """ + strip: bool | None + """This is a required key to strip GRE encapsulation header with protocols.""" + feature_header_length: int | None + """ + Feature header length in bytes. + Note: This setting does not appear in the EOS running-config for + protocol 0x0. + """ + re_encapsulation_ethernet_header: bool | None + """ + Extra ethernet header to prepend to the terminated packet. + Note: This setting does not appear in the + EOS running-config for protocol 0x0. + """ + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__( + self, + *, + protocol: str | UndefinedType = Undefined, + strip: bool | None | UndefinedType = Undefined, + feature_header_length: int | None | UndefinedType = Undefined, + re_encapsulation_ethernet_header: bool | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + ProtocolsItem. + + + Subclass of AvdModel. + + Args: + protocol: + Protocol type in GRE header. + Valid range: 0x0-0xFFFF. The value must be enclosed in quotes, e.g., + "0x0". + strip: This is a required key to strip GRE encapsulation header with protocols. + feature_header_length: + Feature header length in bytes. + Note: This setting does not appear in the EOS running-config for + protocol 0x0. + re_encapsulation_ethernet_header: + Extra ethernet header to prepend to the terminated packet. + Note: This setting does not appear in the + EOS running-config for protocol 0x0. + _custom_data: _custom_data + + """ + + class Protocols(AvdIndexedList[str, ProtocolsItem]): + """Subclass of AvdIndexedList with `ProtocolsItem` items. Primary key is `protocol` (`str`).""" + + _primary_key: ClassVar[str] = "protocol" + + Protocols._item_type = ProtocolsItem + + class DestinationsItem(AvdModel): + """Subclass of AvdModel.""" + + class ProtocolsItem(AvdModel): + """Subclass of AvdModel.""" + + _fields: ClassVar[dict] = { + "protocol": {"type": str}, + "strip": {"type": bool}, + "feature_header_length": {"type": int}, + "re_encapsulation_ethernet_header": {"type": bool}, + "_custom_data": {"type": dict}, + } + protocol: str + """ + Protocol type in GRE header. + Valid range: 0x0-0xFFFF. The value must be enclosed in quotes, e.g., + "0x0". + """ + strip: bool | None + """This is a required key to strip GRE encapsulation header for specific destination with protocols.""" + feature_header_length: int | None + """ + Feature header length in bytes. + Note: This setting does not appear in the EOS running-config for + protocol 0x0. + """ + re_encapsulation_ethernet_header: bool | None + """ + Extra ethernet header to prepend to the terminated packet. + Note: This setting does not appear in the + EOS running-config for protocol 0x0. + """ + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__( + self, + *, + protocol: str | UndefinedType = Undefined, + strip: bool | None | UndefinedType = Undefined, + feature_header_length: int | None | UndefinedType = Undefined, + re_encapsulation_ethernet_header: bool | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + ProtocolsItem. + + + Subclass of AvdModel. + + Args: + protocol: + Protocol type in GRE header. + Valid range: 0x0-0xFFFF. The value must be enclosed in quotes, e.g., + "0x0". + strip: This is a required key to strip GRE encapsulation header for specific destination with protocols. + feature_header_length: + Feature header length in bytes. + Note: This setting does not appear in the EOS running-config for + protocol 0x0. + re_encapsulation_ethernet_header: + Extra ethernet header to prepend to the terminated packet. + Note: This setting does not appear in the + EOS running-config for protocol 0x0. + _custom_data: _custom_data + + """ + + class Protocols(AvdIndexedList[str, ProtocolsItem]): + """Subclass of AvdIndexedList with `ProtocolsItem` items. Primary key is `protocol` (`str`).""" + + _primary_key: ClassVar[str] = "protocol" + + Protocols._item_type = ProtocolsItem + + _fields: ClassVar[dict] = { + "destination": {"type": str}, + "source": {"type": str}, + "strip": {"type": bool}, + "protocols": {"type": Protocols}, + "_custom_data": {"type": dict}, + } + destination: str + """Destination IP address of tunnel packets.""" + source: str | None + """ + Source IP address of tunnel packets. Applied only when destination is defined. When not defined; any + GRE packet that matches the `destination` is terminated. + """ + strip: bool | None + """Strip GRE encapsulation header for specific destination.""" + protocols: Protocols + """Subclass of AvdIndexedList with `ProtocolsItem` items. Primary key is `protocol` (`str`).""" + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__( + self, + *, + destination: str | UndefinedType = Undefined, + source: str | None | UndefinedType = Undefined, + strip: bool | None | UndefinedType = Undefined, + protocols: Protocols | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + DestinationsItem. + + + Subclass of AvdModel. + + Args: + destination: Destination IP address of tunnel packets. + source: + Source IP address of tunnel packets. Applied only when destination is defined. When not defined; any + GRE packet that matches the `destination` is terminated. + strip: Strip GRE encapsulation header for specific destination. + protocols: Subclass of AvdIndexedList with `ProtocolsItem` items. Primary key is `protocol` (`str`). + _custom_data: _custom_data + + """ + + class Destinations(AvdIndexedList[str, DestinationsItem]): + """Subclass of AvdIndexedList with `DestinationsItem` items. Primary key is `destination` (`str`).""" + + _primary_key: ClassVar[str] = "destination" + + Destinations._item_type = DestinationsItem + + _fields: ClassVar[dict] = { + "strip": {"type": bool}, + "protocols": {"type": Protocols}, + "destinations": {"type": Destinations}, + "_custom_data": {"type": dict}, + } + strip: bool | None + """Strip GRE encapsulation header for all GRE tunnels.""" + protocols: Protocols + """ + Protocols for all destinations; destination-specific protocols should be set under the + `destinations[].protocols` key. + + Subclass of AvdIndexedList with `ProtocolsItem` items. Primary key + is `protocol` (`str`). + """ + destinations: Destinations + """ + In EOS, `gre.strip` and `destinations.destination/source.strip` (without defining protocols) are + mutually exclusive. + + Subclass of AvdIndexedList with `DestinationsItem` items. Primary key is + `destination` (`str`). + """ + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__( + self, + *, + strip: bool | None | UndefinedType = Undefined, + protocols: Protocols | UndefinedType = Undefined, + destinations: Destinations | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + Gre. + + + Subclass of AvdModel. + + Args: + strip: Strip GRE encapsulation header for all GRE tunnels. + protocols: + Protocols for all destinations; destination-specific protocols should be set under the + `destinations[].protocols` key. + + Subclass of AvdIndexedList with `ProtocolsItem` items. Primary key + is `protocol` (`str`). + destinations: + In EOS, `gre.strip` and `destinations.destination/source.strip` (without defining protocols) are + mutually exclusive. + + Subclass of AvdIndexedList with `DestinationsItem` items. Primary key is + `destination` (`str`). + _custom_data: _custom_data + + """ + + _fields: ClassVar[dict] = {"vxlan_strip": {"type": bool}, "gre": {"type": Gre}, "_custom_data": {"type": dict}} + vxlan_strip: bool | None + """ + Strip VXLAN encapsulation header. + `encapsulation.vxlan_strip` and `mpls_pop_all` are mutually + exclusive. + `mpls_pop_all` takes precedence. + """ + gre: Gre + """Subclass of AvdModel.""" + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__( + self, + *, + vxlan_strip: bool | None | UndefinedType = Undefined, + gre: Gre | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + Encapsulation. + + + Subclass of AvdModel. + + Args: + vxlan_strip: + Strip VXLAN encapsulation header. + `encapsulation.vxlan_strip` and `mpls_pop_all` are mutually + exclusive. + `mpls_pop_all` takes precedence. + gre: Subclass of AvdModel. + _custom_data: _custom_data + + """ + + _fields: ClassVar[dict] = { + "allowed_vlan": {"type": str}, + "default": {"type": Default}, + "identity": {"type": Identity}, + "mpls_pop_all": {"type": bool}, + "native_vlan": {"type": int}, + "truncation": {"type": Truncation}, + "mac_address": {"type": MacAddress}, + "encapsulation": {"type": Encapsulation}, + "_custom_data": {"type": dict}, + } + allowed_vlan: str | None + """VLAN ID or range(s) of VLAN IDs within range 1-4094.""" + default: Default + """ + Default tap destination config. + + Subclass of AvdModel. + """ + identity: Identity + """Subclass of AvdModel.""" + mpls_pop_all: bool | None + """Pop all MPLS labels.""" + native_vlan: int | None + """Native VLAN ID when interface is in tap mode.""" + truncation: Truncation + """Subclass of AvdModel.""" + mac_address: MacAddress + """Subclass of AvdModel.""" + encapsulation: Encapsulation + """Subclass of AvdModel.""" + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__( + self, + *, + allowed_vlan: str | None | UndefinedType = Undefined, + default: Default | UndefinedType = Undefined, + identity: Identity | UndefinedType = Undefined, + mpls_pop_all: bool | None | UndefinedType = Undefined, + native_vlan: int | None | UndefinedType = Undefined, + truncation: Truncation | UndefinedType = Undefined, + mac_address: MacAddress | UndefinedType = Undefined, + encapsulation: Encapsulation | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + Tap. + + + Subclass of AvdModel. + + Args: + allowed_vlan: VLAN ID or range(s) of VLAN IDs within range 1-4094. + default: + Default tap destination config. + + Subclass of AvdModel. + identity: Subclass of AvdModel. + mpls_pop_all: Pop all MPLS labels. + native_vlan: Native VLAN ID when interface is in tap mode. + truncation: Subclass of AvdModel. + mac_address: Subclass of AvdModel. + encapsulation: Subclass of AvdModel. + _custom_data: _custom_data + + """ + + class Tool(AvdModel): + """Subclass of AvdModel.""" + + class Encapsulation(AvdModel): + """Subclass of AvdModel.""" + + _fields: ClassVar[dict] = {"dot1br_strip": {"type": bool}, "vn_tag_strip": {"type": bool}, "_custom_data": {"type": dict}} + dot1br_strip: bool | None + """Remove a 802.1 BR tag in packet header. 'mpls_pop_all' takes precedence over 'dot1br_strip' in EOS.""" + vn_tag_strip: bool | None + """Remove a VN-tag in packet header. 'mpls_pop_all' takes precedence over 'vn_tag_strip' in EOS.""" + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__( + self, + *, + dot1br_strip: bool | None | UndefinedType = Undefined, + vn_tag_strip: bool | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + Encapsulation. + + + Subclass of AvdModel. + + Args: + dot1br_strip: Remove a 802.1 BR tag in packet header. 'mpls_pop_all' takes precedence over 'dot1br_strip' in EOS. + vn_tag_strip: Remove a VN-tag in packet header. 'mpls_pop_all' takes precedence over 'vn_tag_strip' in EOS. + _custom_data: _custom_data + + """ + + class Identity(AvdModel): + """Subclass of AvdModel.""" + + _fields: ClassVar[dict] = { + "tag": {"type": str}, + "dot1q_dzgre_source": {"type": str}, + "qinq_dzgre_source": {"type": str}, + "_custom_data": {"type": dict}, + } + tag: Literal["dot1q", "qinq"] | None + dot1q_dzgre_source: Literal["policy", "port"] | None + qinq_dzgre_source: Literal["policy inner port", "port inner policy"] | None + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__( + self, + *, + tag: Literal["dot1q", "qinq"] | None | UndefinedType = Undefined, + dot1q_dzgre_source: Literal["policy", "port"] | None | UndefinedType = Undefined, + qinq_dzgre_source: Literal["policy inner port", "port inner policy"] | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + Identity. + + + Subclass of AvdModel. + + Args: + tag: tag + dot1q_dzgre_source: dot1q_dzgre_source + qinq_dzgre_source: qinq_dzgre_source + _custom_data: _custom_data + + """ + + class Groups(AvdList[str]): + """Subclass of AvdList with `str` items.""" + + Groups._item_type = str + + _fields: ClassVar[dict] = { + "mpls_pop_all": {"type": bool}, + "encapsulation": {"type": Encapsulation}, + "allowed_vlan": {"type": str}, + "identity": {"type": Identity}, + "groups": {"type": Groups}, + "dot1q_remove_outer_vlan_tag": {"type": str}, + "_custom_data": {"type": dict}, + } + mpls_pop_all: bool | None + """Pop all MPLS labels.""" + encapsulation: Encapsulation + """Subclass of AvdModel.""" + allowed_vlan: str | None + """VLAN ID or range of VLAN IDs within range 1-4094.""" + identity: Identity + """Subclass of AvdModel.""" + groups: Groups + """ + Tool groups for the interface. + + Subclass of AvdList with `str` items. + """ + dot1q_remove_outer_vlan_tag: str | None + """ + Indices of vlan tags to be removed. + Range: 1-2 + """ + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__( + self, + *, + mpls_pop_all: bool | None | UndefinedType = Undefined, + encapsulation: Encapsulation | UndefinedType = Undefined, + allowed_vlan: str | None | UndefinedType = Undefined, + identity: Identity | UndefinedType = Undefined, + groups: Groups | UndefinedType = Undefined, + dot1q_remove_outer_vlan_tag: str | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + Tool. + + + Subclass of AvdModel. + + Args: + mpls_pop_all: Pop all MPLS labels. + encapsulation: Subclass of AvdModel. + allowed_vlan: VLAN ID or range of VLAN IDs within range 1-4094. + identity: Subclass of AvdModel. + groups: + Tool groups for the interface. + + Subclass of AvdList with `str` items. + dot1q_remove_outer_vlan_tag: + Indices of vlan tags to be removed. + Range: 1-2 + _custom_data: _custom_data + + """ + _fields: ClassVar[dict] = { "enabled": {"type": bool}, "mode": {"type": str}, @@ -11331,6 +12031,8 @@ def __init__( "backup_link": {"type": BackupLink}, "backup": {"type": Backup}, "port_security": {"type": PortSecurity}, + "tap": {"type": Tap}, + "tool": {"type": Tool}, "_custom_data": {"type": dict}, } enabled: bool | None @@ -11384,6 +12086,24 @@ def __init__( """ port_security: PortSecurity """Subclass of AvdModel.""" + tap: Tap + """ + In tap mode, the interface operates as a tap port. + Tap ports receive traffic for replication on one + or more tool ports. + This setting applies only to parent interfaces. + + Subclass of AvdModel. + """ + tool: Tool + """ + In tool mode, the interface operates as a tool port. + Tool ports replicate traffic received by tap + ports. + This setting applies only to parent interfaces. + + Subclass of AvdModel. + """ _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -11404,6 +12124,8 @@ def __init__( backup_link: BackupLink | UndefinedType = Undefined, backup: Backup | UndefinedType = Undefined, port_security: PortSecurity | UndefinedType = Undefined, + tap: Tap | UndefinedType = Undefined, + tool: Tool | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ @@ -11446,6 +12168,20 @@ def __init__( Subclass of AvdModel. port_security: Subclass of AvdModel. + tap: + In tap mode, the interface operates as a tap port. + Tap ports receive traffic for replication on one + or more tool ports. + This setting applies only to parent interfaces. + + Subclass of AvdModel. + tool: + In tool mode, the interface operates as a tool port. + Tool ports replicate traffic received by tap + ports. + This setting applies only to parent interfaces. + + Subclass of AvdModel. _custom_data: _custom_data """ @@ -27481,24 +28217,262 @@ def __init__( copp_system_policy: Control-plane policy configuration. - Subclass of AvdModel. - _custom_data: _custom_data + Subclass of AvdModel. + _custom_data: _custom_data + + """ + + class PortChannelInterfacesItem(AvdModel): + """Subclass of AvdModel.""" + + class Logging(AvdModel): + """Subclass of AvdModel.""" + + class Event(AvdModel): + """Subclass of AvdModel.""" + + _fields: ClassVar[dict] = {"link_status": {"type": bool}, "storm_control_discards": {"type": bool}, "_custom_data": {"type": dict}} + link_status: bool | None + storm_control_discards: bool | None + """Discards due to storm-control.""" + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__( + self, + *, + link_status: bool | None | UndefinedType = Undefined, + storm_control_discards: bool | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + Event. + + + Subclass of AvdModel. + + Args: + link_status: link_status + storm_control_discards: Discards due to storm-control. + _custom_data: _custom_data + + """ + + _fields: ClassVar[dict] = {"event": {"type": Event}, "_custom_data": {"type": dict}} + event: Event + """Subclass of AvdModel.""" + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__(self, *, event: Event | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined) -> None: + """ + Logging. + + + Subclass of AvdModel. + + Args: + event: Subclass of AvdModel. + _custom_data: _custom_data + + """ + + class EncapsulationDot1q(AvdModel): + """Subclass of AvdModel.""" + + _fields: ClassVar[dict] = {"vlan": {"type": int}, "inner_vlan": {"type": int}, "_custom_data": {"type": dict}} + vlan: int + """VLAD ID.""" + inner_vlan: int | None + """Inner VLAN ID. This setting can only be applied to sub-interfaces on EOS.""" + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__( + self, + *, + vlan: int | UndefinedType = Undefined, + inner_vlan: int | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + EncapsulationDot1q. + + + Subclass of AvdModel. + + Args: + vlan: VLAD ID. + inner_vlan: Inner VLAN ID. This setting can only be applied to sub-interfaces on EOS. + _custom_data: _custom_data + + """ + + class EncapsulationVlan(AvdModel): + """Subclass of AvdModel.""" + + class Client(AvdModel): + """Subclass of AvdModel.""" + + class Dot1q(AvdModel): + """Subclass of AvdModel.""" + + _fields: ClassVar[dict] = {"vlan": {"type": int}, "outer": {"type": int}, "inner": {"type": int}, "_custom_data": {"type": dict}} + vlan: int | None + """Client VLAN ID.""" + outer: int | None + """Client Outer VLAN ID.""" + inner: int | None + """Client Inner VLAN ID.""" + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__( + self, + *, + vlan: int | None | UndefinedType = Undefined, + outer: int | None | UndefinedType = Undefined, + inner: int | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + Dot1q. + + + Subclass of AvdModel. + + Args: + vlan: Client VLAN ID. + outer: Client Outer VLAN ID. + inner: Client Inner VLAN ID. + _custom_data: _custom_data + + """ + + _fields: ClassVar[dict] = { + "dot1q": {"type": Dot1q}, + "unmatched": {"type": bool}, + "encapsulation": {"type": str}, + "vlan": {"type": int}, + "outer_vlan": {"type": int}, + "inner_vlan": {"type": int}, + "inner_encapsulation": {"type": str}, + "_custom_data": {"type": dict}, + } + dot1q: Dot1q + """Subclass of AvdModel.""" + unmatched: bool | None + encapsulation: Literal["dot1q", "dot1ad", "unmatched", "untagged"] | None + vlan: int | None + """Client VLAN ID. Not applicable for `encapsulation: untagged` or `encapsulation: unmatched`.""" + outer_vlan: int | None + """Client Outer VLAN ID. Not applicable for `encapsulation: untagged` or `encapsulation: unmatched`.""" + inner_vlan: int | None + """Client Inner VLAN ID. Not applicable for `encapsulation: untagged` or `encapsulation: unmatched`.""" + inner_encapsulation: Literal["dot1q", "dot1ad"] | None + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__( + self, + *, + dot1q: Dot1q | UndefinedType = Undefined, + unmatched: bool | None | UndefinedType = Undefined, + encapsulation: Literal["dot1q", "dot1ad", "unmatched", "untagged"] | None | UndefinedType = Undefined, + vlan: int | None | UndefinedType = Undefined, + outer_vlan: int | None | UndefinedType = Undefined, + inner_vlan: int | None | UndefinedType = Undefined, + inner_encapsulation: Literal["dot1q", "dot1ad"] | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + Client. + + + Subclass of AvdModel. + + Args: + dot1q: Subclass of AvdModel. + unmatched: unmatched + encapsulation: encapsulation + vlan: Client VLAN ID. Not applicable for `encapsulation: untagged` or `encapsulation: unmatched`. + outer_vlan: Client Outer VLAN ID. Not applicable for `encapsulation: untagged` or `encapsulation: unmatched`. + inner_vlan: Client Inner VLAN ID. Not applicable for `encapsulation: untagged` or `encapsulation: unmatched`. + inner_encapsulation: inner_encapsulation + _custom_data: _custom_data + + """ + + class Network(AvdModel): + """Subclass of AvdModel.""" + + class Dot1q(AvdModel): + """Subclass of AvdModel.""" + + _fields: ClassVar[dict] = {"vlan": {"type": int}, "outer": {"type": int}, "inner": {"type": int}, "_custom_data": {"type": dict}} + vlan: int | None + """Network VLAN ID.""" + outer: int | None + """Network Outer VLAN ID.""" + inner: int | None + """Network Inner VLAN ID.""" + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__( + self, + *, + vlan: int | None | UndefinedType = Undefined, + outer: int | None | UndefinedType = Undefined, + inner: int | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + Dot1q. + - """ + Subclass of AvdModel. - class PortChannelInterfacesItem(AvdModel): - """Subclass of AvdModel.""" + Args: + vlan: Network VLAN ID. + outer: Network Outer VLAN ID. + inner: Network Inner VLAN ID. + _custom_data: _custom_data - class Logging(AvdModel): - """Subclass of AvdModel.""" + """ - class Event(AvdModel): + _fields: ClassVar[dict] = { + "dot1q": {"type": Dot1q}, + "client": {"type": bool}, + "encapsulation": {"type": str}, + "vlan": {"type": int}, + "outer_vlan": {"type": int}, + "inner_vlan": {"type": int}, + "inner_encapsulation": {"type": str}, + "_custom_data": {"type": dict}, + } + dot1q: Dot1q """Subclass of AvdModel.""" - - _fields: ClassVar[dict] = {"link_status": {"type": bool}, "storm_control_discards": {"type": bool}, "_custom_data": {"type": dict}} - link_status: bool | None - storm_control_discards: bool | None - """Discards due to storm-control.""" + client: bool | None + encapsulation: Literal["dot1q", "dot1ad", "client", "client inner", "untagged"] | None + """ + `untagged` (no encapsulation) is applicable for `untagged` client only. + `client` and `client inner` + (retain client encapsulation) is not applicable for `untagged` client. + """ + vlan: int | None + """Network VLAN ID. Not applicable for `encapsulation: untagged` or `encapsulation: client`.""" + outer_vlan: int | None + """Network outer VLAN ID. Not applicable for `encapsulation: untagged` or `encapsulation: client`.""" + inner_vlan: int | None + """Network inner VLAN ID. Not applicable for `encapsulation: untagged` or `encapsulation: client`.""" + inner_encapsulation: Literal["dot1q", "dot1ad"] | None _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -27506,51 +28480,81 @@ class Event(AvdModel): def __init__( self, *, - link_status: bool | None | UndefinedType = Undefined, - storm_control_discards: bool | None | UndefinedType = Undefined, + dot1q: Dot1q | UndefinedType = Undefined, + client: bool | None | UndefinedType = Undefined, + encapsulation: Literal["dot1q", "dot1ad", "client", "client inner", "untagged"] | None | UndefinedType = Undefined, + vlan: int | None | UndefinedType = Undefined, + outer_vlan: int | None | UndefinedType = Undefined, + inner_vlan: int | None | UndefinedType = Undefined, + inner_encapsulation: Literal["dot1q", "dot1ad"] | None | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - Event. + Network. Subclass of AvdModel. Args: - link_status: link_status - storm_control_discards: Discards due to storm-control. + dot1q: Subclass of AvdModel. + client: client + encapsulation: + `untagged` (no encapsulation) is applicable for `untagged` client only. + `client` and `client inner` + (retain client encapsulation) is not applicable for `untagged` client. + vlan: Network VLAN ID. Not applicable for `encapsulation: untagged` or `encapsulation: client`. + outer_vlan: Network outer VLAN ID. Not applicable for `encapsulation: untagged` or `encapsulation: client`. + inner_vlan: Network inner VLAN ID. Not applicable for `encapsulation: untagged` or `encapsulation: client`. + inner_encapsulation: inner_encapsulation _custom_data: _custom_data """ - _fields: ClassVar[dict] = {"event": {"type": Event}, "_custom_data": {"type": dict}} - event: Event + _fields: ClassVar[dict] = {"client": {"type": Client}, "network": {"type": Network}, "_custom_data": {"type": dict}} + client: Client """Subclass of AvdModel.""" + network: Network + """ + Network encapsulation are all optional, and skipped if using client unmatched. + + Subclass of + AvdModel. + """ _custom_data: dict[str, Any] if TYPE_CHECKING: - def __init__(self, *, event: Event | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined) -> None: + def __init__( + self, + *, + client: Client | UndefinedType = Undefined, + network: Network | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: """ - Logging. + EncapsulationVlan. Subclass of AvdModel. Args: - event: Subclass of AvdModel. + client: Subclass of AvdModel. + network: + Network encapsulation are all optional, and skipped if using client unmatched. + + Subclass of + AvdModel. _custom_data: _custom_data """ - class EncapsulationDot1q(AvdModel): + class LinkTrackingGroupsItem(AvdModel): """Subclass of AvdModel.""" - _fields: ClassVar[dict] = {"vlan": {"type": int}, "inner_vlan": {"type": int}, "_custom_data": {"type": dict}} - vlan: int - """VLAD ID.""" - inner_vlan: int | None - """Inner VLAN ID. This setting can only be applied to sub-interfaces on EOS.""" + _fields: ClassVar[dict] = {"name": {"type": str}, "direction": {"type": str}, "_custom_data": {"type": dict}} + name: str + """Group name.""" + direction: Literal["upstream", "downstream"] | None _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -27558,185 +28562,184 @@ class EncapsulationDot1q(AvdModel): def __init__( self, *, - vlan: int | UndefinedType = Undefined, - inner_vlan: int | None | UndefinedType = Undefined, + name: str | UndefinedType = Undefined, + direction: Literal["upstream", "downstream"] | None | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - EncapsulationDot1q. + LinkTrackingGroupsItem. Subclass of AvdModel. Args: - vlan: VLAD ID. - inner_vlan: Inner VLAN ID. This setting can only be applied to sub-interfaces on EOS. + name: Group name. + direction: direction _custom_data: _custom_data """ - class EncapsulationVlan(AvdModel): + class LinkTrackingGroups(AvdIndexedList[str, LinkTrackingGroupsItem]): + """Subclass of AvdIndexedList with `LinkTrackingGroupsItem` items. Primary key is `name` (`str`).""" + + _primary_key: ClassVar[str] = "name" + + LinkTrackingGroups._item_type = LinkTrackingGroupsItem + + class LinkTracking(AvdModel): """Subclass of AvdModel.""" - class Client(AvdModel): - """Subclass of AvdModel.""" + class Groups(AvdList[str]): + """Subclass of AvdList with `str` items.""" - class Dot1q(AvdModel): - """Subclass of AvdModel.""" + Groups._item_type = str - _fields: ClassVar[dict] = {"vlan": {"type": int}, "outer": {"type": int}, "inner": {"type": int}, "_custom_data": {"type": dict}} - vlan: int | None - """Client VLAN ID.""" - outer: int | None - """Client Outer VLAN ID.""" - inner: int | None - """Client Inner VLAN ID.""" - _custom_data: dict[str, Any] + _fields: ClassVar[dict] = {"direction": {"type": str}, "groups": {"type": Groups}, "_custom_data": {"type": dict}} + direction: Literal["upstream", "downstream"] | None + groups: Groups + """ + Link state group(s) an interface belongs to. - if TYPE_CHECKING: + Subclass of AvdList with `str` items. + """ + _custom_data: dict[str, Any] - def __init__( - self, - *, - vlan: int | None | UndefinedType = Undefined, - outer: int | None | UndefinedType = Undefined, - inner: int | None | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: - """ - Dot1q. + if TYPE_CHECKING: + def __init__( + self, + *, + direction: Literal["upstream", "downstream"] | None | UndefinedType = Undefined, + groups: Groups | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + LinkTracking. - Subclass of AvdModel. - Args: - vlan: Client VLAN ID. - outer: Client Outer VLAN ID. - inner: Client Inner VLAN ID. - _custom_data: _custom_data + Subclass of AvdModel. - """ + Args: + direction: direction + groups: + Link state group(s) an interface belongs to. - _fields: ClassVar[dict] = { - "dot1q": {"type": Dot1q}, - "unmatched": {"type": bool}, - "encapsulation": {"type": str}, - "vlan": {"type": int}, - "outer_vlan": {"type": int}, - "inner_vlan": {"type": int}, - "inner_encapsulation": {"type": str}, - "_custom_data": {"type": dict}, - } - dot1q: Dot1q - """Subclass of AvdModel.""" - unmatched: bool | None - encapsulation: Literal["dot1q", "dot1ad", "unmatched", "untagged"] | None - vlan: int | None - """Client VLAN ID. Not applicable for `encapsulation: untagged` or `encapsulation: unmatched`.""" - outer_vlan: int | None - """Client Outer VLAN ID. Not applicable for `encapsulation: untagged` or `encapsulation: unmatched`.""" - inner_vlan: int | None - """Client Inner VLAN ID. Not applicable for `encapsulation: untagged` or `encapsulation: unmatched`.""" - inner_encapsulation: Literal["dot1q", "dot1ad"] | None - _custom_data: dict[str, Any] + Subclass of AvdList with `str` items. + _custom_data: _custom_data + + """ + + class Phone(AvdModel): + """Subclass of AvdModel.""" + + _fields: ClassVar[dict] = {"trunk": {"type": str}, "vlan": {"type": int}, "_custom_data": {"type": dict}} + trunk: Literal["tagged", "untagged"] | None + vlan: int | None + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__( + self, + *, + trunk: Literal["tagged", "untagged"] | None | UndefinedType = Undefined, + vlan: int | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + Phone. + + + Subclass of AvdModel. + + Args: + trunk: trunk + vlan: vlan + _custom_data: _custom_data + + """ + + class L2Protocol(AvdModel): + """Subclass of AvdModel.""" + + _fields: ClassVar[dict] = {"encapsulation_dot1q_vlan": {"type": int}, "forwarding_profile": {"type": str}, "_custom_data": {"type": dict}} + encapsulation_dot1q_vlan: int | None + """Vlan tag to configure on sub-interface.""" + forwarding_profile: str | None + """L2 protocol forwarding profile.""" + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__( + self, + *, + encapsulation_dot1q_vlan: int | None | UndefinedType = Undefined, + forwarding_profile: str | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + L2Protocol. - if TYPE_CHECKING: - def __init__( - self, - *, - dot1q: Dot1q | UndefinedType = Undefined, - unmatched: bool | None | UndefinedType = Undefined, - encapsulation: Literal["dot1q", "dot1ad", "unmatched", "untagged"] | None | UndefinedType = Undefined, - vlan: int | None | UndefinedType = Undefined, - outer_vlan: int | None | UndefinedType = Undefined, - inner_vlan: int | None | UndefinedType = Undefined, - inner_encapsulation: Literal["dot1q", "dot1ad"] | None | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: - """ - Client. + Subclass of AvdModel. + Args: + encapsulation_dot1q_vlan: Vlan tag to configure on sub-interface. + forwarding_profile: L2 protocol forwarding profile. + _custom_data: _custom_data - Subclass of AvdModel. + """ - Args: - dot1q: Subclass of AvdModel. - unmatched: unmatched - encapsulation: encapsulation - vlan: Client VLAN ID. Not applicable for `encapsulation: untagged` or `encapsulation: unmatched`. - outer_vlan: Client Outer VLAN ID. Not applicable for `encapsulation: untagged` or `encapsulation: unmatched`. - inner_vlan: Client Inner VLAN ID. Not applicable for `encapsulation: untagged` or `encapsulation: unmatched`. - inner_encapsulation: inner_encapsulation - _custom_data: _custom_data + class TrunkGroups(AvdList[str]): + """Subclass of AvdList with `str` items.""" - """ + TrunkGroups._item_type = str - class Network(AvdModel): - """Subclass of AvdModel.""" + class Qos(AvdModel): + """Subclass of AvdModel.""" - class Dot1q(AvdModel): - """Subclass of AvdModel.""" + _fields: ClassVar[dict] = {"trust": {"type": str}, "dscp": {"type": int}, "cos": {"type": int}, "_custom_data": {"type": dict}} + trust: Literal["dscp", "cos", "disabled"] | None + dscp: int | None + """DSCP value.""" + cos: int | None + """COS value.""" + _custom_data: dict[str, Any] - _fields: ClassVar[dict] = {"vlan": {"type": int}, "outer": {"type": int}, "inner": {"type": int}, "_custom_data": {"type": dict}} - vlan: int | None - """Network VLAN ID.""" - outer: int | None - """Network Outer VLAN ID.""" - inner: int | None - """Network Inner VLAN ID.""" - _custom_data: dict[str, Any] + if TYPE_CHECKING: - if TYPE_CHECKING: + def __init__( + self, + *, + trust: Literal["dscp", "cos", "disabled"] | None | UndefinedType = Undefined, + dscp: int | None | UndefinedType = Undefined, + cos: int | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + Qos. - def __init__( - self, - *, - vlan: int | None | UndefinedType = Undefined, - outer: int | None | UndefinedType = Undefined, - inner: int | None | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: - """ - Dot1q. + Subclass of AvdModel. - Subclass of AvdModel. + Args: + trust: trust + dscp: DSCP value. + cos: COS value. + _custom_data: _custom_data - Args: - vlan: Network VLAN ID. - outer: Network Outer VLAN ID. - inner: Network Inner VLAN ID. - _custom_data: _custom_data + """ - """ + class Bfd(AvdModel): + """Subclass of AvdModel.""" - _fields: ClassVar[dict] = { - "dot1q": {"type": Dot1q}, - "client": {"type": bool}, - "encapsulation": {"type": str}, - "vlan": {"type": int}, - "outer_vlan": {"type": int}, - "inner_vlan": {"type": int}, - "inner_encapsulation": {"type": str}, - "_custom_data": {"type": dict}, - } - dot1q: Dot1q + class PerLink(AvdModel): """Subclass of AvdModel.""" - client: bool | None - encapsulation: Literal["dot1q", "dot1ad", "client", "client inner", "untagged"] | None - """ - `untagged` (no encapsulation) is applicable for `untagged` client only. - `client` and `client inner` - (retain client encapsulation) is not applicable for `untagged` client. - """ - vlan: int | None - """Network VLAN ID. Not applicable for `encapsulation: untagged` or `encapsulation: client`.""" - outer_vlan: int | None - """Network outer VLAN ID. Not applicable for `encapsulation: untagged` or `encapsulation: client`.""" - inner_vlan: int | None - """Network inner VLAN ID. Not applicable for `encapsulation: untagged` or `encapsulation: client`.""" - inner_encapsulation: Literal["dot1q", "dot1ad"] | None + + _fields: ClassVar[dict] = {"enabled": {"type": bool}, "rfc_7130": {"type": bool}, "_custom_data": {"type": dict}} + enabled: bool | None + rfc_7130: bool | None _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -27744,46 +28747,45 @@ def __init__( def __init__( self, *, - dot1q: Dot1q | UndefinedType = Undefined, - client: bool | None | UndefinedType = Undefined, - encapsulation: Literal["dot1q", "dot1ad", "client", "client inner", "untagged"] | None | UndefinedType = Undefined, - vlan: int | None | UndefinedType = Undefined, - outer_vlan: int | None | UndefinedType = Undefined, - inner_vlan: int | None | UndefinedType = Undefined, - inner_encapsulation: Literal["dot1q", "dot1ad"] | None | UndefinedType = Undefined, + enabled: bool | None | UndefinedType = Undefined, + rfc_7130: bool | None | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - Network. + PerLink. Subclass of AvdModel. Args: - dot1q: Subclass of AvdModel. - client: client - encapsulation: - `untagged` (no encapsulation) is applicable for `untagged` client only. - `client` and `client inner` - (retain client encapsulation) is not applicable for `untagged` client. - vlan: Network VLAN ID. Not applicable for `encapsulation: untagged` or `encapsulation: client`. - outer_vlan: Network outer VLAN ID. Not applicable for `encapsulation: untagged` or `encapsulation: client`. - inner_vlan: Network inner VLAN ID. Not applicable for `encapsulation: untagged` or `encapsulation: client`. - inner_encapsulation: inner_encapsulation + enabled: enabled + rfc_7130: rfc_7130 _custom_data: _custom_data """ - _fields: ClassVar[dict] = {"client": {"type": Client}, "network": {"type": Network}, "_custom_data": {"type": dict}} - client: Client - """Subclass of AvdModel.""" - network: Network + _fields: ClassVar[dict] = { + "echo": {"type": bool}, + "interval": {"type": int}, + "min_rx": {"type": int}, + "multiplier": {"type": int}, + "neighbor": {"type": str}, + "per_link": {"type": PerLink}, + "_custom_data": {"type": dict}, + } + echo: bool | None + interval: int | None + """Interval in milliseconds.""" + min_rx: int | None + """Rate in milliseconds.""" + multiplier: int | None + neighbor: str | None """ - Network encapsulation are all optional, and skipped if using client unmatched. - - Subclass of - AvdModel. + IPv4 or IPv6 address. When the Port-channel is a L2 interface, a local L3 BFD address + (router_bfd.local_address) has to be defined globally on the switch. """ + per_link: PerLink + """Subclass of AvdModel.""" _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -27791,81 +28793,87 @@ def __init__( def __init__( self, *, - client: Client | UndefinedType = Undefined, - network: Network | UndefinedType = Undefined, + echo: bool | None | UndefinedType = Undefined, + interval: int | None | UndefinedType = Undefined, + min_rx: int | None | UndefinedType = Undefined, + multiplier: int | None | UndefinedType = Undefined, + neighbor: str | None | UndefinedType = Undefined, + per_link: PerLink | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - EncapsulationVlan. + Bfd. Subclass of AvdModel. Args: - client: Subclass of AvdModel. - network: - Network encapsulation are all optional, and skipped if using client unmatched. - - Subclass of - AvdModel. + echo: echo + interval: Interval in milliseconds. + min_rx: Rate in milliseconds. + multiplier: multiplier + neighbor: + IPv4 or IPv6 address. When the Port-channel is a L2 interface, a local L3 BFD address + (router_bfd.local_address) has to be defined globally on the switch. + per_link: Subclass of AvdModel. _custom_data: _custom_data """ - class LinkTrackingGroupsItem(AvdModel): + class ServicePolicy(AvdModel): """Subclass of AvdModel.""" - _fields: ClassVar[dict] = {"name": {"type": str}, "direction": {"type": str}, "_custom_data": {"type": dict}} - name: str - """Group name.""" - direction: Literal["upstream", "downstream"] | None - _custom_data: dict[str, Any] + class Pbr(AvdModel): + """Subclass of AvdModel.""" - if TYPE_CHECKING: + _fields: ClassVar[dict] = {"input": {"type": str}, "_custom_data": {"type": dict}} + input: str | None + """Policy Based Routing Policy-map name.""" + _custom_data: dict[str, Any] - def __init__( - self, - *, - name: str | UndefinedType = Undefined, - direction: Literal["upstream", "downstream"] | None | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: - """ - LinkTrackingGroupsItem. + if TYPE_CHECKING: + def __init__(self, *, input: str | None | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined) -> None: + """ + Pbr. - Subclass of AvdModel. - Args: - name: Group name. - direction: direction - _custom_data: _custom_data + Subclass of AvdModel. - """ + Args: + input: Policy Based Routing Policy-map name. + _custom_data: _custom_data - class LinkTrackingGroups(AvdIndexedList[str, LinkTrackingGroupsItem]): - """Subclass of AvdIndexedList with `LinkTrackingGroupsItem` items. Primary key is `name` (`str`).""" + """ - _primary_key: ClassVar[str] = "name" + class Qos(AvdModel): + """Subclass of AvdModel.""" - LinkTrackingGroups._item_type = LinkTrackingGroupsItem + _fields: ClassVar[dict] = {"input": {"type": str}, "_custom_data": {"type": dict}} + input: str + """Quality of Service Policy-map name.""" + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__(self, *, input: str | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined) -> None: + """ + Qos. - class LinkTracking(AvdModel): - """Subclass of AvdModel.""" - class Groups(AvdList[str]): - """Subclass of AvdList with `str` items.""" + Subclass of AvdModel. - Groups._item_type = str + Args: + input: Quality of Service Policy-map name. + _custom_data: _custom_data - _fields: ClassVar[dict] = {"direction": {"type": str}, "groups": {"type": Groups}, "_custom_data": {"type": dict}} - direction: Literal["upstream", "downstream"] | None - groups: Groups - """ - Link state group(s) an interface belongs to. + """ - Subclass of AvdList with `str` items. - """ + _fields: ClassVar[dict] = {"pbr": {"type": Pbr}, "qos": {"type": Qos}, "_custom_data": {"type": dict}} + pbr: Pbr + """Subclass of AvdModel.""" + qos: Qos + """Subclass of AvdModel.""" _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -27873,32 +28881,60 @@ class Groups(AvdList[str]): def __init__( self, *, - direction: Literal["upstream", "downstream"] | None | UndefinedType = Undefined, - groups: Groups | UndefinedType = Undefined, + pbr: Pbr | UndefinedType = Undefined, + qos: Qos | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - LinkTracking. + ServicePolicy. Subclass of AvdModel. Args: - direction: direction - groups: - Link state group(s) an interface belongs to. - - Subclass of AvdList with `str` items. + pbr: Subclass of AvdModel. + qos: Subclass of AvdModel. _custom_data: _custom_data """ - class Phone(AvdModel): + class Mpls(AvdModel): """Subclass of AvdModel.""" - _fields: ClassVar[dict] = {"trunk": {"type": str}, "vlan": {"type": int}, "_custom_data": {"type": dict}} - trunk: Literal["tagged", "untagged"] | None - vlan: int | None + class Ldp(AvdModel): + """Subclass of AvdModel.""" + + _fields: ClassVar[dict] = {"interface": {"type": bool}, "igp_sync": {"type": bool}, "_custom_data": {"type": dict}} + interface: bool | None + igp_sync: bool | None + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__( + self, + *, + interface: bool | None | UndefinedType = Undefined, + igp_sync: bool | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + Ldp. + + + Subclass of AvdModel. + + Args: + interface: interface + igp_sync: igp_sync + _custom_data: _custom_data + + """ + + _fields: ClassVar[dict] = {"ip": {"type": bool}, "ldp": {"type": Ldp}, "_custom_data": {"type": dict}} + ip: bool | None + ldp: Ldp + """Subclass of AvdModel.""" _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -27906,31 +28942,40 @@ class Phone(AvdModel): def __init__( self, *, - trunk: Literal["tagged", "untagged"] | None | UndefinedType = Undefined, - vlan: int | None | UndefinedType = Undefined, + ip: bool | None | UndefinedType = Undefined, + ldp: Ldp | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - Phone. + Mpls. Subclass of AvdModel. Args: - trunk: trunk - vlan: vlan + ip: ip + ldp: Subclass of AvdModel. _custom_data: _custom_data """ - class L2Protocol(AvdModel): + class VlanTranslationsItem(AvdModel): """Subclass of AvdModel.""" - _fields: ClassVar[dict] = {"encapsulation_dot1q_vlan": {"type": int}, "forwarding_profile": {"type": str}, "_custom_data": {"type": dict}} - encapsulation_dot1q_vlan: int | None - """Vlan tag to configure on sub-interface.""" - forwarding_profile: str | None - """L2 protocol forwarding profile.""" + _fields: ClassVar[dict] = { + "field_from": {"type": str}, + "to": {"type": int}, + "direction": {"type": str, "default": "both"}, + "_custom_data": {"type": dict}, + } + _field_to_key_map: ClassVar[dict] = {"field_from": "from"} + _key_to_field_map: ClassVar[dict] = {"from": "field_from"} + field_from: str | None + """List of vlans as string (only one vlan if direction is "both").""" + to: int | None + """VLAN ID.""" + direction: Literal["in", "out", "both"] + """Default value: `"both"`""" _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -27938,72 +28983,83 @@ class L2Protocol(AvdModel): def __init__( self, *, - encapsulation_dot1q_vlan: int | None | UndefinedType = Undefined, - forwarding_profile: str | None | UndefinedType = Undefined, + field_from: str | None | UndefinedType = Undefined, + to: int | None | UndefinedType = Undefined, + direction: Literal["in", "out", "both"] | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - L2Protocol. + VlanTranslationsItem. Subclass of AvdModel. Args: - encapsulation_dot1q_vlan: Vlan tag to configure on sub-interface. - forwarding_profile: L2 protocol forwarding profile. + field_from: List of vlans as string (only one vlan if direction is "both"). + to: VLAN ID. + direction: direction _custom_data: _custom_data """ - class TrunkGroups(AvdList[str]): - """Subclass of AvdList with `str` items.""" + class VlanTranslations(AvdList[VlanTranslationsItem]): + """Subclass of AvdList with `VlanTranslationsItem` items.""" - TrunkGroups._item_type = str + VlanTranslations._item_type = VlanTranslationsItem - class Qos(AvdModel): + class Shape(AvdModel): """Subclass of AvdModel.""" - _fields: ClassVar[dict] = {"trust": {"type": str}, "dscp": {"type": int}, "cos": {"type": int}, "_custom_data": {"type": dict}} - trust: Literal["dscp", "cos", "disabled"] | None - dscp: int | None - """DSCP value.""" - cos: int | None - """COS value.""" + _fields: ClassVar[dict] = {"rate": {"type": str}, "_custom_data": {"type": dict}} + rate: str | None + """ + Rate in kbps, pps or percent. + Supported options are platform dependent. + Examples: + - "5000 kbps" + - + "1000 pps" + - "20 percent" + """ _custom_data: dict[str, Any] if TYPE_CHECKING: - def __init__( - self, - *, - trust: Literal["dscp", "cos", "disabled"] | None | UndefinedType = Undefined, - dscp: int | None | UndefinedType = Undefined, - cos: int | None | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: + def __init__(self, *, rate: str | None | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined) -> None: """ - Qos. + Shape. Subclass of AvdModel. Args: - trust: trust - dscp: DSCP value. - cos: COS value. + rate: + Rate in kbps, pps or percent. + Supported options are platform dependent. + Examples: # fmt: skip + - "5000 kbps" + - + "1000 pps" + - "20 percent" _custom_data: _custom_data """ - class Bfd(AvdModel): + class StormControl(AvdModel): """Subclass of AvdModel.""" - class PerLink(AvdModel): + class All(AvdModel): """Subclass of AvdModel.""" - _fields: ClassVar[dict] = {"enabled": {"type": bool}, "rfc_7130": {"type": bool}, "_custom_data": {"type": dict}} - enabled: bool | None - rfc_7130: bool | None + _fields: ClassVar[dict] = {"level": {"type": str}, "unit": {"type": str, "default": "percent"}, "_custom_data": {"type": dict}} + level: str | None + """Configure maximum storm-control level.""" + unit: Literal["percent", "pps"] + """ + Optional field and is hardware dependent. + + Default value: `"percent"` + """ _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -28011,166 +29067,107 @@ class PerLink(AvdModel): def __init__( self, *, - enabled: bool | None | UndefinedType = Undefined, - rfc_7130: bool | None | UndefinedType = Undefined, + level: str | None | UndefinedType = Undefined, + unit: Literal["percent", "pps"] | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - PerLink. + All. Subclass of AvdModel. Args: - enabled: enabled - rfc_7130: rfc_7130 + level: Configure maximum storm-control level. + unit: Optional field and is hardware dependent. _custom_data: _custom_data """ - _fields: ClassVar[dict] = { - "echo": {"type": bool}, - "interval": {"type": int}, - "min_rx": {"type": int}, - "multiplier": {"type": int}, - "neighbor": {"type": str}, - "per_link": {"type": PerLink}, - "_custom_data": {"type": dict}, - } - echo: bool | None - interval: int | None - """Interval in milliseconds.""" - min_rx: int | None - """Rate in milliseconds.""" - multiplier: int | None - neighbor: str | None - """ - IPv4 or IPv6 address. When the Port-channel is a L2 interface, a local L3 BFD address - (router_bfd.local_address) has to be defined globally on the switch. - """ - per_link: PerLink - """Subclass of AvdModel.""" - _custom_data: dict[str, Any] - - if TYPE_CHECKING: - - def __init__( - self, - *, - echo: bool | None | UndefinedType = Undefined, - interval: int | None | UndefinedType = Undefined, - min_rx: int | None | UndefinedType = Undefined, - multiplier: int | None | UndefinedType = Undefined, - neighbor: str | None | UndefinedType = Undefined, - per_link: PerLink | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: - """ - Bfd. - - - Subclass of AvdModel. - - Args: - echo: echo - interval: Interval in milliseconds. - min_rx: Rate in milliseconds. - multiplier: multiplier - neighbor: - IPv4 or IPv6 address. When the Port-channel is a L2 interface, a local L3 BFD address - (router_bfd.local_address) has to be defined globally on the switch. - per_link: Subclass of AvdModel. - _custom_data: _custom_data - - """ - - class ServicePolicy(AvdModel): - """Subclass of AvdModel.""" - - class Pbr(AvdModel): + class Broadcast(AvdModel): """Subclass of AvdModel.""" - _fields: ClassVar[dict] = {"input": {"type": str}, "_custom_data": {"type": dict}} - input: str | None - """Policy Based Routing Policy-map name.""" + _fields: ClassVar[dict] = {"level": {"type": str}, "unit": {"type": str, "default": "percent"}, "_custom_data": {"type": dict}} + level: str | None + """Configure maximum storm-control level.""" + unit: Literal["percent", "pps"] + """ + Optional field and is hardware dependent. + + Default value: `"percent"` + """ _custom_data: dict[str, Any] if TYPE_CHECKING: - def __init__(self, *, input: str | None | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined) -> None: + def __init__( + self, + *, + level: str | None | UndefinedType = Undefined, + unit: Literal["percent", "pps"] | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: """ - Pbr. + Broadcast. Subclass of AvdModel. Args: - input: Policy Based Routing Policy-map name. + level: Configure maximum storm-control level. + unit: Optional field and is hardware dependent. _custom_data: _custom_data """ - class Qos(AvdModel): + class Multicast(AvdModel): """Subclass of AvdModel.""" - _fields: ClassVar[dict] = {"input": {"type": str}, "_custom_data": {"type": dict}} - input: str - """Quality of Service Policy-map name.""" + _fields: ClassVar[dict] = {"level": {"type": str}, "unit": {"type": str, "default": "percent"}, "_custom_data": {"type": dict}} + level: str | None + """Configure maximum storm-control level.""" + unit: Literal["percent", "pps"] + """ + Optional field and is hardware dependent. + + Default value: `"percent"` + """ _custom_data: dict[str, Any] if TYPE_CHECKING: - def __init__(self, *, input: str | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined) -> None: + def __init__( + self, + *, + level: str | None | UndefinedType = Undefined, + unit: Literal["percent", "pps"] | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: """ - Qos. + Multicast. Subclass of AvdModel. Args: - input: Quality of Service Policy-map name. + level: Configure maximum storm-control level. + unit: Optional field and is hardware dependent. _custom_data: _custom_data """ - _fields: ClassVar[dict] = {"pbr": {"type": Pbr}, "qos": {"type": Qos}, "_custom_data": {"type": dict}} - pbr: Pbr - """Subclass of AvdModel.""" - qos: Qos - """Subclass of AvdModel.""" - _custom_data: dict[str, Any] - - if TYPE_CHECKING: - - def __init__( - self, - *, - pbr: Pbr | UndefinedType = Undefined, - qos: Qos | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: - """ - ServicePolicy. - - - Subclass of AvdModel. - - Args: - pbr: Subclass of AvdModel. - qos: Subclass of AvdModel. - _custom_data: _custom_data - - """ - - class Mpls(AvdModel): - """Subclass of AvdModel.""" - - class Ldp(AvdModel): + class UnknownUnicast(AvdModel): """Subclass of AvdModel.""" - _fields: ClassVar[dict] = {"interface": {"type": bool}, "igp_sync": {"type": bool}, "_custom_data": {"type": dict}} - interface: bool | None - igp_sync: bool | None + _fields: ClassVar[dict] = {"level": {"type": str}, "unit": {"type": str, "default": "percent"}, "_custom_data": {"type": dict}} + level: str | None + """Configure maximum storm-control level.""" + unit: Literal["percent", "pps"] + """ + Optional field and is hardware dependent. + + Default value: `"percent"` + """ _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -28178,26 +29175,37 @@ class Ldp(AvdModel): def __init__( self, *, - interface: bool | None | UndefinedType = Undefined, - igp_sync: bool | None | UndefinedType = Undefined, + level: str | None | UndefinedType = Undefined, + unit: Literal["percent", "pps"] | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - Ldp. + UnknownUnicast. Subclass of AvdModel. Args: - interface: interface - igp_sync: igp_sync + level: Configure maximum storm-control level. + unit: Optional field and is hardware dependent. _custom_data: _custom_data """ - _fields: ClassVar[dict] = {"ip": {"type": bool}, "ldp": {"type": Ldp}, "_custom_data": {"type": dict}} - ip: bool | None - ldp: Ldp + _fields: ClassVar[dict] = { + "all": {"type": All}, + "broadcast": {"type": Broadcast}, + "multicast": {"type": Multicast}, + "unknown_unicast": {"type": UnknownUnicast}, + "_custom_data": {"type": dict}, + } + all: All + """Subclass of AvdModel.""" + broadcast: Broadcast + """Subclass of AvdModel.""" + multicast: Multicast + """Subclass of AvdModel.""" + unknown_unicast: UnknownUnicast """Subclass of AvdModel.""" _custom_data: dict[str, Any] @@ -28206,124 +29214,174 @@ def __init__( def __init__( self, *, - ip: bool | None | UndefinedType = Undefined, - ldp: Ldp | UndefinedType = Undefined, + all: All | UndefinedType = Undefined, + broadcast: Broadcast | UndefinedType = Undefined, + multicast: Multicast | UndefinedType = Undefined, + unknown_unicast: UnknownUnicast | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - Mpls. + StormControl. Subclass of AvdModel. Args: - ip: ip - ldp: Subclass of AvdModel. + all: Subclass of AvdModel. + broadcast: Subclass of AvdModel. + multicast: Subclass of AvdModel. + unknown_unicast: Subclass of AvdModel. _custom_data: _custom_data """ - class VlanTranslationsItem(AvdModel): + class IsisAuthentication(AvdModel): """Subclass of AvdModel.""" - _fields: ClassVar[dict] = { - "field_from": {"type": str}, - "to": {"type": int}, - "direction": {"type": str, "default": "both"}, - "_custom_data": {"type": dict}, - } - _field_to_key_map: ClassVar[dict] = {"field_from": "from"} - _key_to_field_map: ClassVar[dict] = {"from": "field_from"} - field_from: str | None - """List of vlans as string (only one vlan if direction is "both").""" - to: int | None - """VLAN ID.""" - direction: Literal["in", "out", "both"] - """Default value: `"both"`""" - _custom_data: dict[str, Any] + class Both(AvdModel): + """Subclass of AvdModel.""" - if TYPE_CHECKING: + class KeyIdsItem(AvdModel): + """Subclass of AvdModel.""" - def __init__( - self, - *, - field_from: str | None | UndefinedType = Undefined, - to: int | None | UndefinedType = Undefined, - direction: Literal["in", "out", "both"] | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: - """ - VlanTranslationsItem. + _fields: ClassVar[dict] = { + "id": {"type": int}, + "algorithm": {"type": str}, + "key_type": {"type": str}, + "key": {"type": str}, + "rfc_5310": {"type": bool}, + "_custom_data": {"type": dict}, + } + id: int + """Configure authentication key-id.""" + algorithm: Literal["sha-1", "sha-224", "sha-256", "sha-384", "sha-512"] + key_type: Literal["0", "7", "8a"] + """Configure authentication key type.""" + key: str + """Password string.""" + rfc_5310: bool | None + """SHA digest computation according to rfc5310.""" + _custom_data: dict[str, Any] + if TYPE_CHECKING: - Subclass of AvdModel. + def __init__( + self, + *, + id: int | UndefinedType = Undefined, + algorithm: Literal["sha-1", "sha-224", "sha-256", "sha-384", "sha-512"] | UndefinedType = Undefined, + key_type: Literal["0", "7", "8a"] | UndefinedType = Undefined, + key: str | UndefinedType = Undefined, + rfc_5310: bool | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + KeyIdsItem. - Args: - field_from: List of vlans as string (only one vlan if direction is "both"). - to: VLAN ID. - direction: direction - _custom_data: _custom_data - """ + Subclass of AvdModel. - class VlanTranslations(AvdList[VlanTranslationsItem]): - """Subclass of AvdList with `VlanTranslationsItem` items.""" + Args: + id: Configure authentication key-id. + algorithm: algorithm + key_type: Configure authentication key type. + key: Password string. + rfc_5310: SHA digest computation according to rfc5310. + _custom_data: _custom_data - VlanTranslations._item_type = VlanTranslationsItem + """ - class Shape(AvdModel): - """Subclass of AvdModel.""" + class KeyIds(AvdIndexedList[int, KeyIdsItem]): + """Subclass of AvdIndexedList with `KeyIdsItem` items. Primary key is `id` (`int`).""" - _fields: ClassVar[dict] = {"rate": {"type": str}, "_custom_data": {"type": dict}} - rate: str | None - """ - Rate in kbps, pps or percent. - Supported options are platform dependent. - Examples: - - "5000 kbps" - - - "1000 pps" - - "20 percent" - """ - _custom_data: dict[str, Any] + _primary_key: ClassVar[str] = "id" + + KeyIds._item_type = KeyIdsItem + + class Sha(AvdModel): + """Subclass of AvdModel.""" + + _fields: ClassVar[dict] = {"key_id": {"type": int}, "_custom_data": {"type": dict}} + key_id: int + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__(self, *, key_id: int | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined) -> None: + """ + Sha. + + + Subclass of AvdModel. + + Args: + key_id: key_id + _custom_data: _custom_data - if TYPE_CHECKING: + """ - def __init__(self, *, rate: str | None | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined) -> None: - """ - Shape. + class SharedSecret(AvdModel): + """Subclass of AvdModel.""" + _fields: ClassVar[dict] = {"profile": {"type": str}, "algorithm": {"type": str}, "_custom_data": {"type": dict}} + profile: str + algorithm: Literal["md5", "sha-1", "sha-224", "sha-256", "sha-384", "sha-512"] + _custom_data: dict[str, Any] - Subclass of AvdModel. + if TYPE_CHECKING: - Args: - rate: - Rate in kbps, pps or percent. - Supported options are platform dependent. - Examples: # fmt: skip - - "5000 kbps" - - - "1000 pps" - - "20 percent" - _custom_data: _custom_data + def __init__( + self, + *, + profile: str | UndefinedType = Undefined, + algorithm: Literal["md5", "sha-1", "sha-224", "sha-256", "sha-384", "sha-512"] | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + SharedSecret. - """ - class StormControl(AvdModel): - """Subclass of AvdModel.""" + Subclass of AvdModel. - class All(AvdModel): - """Subclass of AvdModel.""" + Args: + profile: profile + algorithm: algorithm + _custom_data: _custom_data - _fields: ClassVar[dict] = {"level": {"type": str}, "unit": {"type": str, "default": "percent"}, "_custom_data": {"type": dict}} - level: str | None - """Configure maximum storm-control level.""" - unit: Literal["percent", "pps"] + """ + + _fields: ClassVar[dict] = { + "key_type": {"type": str}, + "key": {"type": str}, + "key_ids": {"type": KeyIds}, + "mode": {"type": str}, + "sha": {"type": Sha}, + "shared_secret": {"type": SharedSecret}, + "rx_disabled": {"type": bool}, + "_custom_data": {"type": dict}, + } + key_type: Literal["0", "7", "8a"] | None + """Configure authentication key type.""" + key: str | None + """Password string. `key_type` is required for this setting.""" + key_ids: KeyIds + """Subclass of AvdIndexedList with `KeyIdsItem` items. Primary key is `id` (`int`).""" + mode: Literal["md5", "sha", "text", "shared-secret"] | None + """Authentication mode.""" + sha: Sha """ - Optional field and is hardware dependent. + Required settings for authentication mode 'sha'. - Default value: `"percent"` + Subclass of AvdModel. """ + shared_secret: SharedSecret + """ + Required settings for authentication mode 'shared_secret'. + + Subclass of AvdModel. + """ + rx_disabled: bool | None + """Disable authentication check on the receive side.""" _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -28331,107 +29389,183 @@ class All(AvdModel): def __init__( self, *, - level: str | None | UndefinedType = Undefined, - unit: Literal["percent", "pps"] | UndefinedType = Undefined, + key_type: Literal["0", "7", "8a"] | None | UndefinedType = Undefined, + key: str | None | UndefinedType = Undefined, + key_ids: KeyIds | UndefinedType = Undefined, + mode: Literal["md5", "sha", "text", "shared-secret"] | None | UndefinedType = Undefined, + sha: Sha | UndefinedType = Undefined, + shared_secret: SharedSecret | UndefinedType = Undefined, + rx_disabled: bool | None | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - All. + Both. Subclass of AvdModel. Args: - level: Configure maximum storm-control level. - unit: Optional field and is hardware dependent. + key_type: Configure authentication key type. + key: Password string. `key_type` is required for this setting. + key_ids: Subclass of AvdIndexedList with `KeyIdsItem` items. Primary key is `id` (`int`). + mode: Authentication mode. + sha: + Required settings for authentication mode 'sha'. + + Subclass of AvdModel. + shared_secret: + Required settings for authentication mode 'shared_secret'. + + Subclass of AvdModel. + rx_disabled: Disable authentication check on the receive side. _custom_data: _custom_data """ - class Broadcast(AvdModel): + class Level1(AvdModel): """Subclass of AvdModel.""" - _fields: ClassVar[dict] = {"level": {"type": str}, "unit": {"type": str, "default": "percent"}, "_custom_data": {"type": dict}} - level: str | None - """Configure maximum storm-control level.""" - unit: Literal["percent", "pps"] - """ - Optional field and is hardware dependent. + class KeyIdsItem(AvdModel): + """Subclass of AvdModel.""" - Default value: `"percent"` - """ - _custom_data: dict[str, Any] + _fields: ClassVar[dict] = { + "id": {"type": int}, + "algorithm": {"type": str}, + "key_type": {"type": str}, + "key": {"type": str}, + "rfc_5310": {"type": bool}, + "_custom_data": {"type": dict}, + } + id: int + """Configure authentication key-id.""" + algorithm: Literal["sha-1", "sha-224", "sha-256", "sha-384", "sha-512"] + key_type: Literal["0", "7", "8a"] + """Configure authentication key type.""" + key: str + """Password string.""" + rfc_5310: bool | None + """SHA digest computation according to rfc5310.""" + _custom_data: dict[str, Any] - if TYPE_CHECKING: + if TYPE_CHECKING: - def __init__( - self, - *, - level: str | None | UndefinedType = Undefined, - unit: Literal["percent", "pps"] | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: - """ - Broadcast. + def __init__( + self, + *, + id: int | UndefinedType = Undefined, + algorithm: Literal["sha-1", "sha-224", "sha-256", "sha-384", "sha-512"] | UndefinedType = Undefined, + key_type: Literal["0", "7", "8a"] | UndefinedType = Undefined, + key: str | UndefinedType = Undefined, + rfc_5310: bool | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + KeyIdsItem. - Subclass of AvdModel. + Subclass of AvdModel. - Args: - level: Configure maximum storm-control level. - unit: Optional field and is hardware dependent. - _custom_data: _custom_data + Args: + id: Configure authentication key-id. + algorithm: algorithm + key_type: Configure authentication key type. + key: Password string. + rfc_5310: SHA digest computation according to rfc5310. + _custom_data: _custom_data - """ + """ - class Multicast(AvdModel): - """Subclass of AvdModel.""" + class KeyIds(AvdIndexedList[int, KeyIdsItem]): + """Subclass of AvdIndexedList with `KeyIdsItem` items. Primary key is `id` (`int`).""" - _fields: ClassVar[dict] = {"level": {"type": str}, "unit": {"type": str, "default": "percent"}, "_custom_data": {"type": dict}} - level: str | None - """Configure maximum storm-control level.""" - unit: Literal["percent", "pps"] - """ - Optional field and is hardware dependent. + _primary_key: ClassVar[str] = "id" - Default value: `"percent"` - """ - _custom_data: dict[str, Any] + KeyIds._item_type = KeyIdsItem - if TYPE_CHECKING: + class Sha(AvdModel): + """Subclass of AvdModel.""" - def __init__( - self, - *, - level: str | None | UndefinedType = Undefined, - unit: Literal["percent", "pps"] | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: - """ - Multicast. + _fields: ClassVar[dict] = {"key_id": {"type": int}, "_custom_data": {"type": dict}} + key_id: int + _custom_data: dict[str, Any] + if TYPE_CHECKING: - Subclass of AvdModel. + def __init__(self, *, key_id: int | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined) -> None: + """ + Sha. - Args: - level: Configure maximum storm-control level. - unit: Optional field and is hardware dependent. - _custom_data: _custom_data - """ + Subclass of AvdModel. - class UnknownUnicast(AvdModel): - """Subclass of AvdModel.""" + Args: + key_id: key_id + _custom_data: _custom_data + + """ + + class SharedSecret(AvdModel): + """Subclass of AvdModel.""" + + _fields: ClassVar[dict] = {"profile": {"type": str}, "algorithm": {"type": str}, "_custom_data": {"type": dict}} + profile: str + algorithm: Literal["md5", "sha-1", "sha-224", "sha-256", "sha-384", "sha-512"] + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__( + self, + *, + profile: str | UndefinedType = Undefined, + algorithm: Literal["md5", "sha-1", "sha-224", "sha-256", "sha-384", "sha-512"] | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + SharedSecret. + + + Subclass of AvdModel. + + Args: + profile: profile + algorithm: algorithm + _custom_data: _custom_data + + """ + + _fields: ClassVar[dict] = { + "key_type": {"type": str}, + "key": {"type": str}, + "key_ids": {"type": KeyIds}, + "mode": {"type": str}, + "sha": {"type": Sha}, + "shared_secret": {"type": SharedSecret}, + "rx_disabled": {"type": bool}, + "_custom_data": {"type": dict}, + } + key_type: Literal["0", "7", "8a"] | None + """Configure authentication key type.""" + key: str | None + """Password string. `key_type` is required for this setting.""" + key_ids: KeyIds + """Subclass of AvdIndexedList with `KeyIdsItem` items. Primary key is `id` (`int`).""" + mode: Literal["md5", "sha", "text", "shared-secret"] | None + """Authentication mode.""" + sha: Sha + """ + Required settings for authentication mode 'sha'. - _fields: ClassVar[dict] = {"level": {"type": str}, "unit": {"type": str, "default": "percent"}, "_custom_data": {"type": dict}} - level: str | None - """Configure maximum storm-control level.""" - unit: Literal["percent", "pps"] + Subclass of AvdModel. """ - Optional field and is hardware dependent. + shared_secret: SharedSecret + """ + Required settings for authentication mode 'shared_secret'. - Default value: `"percent"` + Subclass of AvdModel. """ + rx_disabled: bool | None + """Disable authentication check on the receive side.""" _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -28439,70 +29573,40 @@ class UnknownUnicast(AvdModel): def __init__( self, *, - level: str | None | UndefinedType = Undefined, - unit: Literal["percent", "pps"] | UndefinedType = Undefined, + key_type: Literal["0", "7", "8a"] | None | UndefinedType = Undefined, + key: str | None | UndefinedType = Undefined, + key_ids: KeyIds | UndefinedType = Undefined, + mode: Literal["md5", "sha", "text", "shared-secret"] | None | UndefinedType = Undefined, + sha: Sha | UndefinedType = Undefined, + shared_secret: SharedSecret | UndefinedType = Undefined, + rx_disabled: bool | None | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - UnknownUnicast. + Level1. Subclass of AvdModel. Args: - level: Configure maximum storm-control level. - unit: Optional field and is hardware dependent. - _custom_data: _custom_data - - """ - - _fields: ClassVar[dict] = { - "all": {"type": All}, - "broadcast": {"type": Broadcast}, - "multicast": {"type": Multicast}, - "unknown_unicast": {"type": UnknownUnicast}, - "_custom_data": {"type": dict}, - } - all: All - """Subclass of AvdModel.""" - broadcast: Broadcast - """Subclass of AvdModel.""" - multicast: Multicast - """Subclass of AvdModel.""" - unknown_unicast: UnknownUnicast - """Subclass of AvdModel.""" - _custom_data: dict[str, Any] - - if TYPE_CHECKING: - - def __init__( - self, - *, - all: All | UndefinedType = Undefined, - broadcast: Broadcast | UndefinedType = Undefined, - multicast: Multicast | UndefinedType = Undefined, - unknown_unicast: UnknownUnicast | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: - """ - StormControl. - - - Subclass of AvdModel. + key_type: Configure authentication key type. + key: Password string. `key_type` is required for this setting. + key_ids: Subclass of AvdIndexedList with `KeyIdsItem` items. Primary key is `id` (`int`). + mode: Authentication mode. + sha: + Required settings for authentication mode 'sha'. - Args: - all: Subclass of AvdModel. - broadcast: Subclass of AvdModel. - multicast: Subclass of AvdModel. - unknown_unicast: Subclass of AvdModel. - _custom_data: _custom_data + Subclass of AvdModel. + shared_secret: + Required settings for authentication mode 'shared_secret'. - """ + Subclass of AvdModel. + rx_disabled: Disable authentication check on the receive side. + _custom_data: _custom_data - class IsisAuthentication(AvdModel): - """Subclass of AvdModel.""" + """ - class Both(AvdModel): + class Level2(AvdModel): """Subclass of AvdModel.""" class KeyIdsItem(AvdModel): @@ -28640,12 +29744,163 @@ def __init__( """ shared_secret: SharedSecret """ - Required settings for authentication mode 'shared_secret'. + Required settings for authentication mode 'shared_secret'. + + Subclass of AvdModel. + """ + rx_disabled: bool | None + """Disable authentication check on the receive side.""" + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__( + self, + *, + key_type: Literal["0", "7", "8a"] | None | UndefinedType = Undefined, + key: str | None | UndefinedType = Undefined, + key_ids: KeyIds | UndefinedType = Undefined, + mode: Literal["md5", "sha", "text", "shared-secret"] | None | UndefinedType = Undefined, + sha: Sha | UndefinedType = Undefined, + shared_secret: SharedSecret | UndefinedType = Undefined, + rx_disabled: bool | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + Level2. + + + Subclass of AvdModel. + + Args: + key_type: Configure authentication key type. + key: Password string. `key_type` is required for this setting. + key_ids: Subclass of AvdIndexedList with `KeyIdsItem` items. Primary key is `id` (`int`). + mode: Authentication mode. + sha: + Required settings for authentication mode 'sha'. + + Subclass of AvdModel. + shared_secret: + Required settings for authentication mode 'shared_secret'. + + Subclass of AvdModel. + rx_disabled: Disable authentication check on the receive side. + _custom_data: _custom_data + + """ + + _fields: ClassVar[dict] = {"both": {"type": Both}, "level_1": {"type": Level1}, "level_2": {"type": Level2}, "_custom_data": {"type": dict}} + both: Both + """ + Authentication settings for level-1 and level-2. 'both' takes precedence over 'level_1' and + 'level_2' settings. + + Subclass of AvdModel. + """ + level_1: Level1 + """ + Authentication settings for level-1. 'both' takes precedence over 'level_1' and 'level_2' settings. + Subclass of AvdModel. + """ + level_2: Level2 + """ + Authentication settings for level-2. 'both' takes precedence over 'level_1' and 'level_2' settings. + Subclass of AvdModel. + """ + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__( + self, + *, + both: Both | UndefinedType = Undefined, + level_1: Level1 | UndefinedType = Undefined, + level_2: Level2 | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + IsisAuthentication. + + + Subclass of AvdModel. + + Args: + both: + Authentication settings for level-1 and level-2. 'both' takes precedence over 'level_1' and + 'level_2' settings. + + Subclass of AvdModel. + level_1: + Authentication settings for level-1. 'both' takes precedence over 'level_1' and 'level_2' settings. + Subclass of AvdModel. + level_2: + Authentication settings for level-2. 'both' takes precedence over 'level_1' and 'level_2' settings. + Subclass of AvdModel. + _custom_data: _custom_data + + """ + + class TrafficPolicy(AvdModel): + """Subclass of AvdModel.""" + + _fields: ClassVar[dict] = {"input": {"type": str}, "output": {"type": str}, "_custom_data": {"type": dict}} + input: str | None + """Ingress traffic policy.""" + output: str | None + """Egress traffic policy.""" + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__( + self, + *, + input: str | None | UndefinedType = Undefined, + output: str | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + TrafficPolicy. + + + Subclass of AvdModel. + + Args: + input: Ingress traffic policy. + output: Egress traffic policy. + _custom_data: _custom_data + + """ + + class EvpnEthernetSegment(AvdModel): + """Subclass of AvdModel.""" + + class DesignatedForwarderElection(AvdModel): + """Subclass of AvdModel.""" + + _fields: ClassVar[dict] = { + "algorithm": {"type": str}, + "preference_value": {"type": int}, + "dont_preempt": {"type": bool, "default": False}, + "hold_time": {"type": int}, + "subsequent_hold_time": {"type": int}, + "candidate_reachability_required": {"type": bool}, + "_custom_data": {"type": dict}, + } + algorithm: Literal["modulus", "preference"] | None + preference_value: int | None + """Preference_value is only used when "algorithm" is "preference".""" + dont_preempt: bool + """ + Dont_preempt is only used when "algorithm" is "preference". - Subclass of AvdModel. + Default value: `False` """ - rx_disabled: bool | None - """Disable authentication check on the receive side.""" + hold_time: int | None + subsequent_hold_time: int | None + candidate_reachability_required: bool | None _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -28653,127 +29908,149 @@ def __init__( def __init__( self, *, - key_type: Literal["0", "7", "8a"] | None | UndefinedType = Undefined, - key: str | None | UndefinedType = Undefined, - key_ids: KeyIds | UndefinedType = Undefined, - mode: Literal["md5", "sha", "text", "shared-secret"] | None | UndefinedType = Undefined, - sha: Sha | UndefinedType = Undefined, - shared_secret: SharedSecret | UndefinedType = Undefined, - rx_disabled: bool | None | UndefinedType = Undefined, + algorithm: Literal["modulus", "preference"] | None | UndefinedType = Undefined, + preference_value: int | None | UndefinedType = Undefined, + dont_preempt: bool | UndefinedType = Undefined, + hold_time: int | None | UndefinedType = Undefined, + subsequent_hold_time: int | None | UndefinedType = Undefined, + candidate_reachability_required: bool | None | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - Both. + DesignatedForwarderElection. Subclass of AvdModel. Args: - key_type: Configure authentication key type. - key: Password string. `key_type` is required for this setting. - key_ids: Subclass of AvdIndexedList with `KeyIdsItem` items. Primary key is `id` (`int`). - mode: Authentication mode. - sha: - Required settings for authentication mode 'sha'. - - Subclass of AvdModel. - shared_secret: - Required settings for authentication mode 'shared_secret'. - - Subclass of AvdModel. - rx_disabled: Disable authentication check on the receive side. + algorithm: algorithm + preference_value: Preference_value is only used when "algorithm" is "preference". + dont_preempt: Dont_preempt is only used when "algorithm" is "preference". + hold_time: hold_time + subsequent_hold_time: subsequent_hold_time + candidate_reachability_required: candidate_reachability_required _custom_data: _custom_data """ - class Level1(AvdModel): + class Mpls(AvdModel): """Subclass of AvdModel.""" - class KeyIdsItem(AvdModel): - """Subclass of AvdModel.""" + _fields: ClassVar[dict] = {"shared_index": {"type": int}, "tunnel_flood_filter_time": {"type": int}, "_custom_data": {"type": dict}} + shared_index: int | None + tunnel_flood_filter_time: int | None + _custom_data: dict[str, Any] - _fields: ClassVar[dict] = { - "id": {"type": int}, - "algorithm": {"type": str}, - "key_type": {"type": str}, - "key": {"type": str}, - "rfc_5310": {"type": bool}, - "_custom_data": {"type": dict}, - } - id: int - """Configure authentication key-id.""" - algorithm: Literal["sha-1", "sha-224", "sha-256", "sha-384", "sha-512"] - key_type: Literal["0", "7", "8a"] - """Configure authentication key type.""" - key: str - """Password string.""" - rfc_5310: bool | None - """SHA digest computation according to rfc5310.""" - _custom_data: dict[str, Any] + if TYPE_CHECKING: - if TYPE_CHECKING: + def __init__( + self, + *, + shared_index: int | None | UndefinedType = Undefined, + tunnel_flood_filter_time: int | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + Mpls. - def __init__( - self, - *, - id: int | UndefinedType = Undefined, - algorithm: Literal["sha-1", "sha-224", "sha-256", "sha-384", "sha-512"] | UndefinedType = Undefined, - key_type: Literal["0", "7", "8a"] | UndefinedType = Undefined, - key: str | UndefinedType = Undefined, - rfc_5310: bool | None | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: - """ - KeyIdsItem. + Subclass of AvdModel. - Subclass of AvdModel. + Args: + shared_index: shared_index + tunnel_flood_filter_time: tunnel_flood_filter_time + _custom_data: _custom_data - Args: - id: Configure authentication key-id. - algorithm: algorithm - key_type: Configure authentication key type. - key: Password string. - rfc_5310: SHA digest computation according to rfc5310. - _custom_data: _custom_data + """ - """ + _fields: ClassVar[dict] = { + "identifier": {"type": str}, + "redundancy": {"type": str}, + "designated_forwarder_election": {"type": DesignatedForwarderElection}, + "mpls": {"type": Mpls}, + "route_target": {"type": str}, + "_custom_data": {"type": dict}, + } + identifier: str | None + """EVPN Ethernet Segment Identifier (Type 1 format).""" + redundancy: Literal["all-active", "single-active"] | None + designated_forwarder_election: DesignatedForwarderElection + """Subclass of AvdModel.""" + mpls: Mpls + """Subclass of AvdModel.""" + route_target: str | None + """EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx.""" + _custom_data: dict[str, Any] - class KeyIds(AvdIndexedList[int, KeyIdsItem]): - """Subclass of AvdIndexedList with `KeyIdsItem` items. Primary key is `id` (`int`).""" + if TYPE_CHECKING: - _primary_key: ClassVar[str] = "id" + def __init__( + self, + *, + identifier: str | None | UndefinedType = Undefined, + redundancy: Literal["all-active", "single-active"] | None | UndefinedType = Undefined, + designated_forwarder_election: DesignatedForwarderElection | UndefinedType = Undefined, + mpls: Mpls | UndefinedType = Undefined, + route_target: str | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + EvpnEthernetSegment. - KeyIds._item_type = KeyIdsItem - class Sha(AvdModel): - """Subclass of AvdModel.""" + Subclass of AvdModel. - _fields: ClassVar[dict] = {"key_id": {"type": int}, "_custom_data": {"type": dict}} - key_id: int - _custom_data: dict[str, Any] + Args: + identifier: EVPN Ethernet Segment Identifier (Type 1 format). + redundancy: redundancy + designated_forwarder_election: Subclass of AvdModel. + mpls: Subclass of AvdModel. + route_target: EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx. + _custom_data: _custom_data - if TYPE_CHECKING: + """ - def __init__(self, *, key_id: int | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined) -> None: - """ - Sha. + class Ptp(AvdModel): + """Subclass of AvdModel.""" + class Announce(AvdModel): + """Subclass of AvdModel.""" - Subclass of AvdModel. + _fields: ClassVar[dict] = {"interval": {"type": int}, "timeout": {"type": int}, "_custom_data": {"type": dict}} + interval: int | None + timeout: int | None + _custom_data: dict[str, Any] - Args: - key_id: key_id - _custom_data: _custom_data + if TYPE_CHECKING: - """ + def __init__( + self, + *, + interval: int | None | UndefinedType = Undefined, + timeout: int | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + Announce. - class SharedSecret(AvdModel): + + Subclass of AvdModel. + + Args: + interval: interval + timeout: timeout + _custom_data: _custom_data + + """ + + class Profile(AvdModel): + """Subclass of AvdModel.""" + + class G82751(AvdModel): """Subclass of AvdModel.""" - _fields: ClassVar[dict] = {"profile": {"type": str}, "algorithm": {"type": str}, "_custom_data": {"type": dict}} - profile: str - algorithm: Literal["md5", "sha-1", "sha-224", "sha-256", "sha-384", "sha-512"] + _fields: ClassVar[dict] = {"destination_mac_address": {"type": str}, "_custom_data": {"type": dict}} + destination_mac_address: Literal["forwardable", "non-forwardable"] | None _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -28781,118 +30058,164 @@ class SharedSecret(AvdModel): def __init__( self, *, - profile: str | UndefinedType = Undefined, - algorithm: Literal["md5", "sha-1", "sha-224", "sha-256", "sha-384", "sha-512"] | UndefinedType = Undefined, + destination_mac_address: Literal["forwardable", "non-forwardable"] | None | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - SharedSecret. + G82751. Subclass of AvdModel. Args: - profile: profile - algorithm: algorithm + destination_mac_address: destination_mac_address _custom_data: _custom_data """ - _fields: ClassVar[dict] = { - "key_type": {"type": str}, - "key": {"type": str}, - "key_ids": {"type": KeyIds}, - "mode": {"type": str}, - "sha": {"type": Sha}, - "shared_secret": {"type": SharedSecret}, - "rx_disabled": {"type": bool}, - "_custom_data": {"type": dict}, - } - key_type: Literal["0", "7", "8a"] | None - """Configure authentication key type.""" - key: str | None - """Password string. `key_type` is required for this setting.""" - key_ids: KeyIds - """Subclass of AvdIndexedList with `KeyIdsItem` items. Primary key is `id` (`int`).""" - mode: Literal["md5", "sha", "text", "shared-secret"] | None - """Authentication mode.""" - sha: Sha - """ - Required settings for authentication mode 'sha'. + _fields: ClassVar[dict] = {"g8275_1": {"type": G82751}, "_custom_data": {"type": dict}} + g8275_1: G82751 + """Subclass of AvdModel.""" + _custom_data: dict[str, Any] - Subclass of AvdModel. - """ - shared_secret: SharedSecret - """ - Required settings for authentication mode 'shared_secret'. + if TYPE_CHECKING: + + def __init__(self, *, g8275_1: G82751 | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined) -> None: + """ + Profile. + + + Subclass of AvdModel. + + Args: + g8275_1: Subclass of AvdModel. + _custom_data: _custom_data + + """ + + class SyncMessage(AvdModel): + """Subclass of AvdModel.""" - Subclass of AvdModel. - """ - rx_disabled: bool | None - """Disable authentication check on the receive side.""" + _fields: ClassVar[dict] = {"interval": {"type": int}, "_custom_data": {"type": dict}} + interval: int | None _custom_data: dict[str, Any] if TYPE_CHECKING: - def __init__( - self, - *, - key_type: Literal["0", "7", "8a"] | None | UndefinedType = Undefined, - key: str | None | UndefinedType = Undefined, - key_ids: KeyIds | UndefinedType = Undefined, - mode: Literal["md5", "sha", "text", "shared-secret"] | None | UndefinedType = Undefined, - sha: Sha | UndefinedType = Undefined, - shared_secret: SharedSecret | UndefinedType = Undefined, - rx_disabled: bool | None | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: + def __init__(self, *, interval: int | None | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined) -> None: """ - Level1. + SyncMessage. Subclass of AvdModel. Args: - key_type: Configure authentication key type. - key: Password string. `key_type` is required for this setting. - key_ids: Subclass of AvdIndexedList with `KeyIdsItem` items. Primary key is `id` (`int`). - mode: Authentication mode. - sha: - Required settings for authentication mode 'sha'. - - Subclass of AvdModel. - shared_secret: - Required settings for authentication mode 'shared_secret'. - - Subclass of AvdModel. - rx_disabled: Disable authentication check on the receive side. + interval: interval _custom_data: _custom_data """ - class Level2(AvdModel): + _fields: ClassVar[dict] = { + "enable": {"type": bool}, + "announce": {"type": Announce}, + "delay_req": {"type": int}, + "delay_mechanism": {"type": str}, + "profile": {"type": Profile}, + "sync_message": {"type": SyncMessage}, + "role": {"type": str}, + "vlan": {"type": str}, + "transport": {"type": str}, + "mpass": {"type": bool}, + "_custom_data": {"type": dict}, + } + enable: bool | None + announce: Announce + """Subclass of AvdModel.""" + delay_req: int | None + delay_mechanism: Literal["e2e", "p2p"] | None + profile: Profile + """Subclass of AvdModel.""" + sync_message: SyncMessage + """Subclass of AvdModel.""" + role: Literal["master", "dynamic"] | None + vlan: str | None + """VLAN can be 'all' or list of vlans as string.""" + transport: Literal["ipv4", "ipv6", "layer2"] | None + mpass: bool | None + """ + When MPASS is enabled on an MLAG port-channel, MLAG peers coordinate to function as a single PTP + logical device. + Arista PTP enabled devices always place PTP messages on the same physical link + within the port-channel. + Hence, MPASS is needed only on MLAG port-channels connected to non-Arista + devices. + """ + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__( + self, + *, + enable: bool | None | UndefinedType = Undefined, + announce: Announce | UndefinedType = Undefined, + delay_req: int | None | UndefinedType = Undefined, + delay_mechanism: Literal["e2e", "p2p"] | None | UndefinedType = Undefined, + profile: Profile | UndefinedType = Undefined, + sync_message: SyncMessage | UndefinedType = Undefined, + role: Literal["master", "dynamic"] | None | UndefinedType = Undefined, + vlan: str | None | UndefinedType = Undefined, + transport: Literal["ipv4", "ipv6", "layer2"] | None | UndefinedType = Undefined, + mpass: bool | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + Ptp. + + + Subclass of AvdModel. + + Args: + enable: enable + announce: Subclass of AvdModel. + delay_req: delay_req + delay_mechanism: delay_mechanism + profile: Subclass of AvdModel. + sync_message: Subclass of AvdModel. + role: role + vlan: VLAN can be 'all' or list of vlans as string. + transport: transport + mpass: + When MPASS is enabled on an MLAG port-channel, MLAG peers coordinate to function as a single PTP + logical device. + Arista PTP enabled devices always place PTP messages on the same physical link + within the port-channel. + Hence, MPASS is needed only on MLAG port-channels connected to non-Arista + devices. + _custom_data: _custom_data + + """ + + class IpNat(AvdModel): + """Subclass of AvdModel.""" + + class Destination(AvdModel): """Subclass of AvdModel.""" - class KeyIdsItem(AvdModel): + class DynamicItem(AvdModel): """Subclass of AvdModel.""" _fields: ClassVar[dict] = { - "id": {"type": int}, - "algorithm": {"type": str}, - "key_type": {"type": str}, - "key": {"type": str}, - "rfc_5310": {"type": bool}, + "access_list": {"type": str}, + "comment": {"type": str}, + "pool_name": {"type": str}, + "priority": {"type": int}, "_custom_data": {"type": dict}, } - id: int - """Configure authentication key-id.""" - algorithm: Literal["sha-1", "sha-224", "sha-256", "sha-384", "sha-512"] - key_type: Literal["0", "7", "8a"] - """Configure authentication key type.""" - key: str - """Password string.""" - rfc_5310: bool | None - """SHA digest computation according to rfc5310.""" + access_list: str + comment: str | None + pool_name: str + priority: int | None _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -28900,64 +30223,72 @@ class KeyIdsItem(AvdModel): def __init__( self, *, - id: int | UndefinedType = Undefined, - algorithm: Literal["sha-1", "sha-224", "sha-256", "sha-384", "sha-512"] | UndefinedType = Undefined, - key_type: Literal["0", "7", "8a"] | UndefinedType = Undefined, - key: str | UndefinedType = Undefined, - rfc_5310: bool | None | UndefinedType = Undefined, + access_list: str | UndefinedType = Undefined, + comment: str | None | UndefinedType = Undefined, + pool_name: str | UndefinedType = Undefined, + priority: int | None | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - KeyIdsItem. + DynamicItem. Subclass of AvdModel. Args: - id: Configure authentication key-id. - algorithm: algorithm - key_type: Configure authentication key type. - key: Password string. - rfc_5310: SHA digest computation according to rfc5310. + access_list: access_list + comment: comment + pool_name: pool_name + priority: priority _custom_data: _custom_data """ - class KeyIds(AvdIndexedList[int, KeyIdsItem]): - """Subclass of AvdIndexedList with `KeyIdsItem` items. Primary key is `id` (`int`).""" - - _primary_key: ClassVar[str] = "id" - - KeyIds._item_type = KeyIdsItem - - class Sha(AvdModel): - """Subclass of AvdModel.""" - - _fields: ClassVar[dict] = {"key_id": {"type": int}, "_custom_data": {"type": dict}} - key_id: int - _custom_data: dict[str, Any] - - if TYPE_CHECKING: - - def __init__(self, *, key_id: int | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined) -> None: - """ - Sha. - - - Subclass of AvdModel. + class Dynamic(AvdIndexedList[str, DynamicItem]): + """Subclass of AvdIndexedList with `DynamicItem` items. Primary key is `access_list` (`str`).""" - Args: - key_id: key_id - _custom_data: _custom_data + _primary_key: ClassVar[str] = "access_list" - """ + Dynamic._item_type = DynamicItem - class SharedSecret(AvdModel): + class StaticItem(AvdModel): """Subclass of AvdModel.""" - _fields: ClassVar[dict] = {"profile": {"type": str}, "algorithm": {"type": str}, "_custom_data": {"type": dict}} - profile: str - algorithm: Literal["md5", "sha-1", "sha-224", "sha-256", "sha-384", "sha-512"] + _fields: ClassVar[dict] = { + "access_list": {"type": str}, + "comment": {"type": str}, + "direction": {"type": str}, + "group": {"type": int}, + "original_ip": {"type": str}, + "original_port": {"type": int}, + "priority": {"type": int}, + "protocol": {"type": str}, + "translated_ip": {"type": str}, + "translated_port": {"type": int}, + "_custom_data": {"type": dict}, + } + access_list: str | None + """'access_list' and 'group' are mutual exclusive.""" + comment: str | None + direction: Literal["egress", "ingress"] | None + """ + Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware + platform. + EOS might remove this keyword in the configuration. So, check the configuration on + targeted HW/SW. + """ + group: int | None + """'access_list' and 'group' are mutual exclusive.""" + original_ip: str | None + """IPv4 address. The combination of `original_ip` and `original_port` must be unique.""" + original_port: int | None + """TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.""" + priority: int | None + protocol: Literal["udp", "tcp"] | None + translated_ip: str + """IPv4 address.""" + translated_port: int | None + """requires 'original_port'.""" _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -28965,55 +30296,53 @@ class SharedSecret(AvdModel): def __init__( self, *, - profile: str | UndefinedType = Undefined, - algorithm: Literal["md5", "sha-1", "sha-224", "sha-256", "sha-384", "sha-512"] | UndefinedType = Undefined, + access_list: str | None | UndefinedType = Undefined, + comment: str | None | UndefinedType = Undefined, + direction: Literal["egress", "ingress"] | None | UndefinedType = Undefined, + group: int | None | UndefinedType = Undefined, + original_ip: str | None | UndefinedType = Undefined, + original_port: int | None | UndefinedType = Undefined, + priority: int | None | UndefinedType = Undefined, + protocol: Literal["udp", "tcp"] | None | UndefinedType = Undefined, + translated_ip: str | UndefinedType = Undefined, + translated_port: int | None | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - SharedSecret. + StaticItem. Subclass of AvdModel. Args: - profile: profile - algorithm: algorithm + access_list: 'access_list' and 'group' are mutual exclusive. + comment: comment + direction: + Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware + platform. + EOS might remove this keyword in the configuration. So, check the configuration on + targeted HW/SW. + group: 'access_list' and 'group' are mutual exclusive. + original_ip: IPv4 address. The combination of `original_ip` and `original_port` must be unique. + original_port: TCP/UDP port. The combination of `original_ip` and `original_port` must be unique. + priority: priority + protocol: protocol + translated_ip: IPv4 address. + translated_port: requires 'original_port'. _custom_data: _custom_data """ - _fields: ClassVar[dict] = { - "key_type": {"type": str}, - "key": {"type": str}, - "key_ids": {"type": KeyIds}, - "mode": {"type": str}, - "sha": {"type": Sha}, - "shared_secret": {"type": SharedSecret}, - "rx_disabled": {"type": bool}, - "_custom_data": {"type": dict}, - } - key_type: Literal["0", "7", "8a"] | None - """Configure authentication key type.""" - key: str | None - """Password string. `key_type` is required for this setting.""" - key_ids: KeyIds - """Subclass of AvdIndexedList with `KeyIdsItem` items. Primary key is `id` (`int`).""" - mode: Literal["md5", "sha", "text", "shared-secret"] | None - """Authentication mode.""" - sha: Sha - """ - Required settings for authentication mode 'sha'. + class Static(AvdList[StaticItem]): + """Subclass of AvdList with `StaticItem` items.""" - Subclass of AvdModel. - """ - shared_secret: SharedSecret - """ - Required settings for authentication mode 'shared_secret'. + Static._item_type = StaticItem - Subclass of AvdModel. - """ - rx_disabled: bool | None - """Disable authentication check on the receive side.""" + _fields: ClassVar[dict] = {"dynamic": {"type": Dynamic}, "static": {"type": Static}, "_custom_data": {"type": dict}} + dynamic: Dynamic + """Subclass of AvdIndexedList with `DynamicItem` items. Primary key is `access_list` (`str`).""" + static: Static + """Subclass of AvdList with `StaticItem` items.""" _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -29021,150 +30350,179 @@ def __init__( def __init__( self, *, - key_type: Literal["0", "7", "8a"] | None | UndefinedType = Undefined, - key: str | None | UndefinedType = Undefined, - key_ids: KeyIds | UndefinedType = Undefined, - mode: Literal["md5", "sha", "text", "shared-secret"] | None | UndefinedType = Undefined, - sha: Sha | UndefinedType = Undefined, - shared_secret: SharedSecret | UndefinedType = Undefined, - rx_disabled: bool | None | UndefinedType = Undefined, + dynamic: Dynamic | UndefinedType = Undefined, + static: Static | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - Level2. + Destination. Subclass of AvdModel. Args: - key_type: Configure authentication key type. - key: Password string. `key_type` is required for this setting. - key_ids: Subclass of AvdIndexedList with `KeyIdsItem` items. Primary key is `id` (`int`). - mode: Authentication mode. - sha: - Required settings for authentication mode 'sha'. - - Subclass of AvdModel. - shared_secret: - Required settings for authentication mode 'shared_secret'. - - Subclass of AvdModel. - rx_disabled: Disable authentication check on the receive side. + dynamic: Subclass of AvdIndexedList with `DynamicItem` items. Primary key is `access_list` (`str`). + static: Subclass of AvdList with `StaticItem` items. _custom_data: _custom_data """ - _fields: ClassVar[dict] = {"both": {"type": Both}, "level_1": {"type": Level1}, "level_2": {"type": Level2}, "_custom_data": {"type": dict}} - both: Both - """ - Authentication settings for level-1 and level-2. 'both' takes precedence over 'level_1' and - 'level_2' settings. - - Subclass of AvdModel. - """ - level_1: Level1 - """ - Authentication settings for level-1. 'both' takes precedence over 'level_1' and 'level_2' settings. - Subclass of AvdModel. - """ - level_2: Level2 - """ - Authentication settings for level-2. 'both' takes precedence over 'level_1' and 'level_2' settings. - Subclass of AvdModel. - """ - _custom_data: dict[str, Any] + class Source(AvdModel): + """Subclass of AvdModel.""" - if TYPE_CHECKING: + class DynamicItem(AvdModel): + """Subclass of AvdModel.""" - def __init__( - self, - *, - both: Both | UndefinedType = Undefined, - level_1: Level1 | UndefinedType = Undefined, - level_2: Level2 | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: + _fields: ClassVar[dict] = { + "access_list": {"type": str}, + "comment": {"type": str}, + "nat_type": {"type": str}, + "pool_name": {"type": str}, + "priority": {"type": int}, + "_custom_data": {"type": dict}, + } + access_list: str + comment: str | None + nat_type: Literal["overload", "pool", "pool-address-only", "pool-full-cone"] + pool_name: str | None """ - IsisAuthentication. + required if 'nat_type' is pool, pool-address-only or pool-full-cone. + ignored if 'nat_type' is + overload. + """ + priority: int | None + _custom_data: dict[str, Any] + if TYPE_CHECKING: - Subclass of AvdModel. + def __init__( + self, + *, + access_list: str | UndefinedType = Undefined, + comment: str | None | UndefinedType = Undefined, + nat_type: Literal["overload", "pool", "pool-address-only", "pool-full-cone"] | UndefinedType = Undefined, + pool_name: str | None | UndefinedType = Undefined, + priority: int | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + DynamicItem. - Args: - both: - Authentication settings for level-1 and level-2. 'both' takes precedence over 'level_1' and - 'level_2' settings. - Subclass of AvdModel. - level_1: - Authentication settings for level-1. 'both' takes precedence over 'level_1' and 'level_2' settings. - Subclass of AvdModel. - level_2: - Authentication settings for level-2. 'both' takes precedence over 'level_1' and 'level_2' settings. - Subclass of AvdModel. - _custom_data: _custom_data + Subclass of AvdModel. - """ + Args: + access_list: access_list + comment: comment + nat_type: nat_type + pool_name: + required if 'nat_type' is pool, pool-address-only or pool-full-cone. + ignored if 'nat_type' is + overload. + priority: priority + _custom_data: _custom_data - class TrafficPolicy(AvdModel): - """Subclass of AvdModel.""" + """ - _fields: ClassVar[dict] = {"input": {"type": str}, "output": {"type": str}, "_custom_data": {"type": dict}} - input: str | None - """Ingress traffic policy.""" - output: str | None - """Egress traffic policy.""" - _custom_data: dict[str, Any] + class Dynamic(AvdIndexedList[str, DynamicItem]): + """Subclass of AvdIndexedList with `DynamicItem` items. Primary key is `access_list` (`str`).""" - if TYPE_CHECKING: + _primary_key: ClassVar[str] = "access_list" - def __init__( - self, - *, - input: str | None | UndefinedType = Undefined, - output: str | None | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: + Dynamic._item_type = DynamicItem + + class StaticItem(AvdModel): + """Subclass of AvdModel.""" + + _fields: ClassVar[dict] = { + "access_list": {"type": str}, + "comment": {"type": str}, + "direction": {"type": str}, + "group": {"type": int}, + "original_ip": {"type": str}, + "original_port": {"type": int}, + "priority": {"type": int}, + "protocol": {"type": str}, + "translated_ip": {"type": str}, + "translated_port": {"type": int}, + "_custom_data": {"type": dict}, + } + access_list: str | None + """'access_list' and 'group' are mutual exclusive.""" + comment: str | None + direction: Literal["egress", "ingress"] | None """ - TrafficPolicy. + Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware + platform. + EOS might remove this keyword in the configuration. So, check the configuration on + targeted HW/SW. + """ + group: int | None + """'access_list' and 'group' are mutual exclusive.""" + original_ip: str | None + """IPv4 address. The combination of `original_ip` and `original_port` must be unique.""" + original_port: int | None + """TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.""" + priority: int | None + protocol: Literal["udp", "tcp"] | None + translated_ip: str + """IPv4 address.""" + translated_port: int | None + """requires 'original_port'.""" + _custom_data: dict[str, Any] + if TYPE_CHECKING: - Subclass of AvdModel. + def __init__( + self, + *, + access_list: str | None | UndefinedType = Undefined, + comment: str | None | UndefinedType = Undefined, + direction: Literal["egress", "ingress"] | None | UndefinedType = Undefined, + group: int | None | UndefinedType = Undefined, + original_ip: str | None | UndefinedType = Undefined, + original_port: int | None | UndefinedType = Undefined, + priority: int | None | UndefinedType = Undefined, + protocol: Literal["udp", "tcp"] | None | UndefinedType = Undefined, + translated_ip: str | UndefinedType = Undefined, + translated_port: int | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + StaticItem. - Args: - input: Ingress traffic policy. - output: Egress traffic policy. - _custom_data: _custom_data - """ + Subclass of AvdModel. + + Args: + access_list: 'access_list' and 'group' are mutual exclusive. + comment: comment + direction: + Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware + platform. + EOS might remove this keyword in the configuration. So, check the configuration on + targeted HW/SW. + group: 'access_list' and 'group' are mutual exclusive. + original_ip: IPv4 address. The combination of `original_ip` and `original_port` must be unique. + original_port: TCP/UDP port. The combination of `original_ip` and `original_port` must be unique. + priority: priority + protocol: protocol + translated_ip: IPv4 address. + translated_port: requires 'original_port'. + _custom_data: _custom_data - class EvpnEthernetSegment(AvdModel): - """Subclass of AvdModel.""" + """ - class DesignatedForwarderElection(AvdModel): - """Subclass of AvdModel.""" + class Static(AvdList[StaticItem]): + """Subclass of AvdList with `StaticItem` items.""" - _fields: ClassVar[dict] = { - "algorithm": {"type": str}, - "preference_value": {"type": int}, - "dont_preempt": {"type": bool, "default": False}, - "hold_time": {"type": int}, - "subsequent_hold_time": {"type": int}, - "candidate_reachability_required": {"type": bool}, - "_custom_data": {"type": dict}, - } - algorithm: Literal["modulus", "preference"] | None - preference_value: int | None - """Preference_value is only used when "algorithm" is "preference".""" - dont_preempt: bool - """ - Dont_preempt is only used when "algorithm" is "preference". + Static._item_type = StaticItem - Default value: `False` - """ - hold_time: int | None - subsequent_hold_time: int | None - candidate_reachability_required: bool | None + _fields: ClassVar[dict] = {"dynamic": {"type": Dynamic}, "static": {"type": Static}, "_custom_data": {"type": dict}} + dynamic: Dynamic + """Subclass of AvdIndexedList with `DynamicItem` items. Primary key is `access_list` (`str`).""" + static: Static + """Subclass of AvdList with `StaticItem` items.""" _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -29172,78 +30530,68 @@ class DesignatedForwarderElection(AvdModel): def __init__( self, *, - algorithm: Literal["modulus", "preference"] | None | UndefinedType = Undefined, - preference_value: int | None | UndefinedType = Undefined, - dont_preempt: bool | UndefinedType = Undefined, - hold_time: int | None | UndefinedType = Undefined, - subsequent_hold_time: int | None | UndefinedType = Undefined, - candidate_reachability_required: bool | None | UndefinedType = Undefined, + dynamic: Dynamic | UndefinedType = Undefined, + static: Static | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - DesignatedForwarderElection. + Source. Subclass of AvdModel. Args: - algorithm: algorithm - preference_value: Preference_value is only used when "algorithm" is "preference". - dont_preempt: Dont_preempt is only used when "algorithm" is "preference". - hold_time: hold_time - subsequent_hold_time: subsequent_hold_time - candidate_reachability_required: candidate_reachability_required + dynamic: Subclass of AvdIndexedList with `DynamicItem` items. Primary key is `access_list` (`str`). + static: Subclass of AvdList with `StaticItem` items. _custom_data: _custom_data """ - class Mpls(AvdModel): - """Subclass of AvdModel.""" + _fields: ClassVar[dict] = {"destination": {"type": Destination}, "source": {"type": Source}, "_custom_data": {"type": dict}} + destination: Destination + """Subclass of AvdModel.""" + source: Source + """Subclass of AvdModel.""" + _custom_data: dict[str, Any] - _fields: ClassVar[dict] = {"shared_index": {"type": int}, "tunnel_flood_filter_time": {"type": int}, "_custom_data": {"type": dict}} - shared_index: int | None - tunnel_flood_filter_time: int | None - _custom_data: dict[str, Any] + if TYPE_CHECKING: - if TYPE_CHECKING: + def __init__( + self, + *, + destination: Destination | UndefinedType = Undefined, + source: Source | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + IpNat. - def __init__( - self, - *, - shared_index: int | None | UndefinedType = Undefined, - tunnel_flood_filter_time: int | None | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: - """ - Mpls. + Subclass of AvdModel. - Subclass of AvdModel. + Args: + destination: Subclass of AvdModel. + source: Subclass of AvdModel. + _custom_data: _custom_data - Args: - shared_index: shared_index - tunnel_flood_filter_time: tunnel_flood_filter_time - _custom_data: _custom_data + """ - """ + class Ipv6NdPrefixesItem(AvdModel): + """Subclass of AvdModel.""" _fields: ClassVar[dict] = { - "identifier": {"type": str}, - "redundancy": {"type": str}, - "designated_forwarder_election": {"type": DesignatedForwarderElection}, - "mpls": {"type": Mpls}, - "route_target": {"type": str}, + "ipv6_prefix": {"type": str}, + "valid_lifetime": {"type": str}, + "preferred_lifetime": {"type": str}, + "no_autoconfig_flag": {"type": bool}, "_custom_data": {"type": dict}, } - identifier: str | None - """EVPN Ethernet Segment Identifier (Type 1 format).""" - redundancy: Literal["all-active", "single-active"] | None - designated_forwarder_election: DesignatedForwarderElection - """Subclass of AvdModel.""" - mpls: Mpls - """Subclass of AvdModel.""" - route_target: str | None - """EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx.""" + ipv6_prefix: str + valid_lifetime: str | None + """Infinite or lifetime in seconds.""" + preferred_lifetime: str | None + """Infinite or lifetime in seconds.""" + no_autoconfig_flag: bool | None _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -29251,38 +30599,90 @@ def __init__( def __init__( self, *, - identifier: str | None | UndefinedType = Undefined, - redundancy: Literal["all-active", "single-active"] | None | UndefinedType = Undefined, - designated_forwarder_election: DesignatedForwarderElection | UndefinedType = Undefined, - mpls: Mpls | UndefinedType = Undefined, - route_target: str | None | UndefinedType = Undefined, + ipv6_prefix: str | UndefinedType = Undefined, + valid_lifetime: str | None | UndefinedType = Undefined, + preferred_lifetime: str | None | UndefinedType = Undefined, + no_autoconfig_flag: bool | None | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - EvpnEthernetSegment. + Ipv6NdPrefixesItem. Subclass of AvdModel. Args: - identifier: EVPN Ethernet Segment Identifier (Type 1 format). - redundancy: redundancy - designated_forwarder_election: Subclass of AvdModel. - mpls: Subclass of AvdModel. - route_target: EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx. + ipv6_prefix: ipv6_prefix + valid_lifetime: Infinite or lifetime in seconds. + preferred_lifetime: Infinite or lifetime in seconds. + no_autoconfig_flag: no_autoconfig_flag _custom_data: _custom_data """ - class Ptp(AvdModel): + class Ipv6NdPrefixes(AvdIndexedList[str, Ipv6NdPrefixesItem]): + """Subclass of AvdIndexedList with `Ipv6NdPrefixesItem` items. Primary key is `ipv6_prefix` (`str`).""" + + _primary_key: ClassVar[str] = "ipv6_prefix" + + Ipv6NdPrefixes._item_type = Ipv6NdPrefixesItem + + class Pim(AvdModel): """Subclass of AvdModel.""" - class Announce(AvdModel): + class Ipv4(AvdModel): """Subclass of AvdModel.""" - _fields: ClassVar[dict] = {"interval": {"type": int}, "timeout": {"type": int}, "_custom_data": {"type": dict}} - interval: int | None - timeout: int | None + class Hello(AvdModel): + """Subclass of AvdModel.""" + + _fields: ClassVar[dict] = {"count": {"type": str}, "interval": {"type": int}, "_custom_data": {"type": dict}} + count: str | None + """Number of missed hellos after which the neighbor expires. Range <1.5-65535>.""" + interval: int | None + """PIM hello interval in seconds.""" + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__( + self, + *, + count: str | None | UndefinedType = Undefined, + interval: int | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + Hello. + + + Subclass of AvdModel. + + Args: + count: Number of missed hellos after which the neighbor expires. Range <1.5-65535>. + interval: PIM hello interval in seconds. + _custom_data: _custom_data + + """ + + _fields: ClassVar[dict] = { + "border_router": {"type": bool}, + "dr_priority": {"type": int}, + "sparse_mode": {"type": bool}, + "bfd": {"type": bool}, + "bidirectional": {"type": bool}, + "hello": {"type": Hello}, + "_custom_data": {"type": dict}, + } + border_router: bool | None + """Configure PIM border router. EOS default is false.""" + dr_priority: int | None + sparse_mode: bool | None + bfd: bool | None + """Set the default for whether Bidirectional Forwarding Detection is enabled for PIM.""" + bidirectional: bool | None + hello: Hello + """Subclass of AvdModel.""" _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -29290,130 +30690,100 @@ class Announce(AvdModel): def __init__( self, *, - interval: int | None | UndefinedType = Undefined, - timeout: int | None | UndefinedType = Undefined, + border_router: bool | None | UndefinedType = Undefined, + dr_priority: int | None | UndefinedType = Undefined, + sparse_mode: bool | None | UndefinedType = Undefined, + bfd: bool | None | UndefinedType = Undefined, + bidirectional: bool | None | UndefinedType = Undefined, + hello: Hello | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - Announce. + Ipv4. Subclass of AvdModel. Args: - interval: interval - timeout: timeout + border_router: Configure PIM border router. EOS default is false. + dr_priority: dr_priority + sparse_mode: sparse_mode + bfd: Set the default for whether Bidirectional Forwarding Detection is enabled for PIM. + bidirectional: bidirectional + hello: Subclass of AvdModel. _custom_data: _custom_data """ - class Profile(AvdModel): - """Subclass of AvdModel.""" - - class G82751(AvdModel): - """Subclass of AvdModel.""" - - _fields: ClassVar[dict] = {"destination_mac_address": {"type": str}, "_custom_data": {"type": dict}} - destination_mac_address: Literal["forwardable", "non-forwardable"] | None - _custom_data: dict[str, Any] - - if TYPE_CHECKING: - - def __init__( - self, - *, - destination_mac_address: Literal["forwardable", "non-forwardable"] | None | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: - """ - G82751. - - - Subclass of AvdModel. + _fields: ClassVar[dict] = {"ipv4": {"type": Ipv4}, "_custom_data": {"type": dict}} + ipv4: Ipv4 + """Subclass of AvdModel.""" + _custom_data: dict[str, Any] - Args: - destination_mac_address: destination_mac_address - _custom_data: _custom_data + if TYPE_CHECKING: - """ + def __init__(self, *, ipv4: Ipv4 | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined) -> None: + """ + Pim. - _fields: ClassVar[dict] = {"g8275_1": {"type": G82751}, "_custom_data": {"type": dict}} - g8275_1: G82751 - """Subclass of AvdModel.""" - _custom_data: dict[str, Any] - if TYPE_CHECKING: + Subclass of AvdModel. - def __init__(self, *, g8275_1: G82751 | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined) -> None: - """ - Profile. + Args: + ipv4: Subclass of AvdModel. + _custom_data: _custom_data + """ - Subclass of AvdModel. + class OspfMessageDigestKeysItem(AvdModel): + """Subclass of AvdModel.""" - Args: - g8275_1: Subclass of AvdModel. - _custom_data: _custom_data + _fields: ClassVar[dict] = {"id": {"type": int}, "hash_algorithm": {"type": str}, "key": {"type": str}, "_custom_data": {"type": dict}} + id: int + hash_algorithm: Literal["md5", "sha1", "sha256", "sha384", "sha512"] | None + key: str | None + """Encrypted password.""" + _custom_data: dict[str, Any] - """ + if TYPE_CHECKING: - class SyncMessage(AvdModel): - """Subclass of AvdModel.""" + def __init__( + self, + *, + id: int | UndefinedType = Undefined, + hash_algorithm: Literal["md5", "sha1", "sha256", "sha384", "sha512"] | None | UndefinedType = Undefined, + key: str | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + OspfMessageDigestKeysItem. - _fields: ClassVar[dict] = {"interval": {"type": int}, "_custom_data": {"type": dict}} - interval: int | None - _custom_data: dict[str, Any] - if TYPE_CHECKING: + Subclass of AvdModel. - def __init__(self, *, interval: int | None | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined) -> None: - """ - SyncMessage. + Args: + id: id + hash_algorithm: hash_algorithm + key: Encrypted password. + _custom_data: _custom_data + """ - Subclass of AvdModel. + class OspfMessageDigestKeys(AvdIndexedList[int, OspfMessageDigestKeysItem]): + """Subclass of AvdIndexedList with `OspfMessageDigestKeysItem` items. Primary key is `id` (`int`).""" - Args: - interval: interval - _custom_data: _custom_data + _primary_key: ClassVar[str] = "id" - """ + OspfMessageDigestKeys._item_type = OspfMessageDigestKeysItem - _fields: ClassVar[dict] = { - "enable": {"type": bool}, - "announce": {"type": Announce}, - "delay_req": {"type": int}, - "delay_mechanism": {"type": str}, - "profile": {"type": Profile}, - "sync_message": {"type": SyncMessage}, - "role": {"type": str}, - "vlan": {"type": str}, - "transport": {"type": str}, - "mpass": {"type": bool}, - "_custom_data": {"type": dict}, - } - enable: bool | None - announce: Announce - """Subclass of AvdModel.""" - delay_req: int | None - delay_mechanism: Literal["e2e", "p2p"] | None - profile: Profile - """Subclass of AvdModel.""" - sync_message: SyncMessage + class FlowTracker(AvdModel): """Subclass of AvdModel.""" - role: Literal["master", "dynamic"] | None - vlan: str | None - """VLAN can be 'all' or list of vlans as string.""" - transport: Literal["ipv4", "ipv6", "layer2"] | None - mpass: bool | None - """ - When MPASS is enabled on an MLAG port-channel, MLAG peers coordinate to function as a single PTP - logical device. - Arista PTP enabled devices always place PTP messages on the same physical link - within the port-channel. - Hence, MPASS is needed only on MLAG port-channels connected to non-Arista - devices. - """ + + _fields: ClassVar[dict] = {"sampled": {"type": str}, "hardware": {"type": str}, "_custom_data": {"type": dict}} + sampled: str | None + """Sampled flow tracker name.""" + hardware: str | None + """Hardware flow tracker name.""" _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -29421,192 +30791,129 @@ def __init__(self, *, interval: int | None | UndefinedType = Undefined, _custom_ def __init__( self, *, - enable: bool | None | UndefinedType = Undefined, - announce: Announce | UndefinedType = Undefined, - delay_req: int | None | UndefinedType = Undefined, - delay_mechanism: Literal["e2e", "p2p"] | None | UndefinedType = Undefined, - profile: Profile | UndefinedType = Undefined, - sync_message: SyncMessage | UndefinedType = Undefined, - role: Literal["master", "dynamic"] | None | UndefinedType = Undefined, - vlan: str | None | UndefinedType = Undefined, - transport: Literal["ipv4", "ipv6", "layer2"] | None | UndefinedType = Undefined, - mpass: bool | None | UndefinedType = Undefined, + sampled: str | None | UndefinedType = Undefined, + hardware: str | None | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - Ptp. + FlowTracker. Subclass of AvdModel. Args: - enable: enable - announce: Subclass of AvdModel. - delay_req: delay_req - delay_mechanism: delay_mechanism - profile: Subclass of AvdModel. - sync_message: Subclass of AvdModel. - role: role - vlan: VLAN can be 'all' or list of vlans as string. - transport: transport - mpass: - When MPASS is enabled on an MLAG port-channel, MLAG peers coordinate to function as a single PTP - logical device. - Arista PTP enabled devices always place PTP messages on the same physical link - within the port-channel. - Hence, MPASS is needed only on MLAG port-channels connected to non-Arista - devices. + sampled: Sampled flow tracker name. + hardware: Hardware flow tracker name. _custom_data: _custom_data """ - class IpNat(AvdModel): + class Bgp(AvdModel): """Subclass of AvdModel.""" - class Destination(AvdModel): + _fields: ClassVar[dict] = {"session_tracker": {"type": str}, "_custom_data": {"type": dict}} + session_tracker: str | None + """Name of session tracker.""" + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__( + self, *, session_tracker: str | None | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined + ) -> None: + """ + Bgp. + + + Subclass of AvdModel. + + Args: + session_tracker: Name of session tracker. + _custom_data: _custom_data + + """ + + class IpIgmpHostProxy(AvdModel): + """Subclass of AvdModel.""" + + class GroupsItem(AvdModel): """Subclass of AvdModel.""" - class DynamicItem(AvdModel): + class ExcludeItem(AvdModel): """Subclass of AvdModel.""" - _fields: ClassVar[dict] = { - "access_list": {"type": str}, - "comment": {"type": str}, - "pool_name": {"type": str}, - "priority": {"type": int}, - "_custom_data": {"type": dict}, - } - access_list: str - comment: str | None - pool_name: str - priority: int | None + _fields: ClassVar[dict] = {"source": {"type": str}, "_custom_data": {"type": dict}} + source: str _custom_data: dict[str, Any] if TYPE_CHECKING: - def __init__( - self, - *, - access_list: str | UndefinedType = Undefined, - comment: str | None | UndefinedType = Undefined, - pool_name: str | UndefinedType = Undefined, - priority: int | None | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: + def __init__(self, *, source: str | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined) -> None: """ - DynamicItem. + ExcludeItem. Subclass of AvdModel. Args: - access_list: access_list - comment: comment - pool_name: pool_name - priority: priority + source: source _custom_data: _custom_data """ - class Dynamic(AvdIndexedList[str, DynamicItem]): - """Subclass of AvdIndexedList with `DynamicItem` items. Primary key is `access_list` (`str`).""" - - _primary_key: ClassVar[str] = "access_list" + class Exclude(AvdIndexedList[str, ExcludeItem]): + """Subclass of AvdIndexedList with `ExcludeItem` items. Primary key is `source` (`str`).""" - Dynamic._item_type = DynamicItem + _primary_key: ClassVar[str] = "source" - class StaticItem(AvdModel): - """Subclass of AvdModel.""" + Exclude._item_type = ExcludeItem - _fields: ClassVar[dict] = { - "access_list": {"type": str}, - "comment": {"type": str}, - "direction": {"type": str}, - "group": {"type": int}, - "original_ip": {"type": str}, - "original_port": {"type": int}, - "priority": {"type": int}, - "protocol": {"type": str}, - "translated_ip": {"type": str}, - "translated_port": {"type": int}, - "_custom_data": {"type": dict}, - } - access_list: str | None - """'access_list' and 'group' are mutual exclusive.""" - comment: str | None - direction: Literal["egress", "ingress"] | None - """ - Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware - platform. - EOS might remove this keyword in the configuration. So, check the configuration on - targeted HW/SW. - """ - group: int | None - """'access_list' and 'group' are mutual exclusive.""" - original_ip: str | None - """IPv4 address. The combination of `original_ip` and `original_port` must be unique.""" - original_port: int | None - """TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.""" - priority: int | None - protocol: Literal["udp", "tcp"] | None - translated_ip: str - """IPv4 address.""" - translated_port: int | None - """requires 'original_port'.""" + class IncludeItem(AvdModel): + """Subclass of AvdModel.""" + + _fields: ClassVar[dict] = {"source": {"type": str}, "_custom_data": {"type": dict}} + source: str _custom_data: dict[str, Any] if TYPE_CHECKING: - def __init__( - self, - *, - access_list: str | None | UndefinedType = Undefined, - comment: str | None | UndefinedType = Undefined, - direction: Literal["egress", "ingress"] | None | UndefinedType = Undefined, - group: int | None | UndefinedType = Undefined, - original_ip: str | None | UndefinedType = Undefined, - original_port: int | None | UndefinedType = Undefined, - priority: int | None | UndefinedType = Undefined, - protocol: Literal["udp", "tcp"] | None | UndefinedType = Undefined, - translated_ip: str | UndefinedType = Undefined, - translated_port: int | None | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: + def __init__(self, *, source: str | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined) -> None: """ - StaticItem. + IncludeItem. Subclass of AvdModel. Args: - access_list: 'access_list' and 'group' are mutual exclusive. - comment: comment - direction: - Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware - platform. - EOS might remove this keyword in the configuration. So, check the configuration on - targeted HW/SW. - group: 'access_list' and 'group' are mutual exclusive. - original_ip: IPv4 address. The combination of `original_ip` and `original_port` must be unique. - original_port: TCP/UDP port. The combination of `original_ip` and `original_port` must be unique. - priority: priority - protocol: protocol - translated_ip: IPv4 address. - translated_port: requires 'original_port'. + source: source _custom_data: _custom_data """ - class Static(AvdList[StaticItem]): - """Subclass of AvdList with `StaticItem` items.""" + class Include(AvdIndexedList[str, IncludeItem]): + """Subclass of AvdIndexedList with `IncludeItem` items. Primary key is `source` (`str`).""" - Static._item_type = StaticItem + _primary_key: ClassVar[str] = "source" - _fields: ClassVar[dict] = {"dynamic": {"type": Dynamic}, "static": {"type": Static}, "_custom_data": {"type": dict}} - dynamic: Dynamic - """Subclass of AvdIndexedList with `DynamicItem` items. Primary key is `access_list` (`str`).""" - static: Static - """Subclass of AvdList with `StaticItem` items.""" + Include._item_type = IncludeItem + + _fields: ClassVar[dict] = {"group": {"type": str}, "exclude": {"type": Exclude}, "include": {"type": Include}, "_custom_data": {"type": dict}} + group: str + """Multicast Address.""" + exclude: Exclude + """ + The same source must not be present both in `exclude` and `include` list. + + Subclass of + AvdIndexedList with `ExcludeItem` items. Primary key is `source` (`str`). + """ + include: Include + """ + The same source must not be present both in `exclude` and `include` list. + + Subclass of + AvdIndexedList with `IncludeItem` items. Primary key is `source` (`str`). + """ _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -29614,179 +30921,134 @@ class Static(AvdList[StaticItem]): def __init__( self, *, - dynamic: Dynamic | UndefinedType = Undefined, - static: Static | UndefinedType = Undefined, + group: str | UndefinedType = Undefined, + exclude: Exclude | UndefinedType = Undefined, + include: Include | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - Destination. + GroupsItem. Subclass of AvdModel. Args: - dynamic: Subclass of AvdIndexedList with `DynamicItem` items. Primary key is `access_list` (`str`). - static: Subclass of AvdList with `StaticItem` items. + group: Multicast Address. + exclude: + The same source must not be present both in `exclude` and `include` list. + + Subclass of + AvdIndexedList with `ExcludeItem` items. Primary key is `source` (`str`). + include: + The same source must not be present both in `exclude` and `include` list. + + Subclass of + AvdIndexedList with `IncludeItem` items. Primary key is `source` (`str`). _custom_data: _custom_data """ - class Source(AvdModel): + class Groups(AvdIndexedList[str, GroupsItem]): + """Subclass of AvdIndexedList with `GroupsItem` items. Primary key is `group` (`str`).""" + + _primary_key: ClassVar[str] = "group" + + Groups._item_type = GroupsItem + + class AccessListsItem(AvdModel): """Subclass of AvdModel.""" - class DynamicItem(AvdModel): - """Subclass of AvdModel.""" + _fields: ClassVar[dict] = {"name": {"type": str}, "_custom_data": {"type": dict}} + name: str + _custom_data: dict[str, Any] - _fields: ClassVar[dict] = { - "access_list": {"type": str}, - "comment": {"type": str}, - "nat_type": {"type": str}, - "pool_name": {"type": str}, - "priority": {"type": int}, - "_custom_data": {"type": dict}, - } - access_list: str - comment: str | None - nat_type: Literal["overload", "pool", "pool-address-only", "pool-full-cone"] - pool_name: str | None - """ - required if 'nat_type' is pool, pool-address-only or pool-full-cone. - ignored if 'nat_type' is - overload. - """ - priority: int | None - _custom_data: dict[str, Any] + if TYPE_CHECKING: - if TYPE_CHECKING: + def __init__(self, *, name: str | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined) -> None: + """ + AccessListsItem. - def __init__( - self, - *, - access_list: str | UndefinedType = Undefined, - comment: str | None | UndefinedType = Undefined, - nat_type: Literal["overload", "pool", "pool-address-only", "pool-full-cone"] | UndefinedType = Undefined, - pool_name: str | None | UndefinedType = Undefined, - priority: int | None | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: - """ - DynamicItem. + Subclass of AvdModel. - Subclass of AvdModel. + Args: + name: name + _custom_data: _custom_data - Args: - access_list: access_list - comment: comment - nat_type: nat_type - pool_name: - required if 'nat_type' is pool, pool-address-only or pool-full-cone. - ignored if 'nat_type' is - overload. - priority: priority - _custom_data: _custom_data + """ - """ + class AccessLists(AvdIndexedList[str, AccessListsItem]): + """Subclass of AvdIndexedList with `AccessListsItem` items. Primary key is `name` (`str`).""" - class Dynamic(AvdIndexedList[str, DynamicItem]): - """Subclass of AvdIndexedList with `DynamicItem` items. Primary key is `access_list` (`str`).""" + _primary_key: ClassVar[str] = "name" - _primary_key: ClassVar[str] = "access_list" + AccessLists._item_type = AccessListsItem - Dynamic._item_type = DynamicItem + _fields: ClassVar[dict] = { + "enabled": {"type": bool}, + "groups": {"type": Groups}, + "report_interval": {"type": int}, + "access_lists": {"type": AccessLists}, + "version": {"type": int}, + "_custom_data": {"type": dict}, + } + enabled: bool | None + groups: Groups + """Subclass of AvdIndexedList with `GroupsItem` items. Primary key is `group` (`str`).""" + report_interval: int | None + """Time interval between unsolicited reports.""" + access_lists: AccessLists + """ + Non-standard Access List name. - class StaticItem(AvdModel): - """Subclass of AvdModel.""" + Subclass of AvdIndexedList with `AccessListsItem` items. Primary key + is `name` (`str`). + """ + version: int | None + """IGMP version on IGMP host-proxy interface.""" + _custom_data: dict[str, Any] - _fields: ClassVar[dict] = { - "access_list": {"type": str}, - "comment": {"type": str}, - "direction": {"type": str}, - "group": {"type": int}, - "original_ip": {"type": str}, - "original_port": {"type": int}, - "priority": {"type": int}, - "protocol": {"type": str}, - "translated_ip": {"type": str}, - "translated_port": {"type": int}, - "_custom_data": {"type": dict}, - } - access_list: str | None - """'access_list' and 'group' are mutual exclusive.""" - comment: str | None - direction: Literal["egress", "ingress"] | None - """ - Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware - platform. - EOS might remove this keyword in the configuration. So, check the configuration on - targeted HW/SW. - """ - group: int | None - """'access_list' and 'group' are mutual exclusive.""" - original_ip: str | None - """IPv4 address. The combination of `original_ip` and `original_port` must be unique.""" - original_port: int | None - """TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.""" - priority: int | None - protocol: Literal["udp", "tcp"] | None - translated_ip: str - """IPv4 address.""" - translated_port: int | None - """requires 'original_port'.""" - _custom_data: dict[str, Any] + if TYPE_CHECKING: - if TYPE_CHECKING: + def __init__( + self, + *, + enabled: bool | None | UndefinedType = Undefined, + groups: Groups | UndefinedType = Undefined, + report_interval: int | None | UndefinedType = Undefined, + access_lists: AccessLists | UndefinedType = Undefined, + version: int | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + IpIgmpHostProxy. - def __init__( - self, - *, - access_list: str | None | UndefinedType = Undefined, - comment: str | None | UndefinedType = Undefined, - direction: Literal["egress", "ingress"] | None | UndefinedType = Undefined, - group: int | None | UndefinedType = Undefined, - original_ip: str | None | UndefinedType = Undefined, - original_port: int | None | UndefinedType = Undefined, - priority: int | None | UndefinedType = Undefined, - protocol: Literal["udp", "tcp"] | None | UndefinedType = Undefined, - translated_ip: str | UndefinedType = Undefined, - translated_port: int | None | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: - """ - StaticItem. + Subclass of AvdModel. - Subclass of AvdModel. + Args: + enabled: enabled + groups: Subclass of AvdIndexedList with `GroupsItem` items. Primary key is `group` (`str`). + report_interval: Time interval between unsolicited reports. + access_lists: + Non-standard Access List name. - Args: - access_list: 'access_list' and 'group' are mutual exclusive. - comment: comment - direction: - Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware - platform. - EOS might remove this keyword in the configuration. So, check the configuration on - targeted HW/SW. - group: 'access_list' and 'group' are mutual exclusive. - original_ip: IPv4 address. The combination of `original_ip` and `original_port` must be unique. - original_port: TCP/UDP port. The combination of `original_ip` and `original_port` must be unique. - priority: priority - protocol: protocol - translated_ip: IPv4 address. - translated_port: requires 'original_port'. - _custom_data: _custom_data + Subclass of AvdIndexedList with `AccessListsItem` items. Primary key + is `name` (`str`). + version: IGMP version on IGMP host-proxy interface. + _custom_data: _custom_data - """ + """ - class Static(AvdList[StaticItem]): - """Subclass of AvdList with `StaticItem` items.""" + class Sflow(AvdModel): + """Subclass of AvdModel.""" - Static._item_type = StaticItem + class Egress(AvdModel): + """Subclass of AvdModel.""" - _fields: ClassVar[dict] = {"dynamic": {"type": Dynamic}, "static": {"type": Static}, "_custom_data": {"type": dict}} - dynamic: Dynamic - """Subclass of AvdIndexedList with `DynamicItem` items. Primary key is `access_list` (`str`).""" - static: Static - """Subclass of AvdList with `StaticItem` items.""" + _fields: ClassVar[dict] = {"enable": {"type": bool}, "unmodified_enable": {"type": bool}, "_custom_data": {"type": dict}} + enable: bool | None + unmodified_enable: bool | None _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -29794,27 +31056,26 @@ class Static(AvdList[StaticItem]): def __init__( self, *, - dynamic: Dynamic | UndefinedType = Undefined, - static: Static | UndefinedType = Undefined, + enable: bool | None | UndefinedType = Undefined, + unmodified_enable: bool | None | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - Source. + Egress. Subclass of AvdModel. Args: - dynamic: Subclass of AvdIndexedList with `DynamicItem` items. Primary key is `access_list` (`str`). - static: Subclass of AvdList with `StaticItem` items. + enable: enable + unmodified_enable: unmodified_enable _custom_data: _custom_data """ - _fields: ClassVar[dict] = {"destination": {"type": Destination}, "source": {"type": Source}, "_custom_data": {"type": dict}} - destination: Destination - """Subclass of AvdModel.""" - source: Source + _fields: ClassVar[dict] = {"enable": {"type": bool}, "egress": {"type": Egress}, "_custom_data": {"type": dict}} + enable: bool | None + egress: Egress """Subclass of AvdModel.""" _custom_data: dict[str, Any] @@ -29823,130 +31084,129 @@ def __init__( def __init__( self, *, - destination: Destination | UndefinedType = Undefined, - source: Source | UndefinedType = Undefined, + enable: bool | None | UndefinedType = Undefined, + egress: Egress | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - IpNat. + Sflow. Subclass of AvdModel. Args: - destination: Subclass of AvdModel. - source: Subclass of AvdModel. + enable: enable + egress: Subclass of AvdModel. _custom_data: _custom_data """ - class Ipv6NdPrefixesItem(AvdModel): + class Switchport(AvdModel): """Subclass of AvdModel.""" - _fields: ClassVar[dict] = { - "ipv6_prefix": {"type": str}, - "valid_lifetime": {"type": str}, - "preferred_lifetime": {"type": str}, - "no_autoconfig_flag": {"type": bool}, - "_custom_data": {"type": dict}, - } - ipv6_prefix: str - valid_lifetime: str | None - """Infinite or lifetime in seconds.""" - preferred_lifetime: str | None - """Infinite or lifetime in seconds.""" - no_autoconfig_flag: bool | None - _custom_data: dict[str, Any] - - if TYPE_CHECKING: - - def __init__( - self, - *, - ipv6_prefix: str | UndefinedType = Undefined, - valid_lifetime: str | None | UndefinedType = Undefined, - preferred_lifetime: str | None | UndefinedType = Undefined, - no_autoconfig_flag: bool | None | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: - """ - Ipv6NdPrefixesItem. - - - Subclass of AvdModel. - - Args: - ipv6_prefix: ipv6_prefix - valid_lifetime: Infinite or lifetime in seconds. - preferred_lifetime: Infinite or lifetime in seconds. - no_autoconfig_flag: no_autoconfig_flag - _custom_data: _custom_data - - """ + class Trunk(AvdModel): + """Subclass of AvdModel.""" - class Ipv6NdPrefixes(AvdIndexedList[str, Ipv6NdPrefixesItem]): - """Subclass of AvdIndexedList with `Ipv6NdPrefixesItem` items. Primary key is `ipv6_prefix` (`str`).""" + class Groups(AvdList[str]): + """Subclass of AvdList with `str` items.""" - _primary_key: ClassVar[str] = "ipv6_prefix" + Groups._item_type = str - Ipv6NdPrefixes._item_type = Ipv6NdPrefixesItem + _fields: ClassVar[dict] = { + "allowed_vlan": {"type": str}, + "native_vlan": {"type": int}, + "native_vlan_tag": {"type": bool}, + "private_vlan_secondary": {"type": bool}, + "groups": {"type": Groups}, + "_custom_data": {"type": dict}, + } + allowed_vlan: str | None + """ + VLAN ID or range(s) of VLAN IDs (1-4094). + Warning: This should not be combined with + `port_channel_interfaces[].mode = trunk` and `port_channel_interfaces[].vlans`. + """ + native_vlan: int | None + """ + Set native VLAN when interface is in trunking mode. + Warning: This should not be combined with + `port_channel_interfaces[].native_vlan`. + """ + native_vlan_tag: bool | None + """ + If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence. + Warning: This + should not be combined with `port_channel_interfaces[].native_vlan_tag`. + """ + private_vlan_secondary: bool | None + """ + Enable secondary VLAN mapping for a private vlan. + Warning: This should not be combined with + `port_channel_interfaces[].trunk_private_vlan_secondary`. + """ + groups: Groups + """ + Warning: This should not be combined with `port_channel_interfaces[].trunk_groups`. - class Pim(AvdModel): - """Subclass of AvdModel.""" - class Ipv4(AvdModel): - """Subclass of AvdModel.""" + Subclass of + AvdList with `str` items. + """ + _custom_data: dict[str, Any] - class Hello(AvdModel): - """Subclass of AvdModel.""" + if TYPE_CHECKING: - _fields: ClassVar[dict] = {"count": {"type": str}, "interval": {"type": int}, "_custom_data": {"type": dict}} - count: str | None - """Number of missed hellos after which the neighbor expires. Range <1.5-65535>.""" - interval: int | None - """PIM hello interval in seconds.""" - _custom_data: dict[str, Any] + def __init__( + self, + *, + allowed_vlan: str | None | UndefinedType = Undefined, + native_vlan: int | None | UndefinedType = Undefined, + native_vlan_tag: bool | None | UndefinedType = Undefined, + private_vlan_secondary: bool | None | UndefinedType = Undefined, + groups: Groups | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + Trunk. - if TYPE_CHECKING: - def __init__( - self, - *, - count: str | None | UndefinedType = Undefined, - interval: int | None | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: - """ - Hello. + Subclass of AvdModel. + Args: + allowed_vlan: + VLAN ID or range(s) of VLAN IDs (1-4094). + Warning: This should not be combined with + `port_channel_interfaces[].mode = trunk` and `port_channel_interfaces[].vlans`. + native_vlan: + Set native VLAN when interface is in trunking mode. + Warning: This should not be combined with + `port_channel_interfaces[].native_vlan`. + native_vlan_tag: + If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence. + Warning: This + should not be combined with `port_channel_interfaces[].native_vlan_tag`. + private_vlan_secondary: + Enable secondary VLAN mapping for a private vlan. + Warning: This should not be combined with + `port_channel_interfaces[].trunk_private_vlan_secondary`. + groups: + Warning: This should not be combined with `port_channel_interfaces[].trunk_groups`. - Subclass of AvdModel. - Args: - count: Number of missed hellos after which the neighbor expires. Range <1.5-65535>. - interval: PIM hello interval in seconds. - _custom_data: _custom_data + Subclass of + AvdList with `str` items. + _custom_data: _custom_data - """ + """ - _fields: ClassVar[dict] = { - "border_router": {"type": bool}, - "dr_priority": {"type": int}, - "sparse_mode": {"type": bool}, - "bfd": {"type": bool}, - "bidirectional": {"type": bool}, - "hello": {"type": Hello}, - "_custom_data": {"type": dict}, - } - border_router: bool | None - """Configure PIM border router. EOS default is false.""" - dr_priority: int | None - sparse_mode: bool | None - bfd: bool | None - """Set the default for whether Bidirectional Forwarding Detection is enabled for PIM.""" - bidirectional: bool | None - hello: Hello + class Phone(AvdModel): """Subclass of AvdModel.""" + + _fields: ClassVar[dict] = {"vlan": {"type": int}, "trunk": {"type": str}, "_custom_data": {"type": dict}} + vlan: int | None + """Warning: This should not be combined with `port_channel_interfaces[].phone.vlan`.""" + trunk: Literal["tagged", "tagged phone", "untagged", "untagged phone"] | None + """Warning: This should not be combined with `port_channel_interfaces[].phone.trunk`""" _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -29954,229 +31214,262 @@ def __init__( def __init__( self, *, - border_router: bool | None | UndefinedType = Undefined, - dr_priority: int | None | UndefinedType = Undefined, - sparse_mode: bool | None | UndefinedType = Undefined, - bfd: bool | None | UndefinedType = Undefined, - bidirectional: bool | None | UndefinedType = Undefined, - hello: Hello | UndefinedType = Undefined, + vlan: int | None | UndefinedType = Undefined, + trunk: Literal["tagged", "tagged phone", "untagged", "untagged phone"] | None | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - Ipv4. + Phone. Subclass of AvdModel. Args: - border_router: Configure PIM border router. EOS default is false. - dr_priority: dr_priority - sparse_mode: sparse_mode - bfd: Set the default for whether Bidirectional Forwarding Detection is enabled for PIM. - bidirectional: bidirectional - hello: Subclass of AvdModel. + vlan: Warning: This should not be combined with `port_channel_interfaces[].phone.vlan`. + trunk: Warning: This should not be combined with `port_channel_interfaces[].phone.trunk` _custom_data: _custom_data """ - _fields: ClassVar[dict] = {"ipv4": {"type": Ipv4}, "_custom_data": {"type": dict}} - ipv4: Ipv4 - """Subclass of AvdModel.""" - _custom_data: dict[str, Any] - - if TYPE_CHECKING: - - def __init__(self, *, ipv4: Ipv4 | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined) -> None: - """ - Pim. - - - Subclass of AvdModel. - - Args: - ipv4: Subclass of AvdModel. - _custom_data: _custom_data - - """ - - class OspfMessageDigestKeysItem(AvdModel): - """Subclass of AvdModel.""" - - _fields: ClassVar[dict] = {"id": {"type": int}, "hash_algorithm": {"type": str}, "key": {"type": str}, "_custom_data": {"type": dict}} - id: int - hash_algorithm: Literal["md5", "sha1", "sha256", "sha384", "sha512"] | None - key: str | None - """Encrypted password.""" - _custom_data: dict[str, Any] - - if TYPE_CHECKING: + class Dot1q(AvdModel): + """Subclass of AvdModel.""" - def __init__( - self, - *, - id: int | UndefinedType = Undefined, - hash_algorithm: Literal["md5", "sha1", "sha256", "sha384", "sha512"] | None | UndefinedType = Undefined, - key: str | None | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: - """ - OspfMessageDigestKeysItem. + _fields: ClassVar[dict] = {"ethertype": {"type": int}, "vlan_tag": {"type": str}, "_custom_data": {"type": dict}} + ethertype: int | None + """Ethertype/TPID (Tag Protocol IDentifier) for VLAN tagged frames.""" + vlan_tag: Literal["disallowed", "required"] | None + _custom_data: dict[str, Any] + if TYPE_CHECKING: - Subclass of AvdModel. + def __init__( + self, + *, + ethertype: int | None | UndefinedType = Undefined, + vlan_tag: Literal["disallowed", "required"] | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + Dot1q. - Args: - id: id - hash_algorithm: hash_algorithm - key: Encrypted password. - _custom_data: _custom_data - """ + Subclass of AvdModel. - class OspfMessageDigestKeys(AvdIndexedList[int, OspfMessageDigestKeysItem]): - """Subclass of AvdIndexedList with `OspfMessageDigestKeysItem` items. Primary key is `id` (`int`).""" + Args: + ethertype: Ethertype/TPID (Tag Protocol IDentifier) for VLAN tagged frames. + vlan_tag: vlan_tag + _custom_data: _custom_data - _primary_key: ClassVar[str] = "id" + """ - OspfMessageDigestKeys._item_type = OspfMessageDigestKeysItem + class VlanTranslations(AvdModel): + """Subclass of AvdModel.""" - class FlowTracker(AvdModel): - """Subclass of AvdModel.""" + class DirectionInItem(AvdModel): + """Subclass of AvdModel.""" - _fields: ClassVar[dict] = {"sampled": {"type": str}, "hardware": {"type": str}, "_custom_data": {"type": dict}} - sampled: str | None - """Sampled flow tracker name.""" - hardware: str | None - """Hardware flow tracker name.""" - _custom_data: dict[str, Any] + _fields: ClassVar[dict] = { + "field_from": {"type": str}, + "to": {"type": int}, + "dot1q_tunnel": {"type": bool}, + "inner_vlan_from": {"type": int}, + "_custom_data": {"type": dict}, + } + _field_to_key_map: ClassVar[dict] = {"field_from": "from"} + _key_to_field_map: ClassVar[dict] = {"from": "field_from"} + field_from: str | None + """VLAN ID or range of VLAN IDs to map from. Range 1-4094.""" + to: int | None + """VLAN ID to map to.""" + dot1q_tunnel: bool | None + inner_vlan_from: int | None + """Inner VLAN ID to map from.""" + _custom_data: dict[str, Any] - if TYPE_CHECKING: + if TYPE_CHECKING: - def __init__( - self, - *, - sampled: str | None | UndefinedType = Undefined, - hardware: str | None | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: - """ - FlowTracker. + def __init__( + self, + *, + field_from: str | None | UndefinedType = Undefined, + to: int | None | UndefinedType = Undefined, + dot1q_tunnel: bool | None | UndefinedType = Undefined, + inner_vlan_from: int | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + DirectionInItem. - Subclass of AvdModel. + Subclass of AvdModel. - Args: - sampled: Sampled flow tracker name. - hardware: Hardware flow tracker name. - _custom_data: _custom_data + Args: + field_from: VLAN ID or range of VLAN IDs to map from. Range 1-4094. + to: VLAN ID to map to. + dot1q_tunnel: dot1q_tunnel + inner_vlan_from: Inner VLAN ID to map from. + _custom_data: _custom_data - """ + """ - class Bgp(AvdModel): - """Subclass of AvdModel.""" + class DirectionIn(AvdList[DirectionInItem]): + """Subclass of AvdList with `DirectionInItem` items.""" - _fields: ClassVar[dict] = {"session_tracker": {"type": str}, "_custom_data": {"type": dict}} - session_tracker: str | None - """Name of session tracker.""" - _custom_data: dict[str, Any] + DirectionIn._item_type = DirectionInItem - if TYPE_CHECKING: + class DirectionOutItem(AvdModel): + """Subclass of AvdModel.""" - def __init__( - self, *, session_tracker: str | None | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined - ) -> None: + _fields: ClassVar[dict] = { + "field_from": {"type": str}, + "to": {"type": int}, + "dot1q_tunnel_to": {"type": str}, + "inner_vlan_to": {"type": int}, + "_custom_data": {"type": dict}, + } + _field_to_key_map: ClassVar[dict] = {"field_from": "from"} + _key_to_field_map: ClassVar[dict] = {"from": "field_from"} + field_from: str + """VLAN ID or range of VLAN IDs to map from. Range 1-4094.""" + to: int | None + """VLAN ID to map to.""" + dot1q_tunnel_to: str | None """ - Bgp. - - - Subclass of AvdModel. - - Args: - session_tracker: Name of session tracker. - _custom_data: _custom_data - + VLAN ID or range of VLAN IDs or "all". Range 1-4094. + This takes precedence over `to` and + `inner_vlan_to`. """ - - class IpIgmpHostProxy(AvdModel): - """Subclass of AvdModel.""" - - class GroupsItem(AvdModel): - """Subclass of AvdModel.""" - - class ExcludeItem(AvdModel): - """Subclass of AvdModel.""" - - _fields: ClassVar[dict] = {"source": {"type": str}, "_custom_data": {"type": dict}} - source: str + inner_vlan_to: int | None + """Inner VLAN ID to map to.""" _custom_data: dict[str, Any] if TYPE_CHECKING: - def __init__(self, *, source: str | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined) -> None: + def __init__( + self, + *, + field_from: str | UndefinedType = Undefined, + to: int | None | UndefinedType = Undefined, + dot1q_tunnel_to: str | None | UndefinedType = Undefined, + inner_vlan_to: int | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: """ - ExcludeItem. + DirectionOutItem. Subclass of AvdModel. Args: - source: source + field_from: VLAN ID or range of VLAN IDs to map from. Range 1-4094. + to: VLAN ID to map to. + dot1q_tunnel_to: + VLAN ID or range of VLAN IDs or "all". Range 1-4094. + This takes precedence over `to` and + `inner_vlan_to`. + inner_vlan_to: Inner VLAN ID to map to. _custom_data: _custom_data """ - class Exclude(AvdIndexedList[str, ExcludeItem]): - """Subclass of AvdIndexedList with `ExcludeItem` items. Primary key is `source` (`str`).""" - - _primary_key: ClassVar[str] = "source" + class DirectionOut(AvdList[DirectionOutItem]): + """Subclass of AvdList with `DirectionOutItem` items.""" - Exclude._item_type = ExcludeItem + DirectionOut._item_type = DirectionOutItem - class IncludeItem(AvdModel): + class DirectionBothItem(AvdModel): """Subclass of AvdModel.""" - _fields: ClassVar[dict] = {"source": {"type": str}, "_custom_data": {"type": dict}} - source: str + _fields: ClassVar[dict] = { + "field_from": {"type": str}, + "to": {"type": int}, + "dot1q_tunnel": {"type": bool}, + "inner_vlan_from": {"type": int}, + "network": {"type": bool}, + "_custom_data": {"type": dict}, + } + _field_to_key_map: ClassVar[dict] = {"field_from": "from"} + _key_to_field_map: ClassVar[dict] = {"from": "field_from"} + field_from: str + """VLAN ID or range of VLAN IDs to map from. Range 1-4094.""" + to: int + """VLAN ID to map to.""" + dot1q_tunnel: bool | None + inner_vlan_from: int | None + """Inner VLAN ID to map from.""" + network: bool | None + """ + Enable use of network-side VLAN ID. + This setting can only be enabled when `inner_vlan_from` is + defined. + """ _custom_data: dict[str, Any] if TYPE_CHECKING: - def __init__(self, *, source: str | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined) -> None: + def __init__( + self, + *, + field_from: str | UndefinedType = Undefined, + to: int | UndefinedType = Undefined, + dot1q_tunnel: bool | None | UndefinedType = Undefined, + inner_vlan_from: int | None | UndefinedType = Undefined, + network: bool | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: """ - IncludeItem. + DirectionBothItem. Subclass of AvdModel. Args: - source: source + field_from: VLAN ID or range of VLAN IDs to map from. Range 1-4094. + to: VLAN ID to map to. + dot1q_tunnel: dot1q_tunnel + inner_vlan_from: Inner VLAN ID to map from. + network: + Enable use of network-side VLAN ID. + This setting can only be enabled when `inner_vlan_from` is + defined. _custom_data: _custom_data """ - class Include(AvdIndexedList[str, IncludeItem]): - """Subclass of AvdIndexedList with `IncludeItem` items. Primary key is `source` (`str`).""" + class DirectionBoth(AvdList[DirectionBothItem]): + """Subclass of AvdList with `DirectionBothItem` items.""" - _primary_key: ClassVar[str] = "source" + DirectionBoth._item_type = DirectionBothItem - Include._item_type = IncludeItem + _fields: ClassVar[dict] = { + "in_required": {"type": bool}, + "out_required": {"type": bool}, + "direction_in": {"type": DirectionIn}, + "direction_out": {"type": DirectionOut}, + "direction_both": {"type": DirectionBoth}, + "_custom_data": {"type": dict}, + } + in_required: bool | None + """Drop the ingress traffic that do not match any VLAN mapping.""" + out_required: bool | None + """Drop the egress traffic that do not match any VLAN mapping.""" + direction_in: DirectionIn + """ + Map ingress traffic only. - _fields: ClassVar[dict] = {"group": {"type": str}, "exclude": {"type": Exclude}, "include": {"type": Include}, "_custom_data": {"type": dict}} - group: str - """Multicast Address.""" - exclude: Exclude + Subclass of AvdList with `DirectionInItem` items. """ - The same source must not be present both in `exclude` and `include` list. + direction_out: DirectionOut + """ + Map egress traffic only. - Subclass of - AvdIndexedList with `ExcludeItem` items. Primary key is `source` (`str`). + Subclass of AvdList with `DirectionOutItem` items. """ - include: Include + direction_both: DirectionBoth """ - The same source must not be present both in `exclude` and `include` list. + Map both egress and ingress traffic. - Subclass of - AvdIndexedList with `IncludeItem` items. Primary key is `source` (`str`). + Subclass of AvdList with `DirectionBothItem` items. """ _custom_data: dict[str, Any] @@ -30185,237 +31478,269 @@ class Include(AvdIndexedList[str, IncludeItem]): def __init__( self, *, - group: str | UndefinedType = Undefined, - exclude: Exclude | UndefinedType = Undefined, - include: Include | UndefinedType = Undefined, + in_required: bool | None | UndefinedType = Undefined, + out_required: bool | None | UndefinedType = Undefined, + direction_in: DirectionIn | UndefinedType = Undefined, + direction_out: DirectionOut | UndefinedType = Undefined, + direction_both: DirectionBoth | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - GroupsItem. + VlanTranslations. Subclass of AvdModel. Args: - group: Multicast Address. - exclude: - The same source must not be present both in `exclude` and `include` list. + in_required: Drop the ingress traffic that do not match any VLAN mapping. + out_required: Drop the egress traffic that do not match any VLAN mapping. + direction_in: + Map ingress traffic only. - Subclass of - AvdIndexedList with `ExcludeItem` items. Primary key is `source` (`str`). - include: - The same source must not be present both in `exclude` and `include` list. + Subclass of AvdList with `DirectionInItem` items. + direction_out: + Map egress traffic only. - Subclass of - AvdIndexedList with `IncludeItem` items. Primary key is `source` (`str`). + Subclass of AvdList with `DirectionOutItem` items. + direction_both: + Map both egress and ingress traffic. + + Subclass of AvdList with `DirectionBothItem` items. _custom_data: _custom_data """ - class Groups(AvdIndexedList[str, GroupsItem]): - """Subclass of AvdIndexedList with `GroupsItem` items. Primary key is `group` (`str`).""" - - _primary_key: ClassVar[str] = "group" - - Groups._item_type = GroupsItem - - class AccessListsItem(AvdModel): + class BackupLink(AvdModel): """Subclass of AvdModel.""" - _fields: ClassVar[dict] = {"name": {"type": str}, "_custom_data": {"type": dict}} - name: str + _fields: ClassVar[dict] = {"interface": {"type": str}, "prefer_vlan": {"type": str}, "_custom_data": {"type": dict}} + interface: str + """Backup interface. Example - Ethernet4, Vlan10 etc.""" + prefer_vlan: str | None + """VLANs to carry on the backup interface (1-4094).""" _custom_data: dict[str, Any] if TYPE_CHECKING: - def __init__(self, *, name: str | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined) -> None: + def __init__( + self, + *, + interface: str | UndefinedType = Undefined, + prefer_vlan: str | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: """ - AccessListsItem. + BackupLink. Subclass of AvdModel. Args: - name: name + interface: Backup interface. Example - Ethernet4, Vlan10 etc. + prefer_vlan: VLANs to carry on the backup interface (1-4094). _custom_data: _custom_data """ - class AccessLists(AvdIndexedList[str, AccessListsItem]): - """Subclass of AvdIndexedList with `AccessListsItem` items. Primary key is `name` (`str`).""" + class Backup(AvdModel): + """Subclass of AvdModel.""" - _primary_key: ClassVar[str] = "name" + _fields: ClassVar[dict] = { + "dest_macaddr": {"type": str}, + "initial_mac_move_delay": {"type": int}, + "mac_move_burst": {"type": int}, + "mac_move_burst_interval": {"type": int}, + "preemption_delay": {"type": int}, + "_custom_data": {"type": dict}, + } + dest_macaddr: str | None + """ + Destination MAC address for MAC move updates. + The mac address should be multicast or broadcast. + Example: 01:00:00:00:00:00 + """ + initial_mac_move_delay: int | None + """Initial MAC move delay in milliseconds.""" + mac_move_burst: int | None + """Size of MAC move bursts.""" + mac_move_burst_interval: int | None + """MAC move burst interval in milliseconds.""" + preemption_delay: int | None + """Preemption delay in milliseconds.""" + _custom_data: dict[str, Any] - AccessLists._item_type = AccessListsItem + if TYPE_CHECKING: - _fields: ClassVar[dict] = { - "enabled": {"type": bool}, - "groups": {"type": Groups}, - "report_interval": {"type": int}, - "access_lists": {"type": AccessLists}, - "version": {"type": int}, - "_custom_data": {"type": dict}, - } - enabled: bool | None - groups: Groups - """Subclass of AvdIndexedList with `GroupsItem` items. Primary key is `group` (`str`).""" - report_interval: int | None - """Time interval between unsolicited reports.""" - access_lists: AccessLists - """ - Non-standard Access List name. + def __init__( + self, + *, + dest_macaddr: str | None | UndefinedType = Undefined, + initial_mac_move_delay: int | None | UndefinedType = Undefined, + mac_move_burst: int | None | UndefinedType = Undefined, + mac_move_burst_interval: int | None | UndefinedType = Undefined, + preemption_delay: int | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + Backup. - Subclass of AvdIndexedList with `AccessListsItem` items. Primary key - is `name` (`str`). - """ - version: int | None - """IGMP version on IGMP host-proxy interface.""" - _custom_data: dict[str, Any] - if TYPE_CHECKING: + Subclass of AvdModel. - def __init__( - self, - *, - enabled: bool | None | UndefinedType = Undefined, - groups: Groups | UndefinedType = Undefined, - report_interval: int | None | UndefinedType = Undefined, - access_lists: AccessLists | UndefinedType = Undefined, - version: int | None | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: - """ - IpIgmpHostProxy. + Args: + dest_macaddr: + Destination MAC address for MAC move updates. + The mac address should be multicast or broadcast. + Example: 01:00:00:00:00:00 + initial_mac_move_delay: Initial MAC move delay in milliseconds. + mac_move_burst: Size of MAC move bursts. + mac_move_burst_interval: MAC move burst interval in milliseconds. + preemption_delay: Preemption delay in milliseconds. + _custom_data: _custom_data + """ - Subclass of AvdModel. + class PortSecurity(AvdModel): + """Subclass of AvdModel.""" - Args: - enabled: enabled - groups: Subclass of AvdIndexedList with `GroupsItem` items. Primary key is `group` (`str`). - report_interval: Time interval between unsolicited reports. - access_lists: - Non-standard Access List name. + class MacAddressMaximum(AvdModel): + """Subclass of AvdModel.""" - Subclass of AvdIndexedList with `AccessListsItem` items. Primary key - is `name` (`str`). - version: IGMP version on IGMP host-proxy interface. - _custom_data: _custom_data + _fields: ClassVar[dict] = {"disabled": {"type": bool}, "limit": {"type": int}, "_custom_data": {"type": dict}} + disabled: bool | None + """Disable port level check for port security (only in violation 'shutdown' mode).""" + limit: int | None + """MAC address limit.""" + _custom_data: dict[str, Any] - """ + if TYPE_CHECKING: - class Sflow(AvdModel): - """Subclass of AvdModel.""" + def __init__( + self, + *, + disabled: bool | None | UndefinedType = Undefined, + limit: int | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + MacAddressMaximum. + + + Subclass of AvdModel. + + Args: + disabled: Disable port level check for port security (only in violation 'shutdown' mode). + limit: MAC address limit. + _custom_data: _custom_data - class Egress(AvdModel): - """Subclass of AvdModel.""" + """ - _fields: ClassVar[dict] = {"enable": {"type": bool}, "unmodified_enable": {"type": bool}, "_custom_data": {"type": dict}} - enable: bool | None - unmodified_enable: bool | None - _custom_data: dict[str, Any] + class Violation(AvdModel): + """Subclass of AvdModel.""" - if TYPE_CHECKING: + _fields: ClassVar[dict] = {"mode": {"type": str}, "protect_log": {"type": bool}, "_custom_data": {"type": dict}} + mode: Literal["shutdown", "protect"] | None + """Configure port security mode.""" + protect_log: bool | None + """Log new addresses seen after limit is reached in protect mode.""" + _custom_data: dict[str, Any] - def __init__( - self, - *, - enable: bool | None | UndefinedType = Undefined, - unmodified_enable: bool | None | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: - """ - Egress. + if TYPE_CHECKING: + def __init__( + self, + *, + mode: Literal["shutdown", "protect"] | None | UndefinedType = Undefined, + protect_log: bool | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + Violation. - Subclass of AvdModel. - Args: - enable: enable - unmodified_enable: unmodified_enable - _custom_data: _custom_data + Subclass of AvdModel. - """ + Args: + mode: Configure port security mode. + protect_log: Log new addresses seen after limit is reached in protect mode. + _custom_data: _custom_data - _fields: ClassVar[dict] = {"enable": {"type": bool}, "egress": {"type": Egress}, "_custom_data": {"type": dict}} - enable: bool | None - egress: Egress - """Subclass of AvdModel.""" - _custom_data: dict[str, Any] + """ - if TYPE_CHECKING: + class VlansItem(AvdModel): + """Subclass of AvdModel.""" - def __init__( - self, - *, - enable: bool | None | UndefinedType = Undefined, - egress: Egress | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: + _fields: ClassVar[dict] = {"range": {"type": str}, "mac_address_maximum": {"type": int}, "_custom_data": {"type": dict}} + range: str """ - Sflow. + VLAN ID or range(s) of VLAN IDs, <1-4094>. + Example: + - 3 + - 1,3 + - 1-10 + """ + mac_address_maximum: int | None + _custom_data: dict[str, Any] + if TYPE_CHECKING: - Subclass of AvdModel. + def __init__( + self, + *, + range: str | UndefinedType = Undefined, + mac_address_maximum: int | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + VlansItem. - Args: - enable: enable - egress: Subclass of AvdModel. - _custom_data: _custom_data - """ + Subclass of AvdModel. - class Switchport(AvdModel): - """Subclass of AvdModel.""" + Args: + range: + VLAN ID or range(s) of VLAN IDs, <1-4094>. + Example: # fmt: skip + - 3 + - 1,3 + - 1-10 + mac_address_maximum: mac_address_maximum + _custom_data: _custom_data - class Trunk(AvdModel): - """Subclass of AvdModel.""" + """ - class Groups(AvdList[str]): - """Subclass of AvdList with `str` items.""" + class Vlans(AvdIndexedList[str, VlansItem]): + """Subclass of AvdIndexedList with `VlansItem` items. Primary key is `range` (`str`).""" - Groups._item_type = str + _primary_key: ClassVar[str] = "range" + + Vlans._item_type = VlansItem _fields: ClassVar[dict] = { - "allowed_vlan": {"type": str}, - "native_vlan": {"type": int}, - "native_vlan_tag": {"type": bool}, - "private_vlan_secondary": {"type": bool}, - "groups": {"type": Groups}, + "enabled": {"type": bool}, + "mac_address_maximum": {"type": MacAddressMaximum}, + "violation": {"type": Violation}, + "vlan_default_mac_address_maximum": {"type": int}, + "vlans": {"type": Vlans}, "_custom_data": {"type": dict}, } - allowed_vlan: str | None - """ - VLAN ID or range(s) of VLAN IDs (1-4094). - Warning: This should not be combined with - `port_channel_interfaces[].mode = trunk` and `port_channel_interfaces[].vlans`. - """ - native_vlan: int | None - """ - Set native VLAN when interface is in trunking mode. - Warning: This should not be combined with - `port_channel_interfaces[].native_vlan`. - """ - native_vlan_tag: bool | None - """ - If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence. - Warning: This - should not be combined with `port_channel_interfaces[].native_vlan_tag`. - """ - private_vlan_secondary: bool | None + enabled: bool | None + mac_address_maximum: MacAddressMaximum """ - Enable secondary VLAN mapping for a private vlan. - Warning: This should not be combined with - `port_channel_interfaces[].trunk_private_vlan_secondary`. + Maximum number of MAC addresses allowed on the interface. + + Subclass of AvdModel. """ - groups: Groups + violation: Violation """ - Warning: This should not be combined with `port_channel_interfaces[].trunk_groups`. - + Configure violation mode (shutdown or protect), EOS default is 'shutdown'. - Subclass of - AvdList with `str` items. + Subclass of AvdModel. """ + vlan_default_mac_address_maximum: int | None + """Default maximum MAC addresses for all VLANs on this interface.""" + vlans: Vlans + """Subclass of AvdIndexedList with `VlansItem` items. Primary key is `range` (`str`).""" _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -30423,131 +31748,125 @@ class Groups(AvdList[str]): def __init__( self, *, - allowed_vlan: str | None | UndefinedType = Undefined, - native_vlan: int | None | UndefinedType = Undefined, - native_vlan_tag: bool | None | UndefinedType = Undefined, - private_vlan_secondary: bool | None | UndefinedType = Undefined, - groups: Groups | UndefinedType = Undefined, + enabled: bool | None | UndefinedType = Undefined, + mac_address_maximum: MacAddressMaximum | UndefinedType = Undefined, + violation: Violation | UndefinedType = Undefined, + vlan_default_mac_address_maximum: int | None | UndefinedType = Undefined, + vlans: Vlans | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - Trunk. + PortSecurity. Subclass of AvdModel. Args: - allowed_vlan: - VLAN ID or range(s) of VLAN IDs (1-4094). - Warning: This should not be combined with - `port_channel_interfaces[].mode = trunk` and `port_channel_interfaces[].vlans`. - native_vlan: - Set native VLAN when interface is in trunking mode. - Warning: This should not be combined with - `port_channel_interfaces[].native_vlan`. - native_vlan_tag: - If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence. - Warning: This - should not be combined with `port_channel_interfaces[].native_vlan_tag`. - private_vlan_secondary: - Enable secondary VLAN mapping for a private vlan. - Warning: This should not be combined with - `port_channel_interfaces[].trunk_private_vlan_secondary`. - groups: - Warning: This should not be combined with `port_channel_interfaces[].trunk_groups`. + enabled: enabled + mac_address_maximum: + Maximum number of MAC addresses allowed on the interface. + Subclass of AvdModel. + violation: + Configure violation mode (shutdown or protect), EOS default is 'shutdown'. - Subclass of - AvdList with `str` items. + Subclass of AvdModel. + vlan_default_mac_address_maximum: Default maximum MAC addresses for all VLANs on this interface. + vlans: Subclass of AvdIndexedList with `VlansItem` items. Primary key is `range` (`str`). _custom_data: _custom_data """ - class Phone(AvdModel): + class Tap(AvdModel): """Subclass of AvdModel.""" - _fields: ClassVar[dict] = {"vlan": {"type": int}, "trunk": {"type": str}, "_custom_data": {"type": dict}} - vlan: int | None - """Warning: This should not be combined with `port_channel_interfaces[].phone.vlan`.""" - trunk: Literal["tagged", "tagged phone", "untagged", "untagged phone"] | None - """Warning: This should not be combined with `port_channel_interfaces[].phone.trunk`""" - _custom_data: dict[str, Any] + class Default(AvdModel): + """Subclass of AvdModel.""" - if TYPE_CHECKING: + class Groups(AvdList[str]): + """Subclass of AvdList with `str` items.""" - def __init__( - self, - *, - vlan: int | None | UndefinedType = Undefined, - trunk: Literal["tagged", "tagged phone", "untagged", "untagged phone"] | None | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: - """ - Phone. + Groups._item_type = str + class Interfaces(AvdList[str]): + """Subclass of AvdList with `str` items.""" - Subclass of AvdModel. + Interfaces._item_type = str - Args: - vlan: Warning: This should not be combined with `port_channel_interfaces[].phone.vlan`. - trunk: Warning: This should not be combined with `port_channel_interfaces[].phone.trunk` - _custom_data: _custom_data + class NexthopGroups(AvdList[str]): + """Subclass of AvdList with `str` items.""" - """ + NexthopGroups._item_type = str - class Dot1q(AvdModel): - """Subclass of AvdModel.""" + _fields: ClassVar[dict] = { + "groups": {"type": Groups}, + "interfaces": {"type": Interfaces}, + "nexthop_groups": {"type": NexthopGroups}, + "_custom_data": {"type": dict}, + } + groups: Groups + """ + Tap group names for the interface. + + Subclass of AvdList with `str` items. + """ + interfaces: Interfaces + """ + Interfaces like - Ethernet1, InternalRecirc1, Port-Channel1, Recirc-Channel1. + + Subclass of AvdList + with `str` items. + """ + nexthop_groups: NexthopGroups + """ + Default nexthop-group names. + + Subclass of AvdList with `str` items. + """ + _custom_data: dict[str, Any] + + if TYPE_CHECKING: - _fields: ClassVar[dict] = {"ethertype": {"type": int}, "vlan_tag": {"type": str}, "_custom_data": {"type": dict}} - ethertype: int | None - """Ethertype/TPID (Tag Protocol IDentifier) for VLAN tagged frames.""" - vlan_tag: Literal["disallowed", "required"] | None - _custom_data: dict[str, Any] + def __init__( + self, + *, + groups: Groups | UndefinedType = Undefined, + interfaces: Interfaces | UndefinedType = Undefined, + nexthop_groups: NexthopGroups | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + Default. - if TYPE_CHECKING: - def __init__( - self, - *, - ethertype: int | None | UndefinedType = Undefined, - vlan_tag: Literal["disallowed", "required"] | None | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: - """ - Dot1q. + Subclass of AvdModel. + Args: + groups: + Tap group names for the interface. - Subclass of AvdModel. + Subclass of AvdList with `str` items. + interfaces: + Interfaces like - Ethernet1, InternalRecirc1, Port-Channel1, Recirc-Channel1. - Args: - ethertype: Ethertype/TPID (Tag Protocol IDentifier) for VLAN tagged frames. - vlan_tag: vlan_tag - _custom_data: _custom_data + Subclass of AvdList + with `str` items. + nexthop_groups: + Default nexthop-group names. - """ + Subclass of AvdList with `str` items. + _custom_data: _custom_data - class VlanTranslations(AvdModel): - """Subclass of AvdModel.""" + """ - class DirectionInItem(AvdModel): + class Identity(AvdModel): """Subclass of AvdModel.""" - _fields: ClassVar[dict] = { - "field_from": {"type": str}, - "to": {"type": int}, - "dot1q_tunnel": {"type": bool}, - "inner_vlan_from": {"type": int}, - "_custom_data": {"type": dict}, - } - _field_to_key_map: ClassVar[dict] = {"field_from": "from"} - _key_to_field_map: ClassVar[dict] = {"from": "field_from"} - field_from: str | None - """VLAN ID or range of VLAN IDs to map from. Range 1-4094.""" - to: int | None - """VLAN ID to map to.""" - dot1q_tunnel: bool | None - inner_vlan_from: int | None - """Inner VLAN ID to map from.""" + _fields: ClassVar[dict] = {"id": {"type": int}, "inner_vlan": {"type": int}, "_custom_data": {"type": dict}} + id: int | None + """Tap port VLAN ID (1-4094) or DzGRE extended ID (1-65535).""" + inner_vlan: int | None + """Tap port inner VLAN ID. Only applicable if `id` is a VLAN ID (1-4094).""" _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -30555,56 +31874,30 @@ class DirectionInItem(AvdModel): def __init__( self, *, - field_from: str | None | UndefinedType = Undefined, - to: int | None | UndefinedType = Undefined, - dot1q_tunnel: bool | None | UndefinedType = Undefined, - inner_vlan_from: int | None | UndefinedType = Undefined, + id: int | None | UndefinedType = Undefined, + inner_vlan: int | None | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - DirectionInItem. + Identity. Subclass of AvdModel. Args: - field_from: VLAN ID or range of VLAN IDs to map from. Range 1-4094. - to: VLAN ID to map to. - dot1q_tunnel: dot1q_tunnel - inner_vlan_from: Inner VLAN ID to map from. + id: Tap port VLAN ID (1-4094) or DzGRE extended ID (1-65535). + inner_vlan: Tap port inner VLAN ID. Only applicable if `id` is a VLAN ID (1-4094). _custom_data: _custom_data """ - class DirectionIn(AvdList[DirectionInItem]): - """Subclass of AvdList with `DirectionInItem` items.""" - - DirectionIn._item_type = DirectionInItem - - class DirectionOutItem(AvdModel): + class Truncation(AvdModel): """Subclass of AvdModel.""" - _fields: ClassVar[dict] = { - "field_from": {"type": str}, - "to": {"type": int}, - "dot1q_tunnel_to": {"type": str}, - "inner_vlan_to": {"type": int}, - "_custom_data": {"type": dict}, - } - _field_to_key_map: ClassVar[dict] = {"field_from": "from"} - _key_to_field_map: ClassVar[dict] = {"from": "field_from"} - field_from: str - """VLAN ID or range of VLAN IDs to map from. Range 1-4094.""" - to: int | None - """VLAN ID to map to.""" - dot1q_tunnel_to: str | None - """ - VLAN ID or range of VLAN IDs or "all". Range 1-4094. - This takes precedence over `to` and - `inner_vlan_to`. - """ - inner_vlan_to: int | None - """Inner VLAN ID to map to.""" + _fields: ClassVar[dict] = {"enabled": {"type": bool}, "size": {"type": int}, "_custom_data": {"type": dict}} + enabled: bool | None + size: int | None + """Ingress packet truncation size in bytes.""" _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -30612,61 +31905,31 @@ class DirectionOutItem(AvdModel): def __init__( self, *, - field_from: str | UndefinedType = Undefined, - to: int | None | UndefinedType = Undefined, - dot1q_tunnel_to: str | None | UndefinedType = Undefined, - inner_vlan_to: int | None | UndefinedType = Undefined, + enabled: bool | None | UndefinedType = Undefined, + size: int | None | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - DirectionOutItem. + Truncation. Subclass of AvdModel. Args: - field_from: VLAN ID or range of VLAN IDs to map from. Range 1-4094. - to: VLAN ID to map to. - dot1q_tunnel_to: - VLAN ID or range of VLAN IDs or "all". Range 1-4094. - This takes precedence over `to` and - `inner_vlan_to`. - inner_vlan_to: Inner VLAN ID to map to. + enabled: enabled + size: Ingress packet truncation size in bytes. _custom_data: _custom_data """ - class DirectionOut(AvdList[DirectionOutItem]): - """Subclass of AvdList with `DirectionOutItem` items.""" - - DirectionOut._item_type = DirectionOutItem - - class DirectionBothItem(AvdModel): + class MacAddress(AvdModel): """Subclass of AvdModel.""" - _fields: ClassVar[dict] = { - "field_from": {"type": str}, - "to": {"type": int}, - "dot1q_tunnel": {"type": bool}, - "inner_vlan_from": {"type": int}, - "network": {"type": bool}, - "_custom_data": {"type": dict}, - } - _field_to_key_map: ClassVar[dict] = {"field_from": "from"} - _key_to_field_map: ClassVar[dict] = {"from": "field_from"} - field_from: str - """VLAN ID or range of VLAN IDs to map from. Range 1-4094.""" - to: int - """VLAN ID to map to.""" - dot1q_tunnel: bool | None - inner_vlan_from: int | None - """Inner VLAN ID to map from.""" - network: bool | None - """ - Enable use of network-side VLAN ID. - This setting can only be enabled when `inner_vlan_from` is - defined. - """ + _fields: ClassVar[dict] = {"source": {"type": str}, "destination": {"type": str}, "_custom_data": {"type": dict}} + source: str | None + """MAC address for the source.""" + destination: str | None + """MAC address for the destination.""" _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -30674,163 +31937,364 @@ class DirectionBothItem(AvdModel): def __init__( self, *, - field_from: str | UndefinedType = Undefined, - to: int | UndefinedType = Undefined, - dot1q_tunnel: bool | None | UndefinedType = Undefined, - inner_vlan_from: int | None | UndefinedType = Undefined, - network: bool | None | UndefinedType = Undefined, + source: str | None | UndefinedType = Undefined, + destination: str | None | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - DirectionBothItem. + MacAddress. Subclass of AvdModel. Args: - field_from: VLAN ID or range of VLAN IDs to map from. Range 1-4094. - to: VLAN ID to map to. - dot1q_tunnel: dot1q_tunnel - inner_vlan_from: Inner VLAN ID to map from. - network: - Enable use of network-side VLAN ID. - This setting can only be enabled when `inner_vlan_from` is - defined. + source: MAC address for the source. + destination: MAC address for the destination. _custom_data: _custom_data """ - class DirectionBoth(AvdList[DirectionBothItem]): - """Subclass of AvdList with `DirectionBothItem` items.""" + class Encapsulation(AvdModel): + """Subclass of AvdModel.""" - DirectionBoth._item_type = DirectionBothItem + class Gre(AvdModel): + """Subclass of AvdModel.""" - _fields: ClassVar[dict] = { - "in_required": {"type": bool}, - "out_required": {"type": bool}, - "direction_in": {"type": DirectionIn}, - "direction_out": {"type": DirectionOut}, - "direction_both": {"type": DirectionBoth}, - "_custom_data": {"type": dict}, - } - in_required: bool | None - """Drop the ingress traffic that do not match any VLAN mapping.""" - out_required: bool | None - """Drop the egress traffic that do not match any VLAN mapping.""" - direction_in: DirectionIn - """ - Map ingress traffic only. + class ProtocolsItem(AvdModel): + """Subclass of AvdModel.""" - Subclass of AvdList with `DirectionInItem` items. - """ - direction_out: DirectionOut - """ - Map egress traffic only. + _fields: ClassVar[dict] = { + "protocol": {"type": str}, + "strip": {"type": bool}, + "feature_header_length": {"type": int}, + "re_encapsulation_ethernet_header": {"type": bool}, + "_custom_data": {"type": dict}, + } + protocol: str + """ + Protocol type in GRE header. + Valid range: 0x0-0xFFFF. The value must be enclosed in quotes, e.g., + "0x0". + """ + strip: bool | None + """This is a required key to strip GRE encapsulation header with protocols.""" + feature_header_length: int | None + """ + Feature header length in bytes. + Note: This setting does not appear in the EOS running-config for + protocol 0x0. + """ + re_encapsulation_ethernet_header: bool | None + """ + Extra ethernet header to prepend to the terminated packet. + Note: This setting does not appear in the + EOS running-config for protocol 0x0. + """ + _custom_data: dict[str, Any] - Subclass of AvdList with `DirectionOutItem` items. - """ - direction_both: DirectionBoth - """ - Map both egress and ingress traffic. + if TYPE_CHECKING: - Subclass of AvdList with `DirectionBothItem` items. - """ - _custom_data: dict[str, Any] + def __init__( + self, + *, + protocol: str | UndefinedType = Undefined, + strip: bool | None | UndefinedType = Undefined, + feature_header_length: int | None | UndefinedType = Undefined, + re_encapsulation_ethernet_header: bool | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + ProtocolsItem. - if TYPE_CHECKING: - def __init__( - self, - *, - in_required: bool | None | UndefinedType = Undefined, - out_required: bool | None | UndefinedType = Undefined, - direction_in: DirectionIn | UndefinedType = Undefined, - direction_out: DirectionOut | UndefinedType = Undefined, - direction_both: DirectionBoth | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: - """ - VlanTranslations. + Subclass of AvdModel. + + Args: + protocol: + Protocol type in GRE header. + Valid range: 0x0-0xFFFF. The value must be enclosed in quotes, e.g., + "0x0". + strip: This is a required key to strip GRE encapsulation header with protocols. + feature_header_length: + Feature header length in bytes. + Note: This setting does not appear in the EOS running-config for + protocol 0x0. + re_encapsulation_ethernet_header: + Extra ethernet header to prepend to the terminated packet. + Note: This setting does not appear in the + EOS running-config for protocol 0x0. + _custom_data: _custom_data + + """ + + class Protocols(AvdIndexedList[str, ProtocolsItem]): + """Subclass of AvdIndexedList with `ProtocolsItem` items. Primary key is `protocol` (`str`).""" + + _primary_key: ClassVar[str] = "protocol" + + Protocols._item_type = ProtocolsItem + + class DestinationsItem(AvdModel): + """Subclass of AvdModel.""" + + class ProtocolsItem(AvdModel): + """Subclass of AvdModel.""" + + _fields: ClassVar[dict] = { + "protocol": {"type": str}, + "strip": {"type": bool}, + "feature_header_length": {"type": int}, + "re_encapsulation_ethernet_header": {"type": bool}, + "_custom_data": {"type": dict}, + } + protocol: str + """ + Protocol type in GRE header. + Valid range: 0x0-0xFFFF. The value must be enclosed in quotes, e.g., + "0x0". + """ + strip: bool | None + """This is a required key to strip GRE encapsulation header for specific destination with protocols.""" + feature_header_length: int | None + """ + Feature header length in bytes. + Note: This setting does not appear in the EOS running-config for + protocol 0x0. + """ + re_encapsulation_ethernet_header: bool | None + """ + Extra ethernet header to prepend to the terminated packet. + Note: This setting does not appear in the + EOS running-config for protocol 0x0. + """ + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__( + self, + *, + protocol: str | UndefinedType = Undefined, + strip: bool | None | UndefinedType = Undefined, + feature_header_length: int | None | UndefinedType = Undefined, + re_encapsulation_ethernet_header: bool | None | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + ProtocolsItem. + + + Subclass of AvdModel. + + Args: + protocol: + Protocol type in GRE header. + Valid range: 0x0-0xFFFF. The value must be enclosed in quotes, e.g., + "0x0". + strip: This is a required key to strip GRE encapsulation header for specific destination with protocols. + feature_header_length: + Feature header length in bytes. + Note: This setting does not appear in the EOS running-config for + protocol 0x0. + re_encapsulation_ethernet_header: + Extra ethernet header to prepend to the terminated packet. + Note: This setting does not appear in the + EOS running-config for protocol 0x0. + _custom_data: _custom_data + + """ + + class Protocols(AvdIndexedList[str, ProtocolsItem]): + """Subclass of AvdIndexedList with `ProtocolsItem` items. Primary key is `protocol` (`str`).""" + + _primary_key: ClassVar[str] = "protocol" + + Protocols._item_type = ProtocolsItem + + _fields: ClassVar[dict] = { + "destination": {"type": str}, + "source": {"type": str}, + "strip": {"type": bool}, + "protocols": {"type": Protocols}, + "_custom_data": {"type": dict}, + } + destination: str + """Destination IP address of tunnel packets.""" + source: str | None + """ + Source IP address of tunnel packets. Applied only when destination is defined. When not defined; any + GRE packet that matches the `destination` is terminated. + """ + strip: bool | None + """Strip GRE encapsulation header for specific destination.""" + protocols: Protocols + """Subclass of AvdIndexedList with `ProtocolsItem` items. Primary key is `protocol` (`str`).""" + _custom_data: dict[str, Any] + + if TYPE_CHECKING: + + def __init__( + self, + *, + destination: str | UndefinedType = Undefined, + source: str | None | UndefinedType = Undefined, + strip: bool | None | UndefinedType = Undefined, + protocols: Protocols | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + DestinationsItem. + + + Subclass of AvdModel. + + Args: + destination: Destination IP address of tunnel packets. + source: + Source IP address of tunnel packets. Applied only when destination is defined. When not defined; any + GRE packet that matches the `destination` is terminated. + strip: Strip GRE encapsulation header for specific destination. + protocols: Subclass of AvdIndexedList with `ProtocolsItem` items. Primary key is `protocol` (`str`). + _custom_data: _custom_data + """ - Subclass of AvdModel. + class Destinations(AvdIndexedList[str, DestinationsItem]): + """Subclass of AvdIndexedList with `DestinationsItem` items. Primary key is `destination` (`str`).""" - Args: - in_required: Drop the ingress traffic that do not match any VLAN mapping. - out_required: Drop the egress traffic that do not match any VLAN mapping. - direction_in: - Map ingress traffic only. + _primary_key: ClassVar[str] = "destination" - Subclass of AvdList with `DirectionInItem` items. - direction_out: - Map egress traffic only. + Destinations._item_type = DestinationsItem - Subclass of AvdList with `DirectionOutItem` items. - direction_both: - Map both egress and ingress traffic. + _fields: ClassVar[dict] = { + "strip": {"type": bool}, + "protocols": {"type": Protocols}, + "destinations": {"type": Destinations}, + "_custom_data": {"type": dict}, + } + strip: bool | None + """Strip GRE encapsulation header for all GRE tunnels.""" + protocols: Protocols + """ + Protocols for all destinations; destination-specific protocols should be set under the + `destinations[].protocols` key. - Subclass of AvdList with `DirectionBothItem` items. - _custom_data: _custom_data + Subclass of AvdIndexedList with `ProtocolsItem` items. Primary key + is `protocol` (`str`). + """ + destinations: Destinations + """ + In EOS, `gre.strip` and `destinations.destination/source.strip` (without defining protocols) are + mutually exclusive. + Subclass of AvdIndexedList with `DestinationsItem` items. Primary key is + `destination` (`str`). """ + _custom_data: dict[str, Any] - class BackupLink(AvdModel): - """Subclass of AvdModel.""" + if TYPE_CHECKING: - _fields: ClassVar[dict] = {"interface": {"type": str}, "prefer_vlan": {"type": str}, "_custom_data": {"type": dict}} - interface: str - """Backup interface. Example - Ethernet4, Vlan10 etc.""" - prefer_vlan: str | None - """VLANs to carry on the backup interface (1-4094).""" - _custom_data: dict[str, Any] + def __init__( + self, + *, + strip: bool | None | UndefinedType = Undefined, + protocols: Protocols | UndefinedType = Undefined, + destinations: Destinations | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + Gre. - if TYPE_CHECKING: - def __init__( - self, - *, - interface: str | UndefinedType = Undefined, - prefer_vlan: str | None | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: - """ - BackupLink. + Subclass of AvdModel. + Args: + strip: Strip GRE encapsulation header for all GRE tunnels. + protocols: + Protocols for all destinations; destination-specific protocols should be set under the + `destinations[].protocols` key. + + Subclass of AvdIndexedList with `ProtocolsItem` items. Primary key + is `protocol` (`str`). + destinations: + In EOS, `gre.strip` and `destinations.destination/source.strip` (without defining protocols) are + mutually exclusive. + + Subclass of AvdIndexedList with `DestinationsItem` items. Primary key is + `destination` (`str`). + _custom_data: _custom_data - Subclass of AvdModel. + """ - Args: - interface: Backup interface. Example - Ethernet4, Vlan10 etc. - prefer_vlan: VLANs to carry on the backup interface (1-4094). - _custom_data: _custom_data + _fields: ClassVar[dict] = {"vxlan_strip": {"type": bool}, "gre": {"type": Gre}, "_custom_data": {"type": dict}} + vxlan_strip: bool | None + """ + Strip VXLAN encapsulation header. + `encapsulation.vxlan_strip` and `mpls_pop_all` are mutually + exclusive. + `mpls_pop_all` takes precedence. + """ + gre: Gre + """Subclass of AvdModel.""" + _custom_data: dict[str, Any] - """ + if TYPE_CHECKING: - class Backup(AvdModel): - """Subclass of AvdModel.""" + def __init__( + self, + *, + vxlan_strip: bool | None | UndefinedType = Undefined, + gre: Gre | UndefinedType = Undefined, + _custom_data: dict[str, Any] | UndefinedType = Undefined, + ) -> None: + """ + Encapsulation. + + + Subclass of AvdModel. + + Args: + vxlan_strip: + Strip VXLAN encapsulation header. + `encapsulation.vxlan_strip` and `mpls_pop_all` are mutually + exclusive. + `mpls_pop_all` takes precedence. + gre: Subclass of AvdModel. + _custom_data: _custom_data + + """ _fields: ClassVar[dict] = { - "dest_macaddr": {"type": str}, - "initial_mac_move_delay": {"type": int}, - "mac_move_burst": {"type": int}, - "mac_move_burst_interval": {"type": int}, - "preemption_delay": {"type": int}, + "allowed_vlan": {"type": str}, + "default": {"type": Default}, + "identity": {"type": Identity}, + "mpls_pop_all": {"type": bool}, + "native_vlan": {"type": int}, + "truncation": {"type": Truncation}, + "mac_address": {"type": MacAddress}, + "encapsulation": {"type": Encapsulation}, "_custom_data": {"type": dict}, } - dest_macaddr: str | None + allowed_vlan: str | None + """VLAN ID or range(s) of VLAN IDs within range 1-4094.""" + default: Default """ - Destination MAC address for MAC move updates. - The mac address should be multicast or broadcast. - Example: 01:00:00:00:00:00 + Default tap destination config. + + Subclass of AvdModel. """ - initial_mac_move_delay: int | None - """Initial MAC move delay in milliseconds.""" - mac_move_burst: int | None - """Size of MAC move bursts.""" - mac_move_burst_interval: int | None - """MAC move burst interval in milliseconds.""" - preemption_delay: int | None - """Preemption delay in milliseconds.""" + identity: Identity + """Subclass of AvdModel.""" + mpls_pop_all: bool | None + """Pop all MPLS labels.""" + native_vlan: int | None + """Native VLAN ID when interface is in tap mode.""" + truncation: Truncation + """Subclass of AvdModel.""" + mac_address: MacAddress + """Subclass of AvdModel.""" + encapsulation: Encapsulation + """Subclass of AvdModel.""" _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -30838,75 +32302,49 @@ class Backup(AvdModel): def __init__( self, *, - dest_macaddr: str | None | UndefinedType = Undefined, - initial_mac_move_delay: int | None | UndefinedType = Undefined, - mac_move_burst: int | None | UndefinedType = Undefined, - mac_move_burst_interval: int | None | UndefinedType = Undefined, - preemption_delay: int | None | UndefinedType = Undefined, + allowed_vlan: str | None | UndefinedType = Undefined, + default: Default | UndefinedType = Undefined, + identity: Identity | UndefinedType = Undefined, + mpls_pop_all: bool | None | UndefinedType = Undefined, + native_vlan: int | None | UndefinedType = Undefined, + truncation: Truncation | UndefinedType = Undefined, + mac_address: MacAddress | UndefinedType = Undefined, + encapsulation: Encapsulation | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - Backup. + Tap. Subclass of AvdModel. Args: - dest_macaddr: - Destination MAC address for MAC move updates. - The mac address should be multicast or broadcast. - Example: 01:00:00:00:00:00 - initial_mac_move_delay: Initial MAC move delay in milliseconds. - mac_move_burst: Size of MAC move bursts. - mac_move_burst_interval: MAC move burst interval in milliseconds. - preemption_delay: Preemption delay in milliseconds. + allowed_vlan: VLAN ID or range(s) of VLAN IDs within range 1-4094. + default: + Default tap destination config. + + Subclass of AvdModel. + identity: Subclass of AvdModel. + mpls_pop_all: Pop all MPLS labels. + native_vlan: Native VLAN ID when interface is in tap mode. + truncation: Subclass of AvdModel. + mac_address: Subclass of AvdModel. + encapsulation: Subclass of AvdModel. _custom_data: _custom_data """ - class PortSecurity(AvdModel): + class Tool(AvdModel): """Subclass of AvdModel.""" - class MacAddressMaximum(AvdModel): - """Subclass of AvdModel.""" - - _fields: ClassVar[dict] = {"disabled": {"type": bool}, "limit": {"type": int}, "_custom_data": {"type": dict}} - disabled: bool | None - """Disable port level check for port security (only in violation 'shutdown' mode).""" - limit: int | None - """MAC address limit.""" - _custom_data: dict[str, Any] - - if TYPE_CHECKING: - - def __init__( - self, - *, - disabled: bool | None | UndefinedType = Undefined, - limit: int | None | UndefinedType = Undefined, - _custom_data: dict[str, Any] | UndefinedType = Undefined, - ) -> None: - """ - MacAddressMaximum. - - - Subclass of AvdModel. - - Args: - disabled: Disable port level check for port security (only in violation 'shutdown' mode). - limit: MAC address limit. - _custom_data: _custom_data - - """ - - class Violation(AvdModel): + class Encapsulation(AvdModel): """Subclass of AvdModel.""" - _fields: ClassVar[dict] = {"mode": {"type": str}, "protect_log": {"type": bool}, "_custom_data": {"type": dict}} - mode: Literal["shutdown", "protect"] | None - """Configure port security mode.""" - protect_log: bool | None - """Log new addresses seen after limit is reached in protect mode.""" + _fields: ClassVar[dict] = {"dot1br_strip": {"type": bool}, "vn_tag_strip": {"type": bool}, "_custom_data": {"type": dict}} + dot1br_strip: bool | None + """Remove a 802.1 BR tag in packet header. 'mpls_pop_all' takes precedence over 'dot1br_strip' in EOS.""" + vn_tag_strip: bool | None + """Remove a VN-tag in packet header. 'mpls_pop_all' takes precedence over 'vn_tag_strip' in EOS.""" _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -30914,36 +32352,35 @@ class Violation(AvdModel): def __init__( self, *, - mode: Literal["shutdown", "protect"] | None | UndefinedType = Undefined, - protect_log: bool | None | UndefinedType = Undefined, + dot1br_strip: bool | None | UndefinedType = Undefined, + vn_tag_strip: bool | None | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - Violation. + Encapsulation. Subclass of AvdModel. Args: - mode: Configure port security mode. - protect_log: Log new addresses seen after limit is reached in protect mode. + dot1br_strip: Remove a 802.1 BR tag in packet header. 'mpls_pop_all' takes precedence over 'dot1br_strip' in EOS. + vn_tag_strip: Remove a VN-tag in packet header. 'mpls_pop_all' takes precedence over 'vn_tag_strip' in EOS. _custom_data: _custom_data """ - class VlansItem(AvdModel): + class Identity(AvdModel): """Subclass of AvdModel.""" - _fields: ClassVar[dict] = {"range": {"type": str}, "mac_address_maximum": {"type": int}, "_custom_data": {"type": dict}} - range: str - """ - VLAN ID or range(s) of VLAN IDs, <1-4094>. - Example: - - 3 - - 1,3 - - 1-10 - """ - mac_address_maximum: int | None + _fields: ClassVar[dict] = { + "tag": {"type": str}, + "dot1q_dzgre_source": {"type": str}, + "qinq_dzgre_source": {"type": str}, + "_custom_data": {"type": dict}, + } + tag: Literal["dot1q", "qinq"] | None + dot1q_dzgre_source: Literal["policy", "port"] | None + qinq_dzgre_source: Literal["policy inner port", "port inner policy"] | None _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -30951,60 +32388,58 @@ class VlansItem(AvdModel): def __init__( self, *, - range: str | UndefinedType = Undefined, - mac_address_maximum: int | None | UndefinedType = Undefined, + tag: Literal["dot1q", "qinq"] | None | UndefinedType = Undefined, + dot1q_dzgre_source: Literal["policy", "port"] | None | UndefinedType = Undefined, + qinq_dzgre_source: Literal["policy inner port", "port inner policy"] | None | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - VlansItem. + Identity. Subclass of AvdModel. Args: - range: - VLAN ID or range(s) of VLAN IDs, <1-4094>. - Example: # fmt: skip - - 3 - - 1,3 - - 1-10 - mac_address_maximum: mac_address_maximum + tag: tag + dot1q_dzgre_source: dot1q_dzgre_source + qinq_dzgre_source: qinq_dzgre_source _custom_data: _custom_data """ - class Vlans(AvdIndexedList[str, VlansItem]): - """Subclass of AvdIndexedList with `VlansItem` items. Primary key is `range` (`str`).""" - - _primary_key: ClassVar[str] = "range" + class Groups(AvdList[str]): + """Subclass of AvdList with `str` items.""" - Vlans._item_type = VlansItem + Groups._item_type = str _fields: ClassVar[dict] = { - "enabled": {"type": bool}, - "mac_address_maximum": {"type": MacAddressMaximum}, - "violation": {"type": Violation}, - "vlan_default_mac_address_maximum": {"type": int}, - "vlans": {"type": Vlans}, + "mpls_pop_all": {"type": bool}, + "encapsulation": {"type": Encapsulation}, + "allowed_vlan": {"type": str}, + "identity": {"type": Identity}, + "groups": {"type": Groups}, + "dot1q_remove_outer_vlan_tag": {"type": str}, "_custom_data": {"type": dict}, } - enabled: bool | None - mac_address_maximum: MacAddressMaximum + mpls_pop_all: bool | None + """Pop all MPLS labels.""" + encapsulation: Encapsulation + """Subclass of AvdModel.""" + allowed_vlan: str | None + """VLAN ID or range of VLAN IDs within range 1-4094.""" + identity: Identity + """Subclass of AvdModel.""" + groups: Groups """ - Maximum number of MAC addresses allowed on the interface. + Tool groups for the interface. - Subclass of AvdModel. + Subclass of AvdList with `str` items. """ - violation: Violation + dot1q_remove_outer_vlan_tag: str | None """ - Configure violation mode (shutdown or protect), EOS default is 'shutdown'. - - Subclass of AvdModel. + Indices of vlan tags to be removed. + Range: 1-2 """ - vlan_default_mac_address_maximum: int | None - """Default maximum MAC addresses for all VLANs on this interface.""" - vlans: Vlans - """Subclass of AvdIndexedList with `VlansItem` items. Primary key is `range` (`str`).""" _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -31012,31 +32447,32 @@ class Vlans(AvdIndexedList[str, VlansItem]): def __init__( self, *, - enabled: bool | None | UndefinedType = Undefined, - mac_address_maximum: MacAddressMaximum | UndefinedType = Undefined, - violation: Violation | UndefinedType = Undefined, - vlan_default_mac_address_maximum: int | None | UndefinedType = Undefined, - vlans: Vlans | UndefinedType = Undefined, + mpls_pop_all: bool | None | UndefinedType = Undefined, + encapsulation: Encapsulation | UndefinedType = Undefined, + allowed_vlan: str | None | UndefinedType = Undefined, + identity: Identity | UndefinedType = Undefined, + groups: Groups | UndefinedType = Undefined, + dot1q_remove_outer_vlan_tag: str | None | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ - PortSecurity. + Tool. Subclass of AvdModel. Args: - enabled: enabled - mac_address_maximum: - Maximum number of MAC addresses allowed on the interface. - - Subclass of AvdModel. - violation: - Configure violation mode (shutdown or protect), EOS default is 'shutdown'. + mpls_pop_all: Pop all MPLS labels. + encapsulation: Subclass of AvdModel. + allowed_vlan: VLAN ID or range of VLAN IDs within range 1-4094. + identity: Subclass of AvdModel. + groups: + Tool groups for the interface. - Subclass of AvdModel. - vlan_default_mac_address_maximum: Default maximum MAC addresses for all VLANs on this interface. - vlans: Subclass of AvdIndexedList with `VlansItem` items. Primary key is `range` (`str`). + Subclass of AvdList with `str` items. + dot1q_remove_outer_vlan_tag: + Indices of vlan tags to be removed. + Range: 1-2 _custom_data: _custom_data """ @@ -31055,6 +32491,8 @@ def __init__( "backup_link": {"type": BackupLink}, "backup": {"type": Backup}, "port_security": {"type": PortSecurity}, + "tap": {"type": Tap}, + "tool": {"type": Tool}, "_custom_data": {"type": dict}, } enabled: bool | None @@ -31104,6 +32542,24 @@ def __init__( """ port_security: PortSecurity """Subclass of AvdModel.""" + tap: Tap + """ + In tap mode, the interface operates as a tap port. + Tap ports receive traffic for replication on one + or more tool ports. + This setting applies only to parent interfaces. + + Subclass of AvdModel. + """ + tool: Tool + """ + In tool mode, the interface operates as a tool port. + Tool ports replicate traffic received by tap + ports. + This setting applies only to parent interfaces. + + Subclass of AvdModel. + """ _custom_data: dict[str, Any] if TYPE_CHECKING: @@ -31124,6 +32580,8 @@ def __init__( backup_link: BackupLink | UndefinedType = Undefined, backup: Backup | UndefinedType = Undefined, port_security: PortSecurity | UndefinedType = Undefined, + tap: Tap | UndefinedType = Undefined, + tool: Tool | UndefinedType = Undefined, _custom_data: dict[str, Any] | UndefinedType = Undefined, ) -> None: """ @@ -31163,6 +32621,20 @@ def __init__( Subclass of AvdModel. port_security: Subclass of AvdModel. + tap: + In tap mode, the interface operates as a tap port. + Tap ports receive traffic for replication on one + or more tool ports. + This setting applies only to parent interfaces. + + Subclass of AvdModel. + tool: + In tool mode, the interface operates as a tool port. + Tool ports replicate traffic received by tap + ports. + This setting applies only to parent interfaces. + + Subclass of AvdModel. _custom_data: _custom_data """ diff --git a/python-avd/pyavd/_eos_cli_config_gen/schema/eos_cli_config_gen.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/eos_cli_config_gen.schema.yml index 537d6b04e01..4b0702d8bba 100644 --- a/python-avd/pyavd/_eos_cli_config_gen/schema/eos_cli_config_gen.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/eos_cli_config_gen.schema.yml @@ -4140,6 +4140,257 @@ keys: required: true convert_types: - str + tap: + description: 'In tap mode, the interface operates as a tap port. + + Tap ports receive traffic for replication on one or more tool ports. + + This setting applies only to parent interfaces.' + type: dict + keys: + allowed_vlan: + type: str + convert_types: + - int + description: VLAN ID or range(s) of VLAN IDs within range 1-4094. + default: + description: Default tap destination config. + type: dict + keys: + groups: + description: Tap group names for the interface. + type: list + items: + type: str + interfaces: + description: Interfaces like - Ethernet1, InternalRecirc1, + Port-Channel1, Recirc-Channel1. + type: list + items: + type: str + nexthop_groups: + type: list + description: Default nexthop-group names. + items: + type: str + identity: + type: dict + keys: + id: + type: int + convert_types: + - str + min: 1 + max: 65535 + description: Tap port VLAN ID (1-4094) or DzGRE extended ID + (1-65535). + inner_vlan: + description: Tap port inner VLAN ID. Only applicable if `id` + is a VLAN ID (1-4094). + type: int + convert_types: + - str + min: 1 + max: 4094 + mpls_pop_all: + type: bool + description: Pop all MPLS labels. + native_vlan: + type: int + convert_types: + - str + min: 1 + max: 4094 + description: Native VLAN ID when interface is in tap mode. + truncation: + type: dict + keys: + enabled: + type: bool + size: + description: Ingress packet truncation size in bytes. + type: int + convert_types: + - str + min: 100 + max: 9236 + mac_address: + type: dict + keys: + source: + type: str + pattern: ^([0-9a-f]{2}:){5}[0-9a-f]{2}$ + description: MAC address for the source. + destination: + type: str + pattern: ^([0-9a-f]{2}:){5}[0-9a-f]{2}$ + description: MAC address for the destination. + encapsulation: + type: dict + keys: + vxlan_strip: + type: bool + description: 'Strip VXLAN encapsulation header. + + `encapsulation.vxlan_strip` and `mpls_pop_all` are mutually + exclusive. + + `mpls_pop_all` takes precedence.' + gre: + type: dict + keys: + strip: + type: bool + description: Strip GRE encapsulation header for all GRE + tunnels. + protocols: + type: list + primary_key: protocol + description: Protocols for all destinations; destination-specific + protocols should be set under the `destinations[].protocols` + key. + items: + type: dict + keys: + protocol: + type: str + description: 'Protocol type in GRE header. + + Valid range: 0x0-0xFFFF. The value must be enclosed + in quotes, e.g., "0x0".' + strip: + type: bool + description: This is a required key to strip GRE encapsulation + header with protocols. + feature_header_length: + description: 'Feature header length in bytes. + + Note: This setting does not appear in the EOS running-config + for protocol 0x0.' + type: int + convert_types: + - str + min: 1 + max: 16 + re_encapsulation_ethernet_header: + type: bool + description: 'Extra ethernet header to prepend to + the terminated packet. + + Note: This setting does not appear in the EOS running-config + for protocol 0x0.' + destinations: + type: list + description: In EOS, `gre.strip` and `destinations.destination/source.strip` + (without defining protocols) are mutually exclusive. + primary_key: destination + items: + type: dict + keys: + destination: + description: Destination IP address of tunnel packets. + type: str + source: + description: Source IP address of tunnel packets. + Applied only when destination is defined. When not + defined; any GRE packet that matches the `destination` + is terminated. + type: str + strip: + type: bool + description: Strip GRE encapsulation header for specific + destination. + protocols: + type: list + primary_key: protocol + items: + type: dict + keys: + protocol: + type: str + description: 'Protocol type in GRE header. + + Valid range: 0x0-0xFFFF. The value must be + enclosed in quotes, e.g., "0x0".' + strip: + type: bool + description: This is a required key to strip + GRE encapsulation header for specific destination + with protocols. + feature_header_length: + description: 'Feature header length in bytes. + + Note: This setting does not appear in the + EOS running-config for protocol 0x0.' + type: int + convert_types: + - str + min: 1 + max: 16 + re_encapsulation_ethernet_header: + type: bool + description: 'Extra ethernet header to prepend + to the terminated packet. + + Note: This setting does not appear in the + EOS running-config for protocol 0x0.' + tool: + description: 'In tool mode, the interface operates as a tool port. + + Tool ports replicate traffic received by tap ports. + + This setting applies only to parent interfaces.' + type: dict + keys: + mpls_pop_all: + type: bool + description: Pop all MPLS labels. + encapsulation: + type: dict + keys: + dot1br_strip: + type: bool + description: Remove a 802.1 BR tag in packet header. 'mpls_pop_all' + takes precedence over 'dot1br_strip' in EOS. + vn_tag_strip: + type: bool + description: Remove a VN-tag in packet header. 'mpls_pop_all' + takes precedence over 'vn_tag_strip' in EOS. + allowed_vlan: + type: str + convert_types: + - int + description: VLAN ID or range of VLAN IDs within range 1-4094. + identity: + type: dict + keys: + tag: + type: str + valid_values: + - dot1q + - qinq + dot1q_dzgre_source: + type: str + valid_values: + - policy + - port + qinq_dzgre_source: + type: str + valid_values: + - policy inner port + - port inner policy + groups: + type: list + items: + type: str + description: Tool groups for the interface. + dot1q_remove_outer_vlan_tag: + type: str + convert_types: + - int + description: 'Indices of vlan tags to be removed. + + Range: 1-2' eos_cli: type: str description: Multiline EOS CLI rendered directly on the ethernet interface @@ -10954,6 +11205,12 @@ keys: type: int convert_types: - str + tap: + type: dict + $ref: eos_cli_config_gen#/keys/ethernet_interfaces/items/keys/switchport/keys/tap + tool: + type: dict + $ref: eos_cli_config_gen#/keys/ethernet_interfaces/items/keys/switchport/keys/tool validate_state: type: bool description: Set to false to disable interface state and LLDP topology validation diff --git a/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ethernet_interfaces.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ethernet_interfaces.schema.yml index 98aebab7287..2dca349d154 100644 --- a/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ethernet_interfaces.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ethernet_interfaces.schema.yml @@ -1958,6 +1958,231 @@ keys: required: true convert_types: - str + tap: + description: |- + In tap mode, the interface operates as a tap port. + Tap ports receive traffic for replication on one or more tool ports. + This setting applies only to parent interfaces. + type: dict + keys: + allowed_vlan: + type: str + convert_types: + - int + description: VLAN ID or range(s) of VLAN IDs within range 1-4094. + default: + description: Default tap destination config. + type: dict + keys: + groups: + description: Tap group names for the interface. + type: list + items: + type: str + interfaces: + description: Interfaces like - Ethernet1, InternalRecirc1, Port-Channel1, Recirc-Channel1. + type: list + items: + type: str + nexthop_groups: + type: list + description: Default nexthop-group names. + items: + type: str + identity: + type: dict + keys: + id: + type: int + convert_types: + - str + min: 1 + max: 65535 + description: Tap port VLAN ID (1-4094) or DzGRE extended ID (1-65535). + inner_vlan: + description: Tap port inner VLAN ID. Only applicable if `id` is a VLAN ID (1-4094). + type: int + convert_types: + - str + min: 1 + max: 4094 + mpls_pop_all: + type: bool + description: Pop all MPLS labels. + native_vlan: + type: int + convert_types: + - str + min: 1 + max: 4094 + description: Native VLAN ID when interface is in tap mode. + truncation: + type: dict + keys: + enabled: + type: bool + size: + description: Ingress packet truncation size in bytes. + type: int + convert_types: + - str + min: 100 + max: 9236 + mac_address: + type: dict + keys: + source: + type: str + pattern: "^([0-9a-f]{2}:){5}[0-9a-f]{2}$" + description: MAC address for the source. + destination: + type: str + pattern: "^([0-9a-f]{2}:){5}[0-9a-f]{2}$" + description: MAC address for the destination. + encapsulation: + type: dict + keys: + vxlan_strip: + type: bool + description: |- + Strip VXLAN encapsulation header. + `encapsulation.vxlan_strip` and `mpls_pop_all` are mutually exclusive. + `mpls_pop_all` takes precedence. + gre: + type: dict + keys: + strip: + type: bool + description: Strip GRE encapsulation header for all GRE tunnels. + protocols: + type: list + primary_key: protocol + description: Protocols for all destinations; destination-specific protocols should be set under the `destinations[].protocols` key. + items: + type: dict + keys: + protocol: + type: str + description: |- + Protocol type in GRE header. + Valid range: 0x0-0xFFFF. The value must be enclosed in quotes, e.g., "0x0". + strip: + type: bool + description: |- + This is a required key to strip GRE encapsulation header with protocols. + feature_header_length: + description: |- + Feature header length in bytes. + Note: This setting does not appear in the EOS running-config for protocol 0x0. + type: int + convert_types: + - str + min: 1 + max: 16 + re_encapsulation_ethernet_header: + type: bool + description: |- + Extra ethernet header to prepend to the terminated packet. + Note: This setting does not appear in the EOS running-config for protocol 0x0. + destinations: + type: list + description: |- + In EOS, `gre.strip` and `destinations.destination/source.strip` (without defining protocols) are mutually exclusive. + primary_key: destination + items: + type: dict + keys: + destination: + description: Destination IP address of tunnel packets. + type: str + source: + description: Source IP address of tunnel packets. Applied only when destination is defined. When not defined; any GRE packet that matches the `destination` is terminated. + type: str + strip: + type: bool + description: Strip GRE encapsulation header for specific destination. + protocols: + type: list + primary_key: protocol + items: + type: dict + keys: + protocol: + type: str + description: |- + Protocol type in GRE header. + Valid range: 0x0-0xFFFF. The value must be enclosed in quotes, e.g., "0x0". + strip: + type: bool + description: This is a required key to strip GRE encapsulation header for specific destination with protocols. + feature_header_length: + description: |- + Feature header length in bytes. + Note: This setting does not appear in the EOS running-config for protocol 0x0. + type: int + convert_types: + - str + min: 1 + max: 16 + re_encapsulation_ethernet_header: + type: bool + description: |- + Extra ethernet header to prepend to the terminated packet. + Note: This setting does not appear in the EOS running-config for protocol 0x0. + tool: + description: |- + In tool mode, the interface operates as a tool port. + Tool ports replicate traffic received by tap ports. + This setting applies only to parent interfaces. + type: dict + keys: + mpls_pop_all: + type: bool + description: Pop all MPLS labels. + encapsulation: + type: dict + keys: + dot1br_strip: + type: bool + description: Remove a 802.1 BR tag in packet header. 'mpls_pop_all' takes precedence over 'dot1br_strip' in EOS. + vn_tag_strip: + type: bool + description: Remove a VN-tag in packet header. 'mpls_pop_all' takes precedence over 'vn_tag_strip' in EOS. + allowed_vlan: + type: str + convert_types: + - int + description: VLAN ID or range of VLAN IDs within range 1-4094. + identity: + type: dict + keys: + tag: + type: str + valid_values: + - dot1q + - qinq + dot1q_dzgre_source: + type: str + valid_values: + - policy + - port + qinq_dzgre_source: + type: str + valid_values: + - policy inner port + - port inner policy + groups: + type: list + items: + type: str + description: Tool groups for the interface. + dot1q_remove_outer_vlan_tag: + type: str + convert_types: + - int + description: |- + Indices of vlan tags to be removed. + Range: 1-2 eos_cli: type: str description: Multiline EOS CLI rendered directly on the ethernet interface in the final EOS configuration. diff --git a/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/port_channel_interfaces.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/port_channel_interfaces.schema.yml index 368d819d5f1..d2d9c89738f 100644 --- a/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/port_channel_interfaces.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/port_channel_interfaces.schema.yml @@ -1379,6 +1379,12 @@ keys: type: int convert_types: - str + tap: + type: dict + $ref: "eos_cli_config_gen#/keys/ethernet_interfaces/items/keys/switchport/keys/tap" + tool: + type: dict + $ref: "eos_cli_config_gen#/keys/ethernet_interfaces/items/keys/switchport/keys/tool" validate_state: type: bool description: Set to false to disable interface state and LLDP topology validation performed by the `eos_validate_state` role.