diff --git a/ansible_collections/arista/avd/examples/cv-pathfinder/documentation/devices/inet-cloud.md b/ansible_collections/arista/avd/examples/cv-pathfinder/documentation/devices/inet-cloud.md index 5cf8a45f6d5..81d07555186 100644 --- a/ansible_collections/arista/avd/examples/cv-pathfinder/documentation/devices/inet-cloud.md +++ b/ansible_collections/arista/avd/examples/cv-pathfinder/documentation/devices/inet-cloud.md @@ -233,9 +233,9 @@ dhcp server | Interface name | DHCP IPv4 | DHCP IPv6 | | -------------- | --------- | --------- | -| Ethernet5 | True | False | -| Ethernet6 | True | False | -| Ethernet8 | True | False | +| Ethernet5 | True | - | +| Ethernet6 | True | - | +| Ethernet8 | True | - | ## Monitoring 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 8f5d5d93dfb..0aeba97556f 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 @@ -1794,6 +1794,7 @@ dhcp server vrf VRF01 | Interface name | DHCP IPv4 | DHCP IPv6 | | -------------- | --------- | --------- | | Ethernet64 | True | True | +| Port-Channel112 | True | True | ## System Boot Settings @@ -5494,6 +5495,8 @@ interface Port-Channel112 switchport ip address dhcp dhcp client accept default-route + dhcp server ipv4 + dhcp server ipv6 port-channel lacp fallback individual port-channel lacp fallback timeout 5 ! 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 f0add4ca69a..020de4eade7 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 @@ -2059,6 +2059,8 @@ interface Port-Channel112 switchport ip address dhcp dhcp client accept default-route + dhcp server ipv4 + dhcp server ipv6 port-channel lacp fallback individual port-channel lacp fallback timeout 5 ! 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 18ec3400772..6b71974fc0f 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 @@ -721,6 +721,8 @@ port_channel_interfaces: lacp_fallback_mode: individual ip_address: dhcp dhcp_client_accept_default_route: true + dhcp_server_ipv4: true + dhcp_server_ipv6: true - name: Port-Channel113 description: interface_with_mpls_enabled @@ -729,6 +731,8 @@ port_channel_interfaces: ip_address: 172.31.128.9/31 # This won't be rendered because IP address is not DHCP dhcp_client_accept_default_route: true + dhcp_server_ipv4: false + dhcp_server_ipv6: false mpls: ip: true ldp: 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 ff848c485c1..548206a2d78 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 @@ -217,6 +217,8 @@ | [      mpass](## "port_channel_interfaces.[].ptp.mpass") | Boolean | | | | 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. | | [    ip_address](## "port_channel_interfaces.[].ip_address") | String | | | | IPv4 address/mask or "dhcp". | | [    dhcp_client_accept_default_route](## "port_channel_interfaces.[].dhcp_client_accept_default_route") | Boolean | | | | Install default-route obtained via DHCP. | + | [    dhcp_server_ipv4](## "port_channel_interfaces.[].dhcp_server_ipv4") | Boolean | | | | Enable IPv4 DHCP server. | + | [    dhcp_server_ipv6](## "port_channel_interfaces.[].dhcp_server_ipv6") | Boolean | | | | Enable IPv6 DHCP server. | | [    ip_verify_unicast_source_reachable_via](## "port_channel_interfaces.[].ip_verify_unicast_source_reachable_via") | String | | | Valid Values:
- any
- rx | | | [    ip_nat](## "port_channel_interfaces.[].ip_nat") | Dictionary | | | | | | [      destination](## "port_channel_interfaces.[].ip_nat.destination") | Dictionary | | | | | @@ -926,6 +928,12 @@ # Install default-route obtained via DHCP. dhcp_client_accept_default_route: + + # Enable IPv4 DHCP server. + dhcp_server_ipv4: + + # Enable IPv6 DHCP server. + dhcp_server_ipv6: ip_verify_unicast_source_reachable_via: ip_nat: destination: diff --git a/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/dhcp-servers.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/dhcp-servers.j2 index 59a8aa2f936..57122cfbd44 100644 --- a/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/dhcp-servers.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/dhcp-servers.j2 @@ -5,12 +5,18 @@ #} {# doc - dhcp server #} {% set ethernet_interfaces_dhcp_server = [] %} +{% set port_channel_interfaces_dhcp_server = [] %} {% for ethernet_interface in ethernet_interfaces | arista.avd.natural_sort('name') %} -{% if ethernet_interface.dhcp_server_ipv4 is arista.avd.defined(true) or ethernet_interface.dhcp_server_ipv4 is arista.avd.defined(true) %} +{% if ethernet_interface.dhcp_server_ipv4 is arista.avd.defined(true) or ethernet_interface.dhcp_server_ipv6 is arista.avd.defined(true) %} {% do ethernet_interfaces_dhcp_server.append(ethernet_interface) %} {% endif %} {% endfor %} -{% if (ethernet_interfaces_dhcp_server | length > 0 or dhcp_servers is arista.avd.defined) %} +{% for port_channel_interface in port_channel_interfaces | arista.avd.natural_sort('name') %} +{% if port_channel_interface.dhcp_server_ipv4 is arista.avd.defined(true) or port_channel_interfaces.dhcp_server_ipv6 is arista.avd.defined(true) %} +{% do port_channel_interfaces_dhcp_server.append(port_channel_interface) %} +{% endif %} +{% endfor %} +{% if (ethernet_interfaces_dhcp_server | length > 0 or port_channel_interfaces_dhcp_server | length > 0 or dhcp_servers is arista.avd.defined) %} ## DHCP Server {% if dhcp_servers is arista.avd.defined %} @@ -123,14 +129,21 @@ {% include 'eos/dhcp-servers.j2' %} ``` {% endif %} -{% if ethernet_interfaces_dhcp_server | length > 0 %} +{% if ethernet_interfaces_dhcp_server | length > 0 or port_channel_interfaces_dhcp_server | length > 0 %} ### DHCP Server Interfaces | Interface name | DHCP IPv4 | DHCP IPv6 | | -------------- | --------- | --------- | -{% for ethernet_interface in ethernet_interfaces_dhcp_server | arista.avd.natural_sort %} -| {{ ethernet_interface.name }} | {{ ethernet_interface.dhcp_server_ipv4 | arista.avd.default(false) }} | {{ ethernet_interface.dhcp_server_ipv6 | arista.avd.default(false) }} | -{% endfor %} +{% if ethernet_interfaces_dhcp_server | length > 0 %} +{% for ethernet_interface in ethernet_interfaces_dhcp_server | arista.avd.natural_sort %} +| {{ ethernet_interface.name }} | {{ ethernet_interface.dhcp_server_ipv4 | arista.avd.default("-") }} | {{ ethernet_interface.dhcp_server_ipv6 | arista.avd.default("-") }} | +{% endfor %} +{% endif %} +{% if port_channel_interfaces_dhcp_server | length > 0 %} +{% for port_channel_interface in port_channel_interfaces_dhcp_server | arista.avd.natural_sort %} +| {{ port_channel_interface.name }} | {{ port_channel_interface.dhcp_server_ipv4 | arista.avd.default("-") }} | {{ port_channel_interface.dhcp_server_ipv6 | arista.avd.default("-") }} | +{% endfor %} +{% endif %} {% endif %} {% endif %} 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 92a538f7106..c5ed42541d7 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 @@ -356,6 +356,12 @@ interface {{ port_channel_interface.name }} bfd per-link {% endif %} {% endif %} +{% if port_channel_interface.dhcp_server_ipv4 is arista.avd.defined(true) %} + dhcp server ipv4 +{% endif %} +{% if port_channel_interface.dhcp_server_ipv6 is arista.avd.defined(true) %} + dhcp server ipv6 +{% endif %} {% if port_channel_interface.ip_igmp_host_proxy.enabled is arista.avd.defined(true) %} {% set host_proxy_cli = "ip igmp host-proxy" %} {{ host_proxy_cli }} 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 59a3ba27572..9673536c334 100644 --- a/python-avd/pyavd/_eos_cli_config_gen/schema/__init__.py +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/__init__.py @@ -33102,6 +33102,8 @@ def __init__( "ptp": {"type": Ptp}, "ip_address": {"type": str}, "dhcp_client_accept_default_route": {"type": bool}, + "dhcp_server_ipv4": {"type": bool}, + "dhcp_server_ipv6": {"type": bool}, "ip_verify_unicast_source_reachable_via": {"type": str}, "ip_nat": {"type": IpNat}, "ipv6_enable": {"type": bool}, @@ -33267,6 +33269,10 @@ def __init__( """IPv4 address/mask or "dhcp".""" dhcp_client_accept_default_route: bool | None """Install default-route obtained via DHCP.""" + dhcp_server_ipv4: bool | None + """Enable IPv4 DHCP server.""" + dhcp_server_ipv6: bool | None + """Enable IPv6 DHCP server.""" ip_verify_unicast_source_reachable_via: Literal["any", "rx"] | None ip_nat: IpNat """Subclass of AvdModel.""" @@ -33396,6 +33402,8 @@ def __init__( ptp: Ptp | UndefinedType = Undefined, ip_address: str | None | UndefinedType = Undefined, dhcp_client_accept_default_route: bool | None | UndefinedType = Undefined, + dhcp_server_ipv4: bool | None | UndefinedType = Undefined, + dhcp_server_ipv6: bool | None | UndefinedType = Undefined, ip_verify_unicast_source_reachable_via: Literal["any", "rx"] | None | UndefinedType = Undefined, ip_nat: IpNat | UndefinedType = Undefined, ipv6_enable: bool | None | UndefinedType = Undefined, @@ -33522,6 +33530,8 @@ def __init__( ptp: Subclass of AvdModel. ip_address: IPv4 address/mask or "dhcp". dhcp_client_accept_default_route: Install default-route obtained via DHCP. + dhcp_server_ipv4: Enable IPv4 DHCP server. + dhcp_server_ipv6: Enable IPv6 DHCP server. ip_verify_unicast_source_reachable_via: ip_verify_unicast_source_reachable_via ip_nat: Subclass of AvdModel. ipv6_enable: ipv6_enable 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 5a9c4cf3c4b..48a3e4c529e 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 @@ -10745,6 +10745,12 @@ keys: dhcp_client_accept_default_route: type: bool description: Install default-route obtained via DHCP. + dhcp_server_ipv4: + type: bool + description: Enable IPv4 DHCP server. + dhcp_server_ipv6: + type: bool + description: Enable IPv6 DHCP server. ip_verify_unicast_source_reachable_via: type: str valid_values: 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 6fffebb2833..e835d6e781e 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 @@ -814,6 +814,12 @@ keys: dhcp_client_accept_default_route: type: bool description: Install default-route obtained via DHCP. + dhcp_server_ipv4: + type: bool + description: Enable IPv4 DHCP server. + dhcp_server_ipv6: + type: bool + description: Enable IPv6 DHCP server. ip_verify_unicast_source_reachable_via: type: str valid_values: