diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/connected-endpoints-missing-profile-lacp-fallback.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/connected-endpoints-missing-profile-lacp-fallback.yml new file mode 100644 index 00000000000..929117192eb --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/connected-endpoints-missing-profile-lacp-fallback.yml @@ -0,0 +1,21 @@ +loopback_ipv4_pool: 192.168.0.0/24 + +type: l2leaf +l2leaf: + defaults: + nodes: + - name: connected-endpoints-missing-profile-lacp-fallback + +servers: + # port-channel with lacp fallback individual and missing profile for lacp fallback + - name: INDIVIDUAL_1 + adapters: + - switches: [connected-endpoints-missing-profile-lacp-fallback, connected-endpoints-missing-profile-lacp-fallback] + switch_ports: [Ethernet14, Ethernet15] + port_channel: + mode: "active" + description: "INDIVIDUAL_1" + lacp_fallback: + mode: individual + +expected_error_message: "A Port-channel which is set to lacp fallback mode 'individual' must have a 'profile' defined. Profile definition is missing for the connected endpoint with the name 'INDIVIDUAL_1'." diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/connected-endpoints-wrong-profile-lacp-fallback.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/connected-endpoints-wrong-profile-lacp-fallback.yml new file mode 100644 index 00000000000..0b65295697c --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/connected-endpoints-wrong-profile-lacp-fallback.yml @@ -0,0 +1,30 @@ +loopback_ipv4_pool: 192.168.0.0/24 + +type: l2leaf +l2leaf: + defaults: + nodes: + - name: connected-endpoints-wrong-profile-lacp-fallback + +servers: + # port-channel with lacp fallback individual and missing profile for lacp fallback + - name: INDIVIDUAL_1 + adapters: + - switches: [connected-endpoints-wrong-profile-lacp-fallback, connected-endpoints-wrong-profile-lacp-fallback] + switch_ports: [Ethernet14, Ethernet15] + port_channel: + mode: "active" + description: "INDIVIDUAL_1" + lacp_fallback: + mode: individual + individual: + profile: INDIVIDUAL_TRUNK + +port_profiles: + - profile: INDIVIDUAL_TRUNKS + mode: trunk + vlans: "1,2,3,4,5,6,7,123,234" + native_vlan_tag: False + native_vlan: 123 + +expected_error_message: "The 'profile' of every port-channel lacp fallback individual setting must be defined in the 'port_profiles'. First occurence seen of a missing profile is 'INDIVIDUAL_TRUNK' for the connected endpoint with the name 'INDIVIDUAL_1'." diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/hosts.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/hosts.yml index 4de229c3f17..69d5227a873 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/hosts.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/hosts.yml @@ -52,6 +52,8 @@ all: hosts: failure-port-channel: connected-endpoints-mismatched-descriptions: + connected-endpoints-missing-profile-lacp-fallback: + connected-endpoints-wrong-profile-lacp-fallback: connected-endpoints-phone-vlan-mode: connected-endpoints-phone-vlan-vlans: duplicate-vlans-l2vlans: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/connected_endpoints.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/connected_endpoints.cfg index 9c002115e69..b405e0f1907 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/connected_endpoints.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/connected_endpoints.cfg @@ -28,6 +28,13 @@ interface Port-Channel10 no shutdown switchport ! +interface Port-Channel12 + description INDIVIDUAL_1_INDIVIDUAL_1 + no shutdown + switchport + port-channel lacp fallback timeout 90 + port-channel lacp fallback individual +! interface Ethernet4 description PHYSICAL_PORT_DESCRIPTION no shutdown @@ -67,6 +74,28 @@ interface Ethernet11 description PHYSICAL_PORT_DESCRIPTION_2 no shutdown channel-group 10 mode active +! +interface Ethernet12 + description INDIVIDUAL_1 + no shutdown + switchport trunk native vlan 123 + switchport trunk allowed vlan 1,2,3,4,5,6,7,123,234 + switchport mode trunk + switchport + channel-group 12 mode active + spanning-tree portfast + spanning-tree bpdufilter enable +! +interface Ethernet13 + description INDIVIDUAL_1 + no shutdown + switchport trunk native vlan 123 + switchport trunk allowed vlan 1,2,3,4,5,6,7,123,234 + switchport mode trunk + switchport + channel-group 12 mode active + spanning-tree portfast + spanning-tree bpdufilter enable no ip routing vrf MGMT ! management api http-commands diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/connected_endpoints.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/connected_endpoints.yml index acb38f071a1..eb838f011ed 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/connected_endpoints.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/connected_endpoints.yml @@ -82,6 +82,36 @@ ethernet_interfaces: channel_group: id: 10 mode: active +- name: Ethernet12 + peer: INDIVIDUAL_1 + peer_type: server + description: INDIVIDUAL_1 + shutdown: false + type: switched + channel_group: + id: 12 + mode: active + mode: trunk + vlans: 1,2,3,4,5,6,7,123,234 + native_vlan_tag: false + native_vlan: 123 + spanning_tree_portfast: edge + spanning_tree_bpdufilter: 'True' +- name: Ethernet13 + peer: INDIVIDUAL_1 + peer_type: server + description: INDIVIDUAL_1 + shutdown: false + type: switched + channel_group: + id: 12 + mode: active + mode: trunk + vlans: 1,2,3,4,5,6,7,123,234 + native_vlan_tag: false + native_vlan: 123 + spanning_tree_portfast: edge + spanning_tree_bpdufilter: 'True' port_channel_interfaces: - name: Port-Channel5 description: OLD_SW-1/5_PORT_CHANNEL_DESCRIPTION @@ -95,3 +125,9 @@ port_channel_interfaces: description: OLD_SW-1/7_PORT_CHANNEL_DESCRIPTION type: switched shutdown: false +- name: Port-Channel12 + description: INDIVIDUAL_1_INDIVIDUAL_1 + type: switched + shutdown: false + lacp_fallback_mode: individual + lacp_fallback_timeout: 90 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/connected_endpoints.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/connected_endpoints.yml index e93b852b9de..046f38c647f 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/connected_endpoints.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/connected_endpoints.yml @@ -46,3 +46,24 @@ servers: port_channel: mode: "active" description: "PORT_CHANNEL_DESCRIPTION" + # port-channel with lacp fallback individual and profile for member interfaces + - name: INDIVIDUAL_1 + adapters: + - switches: [connected_endpoints, connected_endpoints] + switch_ports: [Ethernet12, Ethernet13] + port_channel: + mode: "active" + description: "INDIVIDUAL_1" + lacp_fallback: + mode: individual + individual: + profile: INDIVIDUAL_TRUNK + +port_profiles: + - profile: INDIVIDUAL_TRUNK + mode: trunk + vlans: "1,2,3,4,5,6,7,123,234" + native_vlan_tag: False + native_vlan: 123 + spanning_tree_portfast: "edge" + spanning_tree_bpdufilter: True diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/connected-endpoints.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/connected-endpoints.md index 1a15016057a..e8df7811b7f 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/connected-endpoints.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/connected-endpoints.md @@ -137,7 +137,9 @@ | [          esi](## ".[].adapters.[].port_channel.esi") removed | String | | | | Format xxxx:xxxx:xxxx.This key was removed. Support was removed in AVD version 4.0.0. Use short_esi instead. | | [          short_esi](## ".[].adapters.[].port_channel.short_esi") deprecated | String | | | | In format xxxx:xxxx:xxxx or "auto".This key is deprecated. Support will be removed in AVD version 5.0.0. Use ethernet_segment.short_esi instead. | | [          lacp_fallback](## ".[].adapters.[].port_channel.lacp_fallback") | Dictionary | | | | LACP fallback configuration. | - | [            mode](## ".[].adapters.[].port_channel.lacp_fallback.mode") | String | | | Valid Values:
- static | Currently only static mode is supported. | + | [            mode](## ".[].adapters.[].port_channel.lacp_fallback.mode") | String | | | Valid Values:
- static
- individual | Either static or individual mode is supported.
If the mode is set to "individual" the "individual.profile" setting must be defined.
| + | [            individual](## ".[].adapters.[].port_channel.lacp_fallback.individual") | Dictionary | | | | Define parameters for port-channel member interfaces. Applies only if LACP fallback is set to "individual". | + | [              profile](## ".[].adapters.[].port_channel.lacp_fallback.individual.profile") | String | | | | Port-profile name to inherit configuration. | | [            timeout](## ".[].adapters.[].port_channel.lacp_fallback.timeout") | Integer | | | | Timeout in seconds. EOS default is 90 seconds. | | [          lacp_timer](## ".[].adapters.[].port_channel.lacp_timer") | Dictionary | | | | LACP timer configuration. Applies only when Port-channel mode is not "on". | | [            mode](## ".[].adapters.[].port_channel.lacp_timer.mode") | String | | | Valid Values:
- normal
- fast | LACP mode for interface members. | @@ -476,8 +478,15 @@ # LACP fallback configuration. lacp_fallback: - # Currently only static mode is supported. - mode: + # Either static or individual mode is supported. + # If the mode is set to "individual" the "individual.profile" setting must be defined. + mode: + + # Define parameters for port-channel member interfaces. Applies only if LACP fallback is set to "individual". + individual: + + # Port-profile name to inherit configuration. + profile: # Timeout in seconds. EOS default is 90 seconds. timeout: diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-ports.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-ports.md index 579fd7fe856..72fc57137ff 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-ports.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-ports.md @@ -129,7 +129,9 @@ | [      esi](## "network_ports.[].port_channel.esi") removed | String | | | | Format xxxx:xxxx:xxxx.This key was removed. Support was removed in AVD version 4.0.0. Use short_esi instead. | | [      short_esi](## "network_ports.[].port_channel.short_esi") deprecated | String | | | | In format xxxx:xxxx:xxxx or "auto".This key is deprecated. Support will be removed in AVD version 5.0.0. Use ethernet_segment.short_esi instead. | | [      lacp_fallback](## "network_ports.[].port_channel.lacp_fallback") | Dictionary | | | | LACP fallback configuration. | - | [        mode](## "network_ports.[].port_channel.lacp_fallback.mode") | String | | | Valid Values:
- static | Currently only static mode is supported. | + | [        mode](## "network_ports.[].port_channel.lacp_fallback.mode") | String | | | Valid Values:
- static
- individual | Either static or individual mode is supported.
If the mode is set to "individual" the "individual.profile" setting must be defined.
| + | [        individual](## "network_ports.[].port_channel.lacp_fallback.individual") | Dictionary | | | | Define parameters for port-channel member interfaces. Applies only if LACP fallback is set to "individual". | + | [          profile](## "network_ports.[].port_channel.lacp_fallback.individual.profile") | String | | | | Port-profile name to inherit configuration. | | [        timeout](## "network_ports.[].port_channel.lacp_fallback.timeout") | Integer | | | | Timeout in seconds. EOS default is 90 seconds. | | [      lacp_timer](## "network_ports.[].port_channel.lacp_timer") | Dictionary | | | | LACP timer configuration. Applies only when Port-channel mode is not "on". | | [        mode](## "network_ports.[].port_channel.lacp_timer.mode") | String | | | Valid Values:
- normal
- fast | LACP mode for interface members. | @@ -448,8 +450,15 @@ # LACP fallback configuration. lacp_fallback: - # Currently only static mode is supported. - mode: + # Either static or individual mode is supported. + # If the mode is set to "individual" the "individual.profile" setting must be defined. + mode: + + # Define parameters for port-channel member interfaces. Applies only if LACP fallback is set to "individual". + individual: + + # Port-profile name to inherit configuration. + profile: # Timeout in seconds. EOS default is 90 seconds. timeout: diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/port-profiles.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/port-profiles.md index d3c4596944b..4623762f264 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/port-profiles.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/port-profiles.md @@ -126,7 +126,9 @@ | [      esi](## "port_profiles.[].port_channel.esi") removed | String | | | | Format xxxx:xxxx:xxxx.This key was removed. Support was removed in AVD version 4.0.0. Use short_esi instead. | | [      short_esi](## "port_profiles.[].port_channel.short_esi") deprecated | String | | | | In format xxxx:xxxx:xxxx or "auto".This key is deprecated. Support will be removed in AVD version 5.0.0. Use ethernet_segment.short_esi instead. | | [      lacp_fallback](## "port_profiles.[].port_channel.lacp_fallback") | Dictionary | | | | LACP fallback configuration. | - | [        mode](## "port_profiles.[].port_channel.lacp_fallback.mode") | String | | | Valid Values:
- static | Currently only static mode is supported. | + | [        mode](## "port_profiles.[].port_channel.lacp_fallback.mode") | String | | | Valid Values:
- static
- individual | Either static or individual mode is supported.
If the mode is set to "individual" the "individual.profile" setting must be defined.
| + | [        individual](## "port_profiles.[].port_channel.lacp_fallback.individual") | Dictionary | | | | Define parameters for port-channel member interfaces. Applies only if LACP fallback is set to "individual". | + | [          profile](## "port_profiles.[].port_channel.lacp_fallback.individual.profile") | String | | | | Port-profile name to inherit configuration. | | [        timeout](## "port_profiles.[].port_channel.lacp_fallback.timeout") | Integer | | | | Timeout in seconds. EOS default is 90 seconds. | | [      lacp_timer](## "port_profiles.[].port_channel.lacp_timer") | Dictionary | | | | LACP timer configuration. Applies only when Port-channel mode is not "on". | | [        mode](## "port_profiles.[].port_channel.lacp_timer.mode") | String | | | Valid Values:
- normal
- fast | LACP mode for interface members. | @@ -434,8 +436,15 @@ # LACP fallback configuration. lacp_fallback: - # Currently only static mode is supported. - mode: + # Either static or individual mode is supported. + # If the mode is set to "individual" the "individual.profile" setting must be defined. + mode: + + # Define parameters for port-channel member interfaces. Applies only if LACP fallback is set to "individual". + individual: + + # Port-profile name to inherit configuration. + profile: # Timeout in seconds. EOS default is 90 seconds. timeout: diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/connected_endpoints/ethernet_interfaces.py b/ansible_collections/arista/avd/roles/eos_designs/python_modules/connected_endpoints/ethernet_interfaces.py index f1abbbda9b0..235c6752563 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/connected_endpoints/ethernet_interfaces.py +++ b/ansible_collections/arista/avd/roles/eos_designs/python_modules/connected_endpoints/ethernet_interfaces.py @@ -8,7 +8,7 @@ from functools import cached_property from ansible_collections.arista.avd.plugins.filter.range_expand import range_expand -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError +from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError, AristaAvdMissingVariableError from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_null_from_data from ansible_collections.arista.avd.plugins.plugin_utils.utils import append_if_not_duplicate, default, get, replace_or_append_item @@ -78,6 +78,26 @@ def ethernet_interfaces(self) -> list | None: return None + def _update_ethernet_interface_cfg(self, adapter: dict, ethernet_interface: dict, connected_endpoint: dict) -> dict: + ethernet_interface.update( + { + "type": "switched", + "mtu": adapter.get("mtu") if self.shared_utils.platform_settings_feature_support_per_interface_mtu else None, + "l2_mtu": adapter.get("l2_mtu"), + "l2_mru": adapter.get("l2_mru"), + "mode": adapter.get("mode"), + "vlans": adapter.get("vlans"), + "trunk_groups": self._get_adapter_trunk_groups(adapter, connected_endpoint), + "native_vlan_tag": adapter.get("native_vlan_tag"), + "native_vlan": adapter.get("native_vlan"), + "spanning_tree_portfast": adapter.get("spanning_tree_portfast"), + "spanning_tree_bpdufilter": adapter.get("spanning_tree_bpdufilter"), + "spanning_tree_bpduguard": adapter.get("spanning_tree_bpduguard"), + "storm_control": self._get_adapter_storm_control(adapter), + } + ) + return ethernet_interface + def _get_ethernet_interface_cfg(self, adapter: dict, node_index: int, connected_endpoint: dict) -> dict: """ Return structured_config for one ethernet_interface @@ -141,6 +161,25 @@ def _get_ethernet_interface_cfg(self, adapter: dict, node_index: int, connected_ ) if get(adapter, "port_channel.lacp_fallback.mode") == "static": ethernet_interface["lacp_port_priority"] = 8192 if node_index == 0 else 32768 + + elif get(adapter, "port_channel.lacp_fallback.mode") == "individual": + # if fallback is set to individual a profile has to be defined + if (profile_name := get(adapter, "port_channel.lacp_fallback.individual.profile")) is None: + raise AristaAvdMissingVariableError( + "A Port-channel which is set to lacp fallback mode 'individual' must have a 'profile' defined. Profile definition is missing for" + f" the connected endpoint with the name '{connected_endpoint['name']}'." + ) + + # Verify that the referred profile exists under port_profiles + if not (profile := self.shared_utils.get_merged_port_profile(profile_name)): + raise AristaAvdMissingVariableError( + "The 'profile' of every port-channel lacp fallback individual setting must be defined in the 'port_profiles'. First occurence seen" + f" of a missing profile is '{get(adapter, 'port_channel.lacp_fallback.individual.profile')}' for the connected endpoint with the" + f" name '{connected_endpoint['name']}'." + ) + + ethernet_interface = self._update_ethernet_interface_cfg(profile, ethernet_interface, connected_endpoint) + if port_channel_mode != "on" and get(adapter, "port_channel.lacp_timer") is not None: ethernet_interface["lacp_timer"] = { "mode": get(adapter, "port_channel.lacp_timer.mode"), @@ -149,26 +188,14 @@ def _get_ethernet_interface_cfg(self, adapter: dict, node_index: int, connected_ # NOT a port-channel member else: + ethernet_interface = self._update_ethernet_interface_cfg(adapter, ethernet_interface, connected_endpoint) ethernet_interface.update( { - "type": "switched", - "mtu": adapter.get("mtu") if self.shared_utils.platform_settings_feature_support_per_interface_mtu else None, - "l2_mtu": adapter.get("l2_mtu"), - "l2_mru": adapter.get("l2_mru"), - "mode": adapter.get("mode"), - "vlans": adapter.get("vlans"), - "trunk_groups": self._get_adapter_trunk_groups(adapter, connected_endpoint), - "native_vlan_tag": adapter.get("native_vlan_tag"), - "native_vlan": adapter.get("native_vlan"), - "phone": self._get_adapter_phone(adapter, connected_endpoint), - "spanning_tree_portfast": adapter.get("spanning_tree_portfast"), - "spanning_tree_bpdufilter": adapter.get("spanning_tree_bpdufilter"), - "spanning_tree_bpduguard": adapter.get("spanning_tree_bpduguard"), - "storm_control": self._get_adapter_storm_control(adapter), - "service_profile": adapter.get("qos_profile"), "dot1x": adapter.get("dot1x"), + "phone": self._get_adapter_phone(adapter, connected_endpoint), "poe": self._get_adapter_poe(adapter), "ptp": self._get_adapter_ptp(adapter), + "service_profile": adapter.get("qos_profile"), "sflow": self._get_adapter_sflow(adapter), "evpn_ethernet_segment": self._get_adapter_evpn_ethernet_segment_cfg( adapter, short_esi, node_index, connected_endpoint, "auto", "single-active" diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/connected_endpoints/port_channel_interfaces.py b/ansible_collections/arista/avd/roles/eos_designs/python_modules/connected_endpoints/port_channel_interfaces.py index 5b34517b4ef..26286b1e70d 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/connected_endpoints/port_channel_interfaces.py +++ b/ansible_collections/arista/avd/roles/eos_designs/python_modules/connected_endpoints/port_channel_interfaces.py @@ -175,7 +175,7 @@ def _get_port_channel_interface_cfg(self, adapter: dict, port_channel_interface_ port_channel_interface["mlag"] = channel_group_id # LACP Fallback - if port_channel_mode in ["active", "passive"] and (lacp_fallback_mode := get(adapter, "port_channel.lacp_fallback.mode")) == "static": + if port_channel_mode in ["active", "passive"] and (lacp_fallback_mode := get(adapter, "port_channel.lacp_fallback.mode")) in ["static", "individual"]: port_channel_interface.update( { "lacp_fallback_mode": lacp_fallback_mode, diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/eos_designs.jsonschema.json b/ansible_collections/arista/avd/roles/eos_designs/schemas/eos_designs.jsonschema.json index 6613fc5bc8d..2509e8f2631 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/eos_designs.jsonschema.json +++ b/ansible_collections/arista/avd/roles/eos_designs/schemas/eos_designs.jsonschema.json @@ -9154,11 +9154,28 @@ "mode": { "type": "string", "enum": [ - "static" + "static", + "individual" ], - "description": "Currently only static mode is supported.", + "description": "Either static or individual mode is supported.\nIf the mode is set to \"individual\" the \"individual.profile\" setting must be defined.\n", "title": "Mode" }, + "individual": { + "type": "object", + "description": "Define parameters for port-channel member interfaces. Applies only if LACP fallback is set to \"individual\".", + "properties": { + "profile": { + "type": "string", + "description": "Port-profile name to inherit configuration.", + "title": "Profile" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Individual" + }, "timeout": { "type": "integer", "description": "Timeout in seconds. EOS default is 90 seconds.", @@ -15183,11 +15200,28 @@ "mode": { "type": "string", "enum": [ - "static" + "static", + "individual" ], - "description": "Currently only static mode is supported.", + "description": "Either static or individual mode is supported.\nIf the mode is set to \"individual\" the \"individual.profile\" setting must be defined.\n", "title": "Mode" }, + "individual": { + "type": "object", + "description": "Define parameters for port-channel member interfaces. Applies only if LACP fallback is set to \"individual\".", + "properties": { + "profile": { + "type": "string", + "description": "Port-profile name to inherit configuration.", + "title": "Profile" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Individual" + }, "timeout": { "type": "integer", "description": "Timeout in seconds. EOS default is 90 seconds.", diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/eos_designs.schema.yml b/ansible_collections/arista/avd/roles/eos_designs/schemas/eos_designs.schema.yml index 29685e53be3..245fbaa50dc 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/eos_designs.schema.yml +++ b/ansible_collections/arista/avd/roles/eos_designs/schemas/eos_designs.schema.yml @@ -4176,7 +4176,21 @@ $defs: type: str valid_values: - static - description: Currently only static mode is supported. + - individual + description: 'Either static or individual mode is supported. + + If the mode is set to "individual" the "individual.profile" setting + must be defined. + + ' + individual: + type: dict + description: Define parameters for port-channel member interfaces. + Applies only if LACP fallback is set to "individual". + keys: + profile: + type: str + description: Port-profile name to inherit configuration. timeout: type: int convert_types: diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_adapter_config.schema.yml b/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_adapter_config.schema.yml index 486124cd8dd..2d06961b098 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_adapter_config.schema.yml +++ b/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_adapter_config.schema.yml @@ -478,7 +478,17 @@ $defs: type: str valid_values: - static - description: Currently only static mode is supported. + - individual + description: | + Either static or individual mode is supported. + If the mode is set to "individual" the "individual.profile" setting must be defined. + individual: + type: dict + description: Define parameters for port-channel member interfaces. Applies only if LACP fallback is set to "individual". + keys: + profile: + type: str + description: Port-profile name to inherit configuration. timeout: type: int convert_types: