cisco_node_utils_mgx 2.1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.rspec +2 -0
- data/.rubocop.yml +96 -0
- data/.travis.yml +17 -0
- data/CHANGELOG.md +676 -0
- data/CONTRIBUTING.md +43 -0
- data/Gemfile +10 -0
- data/LICENSE +201 -0
- data/README.md +246 -0
- data/Rakefile +44 -0
- data/SUPPORT.md +3 -0
- data/bin/.rubocop.yml +18 -0
- data/bin/check_metric_limits.rb +109 -0
- data/bin/git/hooks/commit-msg/enforce_style +89 -0
- data/bin/git/hooks/hook_lib +115 -0
- data/bin/git/hooks/hooks-wrapper +38 -0
- data/bin/git/hooks/post-flow-hotfix-start/update-version +24 -0
- data/bin/git/hooks/post-flow-release-finish/update-version +29 -0
- data/bin/git/hooks/post-flow-release-start/update-version +19 -0
- data/bin/git/hooks/post-merge/update-hooks +6 -0
- data/bin/git/hooks/post-rewrite/update-hooks +6 -0
- data/bin/git/hooks/pre-commit/check_unstaged_changes +18 -0
- data/bin/git/hooks/pre-commit/rubocop +25 -0
- data/bin/git/hooks/pre-commit/validate-diffs +45 -0
- data/bin/git/hooks/pre-commit/validate-yaml +18 -0
- data/bin/git/hooks/pre-push/check-changelog +24 -0
- data/bin/git/hooks/pre-push/rubocop +7 -0
- data/bin/git/update-hooks +123 -0
- data/bin/show_running_yang.rb +233 -0
- data/cisco_node_utils.gemspec +41 -0
- data/docs/README-develop-best-practices.md +521 -0
- data/docs/README-develop-node-utils-APIs.md +570 -0
- data/docs/README-maintainers.md +77 -0
- data/docs/README-test-execution.md +57 -0
- data/docs/README-utilities.md +14 -0
- data/docs/agent_files.png +0 -0
- data/docs/cisco_node_utils.yaml.example +36 -0
- data/docs/template-router.rb +123 -0
- data/docs/template-test_router.rb +104 -0
- data/ext/mkrf_conf.rb +63 -0
- data/lib/.rubocop.yml +18 -0
- data/lib/cisco_node_utils/aaa_authentication_login.rb +95 -0
- data/lib/cisco_node_utils/aaa_authentication_login_service.rb +138 -0
- data/lib/cisco_node_utils/aaa_authorization_service.rb +156 -0
- data/lib/cisco_node_utils/ace.rb +467 -0
- data/lib/cisco_node_utils/acl.rb +101 -0
- data/lib/cisco_node_utils/banner.rb +63 -0
- data/lib/cisco_node_utils/bfd_global.rb +305 -0
- data/lib/cisco_node_utils/bgp.rb +988 -0
- data/lib/cisco_node_utils/bgp_af.rb +545 -0
- data/lib/cisco_node_utils/bgp_af_aggr_addr.rb +207 -0
- data/lib/cisco_node_utils/bgp_neighbor.rb +527 -0
- data/lib/cisco_node_utils/bgp_neighbor_af.rb +780 -0
- data/lib/cisco_node_utils/bridge_domain.rb +178 -0
- data/lib/cisco_node_utils/bridge_domain_vni.rb +206 -0
- data/lib/cisco_node_utils/cisco_cmn_utils.rb +444 -0
- data/lib/cisco_node_utils/client/client.rb +238 -0
- data/lib/cisco_node_utils/client/grpc/client.rb +395 -0
- data/lib/cisco_node_utils/client/grpc/ems.proto +148 -0
- data/lib/cisco_node_utils/client/grpc/ems.rb +111 -0
- data/lib/cisco_node_utils/client/grpc/ems_services.rb +49 -0
- data/lib/cisco_node_utils/client/grpc.rb +33 -0
- data/lib/cisco_node_utils/client/nxapi/client.rb +368 -0
- data/lib/cisco_node_utils/client/nxapi.rb +31 -0
- data/lib/cisco_node_utils/client/utils.rb +180 -0
- data/lib/cisco_node_utils/client.rb +35 -0
- data/lib/cisco_node_utils/cmd_ref/README_YAML.md +590 -0
- data/lib/cisco_node_utils/cmd_ref/aaa_auth_login_service.yaml +25 -0
- data/lib/cisco_node_utils/cmd_ref/aaa_authentication_login.yaml +38 -0
- data/lib/cisco_node_utils/cmd_ref/aaa_authorization_service.yaml +40 -0
- data/lib/cisco_node_utils/cmd_ref/acl.yaml +48 -0
- data/lib/cisco_node_utils/cmd_ref/banner.yaml +11 -0
- data/lib/cisco_node_utils/cmd_ref/bfd_global.yaml +117 -0
- data/lib/cisco_node_utils/cmd_ref/bgp.yaml +383 -0
- data/lib/cisco_node_utils/cmd_ref/bgp_af.yaml +223 -0
- data/lib/cisco_node_utils/cmd_ref/bgp_af_aa.yaml +38 -0
- data/lib/cisco_node_utils/cmd_ref/bgp_neighbor.yaml +174 -0
- data/lib/cisco_node_utils/cmd_ref/bgp_neighbor_af.yaml +236 -0
- data/lib/cisco_node_utils/cmd_ref/bridge_domain.yaml +49 -0
- data/lib/cisco_node_utils/cmd_ref/bridge_domain_vni.yaml +33 -0
- data/lib/cisco_node_utils/cmd_ref/dhcp_relay_global.yaml +128 -0
- data/lib/cisco_node_utils/cmd_ref/dnsclient.yaml +55 -0
- data/lib/cisco_node_utils/cmd_ref/encapsulation.yaml +25 -0
- data/lib/cisco_node_utils/cmd_ref/evpn_multicast.yaml +12 -0
- data/lib/cisco_node_utils/cmd_ref/evpn_multisite.yaml +18 -0
- data/lib/cisco_node_utils/cmd_ref/evpn_stormcontrol.yaml +18 -0
- data/lib/cisco_node_utils/cmd_ref/evpn_vni.yaml +48 -0
- data/lib/cisco_node_utils/cmd_ref/fabricpath.yaml +183 -0
- data/lib/cisco_node_utils/cmd_ref/fabricpath_topology.yaml +40 -0
- data/lib/cisco_node_utils/cmd_ref/feature.yaml +126 -0
- data/lib/cisco_node_utils/cmd_ref/hostname.yaml +8 -0
- data/lib/cisco_node_utils/cmd_ref/hsrp_global.yaml +25 -0
- data/lib/cisco_node_utils/cmd_ref/images.yaml +8 -0
- data/lib/cisco_node_utils/cmd_ref/interface.yaml +781 -0
- data/lib/cisco_node_utils/cmd_ref/interface_channel_group.yaml +45 -0
- data/lib/cisco_node_utils/cmd_ref/interface_evpn_multisite.yaml +17 -0
- data/lib/cisco_node_utils/cmd_ref/interface_hsrp_group.yaml +120 -0
- data/lib/cisco_node_utils/cmd_ref/interface_ospf.yaml +112 -0
- data/lib/cisco_node_utils/cmd_ref/interface_portchannel.yaml +87 -0
- data/lib/cisco_node_utils/cmd_ref/interface_service_vni.yaml +42 -0
- data/lib/cisco_node_utils/cmd_ref/inventory.yaml +45 -0
- data/lib/cisco_node_utils/cmd_ref/ip_multicast.yaml +22 -0
- data/lib/cisco_node_utils/cmd_ref/itd_device_group.yaml +83 -0
- data/lib/cisco_node_utils/cmd_ref/itd_service.yaml +119 -0
- data/lib/cisco_node_utils/cmd_ref/memory.yaml +24 -0
- data/lib/cisco_node_utils/cmd_ref/ntp_auth_key.yaml +10 -0
- data/lib/cisco_node_utils/cmd_ref/ntp_config.yaml +27 -0
- data/lib/cisco_node_utils/cmd_ref/ntp_server.yaml +34 -0
- data/lib/cisco_node_utils/cmd_ref/object_group.yaml +32 -0
- data/lib/cisco_node_utils/cmd_ref/ospf.yaml +91 -0
- data/lib/cisco_node_utils/cmd_ref/ospf_area.yaml +91 -0
- data/lib/cisco_node_utils/cmd_ref/ospf_area_vlink.yaml +88 -0
- data/lib/cisco_node_utils/cmd_ref/overlay_global.yaml +37 -0
- data/lib/cisco_node_utils/cmd_ref/pim.yaml +43 -0
- data/lib/cisco_node_utils/cmd_ref/portchannel_global.yaml +86 -0
- data/lib/cisco_node_utils/cmd_ref/radius_global.yaml +37 -0
- data/lib/cisco_node_utils/cmd_ref/radius_server.yaml +100 -0
- data/lib/cisco_node_utils/cmd_ref/radius_server_group.yaml +19 -0
- data/lib/cisco_node_utils/cmd_ref/route_map.yaml +601 -0
- data/lib/cisco_node_utils/cmd_ref/show_system.yaml +9 -0
- data/lib/cisco_node_utils/cmd_ref/show_version.yaml +84 -0
- data/lib/cisco_node_utils/cmd_ref/snmp_community.yaml +81 -0
- data/lib/cisco_node_utils/cmd_ref/snmp_group.yaml +9 -0
- data/lib/cisco_node_utils/cmd_ref/snmp_notification_receiver.yaml +74 -0
- data/lib/cisco_node_utils/cmd_ref/snmp_server.yaml +91 -0
- data/lib/cisco_node_utils/cmd_ref/snmp_user.yaml +57 -0
- data/lib/cisco_node_utils/cmd_ref/snmpnotification.yaml +23 -0
- data/lib/cisco_node_utils/cmd_ref/span_session.yaml +65 -0
- data/lib/cisco_node_utils/cmd_ref/stp_global.yaml +235 -0
- data/lib/cisco_node_utils/cmd_ref/syslog_facility.yaml +10 -0
- data/lib/cisco_node_utils/cmd_ref/syslog_server.yaml +34 -0
- data/lib/cisco_node_utils/cmd_ref/syslog_settings.yaml +45 -0
- data/lib/cisco_node_utils/cmd_ref/system.yaml +7 -0
- data/lib/cisco_node_utils/cmd_ref/tacacs_global.yaml +37 -0
- data/lib/cisco_node_utils/cmd_ref/tacacs_server.yaml +63 -0
- data/lib/cisco_node_utils/cmd_ref/tacacs_server_group.yaml +45 -0
- data/lib/cisco_node_utils/cmd_ref/tacacs_server_host.yaml +64 -0
- data/lib/cisco_node_utils/cmd_ref/upgrade.yaml +38 -0
- data/lib/cisco_node_utils/cmd_ref/vdc.yaml +52 -0
- data/lib/cisco_node_utils/cmd_ref/virtual_service.yaml +8 -0
- data/lib/cisco_node_utils/cmd_ref/vlan.yaml +106 -0
- data/lib/cisco_node_utils/cmd_ref/vpc.yaml +233 -0
- data/lib/cisco_node_utils/cmd_ref/vrf.yaml +86 -0
- data/lib/cisco_node_utils/cmd_ref/vrf_af.yaml +139 -0
- data/lib/cisco_node_utils/cmd_ref/vtp.yaml +32 -0
- data/lib/cisco_node_utils/cmd_ref/vxlan_vtep.yaml +114 -0
- data/lib/cisco_node_utils/cmd_ref/vxlan_vtep_vni.yaml +71 -0
- data/lib/cisco_node_utils/cmd_ref/yang.yaml +7 -0
- data/lib/cisco_node_utils/cmd_ref/yum.yaml +68 -0
- data/lib/cisco_node_utils/command_reference.rb +724 -0
- data/lib/cisco_node_utils/configparser_lib.rb +195 -0
- data/lib/cisco_node_utils/constants.rb +40 -0
- data/lib/cisco_node_utils/dhcp_relay_global.rb +302 -0
- data/lib/cisco_node_utils/dns_domain.rb +93 -0
- data/lib/cisco_node_utils/domain_name.rb +82 -0
- data/lib/cisco_node_utils/encapsulation.rb +112 -0
- data/lib/cisco_node_utils/environment.rb +110 -0
- data/lib/cisco_node_utils/evpn_multicast.rb +66 -0
- data/lib/cisco_node_utils/evpn_multisite.rb +96 -0
- data/lib/cisco_node_utils/evpn_stormcontrol.rb +84 -0
- data/lib/cisco_node_utils/evpn_vni.rb +159 -0
- data/lib/cisco_node_utils/exceptions.rb +140 -0
- data/lib/cisco_node_utils/fabricpath_global.rb +405 -0
- data/lib/cisco_node_utils/fabricpath_topology.rb +137 -0
- data/lib/cisco_node_utils/feature.rb +377 -0
- data/lib/cisco_node_utils/hostname.rb +62 -0
- data/lib/cisco_node_utils/hsrp_global.rb +97 -0
- data/lib/cisco_node_utils/interface.rb +2128 -0
- data/lib/cisco_node_utils/interface_channel_group.rb +142 -0
- data/lib/cisco_node_utils/interface_evpn_multisite.rb +72 -0
- data/lib/cisco_node_utils/interface_hsrp_group.rb +557 -0
- data/lib/cisco_node_utils/interface_ospf.rb +378 -0
- data/lib/cisco_node_utils/interface_portchannel.rb +180 -0
- data/lib/cisco_node_utils/interface_service_vni.rb +132 -0
- data/lib/cisco_node_utils/ip_multicast.rb +90 -0
- data/lib/cisco_node_utils/itd_device_group.rb +228 -0
- data/lib/cisco_node_utils/itd_device_group_node.rb +144 -0
- data/lib/cisco_node_utils/itd_service.rb +511 -0
- data/lib/cisco_node_utils/logger.rb +78 -0
- data/lib/cisco_node_utils/name_server.rb +64 -0
- data/lib/cisco_node_utils/node.rb +443 -0
- data/lib/cisco_node_utils/node_util.rb +111 -0
- data/lib/cisco_node_utils/ntp_auth_key.rb +67 -0
- data/lib/cisco_node_utils/ntp_config.rb +83 -0
- data/lib/cisco_node_utils/ntp_server.rb +86 -0
- data/lib/cisco_node_utils/object_group.rb +75 -0
- data/lib/cisco_node_utils/object_group_entry.rb +143 -0
- data/lib/cisco_node_utils/overlay_global.rb +142 -0
- data/lib/cisco_node_utils/pim.rb +131 -0
- data/lib/cisco_node_utils/pim_group_list.rb +109 -0
- data/lib/cisco_node_utils/pim_rp_address.rb +103 -0
- data/lib/cisco_node_utils/platform.rb +217 -0
- data/lib/cisco_node_utils/portchannel_global.rb +347 -0
- data/lib/cisco_node_utils/radius_global.rb +165 -0
- data/lib/cisco_node_utils/radius_server.rb +421 -0
- data/lib/cisco_node_utils/radius_server_group.rb +117 -0
- data/lib/cisco_node_utils/route_map.rb +2540 -0
- data/lib/cisco_node_utils/router_ospf.rb +77 -0
- data/lib/cisco_node_utils/router_ospf_area.rb +416 -0
- data/lib/cisco_node_utils/router_ospf_area_vlink.rb +313 -0
- data/lib/cisco_node_utils/router_ospf_vrf.rb +342 -0
- data/lib/cisco_node_utils/snmp_notification_receiver.rb +176 -0
- data/lib/cisco_node_utils/snmpcommunity.rb +109 -0
- data/lib/cisco_node_utils/snmpgroup.rb +54 -0
- data/lib/cisco_node_utils/snmpnotification.rb +57 -0
- data/lib/cisco_node_utils/snmpserver.rb +132 -0
- data/lib/cisco_node_utils/snmpuser.rb +403 -0
- data/lib/cisco_node_utils/span_session.rb +149 -0
- data/lib/cisco_node_utils/stp_global.rb +676 -0
- data/lib/cisco_node_utils/syslog_facility.rb +64 -0
- data/lib/cisco_node_utils/syslog_server.rb +146 -0
- data/lib/cisco_node_utils/syslog_settings.rb +174 -0
- data/lib/cisco_node_utils/tacacs_global.rb +137 -0
- data/lib/cisco_node_utils/tacacs_server.rb +173 -0
- data/lib/cisco_node_utils/tacacs_server_group.rb +149 -0
- data/lib/cisco_node_utils/tacacs_server_host.rb +216 -0
- data/lib/cisco_node_utils/upgrade.rb +122 -0
- data/lib/cisco_node_utils/vdc.rb +118 -0
- data/lib/cisco_node_utils/version.rb +21 -0
- data/lib/cisco_node_utils/vlan.rb +301 -0
- data/lib/cisco_node_utils/vpc.rb +466 -0
- data/lib/cisco_node_utils/vrf.rb +192 -0
- data/lib/cisco_node_utils/vrf_af.rb +327 -0
- data/lib/cisco_node_utils/vtp.rb +125 -0
- data/lib/cisco_node_utils/vxlan_vtep.rb +286 -0
- data/lib/cisco_node_utils/vxlan_vtep_vni.rb +331 -0
- data/lib/cisco_node_utils/yang.rb +160 -0
- data/lib/cisco_node_utils/yum.rb +213 -0
- data/lib/cisco_node_utils.rb +21 -0
- data/lib/minitest/environment_plugin.rb +31 -0
- data/lib/minitest/log_level_plugin.rb +41 -0
- data/spec/client_spec.rb +7 -0
- data/spec/environment_spec.rb +384 -0
- data/spec/grpc_client_spec.rb +23 -0
- data/spec/isolate/all_clients_spec.rb +9 -0
- data/spec/isolate/grpc_only_spec.rb +16 -0
- data/spec/isolate/no_clients_spec.rb +26 -0
- data/spec/isolate/nxapi_only_spec.rb +16 -0
- data/spec/nxapi_client_spec.rb +42 -0
- data/spec/schema.yaml +82 -0
- data/spec/shared_examples_for_clients.rb +14 -0
- data/spec/spec_helper.rb +91 -0
- data/spec/whitespace_spec.rb +10 -0
- data/spec/yaml_spec.rb +42 -0
- data/tests/.rubocop.yml +18 -0
- data/tests/CSCuxdublin-1.0.0-7.0.3.I3.1.lib32_n9000.rpm +0 -0
- data/tests/basetest.rb +243 -0
- data/tests/ciscotest.rb +577 -0
- data/tests/cmd_config.yaml +75 -0
- data/tests/cmd_config_invalid.yaml +16 -0
- data/tests/n9000_sample-1.0.0-7.0.3.x86_64.rpm +0 -0
- data/tests/noop.rb +7 -0
- data/tests/platform_info.rb +63 -0
- data/tests/tacacs_server.yaml.example +6 -0
- data/tests/test_aaa_authentication_login.rb +243 -0
- data/tests/test_aaa_authentication_login_service.rb +761 -0
- data/tests/test_aaa_authorization_service.rb +874 -0
- data/tests/test_ace.rb +304 -0
- data/tests/test_acl.rb +185 -0
- data/tests/test_banner.rb +85 -0
- data/tests/test_bfd_global.rb +272 -0
- data/tests/test_bgp_af.rb +875 -0
- data/tests/test_bgp_af_aa.rb +108 -0
- data/tests/test_bgp_neighbor.rb +596 -0
- data/tests/test_bgp_neighbor_af.rb +781 -0
- data/tests/test_bridge_domain.rb +198 -0
- data/tests/test_bridge_domain_vni.rb +109 -0
- data/tests/test_client_utils.rb +111 -0
- data/tests/test_cmn_utils.rb +76 -0
- data/tests/test_command_config.rb +206 -0
- data/tests/test_command_reference.rb +669 -0
- data/tests/test_dhcp_relay_global.rb +286 -0
- data/tests/test_dns_domain.rb +123 -0
- data/tests/test_domain_name.rb +96 -0
- data/tests/test_encapsulation.rb +75 -0
- data/tests/test_evpn_multicast.rb +65 -0
- data/tests/test_evpn_multisite.rb +70 -0
- data/tests/test_evpn_stormcontrol.rb +56 -0
- data/tests/test_evpn_vni.rb +131 -0
- data/tests/test_fabricpath_global.rb +246 -0
- data/tests/test_fabricpath_topology.rb +77 -0
- data/tests/test_feature.rb +272 -0
- data/tests/test_grpc.rb +166 -0
- data/tests/test_hostname.rb +64 -0
- data/tests/test_hsrp_global.rb +79 -0
- data/tests/test_interface.rb +1958 -0
- data/tests/test_interface_bdi.rb +80 -0
- data/tests/test_interface_channel_group.rb +131 -0
- data/tests/test_interface_evpn_multisite.rb +94 -0
- data/tests/test_interface_hsrp.rb +134 -0
- data/tests/test_interface_hsrp_group.rb +570 -0
- data/tests/test_interface_ospf.rb +820 -0
- data/tests/test_interface_portchannel.rb +135 -0
- data/tests/test_interface_private_vlan.rb +365 -0
- data/tests/test_interface_service_vni.rb +203 -0
- data/tests/test_interface_svi.rb +210 -0
- data/tests/test_interface_switchport.rb +468 -0
- data/tests/test_ip_multicast.rb +80 -0
- data/tests/test_itd_device_group.rb +145 -0
- data/tests/test_itd_device_group_node.rb +199 -0
- data/tests/test_itd_service.rb +314 -0
- data/tests/test_logger.rb +43 -0
- data/tests/test_name_server.rb +94 -0
- data/tests/test_node.rb +50 -0
- data/tests/test_node_ext.rb +406 -0
- data/tests/test_node_util.rb +119 -0
- data/tests/test_ntp_auth_key.rb +77 -0
- data/tests/test_ntp_config.rb +100 -0
- data/tests/test_ntp_server.rb +146 -0
- data/tests/test_nxapi.rb +236 -0
- data/tests/test_object_group.rb +122 -0
- data/tests/test_overlay_global.rb +108 -0
- data/tests/test_pim.rb +203 -0
- data/tests/test_pim_group_list.rb +147 -0
- data/tests/test_pim_rp_address.rb +155 -0
- data/tests/test_platform.rb +254 -0
- data/tests/test_portchannel_global.rb +322 -0
- data/tests/test_radius_global.rb +108 -0
- data/tests/test_radius_server.rb +377 -0
- data/tests/test_radius_server_group.rb +151 -0
- data/tests/test_route_map.rb +1479 -0
- data/tests/test_router_bgp.rb +1325 -0
- data/tests/test_router_ospf.rb +56 -0
- data/tests/test_router_ospf_area.rb +433 -0
- data/tests/test_router_ospf_area_vlink.rb +298 -0
- data/tests/test_router_ospf_vrf.rb +690 -0
- data/tests/test_snmp_notification_receiver.rb +169 -0
- data/tests/test_snmpcommunity.rb +422 -0
- data/tests/test_snmpgroup.rb +71 -0
- data/tests/test_snmpnotification.rb +91 -0
- data/tests/test_snmpserver.rb +251 -0
- data/tests/test_snmpuser.rb +666 -0
- data/tests/test_span_session.rb +155 -0
- data/tests/test_stp_global.rb +575 -0
- data/tests/test_syslog_facility.rb +80 -0
- data/tests/test_syslog_server.rb +119 -0
- data/tests/test_syslog_settings.rb +123 -0
- data/tests/test_tacacs_global.rb +109 -0
- data/tests/test_tacacs_server.rb +436 -0
- data/tests/test_tacacs_server_group.rb +434 -0
- data/tests/test_tacacs_server_host.rb +427 -0
- data/tests/test_upgrade.rb +105 -0
- data/tests/test_vdc.rb +64 -0
- data/tests/test_vlan.rb +386 -0
- data/tests/test_vlan_private.rb +656 -0
- data/tests/test_vpc.rb +548 -0
- data/tests/test_vrf.rb +248 -0
- data/tests/test_vrf_af.rb +288 -0
- data/tests/test_vtp.rb +278 -0
- data/tests/test_vxlan_vtep.rb +327 -0
- data/tests/test_vxlan_vtep_vni.rb +326 -0
- data/tests/test_yang.rb +369 -0
- data/tests/test_yum.rb +109 -0
- data/tests/upgrade_info.yaml.example +3 -0
- data/tests/yum_package.yaml +94 -0
- metadata +534 -0
|
@@ -0,0 +1,690 @@
|
|
|
1
|
+
# Copyright (c) 2014-2016 Cisco and/or its affiliates.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
require_relative 'ciscotest'
|
|
16
|
+
require_relative '../lib/cisco_node_utils/router_ospf'
|
|
17
|
+
require_relative '../lib/cisco_node_utils/router_ospf_vrf'
|
|
18
|
+
|
|
19
|
+
# TestRouterOspfVrf - Minitest for RouterOspfVrf node utility class
|
|
20
|
+
class TestRouterOspfVrf < CiscoTestCase
|
|
21
|
+
@skip_unless_supported = 'ospf'
|
|
22
|
+
@@pre_clean_needed = true # rubocop:disable Style/ClassVars
|
|
23
|
+
|
|
24
|
+
def setup
|
|
25
|
+
super
|
|
26
|
+
remove_all_ospfs if @@pre_clean_needed
|
|
27
|
+
@@pre_clean_needed = false # rubocop:disable Style/ClassVars
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def teardown
|
|
31
|
+
remove_all_ospfs
|
|
32
|
+
super
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def test_redistribute
|
|
36
|
+
routers = %w(alpha beta)
|
|
37
|
+
vrfs = %w(default zed)
|
|
38
|
+
routers.each do |rtr|
|
|
39
|
+
vrfs.each do |vrf|
|
|
40
|
+
dbg = sprintf('[RTR %s VRF %s]', rtr, vrf)
|
|
41
|
+
af = RouterOspfVrf.new(rtr, vrf)
|
|
42
|
+
redistribute_cmd(af, dbg)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def redistribute_cmd(af, dbg)
|
|
48
|
+
# rubocop:disable Style/WordArray
|
|
49
|
+
# Initial 'should' state
|
|
50
|
+
master = [['direct', 'rm_direct'],
|
|
51
|
+
['lisp', 'rm_lisp'],
|
|
52
|
+
['static', 'rm_static'],
|
|
53
|
+
['eigrp 1', 'rm_eigrp'],
|
|
54
|
+
['isis 2', 'rm_isis'],
|
|
55
|
+
['ospf 3', 'rm_ospf'],
|
|
56
|
+
['rip 4', 'rm_rip'],
|
|
57
|
+
['bgp 5', 'rm_bgp']]
|
|
58
|
+
# rubocop:enable Style/WordArray
|
|
59
|
+
|
|
60
|
+
# Test: Add all protocols w/route-maps when no cmds are present
|
|
61
|
+
should = master.clone
|
|
62
|
+
af.redistribute = should
|
|
63
|
+
result = af.redistribute
|
|
64
|
+
assert_equal(should.sort, result.sort,
|
|
65
|
+
"#{dbg} Test 1. From empty, to all protocols")
|
|
66
|
+
|
|
67
|
+
# Test: remove half of the protocols
|
|
68
|
+
should.shift(4)
|
|
69
|
+
af.redistribute = should
|
|
70
|
+
result = af.redistribute
|
|
71
|
+
assert_equal(should.sort, result.sort,
|
|
72
|
+
"#{dbg} Test 2. Remove half of the protocols")
|
|
73
|
+
|
|
74
|
+
# Test: restore the removed protocols
|
|
75
|
+
should = master.clone
|
|
76
|
+
af.redistribute = should
|
|
77
|
+
result = af.redistribute
|
|
78
|
+
assert_equal(should.sort, result.sort,
|
|
79
|
+
"#{dbg} Test 3. Restore the removed protocols")
|
|
80
|
+
|
|
81
|
+
# Test: Change route-maps on existing commands
|
|
82
|
+
should = master.map { |prot_only, rm| [prot_only, "#{rm}_2"] }
|
|
83
|
+
af.redistribute = should
|
|
84
|
+
result = af.redistribute
|
|
85
|
+
assert_equal(should.sort, result.sort,
|
|
86
|
+
"#{dbg} Test 4. Change route-maps on existing commands")
|
|
87
|
+
|
|
88
|
+
# Test: 'default'
|
|
89
|
+
should = af.default_redistribute
|
|
90
|
+
af.redistribute = should
|
|
91
|
+
result = af.redistribute
|
|
92
|
+
assert_equal(should.sort, result.sort,
|
|
93
|
+
"#{dbg} Test 5. 'Default'")
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def assert_match_vrf_line(routername, vrfname, cmd=nil)
|
|
97
|
+
match_vrf_line(routername, vrfname, cmd, true)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def refute_match_vrf_line(routername, vrfname, cmd=nil)
|
|
101
|
+
match_vrf_line(routername, vrfname, cmd, false)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def match_vrf_line(routername, vrfname, cmd=nil, match_cmd=true)
|
|
105
|
+
s = @device.cmd('show run ospf all | sec "router ospf" | no-more')
|
|
106
|
+
pattern = /router ospf #{routername}/
|
|
107
|
+
assert_match(pattern, s)
|
|
108
|
+
vrf_found = false
|
|
109
|
+
# If no vrf or cmd, just finding the router is enough
|
|
110
|
+
return true if vrfname == 'default' && cmd.nil?
|
|
111
|
+
|
|
112
|
+
# Else, look for the vrf and/or cmd
|
|
113
|
+
pattern.match(s).post_match.each_line do |line|
|
|
114
|
+
# Skip blank lines
|
|
115
|
+
next if /^\s*$/.match(line)
|
|
116
|
+
if !vrf_found && vrfname != 'default'
|
|
117
|
+
# Have to find the VRF before checking for cmd
|
|
118
|
+
assert_match(/^\s+(.*)/, line,
|
|
119
|
+
"Exited 'router ospf #{routername}' submode "\
|
|
120
|
+
"before finding 'vrf #{vrfname}'. Output:\n#{s}")
|
|
121
|
+
vrf_found = true if /vrf\s#{vrfname}/ =~ line
|
|
122
|
+
return true if cmd.nil?
|
|
123
|
+
next
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# If we get here, either we found the VRF we want or we want no VRF
|
|
127
|
+
if !match_cmd
|
|
128
|
+
# If we find a new VRF, we're done
|
|
129
|
+
return true if /vrf\s.*/ =~ line
|
|
130
|
+
# Fail if we find the unwanted command
|
|
131
|
+
refute_match(cmd, line)
|
|
132
|
+
else
|
|
133
|
+
# Fail if we hit a VRF before finding our cmd
|
|
134
|
+
refute_match(/vrf\s.*/, line,
|
|
135
|
+
"Found vrf line before finding #{cmd} under vrf default")
|
|
136
|
+
# We're done if we found the command
|
|
137
|
+
return true if cmd =~ line
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
if !vrf_found && vrfname != 'default'
|
|
141
|
+
flunk("Ran out of output before finding 'vrf #{vrfname}':\n#{s}")
|
|
142
|
+
elsif cmd && match_cmd
|
|
143
|
+
flunk("Ran out of output before finding #{cmd}:\n#{s}")
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def create_routerospf(ospfname='ospfTest')
|
|
148
|
+
RouterOspf.new(ospfname)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def create_routerospfvrf(router='Wolfpack', name='default')
|
|
152
|
+
RouterOspfVrf.new(router, name)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def config_from_hash(hash)
|
|
156
|
+
config('feature ospf')
|
|
157
|
+
cfg = []
|
|
158
|
+
hash.each do |k, v|
|
|
159
|
+
# Assuming all values are in hash
|
|
160
|
+
cfg << "router ospf #{k}"
|
|
161
|
+
v.each do |k1, v1|
|
|
162
|
+
cfg << "vrf #{v1[:vrf]}" if (k1 != 'default')
|
|
163
|
+
cfg << "auto-cost reference-bandwidth #{v1[:cov]}"
|
|
164
|
+
cfg << "default-metric #{v1[:dm]}"
|
|
165
|
+
cfg << "router-id #{v1[:id]}"
|
|
166
|
+
cfg << "timers throttle lsa #{v1[:l1]} #{v1[:l2]} #{v1[:l3]}"
|
|
167
|
+
cfg << "timers throttle spf #{v1[:s1]} #{v1[:s2]} #{v1[:s3]}"
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
config(*cfg)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def test_collection_size
|
|
174
|
+
create_routerospfvrf('green')
|
|
175
|
+
vrfs = RouterOspfVrf.vrfs
|
|
176
|
+
assert_equal(1, vrfs.size, 'Error: Collection is not one')
|
|
177
|
+
create_routerospfvrf('green', 'NC_State')
|
|
178
|
+
vrfs = RouterOspfVrf.vrfs
|
|
179
|
+
assert_equal(2, vrfs['green'].size, 'Error: Collection is not two')
|
|
180
|
+
create_routerospfvrf('green', 'Duke')
|
|
181
|
+
create_routerospfvrf('green', 'Carolina')
|
|
182
|
+
vrfs = RouterOspfVrf.vrfs
|
|
183
|
+
assert_equal(4, vrfs['green'].size, 'Error: Collection is not four')
|
|
184
|
+
RouterOspf.routers.each_value(&:destroy)
|
|
185
|
+
vrfs = RouterOspfVrf.vrfs
|
|
186
|
+
assert_empty(vrfs, 'Error: Collection is not empty')
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
# rubocop:disable Style/AlignHash
|
|
190
|
+
MULTIPLE_OSPFS = Hash.new { |h, k| h[k] = {} }.merge(
|
|
191
|
+
'ospfTest' => {
|
|
192
|
+
'default' => {
|
|
193
|
+
vrf: 'default', cov: 90,
|
|
194
|
+
cot: RouterOspfVrf::OSPF_AUTO_COST[:mbps], dm: 15_000,
|
|
195
|
+
id: '9.0.0.2', l1: 130, l2: 530, l3: 1030, s1: 300,
|
|
196
|
+
s2: 600, s3: 1100
|
|
197
|
+
}
|
|
198
|
+
},
|
|
199
|
+
'bxb300' => {
|
|
200
|
+
'default' => {
|
|
201
|
+
vrf: 'default', cov: 200,
|
|
202
|
+
cot: RouterOspfVrf::OSPF_AUTO_COST[:mbps], dm: 10_000,
|
|
203
|
+
id: '10.0.0.3', l1: 130, l2: 530, l3: 1030, s1: 300,
|
|
204
|
+
s2: 600, s3: 1100
|
|
205
|
+
}
|
|
206
|
+
},
|
|
207
|
+
)
|
|
208
|
+
# rubocop:enable Style/AlignHash
|
|
209
|
+
|
|
210
|
+
def test_collection_not_empty_valid
|
|
211
|
+
# pre-populate values
|
|
212
|
+
config_from_hash(MULTIPLE_OSPFS)
|
|
213
|
+
|
|
214
|
+
routers = RouterOspf.routers
|
|
215
|
+
# validate the collection
|
|
216
|
+
routers.each_key do |routername|
|
|
217
|
+
vrfs = RouterOspfVrf.vrfs
|
|
218
|
+
refute_empty(vrfs, 'Error: Collection is empty')
|
|
219
|
+
hv = MULTIPLE_OSPFS.fetch(routername.to_s)
|
|
220
|
+
next if hv.nil?
|
|
221
|
+
hv = hv['default']
|
|
222
|
+
vrfs[routername].each_value do |vrf|
|
|
223
|
+
auto_cost_value = [] << hv[:cov] << hv[:cot]
|
|
224
|
+
assert_equal(hv[:vrf], vrf.name,
|
|
225
|
+
'Error: Collection, vrf name')
|
|
226
|
+
assert_equal(auto_cost_value, vrf.auto_cost,
|
|
227
|
+
'Error: Collection, auto cost')
|
|
228
|
+
assert_equal(hv[:dm], vrf.default_metric,
|
|
229
|
+
'Error: Collection, default metric')
|
|
230
|
+
assert_equal(hv[:id], vrf.router_id,
|
|
231
|
+
'Error: Collection, router id')
|
|
232
|
+
lsa = [] << hv[:l1] << hv[:l2] << hv[:l3]
|
|
233
|
+
assert_equal(lsa, vrf.timer_throttle_lsa,
|
|
234
|
+
'Error: Collection, timer throttle lsa')
|
|
235
|
+
spf = [] << hv[:s1] << hv[:s2] << hv[:s3]
|
|
236
|
+
assert_equal(spf, vrf.timer_throttle_spf,
|
|
237
|
+
'Error: Collection, timer throttle spf')
|
|
238
|
+
end
|
|
239
|
+
end
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
def test_create_vrf_nil
|
|
243
|
+
assert_raises(TypeError) { RouterOspfVrf.new(nil, 'testvrf') }
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
def test_create_name_zero_length
|
|
247
|
+
RouterOspf.new('testOspf')
|
|
248
|
+
assert_raises(ArgumentError) do
|
|
249
|
+
RouterOspfVrf.new('testOspf', '')
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
def test_create_valid
|
|
254
|
+
ospfname = 'ospfTest'
|
|
255
|
+
|
|
256
|
+
vrfname = 'default'
|
|
257
|
+
vrf = RouterOspfVrf.new(ospfname, vrfname)
|
|
258
|
+
assert_match_vrf_line(ospfname, vrfname)
|
|
259
|
+
assert_equal(vrfname, vrf.name,
|
|
260
|
+
"Error: #{vrfname} vrf, create failed")
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
def test_get_parent_name
|
|
264
|
+
routerospf = create_routerospf
|
|
265
|
+
vrf = create_routerospfvrf(routerospf.name)
|
|
266
|
+
assert_equal(routerospf.name, vrf.parent.name,
|
|
267
|
+
'Error: Parent value is not correct')
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
def test_get_name
|
|
271
|
+
vrfname = 'default'
|
|
272
|
+
vrf = create_routerospfvrf('green')
|
|
273
|
+
assert_match_vrf_line('green', vrfname)
|
|
274
|
+
assert_equal(vrfname, vrf.name,
|
|
275
|
+
"Error: #{vrfname} vrf, name get value mismatch")
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
def test_destroy
|
|
279
|
+
vrfname = 'default'
|
|
280
|
+
vrf = create_routerospfvrf
|
|
281
|
+
assert_raises(RuntimeError) do
|
|
282
|
+
vrf.destroy
|
|
283
|
+
end
|
|
284
|
+
assert_match_vrf_line(vrf.parent.name, vrfname)
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
def test_auto_cost
|
|
288
|
+
vrf = create_routerospfvrf
|
|
289
|
+
auto_cost_value = [400_000, RouterOspfVrf::OSPF_AUTO_COST[:mbps]]
|
|
290
|
+
|
|
291
|
+
vrf.auto_cost_set(auto_cost_value[0], :mbps)
|
|
292
|
+
pattern = /\s+auto-cost reference-bandwidth #{auto_cost_value[0]}/
|
|
293
|
+
assert_match_vrf_line(vrf.parent.name, vrf.name, pattern)
|
|
294
|
+
assert_equal(auto_cost_value, vrf.auto_cost,
|
|
295
|
+
'Error: auto-cost, get value mismatch')
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
def test_auto_cost_multiple_vrf
|
|
299
|
+
routerospf = create_routerospf
|
|
300
|
+
vrf = create_routerospfvrf(routerospf.name)
|
|
301
|
+
vrf1 = create_routerospfvrf(routerospf.name, 'testvrf')
|
|
302
|
+
auto_cost_value = [600_000, RouterOspfVrf::OSPF_AUTO_COST[:mbps]]
|
|
303
|
+
|
|
304
|
+
vrf.auto_cost_set(auto_cost_value[0], :mbps)
|
|
305
|
+
pattern = /\s+auto-cost reference-bandwidth #{auto_cost_value[0]}/
|
|
306
|
+
assert_match_vrf_line(routerospf.name, vrf.name, pattern)
|
|
307
|
+
assert_equal(auto_cost_value, vrf.auto_cost,
|
|
308
|
+
"Error: #{vrf.name} vrf, auto-cost get value mismatch")
|
|
309
|
+
|
|
310
|
+
# vrf 1
|
|
311
|
+
auto_cost_value = [500_000, RouterOspfVrf::OSPF_AUTO_COST[:mbps]]
|
|
312
|
+
|
|
313
|
+
vrf1.auto_cost_set(auto_cost_value[0], :mbps)
|
|
314
|
+
pattern = /\s+auto-cost reference-bandwidth #{auto_cost_value[0]}/
|
|
315
|
+
assert_match_vrf_line(routerospf.name, vrf1.name, pattern)
|
|
316
|
+
assert_equal(auto_cost_value, vrf1.auto_cost,
|
|
317
|
+
"Error: #{vrf1.name} vrf, auto-cost get value mismatch")
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
def test_get_default_auto_cost
|
|
321
|
+
vrf = create_routerospfvrf
|
|
322
|
+
# NXOS specific
|
|
323
|
+
auto_cost_value = [40, RouterOspfVrf::OSPF_AUTO_COST[:gbps]]
|
|
324
|
+
assert_equal(auto_cost_value, vrf.default_auto_cost,
|
|
325
|
+
'Error: default auto-cost get value mismatch')
|
|
326
|
+
assert_equal(auto_cost_value, vrf.auto_cost,
|
|
327
|
+
'Error: auto-cost get value default mismatch')
|
|
328
|
+
end
|
|
329
|
+
|
|
330
|
+
def test_bfd
|
|
331
|
+
routerospf = create_routerospf
|
|
332
|
+
vrf = create_routerospfvrf(routerospf.name)
|
|
333
|
+
vrf1 = create_routerospfvrf(routerospf.name, 'testvrf')
|
|
334
|
+
assert_equal(vrf.default_bfd, vrf.bfd)
|
|
335
|
+
assert_equal(vrf1.default_bfd, vrf1.bfd)
|
|
336
|
+
vrf.bfd = true
|
|
337
|
+
vrf1.bfd = true
|
|
338
|
+
assert_equal(true, vrf.bfd)
|
|
339
|
+
assert_equal(true, vrf1.bfd)
|
|
340
|
+
vrf.bfd = vrf.default_bfd
|
|
341
|
+
vrf1.bfd = vrf1.default_bfd
|
|
342
|
+
assert_equal(vrf.default_bfd, vrf.bfd)
|
|
343
|
+
assert_equal(vrf1.default_bfd, vrf1.bfd)
|
|
344
|
+
end
|
|
345
|
+
|
|
346
|
+
def test_default_metric
|
|
347
|
+
vrf = create_routerospfvrf
|
|
348
|
+
metric = 30_000
|
|
349
|
+
vrf.default_metric = metric
|
|
350
|
+
pattern = /\s+default-metric #{metric}/
|
|
351
|
+
assert_match_vrf_line(vrf.parent.name, vrf.name, pattern)
|
|
352
|
+
assert_equal(metric, vrf.default_metric,
|
|
353
|
+
"Error: #{vrf.name} vrf, default-metric get value mismatch")
|
|
354
|
+
|
|
355
|
+
skip_versions = ['7.0.3.I7.3']
|
|
356
|
+
return unless step_unless_legacy_defect(skip_versions, 'CSCvi74876: Cannot remove default metric')
|
|
357
|
+
vrf.default_metric = vrf.default_default_metric
|
|
358
|
+
refute_match_vrf_line(vrf.parent.name, vrf.name, pattern)
|
|
359
|
+
end
|
|
360
|
+
|
|
361
|
+
def test_default_metric_multiple_vrf
|
|
362
|
+
routerospf = create_routerospf
|
|
363
|
+
vrf = create_routerospfvrf(routerospf.name)
|
|
364
|
+
vrf1 = create_routerospfvrf(routerospf.name, 'testvrf')
|
|
365
|
+
metric = 35_000
|
|
366
|
+
|
|
367
|
+
vrf.default_metric = metric
|
|
368
|
+
pattern = /\s+default-metric #{metric}/
|
|
369
|
+
assert_match_vrf_line(routerospf.name, vrf.name, pattern)
|
|
370
|
+
assert_equal(metric, vrf.default_metric,
|
|
371
|
+
"Error: #{vrf.name} vrf, default-metric get value mismatch")
|
|
372
|
+
|
|
373
|
+
# vrf 1
|
|
374
|
+
metric = 25_000
|
|
375
|
+
vrf1.default_metric = metric
|
|
376
|
+
pattern = /\s+default-metric #{metric}/
|
|
377
|
+
assert_match_vrf_line(routerospf.name, vrf1.name, pattern)
|
|
378
|
+
assert_equal(metric, vrf1.default_metric,
|
|
379
|
+
"Error: #{vrf1.name} vrf, default-metric get value mismatch")
|
|
380
|
+
end
|
|
381
|
+
|
|
382
|
+
def test_log_adjacency_changes
|
|
383
|
+
vrf = create_routerospfvrf
|
|
384
|
+
|
|
385
|
+
assert_equal(:none, vrf.log_adjacency,
|
|
386
|
+
'Error: log-adjacency get value mismatch')
|
|
387
|
+
|
|
388
|
+
vrf.log_adjacency = :log
|
|
389
|
+
pattern = /\s+log-adjacency-changes/
|
|
390
|
+
assert_match_vrf_line(vrf.parent.name, vrf.name, pattern)
|
|
391
|
+
assert_equal(:log, vrf.log_adjacency,
|
|
392
|
+
'Error: log-adjacency get value mismatch')
|
|
393
|
+
|
|
394
|
+
vrf.log_adjacency = :detail
|
|
395
|
+
pattern = /\s+log-adjacency-changes detail/
|
|
396
|
+
assert_match_vrf_line(vrf.parent.name, vrf.name, pattern)
|
|
397
|
+
assert_equal(:detail, vrf.log_adjacency,
|
|
398
|
+
"Error: #{vrf.name} vrf, " \
|
|
399
|
+
'log-adjacency detail get value mismatch')
|
|
400
|
+
|
|
401
|
+
vrf.log_adjacency = vrf.default_log_adjacency
|
|
402
|
+
pattern = /\s+log-adjacency-changes(.*)/
|
|
403
|
+
refute_match_vrf_line(vrf.parent.name, vrf.name, pattern)
|
|
404
|
+
end
|
|
405
|
+
|
|
406
|
+
def test_log_adjacency_multiple_vrf
|
|
407
|
+
routerospf = create_routerospf
|
|
408
|
+
vrf = create_routerospfvrf(routerospf.name)
|
|
409
|
+
vrf1 = create_routerospfvrf(routerospf.name, 'testvrf')
|
|
410
|
+
|
|
411
|
+
vrf.log_adjacency = :log
|
|
412
|
+
pattern = /\s+log-adjacency-changes/
|
|
413
|
+
assert_match_vrf_line(routerospf.name, vrf.name, pattern)
|
|
414
|
+
assert_equal(:log, vrf.log_adjacency,
|
|
415
|
+
"Error: #{vrf.name} vrf, log-adjacency get value mismatch")
|
|
416
|
+
|
|
417
|
+
# vrf 1
|
|
418
|
+
vrf1.log_adjacency = :detail
|
|
419
|
+
pattern = /\s+log-adjacency-changes/
|
|
420
|
+
assert_match_vrf_line(routerospf.name, vrf1.name, pattern)
|
|
421
|
+
assert_equal(:detail, vrf1.log_adjacency,
|
|
422
|
+
"Error: #{vrf1.name} vrf, log-adjacency get value mismatch")
|
|
423
|
+
end
|
|
424
|
+
|
|
425
|
+
def test_log_adjacency_multiple_vrf_2
|
|
426
|
+
routerospf = create_routerospf
|
|
427
|
+
vrf_default = create_routerospfvrf(routerospf.name)
|
|
428
|
+
vrf1 = create_routerospfvrf(routerospf.name, 'testvrf')
|
|
429
|
+
# DO NOT set log_adjacency for default vrf
|
|
430
|
+
# DO set log_adjacency for non-default vrf
|
|
431
|
+
|
|
432
|
+
vrf1.log_adjacency = :detail
|
|
433
|
+
pattern = /\s+log-adjacency-changes/
|
|
434
|
+
assert_match_vrf_line(routerospf.name, vrf1.name, pattern)
|
|
435
|
+
assert_equal(:detail, vrf1.log_adjacency,
|
|
436
|
+
"Error: #{vrf1.name} vrf, log-adjacency get value mismatch")
|
|
437
|
+
|
|
438
|
+
assert_equal(:none, vrf_default.log_adjacency,
|
|
439
|
+
"Error: #{vrf_default.name} vrf_default, " \
|
|
440
|
+
'log-adjacency get value mismatch')
|
|
441
|
+
end
|
|
442
|
+
|
|
443
|
+
def test_router_id
|
|
444
|
+
vrf = create_routerospfvrf
|
|
445
|
+
id = '8.1.1.3'
|
|
446
|
+
vrf.router_id = id
|
|
447
|
+
pattern = /\s+router-id #{id}/
|
|
448
|
+
assert_match_vrf_line(vrf.parent.name, vrf.name, pattern)
|
|
449
|
+
assert_equal(id, vrf.router_id,
|
|
450
|
+
"Error: #{vrf.name} vrf, router-id get value mismatch")
|
|
451
|
+
|
|
452
|
+
vrf.router_id = vrf.default_router_id
|
|
453
|
+
refute_match_vrf_line(vrf.parent.name, vrf.name, pattern)
|
|
454
|
+
end
|
|
455
|
+
|
|
456
|
+
def test_router_id_multiple_vrf
|
|
457
|
+
routerospf = create_routerospf
|
|
458
|
+
vrf = create_routerospfvrf(routerospf.name)
|
|
459
|
+
vrf1 = create_routerospfvrf(routerospf.name, 'testvrf')
|
|
460
|
+
id = '8.1.1.3'
|
|
461
|
+
|
|
462
|
+
vrf.router_id = id
|
|
463
|
+
pattern = /\s+router-id #{id}/
|
|
464
|
+
assert_match_vrf_line(routerospf.name, vrf.name, pattern)
|
|
465
|
+
assert_equal(id, vrf.router_id,
|
|
466
|
+
"Error: #{vrf.name} vrf, router-id get value mismatch")
|
|
467
|
+
|
|
468
|
+
# vrf 1
|
|
469
|
+
id = '10.1.1.3'
|
|
470
|
+
|
|
471
|
+
vrf1.router_id = id
|
|
472
|
+
pattern = /\s+router-id #{id}/
|
|
473
|
+
assert_match_vrf_line(routerospf.name, vrf1.name, pattern)
|
|
474
|
+
assert_equal(id, vrf1.router_id,
|
|
475
|
+
"Error: #{vrf1.name} vrf, router-id get value mismatch")
|
|
476
|
+
end
|
|
477
|
+
|
|
478
|
+
def test_timer_throttle_lsa
|
|
479
|
+
vrf = create_routerospfvrf
|
|
480
|
+
lsa = [] << 100 << 500 << 1000
|
|
481
|
+
vrf.timer_throttle_lsa_set(lsa[0], lsa[1], lsa[2])
|
|
482
|
+
|
|
483
|
+
pattern = /\s+timers throttle lsa #{lsa[0]} #{lsa[1]} #{lsa[2]}/
|
|
484
|
+
assert_match_vrf_line(vrf.parent.name, vrf.name, pattern)
|
|
485
|
+
assert_equal(lsa, vrf.timer_throttle_lsa,
|
|
486
|
+
"Error: #{vrf.name} vrf, timer throttle lsa " \
|
|
487
|
+
'get values mismatch')
|
|
488
|
+
end
|
|
489
|
+
|
|
490
|
+
def test_timer_throttle_lsa_multiple_vrf
|
|
491
|
+
routerospf = create_routerospf
|
|
492
|
+
vrf = create_routerospfvrf(routerospf.name)
|
|
493
|
+
vrf1 = create_routerospfvrf(routerospf.name, 'testvrf')
|
|
494
|
+
lsa = [] << 100 << 500 << 1000
|
|
495
|
+
|
|
496
|
+
vrf.timer_throttle_lsa_set(lsa[0], lsa[1], lsa[2])
|
|
497
|
+
pattern = /\s+timers throttle lsa #{lsa[0]} #{lsa[1]} #{lsa[2]}/
|
|
498
|
+
assert_match_vrf_line(routerospf.name, vrf.name, pattern)
|
|
499
|
+
assert_equal(lsa, vrf.timer_throttle_lsa,
|
|
500
|
+
"Error: #{vrf.name} vrf, timer throttle lsa " \
|
|
501
|
+
'get values mismatch')
|
|
502
|
+
|
|
503
|
+
lsa = [] << 300 << 700 << 2000
|
|
504
|
+
|
|
505
|
+
vrf1.timer_throttle_lsa_set(lsa[0], lsa[1], lsa[2])
|
|
506
|
+
pattern = /\s+timers throttle lsa #{lsa[0]} #{lsa[1]} #{lsa[2]}/
|
|
507
|
+
assert_match_vrf_line(routerospf.name, vrf1.name, pattern)
|
|
508
|
+
assert_equal(lsa, vrf1.timer_throttle_lsa,
|
|
509
|
+
"Error: #{vrf1.name} vrf, timer throttle lsa " \
|
|
510
|
+
'get values mismatch')
|
|
511
|
+
end
|
|
512
|
+
|
|
513
|
+
def test_get_default_timer_throttle_lsa
|
|
514
|
+
vrf = create_routerospfvrf
|
|
515
|
+
lsa = [0, 5000, 5000]
|
|
516
|
+
assert_equal(lsa[0], vrf.timer_throttle_lsa_start,
|
|
517
|
+
"Error: #{vrf.name} vrf, timer throttle lsa start not correct")
|
|
518
|
+
assert_equal(lsa[1], vrf.timer_throttle_lsa_hold,
|
|
519
|
+
"Error: #{vrf.name} vrf, timer throttle lsa hold not correct")
|
|
520
|
+
assert_equal(lsa[2], vrf.timer_throttle_lsa_max,
|
|
521
|
+
"Error: #{vrf.name} vrf, timer throttle lsa max not correct")
|
|
522
|
+
assert_equal(lsa[0], vrf.default_timer_throttle_lsa_start,
|
|
523
|
+
'Error: default timer throttle lsa start not correct')
|
|
524
|
+
assert_equal(lsa[1], vrf.default_timer_throttle_lsa_hold,
|
|
525
|
+
'Error: default timer throttle lsa hold not correct')
|
|
526
|
+
assert_equal(lsa[2], vrf.default_timer_throttle_lsa_max,
|
|
527
|
+
'Error: default timer throttle lsa max not correct')
|
|
528
|
+
end
|
|
529
|
+
|
|
530
|
+
def test_timer_throttle_spf
|
|
531
|
+
vrf = create_routerospfvrf
|
|
532
|
+
spf = [250, 500, 1000]
|
|
533
|
+
|
|
534
|
+
vrf.timer_throttle_spf_set(spf[0], spf[1], spf[2])
|
|
535
|
+
pattern = /\s+timers throttle spf #{spf[0]} #{spf[1]} #{spf[2]}/
|
|
536
|
+
assert_match_vrf_line(vrf.parent.name, vrf.name, pattern)
|
|
537
|
+
assert_equal(spf, vrf.timer_throttle_spf,
|
|
538
|
+
"Error: #{vrf.name} vrf, timer throttle spf " \
|
|
539
|
+
'get values mismatch')
|
|
540
|
+
end
|
|
541
|
+
|
|
542
|
+
def test_timer_throttle_spf_multiple_vrf
|
|
543
|
+
routerospf = create_routerospf
|
|
544
|
+
vrf = create_routerospfvrf(routerospf.name)
|
|
545
|
+
vrf1 = create_routerospfvrf(routerospf.name, 'testvrf')
|
|
546
|
+
spf = [] << 250 << 500 << 1000
|
|
547
|
+
|
|
548
|
+
vrf.timer_throttle_spf_set(spf[0], spf[1], spf[2])
|
|
549
|
+
pattern = /\s+timers throttle spf #{spf[0]} #{spf[1]} #{spf[2]}/
|
|
550
|
+
assert_match_vrf_line(routerospf.name, vrf.name, pattern)
|
|
551
|
+
assert_equal(spf, vrf.timer_throttle_spf,
|
|
552
|
+
"Error: #{vrf.name} vrf, timer throttle spf " \
|
|
553
|
+
'get values mismatch')
|
|
554
|
+
|
|
555
|
+
spf = [] << 300 << 700 << 2000
|
|
556
|
+
|
|
557
|
+
vrf1.timer_throttle_spf_set(spf[0], spf[1], spf[2])
|
|
558
|
+
pattern = /\s+timers throttle spf #{spf[0]} #{spf[1]} #{spf[2]}/
|
|
559
|
+
assert_match_vrf_line(routerospf.name, vrf1.name, pattern)
|
|
560
|
+
assert_equal(spf, vrf1.timer_throttle_spf,
|
|
561
|
+
"Error: #{vrf1.name} vrf, timer throttle spf " \
|
|
562
|
+
'get values mismatch')
|
|
563
|
+
end
|
|
564
|
+
|
|
565
|
+
def test_get_default_timer_throttle_spf
|
|
566
|
+
vrf = create_routerospfvrf
|
|
567
|
+
spf = [200, 1000, 5000]
|
|
568
|
+
assert_equal(spf[0], vrf.default_timer_throttle_spf_start,
|
|
569
|
+
'Error: default timer throttle spf not correct')
|
|
570
|
+
assert_equal(spf[1], vrf.default_timer_throttle_spf_hold,
|
|
571
|
+
'Error: default timer throttle hold not correct')
|
|
572
|
+
assert_equal(spf[2], vrf.default_timer_throttle_spf_max,
|
|
573
|
+
'Error: default timer throttle max not correct')
|
|
574
|
+
assert_equal(spf[0], vrf.timer_throttle_spf_start,
|
|
575
|
+
"Error: #{vrf.name} vrf, " \
|
|
576
|
+
'default timer throttle spf not correct')
|
|
577
|
+
assert_equal(spf[1], vrf.timer_throttle_spf_hold,
|
|
578
|
+
"Error: #{vrf.name} vrf, " \
|
|
579
|
+
'default timer throttle hold not correct')
|
|
580
|
+
assert_equal(spf[2], vrf.timer_throttle_spf_max,
|
|
581
|
+
"Error: #{vrf.name} vrf, " \
|
|
582
|
+
'default timer throttle max not correct')
|
|
583
|
+
end
|
|
584
|
+
|
|
585
|
+
def test_create_valid_destroy_default
|
|
586
|
+
ospfname = 'ospfTest'
|
|
587
|
+
routerospf = RouterOspf.new(ospfname)
|
|
588
|
+
vrfname = 'default'
|
|
589
|
+
vrf = RouterOspfVrf.new(routerospf.name, vrfname)
|
|
590
|
+
assert_match_vrf_line(ospfname, vrfname)
|
|
591
|
+
assert_equal(vrfname, vrf.name,
|
|
592
|
+
"Error: #{vrfname} vrf, create failed")
|
|
593
|
+
assert_raises(RuntimeError) do
|
|
594
|
+
vrf.destroy
|
|
595
|
+
end
|
|
596
|
+
end
|
|
597
|
+
|
|
598
|
+
# rubocop:disable Style/AlignHash
|
|
599
|
+
MULTIPLE_OSPFS_MULTIPLE_VRFS = Hash.new { |h, k| h[k] = {} }.merge(
|
|
600
|
+
'ospfTest' => {
|
|
601
|
+
'default' => {
|
|
602
|
+
vrf: 'default', cov: 90,
|
|
603
|
+
cot: RouterOspfVrf::OSPF_AUTO_COST[:mbps], dm: 15_000,
|
|
604
|
+
id: '9.0.0.2', l1: 130, l2: 530, l3: 1030, s1: 300,
|
|
605
|
+
s2: 600, s3: 1100
|
|
606
|
+
}
|
|
607
|
+
},
|
|
608
|
+
'bxb300' => {
|
|
609
|
+
'default' => {
|
|
610
|
+
vrf: 'default', cov: 200,
|
|
611
|
+
cot: RouterOspfVrf::OSPF_AUTO_COST[:mbps], dm: 10_000,
|
|
612
|
+
id: '10.0.0.3', l1: 130, l2: 530, l3: 1030, s1: 300,
|
|
613
|
+
s2: 600, s3: 1100
|
|
614
|
+
},
|
|
615
|
+
'nondefault' => {
|
|
616
|
+
vrf: 'nondefault', cov: 300,
|
|
617
|
+
cot: RouterOspfVrf::OSPF_AUTO_COST[:mbps], dm: 30_000,
|
|
618
|
+
id: '10.0.0.4', l1: 230, l2: 730, l3: 2030, s1: 400,
|
|
619
|
+
s2: 700, s3: 2100
|
|
620
|
+
},
|
|
621
|
+
},
|
|
622
|
+
)
|
|
623
|
+
# rubocop:enable Style/AlignHash
|
|
624
|
+
|
|
625
|
+
def test_collection_router_multi_vrfs
|
|
626
|
+
config_from_hash(MULTIPLE_OSPFS_MULTIPLE_VRFS)
|
|
627
|
+
routers = RouterOspf.routers
|
|
628
|
+
# validate the collection
|
|
629
|
+
routers.each_key do |routername|
|
|
630
|
+
vrfs = RouterOspfVrf.vrfs
|
|
631
|
+
refute_empty(vrfs, 'Error: Collection is empty')
|
|
632
|
+
unless MULTIPLE_OSPFS_MULTIPLE_VRFS.key?(routername)
|
|
633
|
+
puts "%Error: hash does not have hash key #{routername}"
|
|
634
|
+
end
|
|
635
|
+
ospfh = MULTIPLE_OSPFS_MULTIPLE_VRFS.fetch(routername)
|
|
636
|
+
vrfs[routername].each do |name, vrf|
|
|
637
|
+
puts "%Error: hash key #{routername} not found" unless ospfh.key?(name)
|
|
638
|
+
hv = ospfh.fetch(name)
|
|
639
|
+
auto_cost_value = [] << hv[:cov] << hv[:cot]
|
|
640
|
+
assert_equal(hv[:vrf], vrf.name,
|
|
641
|
+
'Error: Collection, vrf name')
|
|
642
|
+
assert_equal(auto_cost_value, vrf.auto_cost,
|
|
643
|
+
'Error: Collection, auto cost')
|
|
644
|
+
assert_equal(hv[:dm], vrf.default_metric,
|
|
645
|
+
'Error: Collection, default metric')
|
|
646
|
+
assert_equal(hv[:id], vrf.router_id,
|
|
647
|
+
'Error: Collection, router id')
|
|
648
|
+
lsa = [] << hv[:l1] << hv[:l2] << hv[:l3]
|
|
649
|
+
assert_equal(lsa, vrf.timer_throttle_lsa,
|
|
650
|
+
'Error: Collection, timer throttle lsa')
|
|
651
|
+
spf = [] << hv[:s1] << hv[:s2] << hv[:s3]
|
|
652
|
+
assert_equal(spf, vrf.timer_throttle_spf,
|
|
653
|
+
'Error: Collection, timer throttle spf')
|
|
654
|
+
end
|
|
655
|
+
end
|
|
656
|
+
end
|
|
657
|
+
|
|
658
|
+
def test_timer_throttle_lsa_start_hold_max
|
|
659
|
+
vrf = create_routerospfvrf
|
|
660
|
+
vrf.timer_throttle_lsa_set(250, 900, 5001)
|
|
661
|
+
assert_equal(250, vrf.timer_throttle_lsa_start,
|
|
662
|
+
"Error: #{vrf.name} vrf, start timer throttle lsa not correct")
|
|
663
|
+
assert_equal(900, vrf.timer_throttle_lsa_hold,
|
|
664
|
+
"Error: #{vrf.name} vrf, hold timer throttle lsa not correct")
|
|
665
|
+
assert_equal(5001, vrf.timer_throttle_lsa_max,
|
|
666
|
+
"Error: #{vrf.name} vrf, max timer throttle lsa not correct")
|
|
667
|
+
end
|
|
668
|
+
|
|
669
|
+
def test_timer_throttle_spf_start_hold_max
|
|
670
|
+
vrf = create_routerospfvrf
|
|
671
|
+
vrf.timer_throttle_spf_set(250, 900, 5001)
|
|
672
|
+
assert_equal(250, vrf.timer_throttle_spf_start,
|
|
673
|
+
"Error: #{vrf.name} vrf, start timer throttle spf not correct")
|
|
674
|
+
assert_equal(900, vrf.timer_throttle_spf_hold,
|
|
675
|
+
"Error: #{vrf.name} vrf, hold timer throttle spf not correct")
|
|
676
|
+
assert_equal(5001, vrf.timer_throttle_spf_max,
|
|
677
|
+
"Error: #{vrf.name} vrf, max timer throttle spf not correct")
|
|
678
|
+
end
|
|
679
|
+
|
|
680
|
+
def test_noninstantiated
|
|
681
|
+
create_routerospf
|
|
682
|
+
vrf = RouterOspfVrf.new('absent', 'absent', false)
|
|
683
|
+
vrf.auto_cost
|
|
684
|
+
vrf.default_metric
|
|
685
|
+
vrf.log_adjacency
|
|
686
|
+
vrf.router_id
|
|
687
|
+
vrf.timer_throttle_lsa
|
|
688
|
+
vrf.timer_throttle_spf
|
|
689
|
+
end
|
|
690
|
+
end
|