diff options
| author | Christian Breunig <christian@breunig.cc> | 2023-02-04 16:11:14 +0100 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-02-04 16:11:14 +0100 | 
| commit | 9ee41e63880ea52d058c90d15837d6ebd48f0a80 (patch) | |
| tree | f5df010f70d8216d497b5f562e197c9a2e6cacbd | |
| parent | d56956df82c036d9ca0cb11626265951b970545d (diff) | |
| parent | ca70102fcf782e7a61d3d1b7672d74eb8db32129 (diff) | |
| download | vyos-1x-9ee41e63880ea52d058c90d15837d6ebd48f0a80.tar.gz vyos-1x-9ee41e63880ea52d058c90d15837d6ebd48f0a80.zip | |
Merge pull request #1603 from nicolas-fort/T2408
T2408: dhcp-relay: Add listen-interface and upstream-interface feature
| -rw-r--r-- | data/templates/dhcp-relay/dhcrelay.conf.j2 | 5 | ||||
| -rw-r--r-- | interface-definitions/dhcp-relay.xml.in | 49 | ||||
| -rwxr-xr-x | smoketest/scripts/cli/test_service_dhcp-relay.py | 37 | ||||
| -rwxr-xr-x | src/conf_mode/dhcp_relay.py | 13 | 
4 files changed, 102 insertions, 2 deletions
| diff --git a/data/templates/dhcp-relay/dhcrelay.conf.j2 b/data/templates/dhcp-relay/dhcrelay.conf.j2 index 11710bd8e..c26c263fd 100644 --- a/data/templates/dhcp-relay/dhcrelay.conf.j2 +++ b/data/templates/dhcp-relay/dhcrelay.conf.j2 @@ -2,5 +2,8 @@  {% set max_size = '-A ' ~ relay_options.max_size if relay_options.max_size is vyos_defined %}  {# hop_count and relay_agents_packets is a default option, thus it is always present #} +{% if interface is vyos_defined %}  OPTIONS="-c {{ relay_options.hop_count }} -a -m {{ relay_options.relay_agents_packets }} {{ max_size }} -i {{ interface | join(' -i ') }} {{ server | join(' ') }}" - +{% else %} +OPTIONS="-c {{ relay_options.hop_count }} -a -m {{ relay_options.relay_agents_packets }} {{ max_size }} -id {{ listen_interface | join(' -id ') }} -iu {{ upstream_interface | join(' -iu ') }} {{ server | join(' ') }}" +{% endif %}
\ No newline at end of file diff --git a/interface-definitions/dhcp-relay.xml.in b/interface-definitions/dhcp-relay.xml.in index 27d0a3e6c..746cc2fb4 100644 --- a/interface-definitions/dhcp-relay.xml.in +++ b/interface-definitions/dhcp-relay.xml.in @@ -9,7 +9,54 @@            <priority>910</priority>          </properties>          <children> -          #include <include/generic-interface-multi-broadcast.xml.i> +          <leafNode name="interface"> +            <properties> +              <help>Interface Name to use [To be deprecated]. Only for backward compatibility. Use listen-interface and upstream-interface instead of this option </help> +              <completionHelp> +                <script>${vyos_completion_dir}/list_interfaces.py --broadcast</script> +              </completionHelp> +              <valueHelp> +                <format>txt</format> +                <description>Interface name</description> +              </valueHelp> +              <constraint> +                <validator name="interface-name"/> +              </constraint> +              <multi/> +            </properties> +          </leafNode> +          <leafNode name="listen-interface"> +            <properties> +              <help>Interface for DHCP Relay Agent to listen for requests</help> +              <completionHelp> +                <script>${vyos_completion_dir}/list_interfaces.py</script> +              </completionHelp> +              <valueHelp> +                <format>txt</format> +                <description>Interface name</description> +              </valueHelp> +              <constraint> +                <validator name="interface-name"/> +              </constraint> +              <multi/> +            </properties> +          </leafNode> +          <leafNode name="upstream-interface"> +            <properties> +              <help>Interface for DHCP Relay Agent forward requests out</help> +              <completionHelp> +                <script>${vyos_completion_dir}/list_interfaces.py</script> +              </completionHelp> +              <valueHelp> +                <format>txt</format> +                <description>Interface name</description> +              </valueHelp> +              <constraint> +                <validator name="interface-name"/> +              </constraint> +              <multi/> +            </properties> +          </leafNode>            <node name="relay-options">              <properties>                <help>Relay options</help> diff --git a/smoketest/scripts/cli/test_service_dhcp-relay.py b/smoketest/scripts/cli/test_service_dhcp-relay.py index bbfd9e032..92f87c06c 100755 --- a/smoketest/scripts/cli/test_service_dhcp-relay.py +++ b/smoketest/scripts/cli/test_service_dhcp-relay.py @@ -82,6 +82,43 @@ class TestServiceDHCPRelay(VyOSUnitTestSHIM.TestCase):          # Check for running process          self.assertTrue(process_named_running(PROCESS_NAME)) +    def test_relay_interfaces(self): +        max_size = '800' +        hop_count = '20' +        agents_packets = 'append' +        servers = ['192.0.2.1', '192.0.2.2'] +        listen_iface = 'eth0' +        up_iface = 'eth1' + +        self.cli_set(base_path + ['interface', up_iface]) +        self.cli_set(base_path + ['listen-interface', listen_iface]) +        # check validate() - backward interface plus listen_interface +        with self.assertRaises(ConfigSessionError): +            self.cli_commit() +        self.cli_delete(base_path + ['interface']) + +        self.cli_set(base_path + ['upstream-interface', up_iface]) + +        for server in servers: +            self.cli_set(base_path + ['server', server]) + +        # commit changes +        self.cli_commit() + +        # Check configured port +        config = read_file(RELAY_CONF) + +        # Test configured relay interfaces +        self.assertIn(f'-id {listen_iface}', config) +        self.assertIn(f'-iu {up_iface}', config) + +        # Test relay servers +        for server in servers: +            self.assertIn(f' {server}', config) + +        # Check for running process +        self.assertTrue(process_named_running(PROCESS_NAME)) +  if __name__ == '__main__':      unittest.main(verbosity=2) diff --git a/src/conf_mode/dhcp_relay.py b/src/conf_mode/dhcp_relay.py index 4de2ca2f3..07ec1c7a3 100755 --- a/src/conf_mode/dhcp_relay.py +++ b/src/conf_mode/dhcp_relay.py @@ -21,6 +21,7 @@ from sys import exit  from vyos.config import Config  from vyos.configdict import dict_merge  from vyos.template import render +from vyos.base import Warning  from vyos.util import call  from vyos.util import dict_search  from vyos.xml import defaults @@ -59,6 +60,18 @@ def verify(relay):          raise ConfigError('No DHCP relay server(s) configured.\n' \                            'At least one DHCP relay server required.') +    if 'interface' in relay: +        if 'upstream_interface' in relay or 'listen_interface' in relay: +            raise ConfigError('<interface> configuration is not compatible with upstream/listen interface') +        else: +            Warning('<interface> is going to be deprecated.\n'  \ +                    'Please use <listen-interface> and <upstream-interface>') + +    if 'upstream_interface' in relay and 'listen_interface' not in relay: +        raise ConfigError('No listen-interface configured') +    if 'listen_interface' in relay and 'upstream_interface' not in relay: +        raise ConfigError('No upstream-interface configured') +      return None  def generate(relay): | 
