diff --git a/data/templates/frr/isisd.frr.j2 b/data/templates/frr/isisd.frr.j2 index 3c37e28b9..dbb8c7305 100644 --- a/data/templates/frr/isisd.frr.j2 +++ b/data/templates/frr/isisd.frr.j2 @@ -1,194 +1,200 @@ ! {% if interface is vyos_defined %} {% for iface, iface_config in interface.items() %} interface {{ iface }} ip router isis VyOS ipv6 router isis VyOS {% if iface_config.bfd is vyos_defined %} isis bfd {% if iface_config.bfd.profile is vyos_defined %} isis bfd profile {{ iface_config.bfd.profile }} {% endif %} {% endif %} {% if iface_config.network.point_to_point is vyos_defined %} isis network point-to-point {% endif %} {% if iface_config.circuit_type is vyos_defined %} isis circuit-type {{ iface_config.circuit_type }} {% endif %} {% if iface_config.hello_interval is vyos_defined %} isis hello-interval {{ iface_config.hello_interval }} {% endif %} {% if iface_config.hello_multiplier is vyos_defined %} isis hello-multiplier {{ iface_config.hello_multiplier }} {% endif %} {% if iface_config.hello_padding is vyos_defined %} isis hello padding {% endif %} {% if iface_config.ldp_sync.disable is vyos_defined %} no isis mpls ldp-sync {% elif iface_config.ldp_sync.holddown is vyos_defined %} isis mpls ldp-sync isis mpls ldp-sync holddown {{ iface_config.ldp_sync.holddown }} {% endif %} {% if iface_config.metric is vyos_defined %} isis metric {{ iface_config.metric }} {% endif %} {% if iface_config.passive is vyos_defined %} isis passive {% endif %} {% if iface_config.password.md5 is vyos_defined %} isis password md5 {{ iface_config.password.md5 }} {% elif iface_config.password.plaintext_password is vyos_defined %} isis password clear {{ iface_config.password.plaintext_password }} {% endif %} {% if iface_config.priority is vyos_defined %} isis priority {{ iface_config.priority }} {% endif %} {% if iface_config.psnp_interval is vyos_defined %} isis psnp-interval {{ iface_config.psnp_interval }} {% endif %} {% if iface_config.no_three_way_handshake is vyos_defined %} no isis three-way-handshake {% endif %} exit ! {% endfor %} {% endif %} ! router isis VyOS {{ 'vrf ' + vrf if vrf is vyos_defined }} net {{ net }} +{% if advertise_high_metrics is vyos_defined %} +advertise-high-metrics +{% endif %} +{% if advertise_passive_only is vyos_defined %} +advertise-passive-only +{% endif %} {% if dynamic_hostname is vyos_defined %} hostname dynamic {% endif %} {% if purge_originator is vyos_defined %} purge-originator {% endif %} {% if set_attached_bit is vyos_defined %} set-attached-bit {% endif %} {% if set_overload_bit is vyos_defined %} set-overload-bit {% endif %} {% if domain_password.md5 is vyos_defined %} domain-password md5 {{ domain_password.plaintext_password }} {% elif domain_password.plaintext_password is vyos_defined %} domain-password clear {{ domain_password.plaintext_password }} {% endif %} {% if log_adjacency_changes is vyos_defined %} log-adjacency-changes {% endif %} {% if lsp_gen_interval is vyos_defined %} lsp-gen-interval {{ lsp_gen_interval }} {% endif %} {% if lsp_mtu is vyos_defined %} lsp-mtu {{ lsp_mtu }} {% endif %} {% if lsp_refresh_interval is vyos_defined %} lsp-refresh-interval {{ lsp_refresh_interval }} {% endif %} {% if max_lsp_lifetime is vyos_defined %} max-lsp-lifetime {{ max_lsp_lifetime }} {% endif %} {% if ldp_sync.holddown is vyos_defined %} mpls ldp-sync holddown {{ ldp_sync.holddown }} {% elif ldp_sync is vyos_defined %} mpls ldp-sync {% endif %} {% if spf_interval is vyos_defined %} spf-interval {{ spf_interval }} {% endif %} {% if traffic_engineering.enable is vyos_defined %} mpls-te on {% endif %} {% if traffic_engineering.address is vyos_defined %} mpls-te router-address {{ traffic_engineering.address }} {% endif %} {% if traffic_engineering.inter_as is vyos_defined %} {% set level = '' %} {% if traffic_engineering.inter_as.level_1 is vyos_defined %} {% set level = ' level-1' %} {% endif %} {% if traffic_engineering.inter_as.level_1_2 is vyos_defined %} {% set level = ' level-1-2' %} {% endif %} {% if traffic_engineering.inter_as.level_2 is vyos_defined %} {% set level = ' level-2-only' %} {% endif %} mpls-te inter-as{{ level }} {% endif %} {% if segment_routing is vyos_defined %} {% if segment_routing.maximum_label_depth is vyos_defined %} segment-routing node-msd {{ segment_routing.maximum_label_depth }} {% endif %} {% if segment_routing.global_block is vyos_defined %} {% if segment_routing.local_block is vyos_defined %} segment-routing global-block {{ segment_routing.global_block.low_label_value }} {{ segment_routing.global_block.high_label_value }} local-block {{ segment_routing.local_block.low_label_value }} {{ segment_routing.local_block.high_label_value }} {% else %} segment-routing global-block {{ segment_routing.global_block.low_label_value }} {{ segment_routing.global_block.high_label_value }} {% endif %} {% endif %} {% if segment_routing.prefix is vyos_defined %} {% for prefix, prefix_config in segment_routing.prefix.items() %} {% if prefix_config.absolute is vyos_defined %} {% if prefix_config.absolute.value is vyos_defined %} segment-routing prefix {{ prefix }} absolute {{ prefix_config.absolute.value }} {{ 'explicit-null' if prefix_config.absolute.explicit_null is vyos_defined }} {{ 'no-php-flag' if prefix_config.absolute.no_php_flag is vyos_defined }} {% endif %} {% endif %} {% if prefix_config.index is vyos_defined %} {% if prefix_config.index.value is vyos_defined %} segment-routing prefix {{ prefix }} index {{ prefix_config.index.value }} {{ 'explicit-null' if prefix_config.index.explicit_null is vyos_defined }} {{ 'no-php-flag' if prefix_config.index.no_php_flag is vyos_defined }} {% endif %} {% endif %} {% endfor %} {% endif %} segment-routing on {% endif %} {% if spf_delay_ietf.init_delay is vyos_defined %} spf-delay-ietf init-delay {{ spf_delay_ietf.init_delay }} short-delay {{ spf_delay_ietf.short_delay }} long-delay {{ spf_delay_ietf.long_delay }} holddown {{ spf_delay_ietf.holddown }} time-to-learn {{ spf_delay_ietf.time_to_learn }} {% endif %} {% if area_password.md5 is vyos_defined %} area-password md5 {{ area_password.md5 }} {% elif area_password.plaintext_password is vyos_defined %} area-password clear {{ area_password.plaintext_password }} {% endif %} {% if default_information.originate is vyos_defined %} {% for afi, afi_config in default_information.originate.items() %} {% for level, level_config in afi_config.items() %} default-information originate {{ afi }} {{ level | replace('_', '-') }} {{ 'always' if level_config.always is vyos_defined }} {{ 'route-map ' ~ level_config.route_map if level_config.route_map is vyos_defined }} {{ 'metric ' ~ level_config.metric if level_config.metric is vyos_defined }} {% endfor %} {% endfor %} {% endif %} {% if redistribute.ipv4 is vyos_defined %} {% for protocol, protocol_options in redistribute.ipv4.items() %} {% for level, level_config in protocol_options.items() %} {% if level_config.metric is vyos_defined %} redistribute ipv4 {{ protocol }} {{ level | replace('_', '-') }} metric {{ level_config.metric }} {% elif level_config.route_map is vyos_defined %} redistribute ipv4 {{ protocol }} {{ level | replace('_', '-') }} route-map {{ level_config.route_map }} {% else %} redistribute ipv4 {{ protocol }} {{ level | replace('_', '-') }} {% endif %} {% endfor %} {% endfor %} {% endif %} {% if redistribute.ipv6 is vyos_defined %} {% for protocol, protocol_options in redistribute.ipv6.items() %} {% for level, level_config in protocol_options.items() %} {% if level_config.metric is vyos_defined %} redistribute ipv6 {{ protocol }} {{ level | replace('_', '-') }} metric {{ level_config.metric }} {% elif level_config.route_map is vyos_defined %} redistribute ipv6 {{ protocol }} {{ level | replace('_', '-') }} route-map {{ level_config.route_map }} {% else %} redistribute ipv6 {{ protocol }} {{ level | replace('_', '-') }} {% endif %} {% endfor %} {% endfor %} {% endif %} {% if level is vyos_defined('level-2') %} is-type level-2-only {% elif level is vyos_defined %} is-type {{ level }} {% endif %} exit -! \ No newline at end of file +! diff --git a/interface-definitions/include/isis/protocol-common-config.xml.i b/interface-definitions/include/isis/protocol-common-config.xml.i index 4ca7061db..648f2b319 100644 --- a/interface-definitions/include/isis/protocol-common-config.xml.i +++ b/interface-definitions/include/isis/protocol-common-config.xml.i @@ -1,690 +1,702 @@ <!-- include start from isis/protocol-common-config.xml.i --> +<leafNode name="advertise-high-metrics"> + <properties> + <help>Advertise high metric value on all interfaces</help> + <valueless/> + </properties> +</leafNode> +<leafNode name="advertise-passive-only"> + <properties> + <help>Advertise prefixes of passive interfaces only</help> + <valueless/> + </properties> +</leafNode> <node name="area-password"> <properties> <help>Configure the authentication password for an area</help> </properties> <children> #include <include/isis/password.xml.i> </children> </node> <node name="default-information"> <properties> <help>Control distribution of default information</help> </properties> <children> <node name="originate"> <properties> <help>Distribute a default route</help> </properties> <children> <node name="ipv4"> <properties> <help>Distribute default route for IPv4</help> </properties> <children> #include <include/isis/default-information-level.xml.i> </children> </node> <node name="ipv6"> <properties> <help>Distribute default route for IPv6</help> </properties> <children> #include <include/isis/default-information-level.xml.i> </children> </node> </children> </node> </children> </node> <node name="domain-password"> <properties> <help>Set the authentication password for a routing domain</help> </properties> <children> #include <include/isis/password.xml.i> </children> </node> <leafNode name="dynamic-hostname"> <properties> <help>Dynamic hostname for IS-IS</help> <valueless/> </properties> </leafNode> <leafNode name="level"> <properties> <help>IS-IS level number</help> <completionHelp> <list>level-1 level-1-2 level-2</list> </completionHelp> <valueHelp> <format>level-1</format> <description>Act as a station router</description> </valueHelp> <valueHelp> <format>level-1-2</format> <description>Act as both a station and an area router</description> </valueHelp> <valueHelp> <format>level-2</format> <description>Act as an area router</description> </valueHelp> <constraint> <regex>(level-1|level-1-2|level-2)</regex> </constraint> </properties> </leafNode> <leafNode name="log-adjacency-changes"> <properties> <help>Log adjacency state changes</help> <valueless/> </properties> </leafNode> <leafNode name="lsp-gen-interval"> <properties> <help>Minimum interval between regenerating same LSP</help> <valueHelp> <format>u32:1-120</format> <description>Minimum interval in seconds</description> </valueHelp> <constraint> <validator name="numeric" argument="--range 1-120"/> </constraint> </properties> </leafNode> <leafNode name="lsp-mtu"> <properties> <help>Configure the maximum size of generated LSPs</help> <valueHelp> <format>u32:128-4352</format> <description>Maximum size of generated LSPs</description> </valueHelp> <constraint> <validator name="numeric" argument="--range 128-4352"/> </constraint> </properties> <defaultValue>1497</defaultValue> </leafNode> <leafNode name="lsp-refresh-interval"> <properties> <help>LSP refresh interval</help> <valueHelp> <format>u32:1-65235</format> <description>LSP refresh interval in seconds</description> </valueHelp> <constraint> <validator name="numeric" argument="--range 1-65235"/> </constraint> </properties> </leafNode> <leafNode name="max-lsp-lifetime"> <properties> <help>Maximum LSP lifetime</help> <valueHelp> <format>u32:350-65535</format> <description>LSP lifetime in seconds</description> </valueHelp> <constraint> <validator name="numeric" argument="--range 1-65535"/> </constraint> </properties> </leafNode> <leafNode name="metric-style"> <properties> <help>Use old-style (ISO 10589) or new-style packet formats</help> <completionHelp> <list>narrow transition wide</list> </completionHelp> <valueHelp> <format>narrow</format> <description>Use old style of TLVs with narrow metric</description> </valueHelp> <valueHelp> <format>transition</format> <description>Send and accept both styles of TLVs during transition</description> </valueHelp> <valueHelp> <format>wide</format> <description>Use new style of TLVs to carry wider metric</description> </valueHelp> <constraint> <regex>(narrow|transition|wide)</regex> </constraint> </properties> </leafNode> #include <include/isis/ldp-sync-protocol.xml.i> <leafNode name="net"> <properties> <help>A Network Entity Title for this process (ISO only)</help> <valueHelp> <format>XX.XXXX. ... .XXX.XX</format> <description>Network entity title (NET)</description> </valueHelp> <constraint> <regex>[a-fA-F0-9]{2}(\.[a-fA-F0-9]{4}){3,9}\.[a-fA-F0-9]{2}</regex> </constraint> </properties> </leafNode> <leafNode name="purge-originator"> <properties> <help>Use the RFC 6232 purge-originator</help> <valueless/> </properties> </leafNode> <node name="traffic-engineering"> <properties> <help>IS-IS traffic engineering extensions</help> </properties> <children> <leafNode name="enable"> <properties> <help>Enable MPLS traffic engineering extensions</help> <valueless/> </properties> </leafNode> <!-- <node name="inter-as"> <properties> <help>MPLS traffic engineering inter-AS support</help> </properties> <children> <leafNode name="level-1"> <properties> <help>Area native mode self originate inter-AS LSP with L1 only flooding scope</help> <valueless/> </properties> </leafNode> <leafNode name="level-1-2"> <properties> <help>Area native mode self originate inter-AS LSP with L1 and L2 flooding scope</help> <valueless/> </properties> </leafNode> <leafNode name="level-2"> <properties> <help>Area native mode self originate inter-AS LSP with L2 only flooding scope</help> <valueless/> </properties> </leafNode> </children> </node> <leafNode name="inter-as"> <properties> <help>MPLS traffic engineering inter-AS support</help> <valueless/> </properties> </leafNode> --> <leafNode name="address"> <properties> <help>MPLS traffic engineering router ID</help> <valueHelp> <format>ipv4</format> <description>IPv4 address</description> </valueHelp> <constraint> <validator name="ipv4-address"/> </constraint> </properties> </leafNode> </children> </node> <node name="segment-routing"> <properties> <help>Segment-Routing (SPRING) settings</help> </properties> <children> <node name="global-block"> <properties> <help>Segment Routing Global Block label range</help> </properties> <children> #include <include/segment-routing-label-value.xml.i> </children> </node> <node name="local-block"> <properties> <help>Segment Routing Local Block label range</help> </properties> <children> #include <include/segment-routing-label-value.xml.i> </children> </node> <leafNode name="maximum-label-depth"> <properties> <help>Maximum MPLS labels allowed for this router</help> <valueHelp> <format>u32:1-16</format> <description>MPLS label depth</description> </valueHelp> <constraint> <validator name="numeric" argument="--range 1-16"/> </constraint> </properties> </leafNode> <tagNode name="prefix"> <properties> <help>Static IPv4/IPv6 prefix segment/label mapping</help> <valueHelp> <format>ipv4net</format> <description>IPv4 prefix segment</description> </valueHelp> <valueHelp> <format>ipv6net</format> <description>IPv6 prefix segment</description> </valueHelp> <constraint> <validator name="ipv4-prefix"/> <validator name="ipv6-prefix"/> </constraint> </properties> <children> <node name="absolute"> <properties> <help>Specify the absolute value of prefix segment/label ID</help> </properties> <children> <leafNode name="value"> <properties> <help>Specify the absolute value of prefix segment/label ID</help> <valueHelp> <format>u32:16-1048575</format> <description>The absolute segment/label ID value</description> </valueHelp> <constraint> <validator name="numeric" argument="--range 16-1048575"/> </constraint> </properties> </leafNode> <leafNode name="explicit-null"> <properties> <help>Request upstream neighbor to replace segment/label with explicit null label</help> <valueless/> </properties> </leafNode> <leafNode name="no-php-flag"> <properties> <help>Do not request penultimate hop popping for segment/label</help> <valueless/> </properties> </leafNode> </children> </node> <node name="index"> <properties> <help>Specify the index value of prefix segment/label ID</help> </properties> <children> <leafNode name="value"> <properties> <help>Specify the index value of prefix segment/label ID</help> <valueHelp> <format>u32:0-65535</format> <description>The index segment/label ID value</description> </valueHelp> <constraint> <validator name="numeric" argument="--range 0-65535"/> </constraint> </properties> </leafNode> <leafNode name="explicit-null"> <properties> <help>Request upstream neighbor to replace segment/label with explicit null label</help> <valueless/> </properties> </leafNode> <leafNode name="no-php-flag"> <properties> <help>Do not request penultimate hop popping for segment/label</help> <valueless/> </properties> </leafNode> </children> </node> </children> </tagNode> </children> </node> <node name="redistribute"> <properties> <help>Redistribute information from another routing protocol</help> </properties> <children> <node name="ipv4"> <properties> <help>Redistribute IPv4 routes</help> </properties> <children> <node name="bgp"> <properties> <help>Border Gateway Protocol (BGP)</help> </properties> <children> #include <include/isis/redistribute-level-1-2.xml.i> </children> </node> <node name="connected"> <properties> <help>Redistribute connected routes into IS-IS</help> </properties> <children> #include <include/isis/redistribute-level-1-2.xml.i> </children> </node> <node name="kernel"> <properties> <help>Redistribute kernel routes into IS-IS</help> </properties> <children> #include <include/isis/redistribute-level-1-2.xml.i> </children> </node> <node name="ospf"> <properties> <help>Redistribute OSPF routes into IS-IS</help> </properties> <children> #include <include/isis/redistribute-level-1-2.xml.i> </children> </node> <node name="rip"> <properties> <help>Redistribute RIP routes into IS-IS</help> </properties> <children> #include <include/isis/redistribute-level-1-2.xml.i> </children> </node> <node name="babel"> <properties> <help>Redistribute Babel routes into IS-IS</help> </properties> <children> #include <include/isis/redistribute-level-1-2.xml.i> </children> </node> <node name="static"> <properties> <help>Redistribute static routes into IS-IS</help> </properties> <children> #include <include/isis/redistribute-level-1-2.xml.i> </children> </node> </children> </node> <node name="ipv6"> <properties> <help>Redistribute IPv6 routes</help> </properties> <children> <node name="bgp"> <properties> <help>Redistribute BGP routes into IS-IS</help> </properties> <children> #include <include/isis/redistribute-level-1-2.xml.i> </children> </node> <node name="connected"> <properties> <help>Redistribute connected routes into IS-IS</help> </properties> <children> #include <include/isis/redistribute-level-1-2.xml.i> </children> </node> <node name="kernel"> <properties> <help>Redistribute kernel routes into IS-IS</help> </properties> <children> #include <include/isis/redistribute-level-1-2.xml.i> </children> </node> <node name="ospf6"> <properties> <help>Redistribute OSPFv3 routes into IS-IS</help> </properties> <children> #include <include/isis/redistribute-level-1-2.xml.i> </children> </node> <node name="ripng"> <properties> <help>Redistribute RIPng routes into IS-IS</help> </properties> <children> #include <include/isis/redistribute-level-1-2.xml.i> </children> </node> <node name="babel"> <properties> <help>Redistribute Babel routes into IS-IS</help> </properties> <children> #include <include/isis/redistribute-level-1-2.xml.i> </children> </node> <node name="static"> <properties> <help>Redistribute static routes into IS-IS</help> </properties> <children> #include <include/isis/redistribute-level-1-2.xml.i> </children> </node> </children> </node> </children> </node> <leafNode name="set-attached-bit"> <properties> <help>Set attached bit to identify as L1/L2 router for inter-area traffic</help> <valueless/> </properties> </leafNode> <leafNode name="set-overload-bit"> <properties> <help>Set overload bit to avoid any transit traffic</help> <valueless/> </properties> </leafNode> <node name="spf-delay-ietf"> <properties> <help>IETF SPF delay algorithm</help> </properties> <children> <leafNode name="init-delay"> <properties> <help>Delay used while in QUIET state</help> <valueHelp> <format>u32:0-60000</format> <description>Delay used while in QUIET state (in ms)</description> </valueHelp> <constraint> <validator name="numeric" argument="--range 0-60000"/> </constraint> </properties> </leafNode> <leafNode name="short-delay"> <properties> <help>Delay used while in SHORT_WAIT state</help> <valueHelp> <format>u32:0-60000</format> <description>Delay used while in SHORT_WAIT state (in ms)</description> </valueHelp> <constraint> <validator name="numeric" argument="--range 0-60000"/> </constraint> </properties> </leafNode> <leafNode name="long-delay"> <properties> <help>Delay used while in LONG_WAIT</help> <valueHelp> <format>u32:0-60000</format> <description>Delay used while in LONG_WAIT state in ms</description> </valueHelp> <constraint> <validator name="numeric" argument="--range 0-60000"/> </constraint> </properties> </leafNode> <leafNode name="holddown"> <properties> <help>Time with no received IGP events before considering IGP stable</help> <valueHelp> <format>u32:0-60000</format> <description>Time with no received IGP events before considering IGP stable in ms</description> </valueHelp> <constraint> <validator name="numeric" argument="--range 0-60000"/> </constraint> </properties> </leafNode> <leafNode name="time-to-learn"> <properties> <help>Maximum duration needed to learn all the events related to a single failure</help> <valueHelp> <format>u32:0-60000</format> <description>Maximum duration needed to learn all the events related to a single failure in ms</description> </valueHelp> <constraint> <validator name="numeric" argument="--range 0-60000"/> </constraint> </properties> </leafNode> </children> </node> <leafNode name="spf-interval"> <properties> <help>Minimum interval between SPF calculations</help> <valueHelp> <format>u32:1-120</format> <description>Interval in seconds</description> </valueHelp> <constraint> <validator name="numeric" argument="--range 1-120"/> </constraint> </properties> </leafNode> <tagNode name="interface"> <properties> <help>Interface params</help> <completionHelp> <script>${vyos_completion_dir}/list_interfaces</script> </completionHelp> </properties> <children> #include <include/bfd/bfd.xml.i> <leafNode name="circuit-type"> <properties> <help>Configure circuit type for interface</help> <completionHelp> <list>level-1 level-1-2 level-2-only</list> </completionHelp> <valueHelp> <format>level-1</format> <description>Level-1 only adjacencies are formed</description> </valueHelp> <valueHelp> <format>level-1-2</format> <description>Level-1-2 adjacencies are formed</description> </valueHelp> <valueHelp> <format>level-2-only</format> <description>Level-2 only adjacencies are formed</description> </valueHelp> <constraint> <regex>(level-1|level-1-2|level-2-only)</regex> </constraint> </properties> </leafNode> <leafNode name="hello-padding"> <properties> <help>Add padding to IS-IS hello packets</help> <valueless/> </properties> </leafNode> <leafNode name="hello-interval"> <properties> <help>Set Hello interval</help> <valueHelp> <format>u32:1-600</format> <description>Set Hello interval</description> </valueHelp> <constraint> <validator name="numeric" argument="--range 1-600"/> </constraint> </properties> </leafNode> <leafNode name="hello-multiplier"> <properties> <help>Set Hello interval</help> <valueHelp> <format>u32:2-100</format> <description>Set multiplier for Hello holding time</description> </valueHelp> <constraint> <validator name="numeric" argument="--range 2-100"/> </constraint> </properties> </leafNode> #include <include/isis/metric.xml.i> #include <include/isis/ldp-sync-interface.xml.i> <node name="network"> <properties> <help>Set network type</help> </properties> <children> <leafNode name="point-to-point"> <properties> <help>point-to-point network type</help> <valueless/> </properties> </leafNode> </children> </node> #include <include/isis/passive.xml.i> <node name="password"> <properties> <help>Configure the authentication password for a circuit</help> </properties> <children> #include <include/isis/password.xml.i> </children> </node> <leafNode name="priority"> <properties> <help>Set priority for Designated Router election</help> <valueHelp> <format>u32:0-127</format> <description>Priority value</description> </valueHelp> <constraint> <validator name="numeric" argument="--range 0-127"/> </constraint> </properties> </leafNode> <leafNode name="psnp-interval"> <properties> <help>Set PSNP interval</help> <valueHelp> <format>u32:0-127</format> <description>PSNP interval in seconds</description> </valueHelp> <constraint> <validator name="numeric" argument="--range 0-127"/> </constraint> </properties> </leafNode> <leafNode name="no-three-way-handshake"> <properties> <help>Disable three-way handshake</help> <valueless/> </properties> </leafNode> </children> </tagNode> <!-- include end --> diff --git a/smoketest/scripts/cli/test_protocols_isis.py b/smoketest/scripts/cli/test_protocols_isis.py index 5ab7fae14..747fb5e80 100755 --- a/smoketest/scripts/cli/test_protocols_isis.py +++ b/smoketest/scripts/cli/test_protocols_isis.py @@ -1,324 +1,328 @@ #!/usr/bin/env python3 # # Copyright (C) 2021-2022 VyOS maintainers and contributors # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 or later as # published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. import unittest from base_vyostest_shim import VyOSUnitTestSHIM from vyos.configsession import ConfigSessionError from vyos.ifconfig import Section from vyos.utils.process import process_named_running PROCESS_NAME = 'isisd' base_path = ['protocols', 'isis'] domain = 'VyOS' net = '49.0001.1921.6800.1002.00' class TestProtocolsISIS(VyOSUnitTestSHIM.TestCase): @classmethod def setUpClass(cls): cls._interfaces = Section.interfaces('ethernet') # call base-classes classmethod super(TestProtocolsISIS, cls).setUpClass() # ensure we can also run this test on a live system - so lets clean # out the current configuration :) cls.cli_delete(cls, base_path) def tearDown(self): self.cli_delete(base_path) self.cli_commit() # Check for running process self.assertTrue(process_named_running(PROCESS_NAME)) def isis_base_config(self): self.cli_set(base_path + ['net', net]) for interface in self._interfaces: self.cli_set(base_path + ['interface', interface]) def test_isis_01_redistribute(self): prefix_list = 'EXPORT-ISIS' route_map = 'EXPORT-ISIS' rule = '10' self.cli_set(['policy', 'prefix-list', prefix_list, 'rule', rule, 'action', 'permit']) self.cli_set(['policy', 'prefix-list', prefix_list, 'rule', rule, 'prefix', '203.0.113.0/24']) self.cli_set(['policy', 'route-map', route_map, 'rule', rule, 'action', 'permit']) self.cli_set(['policy', 'route-map', route_map, 'rule', rule, 'match', 'ip', 'address', 'prefix-list', prefix_list]) self.cli_set(base_path) # verify() - net id and interface are mandatory with self.assertRaises(ConfigSessionError): self.cli_commit() self.isis_base_config() self.cli_set(base_path + ['redistribute', 'ipv4', 'connected', 'level-2', 'route-map', route_map]) self.cli_set(base_path + ['log-adjacency-changes']) # Commit all changes self.cli_commit() # Verify all changes tmp = self.getFRRconfig(f'router isis {domain}', daemon='isisd') self.assertIn(f' net {net}', tmp) self.assertIn(f' log-adjacency-changes', tmp) self.assertIn(f' redistribute ipv4 connected level-2 route-map {route_map}', tmp) for interface in self._interfaces: tmp = self.getFRRconfig(f'interface {interface}', daemon='isisd') self.assertIn(f' ip router isis {domain}', tmp) self.assertIn(f' ipv6 router isis {domain}', tmp) self.cli_delete(['policy', 'route-map', route_map]) self.cli_delete(['policy', 'prefix-list', prefix_list]) def test_isis_02_vrfs(self): vrfs = ['red', 'green', 'blue'] # It is safe to assume that when the basic VRF test works, all other # IS-IS related features work, as we entirely inherit the CLI templates # and Jinja2 FRR template. table = '1000' vrf = 'red' vrf_base = ['vrf', 'name', vrf] vrf_iface = 'eth1' self.cli_set(vrf_base + ['table', table]) self.cli_set(vrf_base + ['protocols', 'isis', 'net', net]) self.cli_set(vrf_base + ['protocols', 'isis', 'interface', vrf_iface]) + self.cli_set(vrf_base + ['protocols', 'isis', 'advertise-high-metrics']) + self.cli_set(vrf_base + ['protocols', 'isis', 'advertise-passive-only']) self.cli_set(['interfaces', 'ethernet', vrf_iface, 'vrf', vrf]) # Also set a default VRF IS-IS config self.cli_set(base_path + ['net', net]) self.cli_set(base_path + ['interface', 'eth0']) self.cli_commit() # Verify FRR isisd configuration tmp = self.getFRRconfig(f'router isis {domain}', daemon='isisd') self.assertIn(f'router isis {domain}', tmp) self.assertIn(f' net {net}', tmp) tmp = self.getFRRconfig(f'router isis {domain} vrf {vrf}', daemon='isisd') self.assertIn(f'router isis {domain} vrf {vrf}', tmp) self.assertIn(f' net {net}', tmp) + self.assertIn(f' advertise-high-metrics', tmp) + self.assertIn(f' advertise-passive-only', tmp) self.cli_delete(['vrf', 'name', vrf]) self.cli_delete(['interfaces', 'ethernet', vrf_iface, 'vrf']) def test_isis_04_default_information(self): metric = '50' route_map = 'default-foo-' self.isis_base_config() for afi in ['ipv4', 'ipv6']: for level in ['level-1', 'level-2']: self.cli_set(base_path + ['default-information', 'originate', afi, level, 'always']) self.cli_set(base_path + ['default-information', 'originate', afi, level, 'metric', metric]) self.cli_set(base_path + ['default-information', 'originate', afi, level, 'route-map', route_map + level + afi]) # Commit all changes self.cli_commit() # Verify all changes tmp = self.getFRRconfig(f'router isis {domain}', daemon='isisd') self.assertIn(f' net {net}', tmp) for afi in ['ipv4', 'ipv6']: for level in ['level-1', 'level-2']: route_map_name = route_map + level + afi self.assertIn(f' default-information originate {afi} {level} always route-map {route_map_name} metric {metric}', tmp) def test_isis_05_password(self): password = 'foo' self.isis_base_config() for interface in self._interfaces: self.cli_set(base_path + ['interface', interface, 'password', 'plaintext-password', f'{password}-{interface}']) self.cli_set(base_path + ['area-password', 'plaintext-password', password]) self.cli_set(base_path + ['area-password', 'md5', password]) self.cli_set(base_path + ['domain-password', 'plaintext-password', password]) self.cli_set(base_path + ['domain-password', 'md5', password]) # verify() - can not use both md5 and plaintext-password for area-password with self.assertRaises(ConfigSessionError): self.cli_commit() self.cli_delete(base_path + ['area-password', 'md5', password]) # verify() - can not use both md5 and plaintext-password for domain-password with self.assertRaises(ConfigSessionError): self.cli_commit() self.cli_delete(base_path + ['domain-password', 'md5', password]) # Commit all changes self.cli_commit() # Verify all changes tmp = self.getFRRconfig(f'router isis {domain}', daemon='isisd') self.assertIn(f' net {net}', tmp) self.assertIn(f' domain-password clear {password}', tmp) self.assertIn(f' area-password clear {password}', tmp) for interface in self._interfaces: tmp = self.getFRRconfig(f'interface {interface}', daemon='isisd') self.assertIn(f' isis password clear {password}-{interface}', tmp) def test_isis_06_spf_delay_bfd(self): network = 'point-to-point' holddown = '10' init_delay = '50' long_delay = '200' short_delay = '100' time_to_learn = '75' bfd_profile = 'isis-bfd' self.cli_set(base_path + ['net', net]) for interface in self._interfaces: self.cli_set(base_path + ['interface', interface, 'network', network]) self.cli_set(base_path + ['interface', interface, 'bfd', 'profile', bfd_profile]) self.cli_set(base_path + ['spf-delay-ietf', 'holddown', holddown]) # verify() - All types of spf-delay must be configured with self.assertRaises(ConfigSessionError): self.cli_commit() self.cli_set(base_path + ['spf-delay-ietf', 'init-delay', init_delay]) # verify() - All types of spf-delay must be configured with self.assertRaises(ConfigSessionError): self.cli_commit() self.cli_set(base_path + ['spf-delay-ietf', 'long-delay', long_delay]) # verify() - All types of spf-delay must be configured with self.assertRaises(ConfigSessionError): self.cli_commit() self.cli_set(base_path + ['spf-delay-ietf', 'short-delay', short_delay]) # verify() - All types of spf-delay must be configured with self.assertRaises(ConfigSessionError): self.cli_commit() self.cli_set(base_path + ['spf-delay-ietf', 'time-to-learn', time_to_learn]) # Commit all changes self.cli_commit() # Verify all changes tmp = self.getFRRconfig(f'router isis {domain}', daemon='isisd') self.assertIn(f' net {net}', tmp) self.assertIn(f' spf-delay-ietf init-delay {init_delay} short-delay {short_delay} long-delay {long_delay} holddown {holddown} time-to-learn {time_to_learn}', tmp) for interface in self._interfaces: tmp = self.getFRRconfig(f'interface {interface}', daemon='isisd') self.assertIn(f' ip router isis {domain}', tmp) self.assertIn(f' ipv6 router isis {domain}', tmp) self.assertIn(f' isis network {network}', tmp) self.assertIn(f' isis bfd', tmp) self.assertIn(f' isis bfd profile {bfd_profile}', tmp) def test_isis_07_segment_routing_configuration(self): global_block_low = "300" global_block_high = "399" local_block_low = "400" local_block_high = "499" interface = 'lo' maximum_stack_size = '5' prefix_one = '192.168.0.1/32' prefix_two = '192.168.0.2/32' prefix_three = '192.168.0.3/32' prefix_four = '192.168.0.4/32' prefix_one_value = '1' prefix_two_value = '2' prefix_three_value = '60000' prefix_four_value = '65000' self.cli_set(base_path + ['net', net]) self.cli_set(base_path + ['interface', interface]) self.cli_set(base_path + ['segment-routing', 'maximum-label-depth', maximum_stack_size]) self.cli_set(base_path + ['segment-routing', 'global-block', 'low-label-value', global_block_low]) self.cli_set(base_path + ['segment-routing', 'global-block', 'high-label-value', global_block_high]) self.cli_set(base_path + ['segment-routing', 'local-block', 'low-label-value', local_block_low]) self.cli_set(base_path + ['segment-routing', 'local-block', 'high-label-value', local_block_high]) self.cli_set(base_path + ['segment-routing', 'prefix', prefix_one, 'index', 'value', prefix_one_value]) self.cli_set(base_path + ['segment-routing', 'prefix', prefix_one, 'index', 'explicit-null']) self.cli_set(base_path + ['segment-routing', 'prefix', prefix_two, 'index', 'value', prefix_two_value]) self.cli_set(base_path + ['segment-routing', 'prefix', prefix_two, 'index', 'no-php-flag']) self.cli_set(base_path + ['segment-routing', 'prefix', prefix_three, 'absolute', 'value', prefix_three_value]) self.cli_set(base_path + ['segment-routing', 'prefix', prefix_three, 'absolute', 'explicit-null']) self.cli_set(base_path + ['segment-routing', 'prefix', prefix_four, 'absolute', 'value', prefix_four_value]) self.cli_set(base_path + ['segment-routing', 'prefix', prefix_four, 'absolute', 'no-php-flag']) # Commit all changes self.cli_commit() # Verify all changes tmp = self.getFRRconfig(f'router isis {domain}', daemon='isisd') self.assertIn(f' net {net}', tmp) self.assertIn(f' segment-routing on', tmp) self.assertIn(f' segment-routing global-block {global_block_low} {global_block_high} local-block {local_block_low} {local_block_high}', tmp) self.assertIn(f' segment-routing node-msd {maximum_stack_size}', tmp) self.assertIn(f' segment-routing prefix {prefix_one} index {prefix_one_value} explicit-null', tmp) self.assertIn(f' segment-routing prefix {prefix_two} index {prefix_two_value} no-php-flag', tmp) self.assertIn(f' segment-routing prefix {prefix_three} absolute {prefix_three_value} explicit-null', tmp) self.assertIn(f' segment-routing prefix {prefix_four} absolute {prefix_four_value} no-php-flag', tmp) def test_isis_08_ldp_sync(self): holddown = "500" interface = 'lo' self.cli_set(base_path + ['net', net]) self.cli_set(base_path + ['interface', interface]) self.cli_set(base_path + ['ldp-sync', 'holddown', holddown]) # Commit main ISIS changes self.cli_commit() # Verify main ISIS changes tmp = self.getFRRconfig(f'router isis {domain}', daemon='isisd') self.assertIn(f' net {net}', tmp) self.assertIn(f' mpls ldp-sync', tmp) self.assertIn(f' mpls ldp-sync holddown {holddown}', tmp) for interface in self._interfaces: self.cli_set(base_path + ['interface', interface, 'ldp-sync', 'holddown', holddown]) # Commit interface changes for holddown self.cli_commit() for interface in self._interfaces: # Verify interface changes for holddown tmp = self.getFRRconfig(f'interface {interface}', daemon='isisd') self.assertIn(f'interface {interface}', tmp) self.assertIn(f' ip router isis {domain}', tmp) self.assertIn(f' ipv6 router isis {domain}', tmp) self.assertIn(f' isis mpls ldp-sync holddown {holddown}', tmp) for interface in self._interfaces: self.cli_set(base_path + ['interface', interface, 'ldp-sync', 'disable']) # Commit interface changes for disable self.cli_commit() for interface in self._interfaces: # Verify interface changes for disable tmp = self.getFRRconfig(f'interface {interface}', daemon='isisd') self.assertIn(f'interface {interface}', tmp) self.assertIn(f' ip router isis {domain}', tmp) self.assertIn(f' ipv6 router isis {domain}', tmp) self.assertIn(f' no isis mpls ldp-sync', tmp) if __name__ == '__main__': unittest.main(verbosity=2)