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: