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,254 @@
|
|
|
1
|
+
# Copyright (c) 2015-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/platform'
|
|
17
|
+
|
|
18
|
+
# TestPlatform - Minitest for Platform class
|
|
19
|
+
class TestPlatform < CiscoTestCase
|
|
20
|
+
def test_image_version
|
|
21
|
+
case platform
|
|
22
|
+
when :ios_xr
|
|
23
|
+
refute_empty(Platform.image_version)
|
|
24
|
+
|
|
25
|
+
when :nexus
|
|
26
|
+
# Supported Images:
|
|
27
|
+
# N3/9k: 7.0(3)I2(*), 7.0(3)I3(1)
|
|
28
|
+
# N7k: 7.3(1)D1(1)
|
|
29
|
+
# N5/6k: 7.3(0)N1(1)
|
|
30
|
+
|
|
31
|
+
in_pat = '(^ NXOS: version |^ system: version)'
|
|
32
|
+
s = @device.cmd("show version | i '#{in_pat}'")
|
|
33
|
+
|
|
34
|
+
out_pat = %r{/(\d\.\d\(\d\)[IDN])\d\(\d\)/}
|
|
35
|
+
show = s.match(out_pat).to_s
|
|
36
|
+
plat = Platform.image_version.match(out_pat).to_s
|
|
37
|
+
assert_equal(show, plat)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def test_system_image
|
|
42
|
+
if platform == :ios_xr
|
|
43
|
+
assert_nil(Platform.system_image)
|
|
44
|
+
elsif platform == :nexus
|
|
45
|
+
s = @device.cmd('show version | inc image | exc kickstart').scan(/ (\S+)$/).flatten.first
|
|
46
|
+
assert_equal(s, Platform.system_image)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def test_packages
|
|
51
|
+
# [['pack1', 'state1'], ['pack2', 'state2'], ...]
|
|
52
|
+
# 'state' should always be a variant of Active or Inactive
|
|
53
|
+
pkgs = @device.cmd('sh inst patch')
|
|
54
|
+
.scan(/\n(\S+)\s+(\S*[aA]ctive.*)/)
|
|
55
|
+
# convert to hash with key pkg_name and value pkg_state
|
|
56
|
+
pkg_hsh = {}
|
|
57
|
+
pkgs.each { |p| pkg_hsh[p[0]] = p[1].downcase }
|
|
58
|
+
assert_equal(pkg_hsh, Platform.packages)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def test_hardware_type
|
|
62
|
+
if platform == :ios_xr
|
|
63
|
+
s = @device.cmd('show inv | inc "Rack 0"').scan(/DESCR: "(.*)"/)
|
|
64
|
+
elsif platform == :nexus
|
|
65
|
+
s = @device.cmd('sh ver').scan(/Hardware\n\s+(.*)\n/)
|
|
66
|
+
end
|
|
67
|
+
s = s.flatten.first
|
|
68
|
+
refute_empty(Platform.hardware_type)
|
|
69
|
+
# hardware type returns a different value depending on whether you use the
|
|
70
|
+
# ascii or show output of nxapi, but show appears to be substring of ascii
|
|
71
|
+
assert(s.include?(Platform.hardware_type),
|
|
72
|
+
"Expected '#{s}' to contain '#{Platform.hardware_type}'")
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def test_cpu
|
|
76
|
+
s = @device.cmd('sh ver').scan(
|
|
77
|
+
/Hardware\n\s+.*\n\s+(.*) with/).flatten.first
|
|
78
|
+
assert_equal(s, Platform.cpu)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def test_memory
|
|
82
|
+
if platform == :ios_xr
|
|
83
|
+
arr = @device.cmd('sh mem summ').scan(
|
|
84
|
+
/Physical Memory: (\S+) total.*\((\S+) available/).flatten
|
|
85
|
+
mem_hsh = { 'total' => arr[0],
|
|
86
|
+
'used' => nil,
|
|
87
|
+
'free' => arr[1] }
|
|
88
|
+
elsif platform == :nexus
|
|
89
|
+
arr = @device.cmd('sh sys reso').scan(
|
|
90
|
+
/(\S+) total.* (\S+) used.* (\S+) free/).flatten
|
|
91
|
+
mem_hsh = { 'total' => arr[0],
|
|
92
|
+
'used' => arr[1],
|
|
93
|
+
'free' => arr[2] }
|
|
94
|
+
end
|
|
95
|
+
assert_equal(mem_hsh['total'], Platform.memory['total'])
|
|
96
|
+
if platform == :nexus
|
|
97
|
+
# used and free mem change rapidly, compare total and sums of free + used
|
|
98
|
+
assert_equal(mem_hsh['used'].to_i + mem_hsh['free'].to_i,
|
|
99
|
+
Platform.memory['used'].to_i + Platform.memory['free'].to_i)
|
|
100
|
+
end
|
|
101
|
+
assert(Platform.memory.key?('used'),
|
|
102
|
+
"Platform memory has no key 'used'")
|
|
103
|
+
assert(Platform.memory.key?('free'),
|
|
104
|
+
"Platform memory has no key 'free'")
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def test_board
|
|
108
|
+
s = @device.cmd('sh ver').scan(/Board ID (\S+)/).flatten.first
|
|
109
|
+
assert_equal(s, Platform.board)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def test_uptime
|
|
113
|
+
s = @device.cmd('sh system uptime').scan(/Kernel uptime:\s+(.*)/).flatten.first
|
|
114
|
+
# compare without seconds
|
|
115
|
+
assert_equal(s.gsub(/\d+ sec/, ''), Platform.uptime.gsub(/\d+ sec/, ''))
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def test_reset_reason
|
|
119
|
+
s = @device.cmd('sh ver').scan(/Reason: (.*)/).flatten.first
|
|
120
|
+
assert_equal(s, Platform.reset_reason)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# switch#show inventory
|
|
124
|
+
# NAME: "Chassis", DESCR: "Nexus9000 C9396PX Chassis"
|
|
125
|
+
# PID: N9K-C9396PX , VID: V02 , SN: xxxxxxxxxxx
|
|
126
|
+
#
|
|
127
|
+
# NAME: "Slot 1", DESCR: "1/10G SFP+ Ethernet Module"
|
|
128
|
+
# PID: N9K-C9396PX , VID: V02 , SN: xxxxxxxxxxx
|
|
129
|
+
#
|
|
130
|
+
# NAME: "Slot 2", DESCR: "40G Ethernet Expansion Module"
|
|
131
|
+
# PID: N9K-M12PQ , VID: V01 , SN: xxxxxxxxxxx
|
|
132
|
+
# (...)
|
|
133
|
+
# NAME: "Power Supply 1", DESCR: "Nexus9000 C9396PX Chassis Power Supply"
|
|
134
|
+
# PID: N9K-PAC-650W , VID: V01 , SN: xxxxxxxxxxx
|
|
135
|
+
# (...)
|
|
136
|
+
# NAME: "Fan 1", DESCR: "Nexus9000 C9396PX Chassis Fan Module"
|
|
137
|
+
# PID: N9K-C9300-FAN2 , VID: V01 , SN: N/A
|
|
138
|
+
#
|
|
139
|
+
# Everything from DESCR onwards follows the same general format so we
|
|
140
|
+
# can define a single base regexp and extend it as needed for Chassis, Slot,
|
|
141
|
+
# Power Supply, and Fan inventory entries.
|
|
142
|
+
#
|
|
143
|
+
# On some platforms, some fields may be empty:
|
|
144
|
+
# NAME: "Chassis", DESCR: "NX-OSv Chassis"
|
|
145
|
+
# PID: N9K-NXOSV , VID: , SN:
|
|
146
|
+
def inv_cmn_re(name_expr)
|
|
147
|
+
/NAME:\s+"#{name_expr}",\s+
|
|
148
|
+
DESCR:\s+"(.*)"\s*
|
|
149
|
+
\n
|
|
150
|
+
PID:\s+(\S*)\s*,\s*
|
|
151
|
+
VID:\s+(\S*)\s*,\s*
|
|
152
|
+
SN:\s+(\S*)\s*
|
|
153
|
+
$/x
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def test_chassis
|
|
157
|
+
arr = @device.cmd('sh inv').scan(inv_cmn_re('Chassis'))
|
|
158
|
+
arr = arr.flatten
|
|
159
|
+
# convert to hash
|
|
160
|
+
chas_hsh = { 'descr' => arr[0],
|
|
161
|
+
'pid' => arr[1],
|
|
162
|
+
'vid' => arr[2],
|
|
163
|
+
'sn' => arr[3],
|
|
164
|
+
} unless arr.empty?
|
|
165
|
+
assert_equal(chas_hsh, Platform.chassis)
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def test_slots
|
|
169
|
+
slots_arr_arr = @device.cmd('sh inv').scan(inv_cmn_re('(Slot\s+\d+)'))
|
|
170
|
+
# convert to array of slot hashes
|
|
171
|
+
slots_hsh_hsh = {}
|
|
172
|
+
slots_arr_arr.each do |slot|
|
|
173
|
+
slots_hsh_hsh[slot[0]] = { 'descr' => slot[1],
|
|
174
|
+
'pid' => slot[2],
|
|
175
|
+
'vid' => slot[3],
|
|
176
|
+
'sn' => slot[4],
|
|
177
|
+
}
|
|
178
|
+
end
|
|
179
|
+
assert_equal(slots_hsh_hsh, Platform.slots)
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def test_power_supplies
|
|
183
|
+
pwr_arr_arr = @device.cmd('sh inv')
|
|
184
|
+
.scan(inv_cmn_re('(Power\s+Supply\s+\d+)'))
|
|
185
|
+
|
|
186
|
+
# convert to array of power supply hashes
|
|
187
|
+
pwr_hsh_hsh = {}
|
|
188
|
+
pwr_arr_arr.each do |pwr|
|
|
189
|
+
pwr_hsh_hsh[pwr[0]] = { 'descr' => pwr[1],
|
|
190
|
+
'pid' => pwr[2],
|
|
191
|
+
'vid' => pwr[3],
|
|
192
|
+
'sn' => pwr[4],
|
|
193
|
+
}
|
|
194
|
+
end
|
|
195
|
+
assert_equal(pwr_hsh_hsh, Platform.power_supplies)
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def test_fans
|
|
199
|
+
fan_arr_arr = @device.cmd('sh inv').scan(inv_cmn_re('(Fan\s+\d+)'))
|
|
200
|
+
|
|
201
|
+
# convert to array of fan hashes
|
|
202
|
+
fan_hsh_hsh = {}
|
|
203
|
+
fan_arr_arr.each do |fan|
|
|
204
|
+
fan_hsh_hsh[fan[0]] = { 'descr' => fan[1],
|
|
205
|
+
'pid' => fan[2],
|
|
206
|
+
'vid' => fan[3],
|
|
207
|
+
'sn' => fan[4],
|
|
208
|
+
}
|
|
209
|
+
end
|
|
210
|
+
assert_equal(fan_hsh_hsh, Platform.fans)
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
def test_virtual_services
|
|
214
|
+
if validate_property_excluded?('virtual_service', 'services')
|
|
215
|
+
assert_nil(node.config_get('virtual_service', 'services'))
|
|
216
|
+
return
|
|
217
|
+
end
|
|
218
|
+
# Only run this test if a virtual-service is installed
|
|
219
|
+
if config('show virtual-service global')[/services installed : 0$/]
|
|
220
|
+
skip('This test requires a virtual-service to be installed')
|
|
221
|
+
end
|
|
222
|
+
# this would be beyond ugly to parse from ascii, utilize config_get
|
|
223
|
+
vir_arr = node.config_get('virtual_service', 'services')
|
|
224
|
+
vir_arr = [vir_arr] if vir_arr.is_a? Hash
|
|
225
|
+
# convert to expected format
|
|
226
|
+
vir_hsh_hsh = {}
|
|
227
|
+
unless vir_arr.nil?
|
|
228
|
+
vir_arr.each do |serv|
|
|
229
|
+
# rubocop:disable Style/AlignHash
|
|
230
|
+
vir_hsh_hsh[serv['name']] = {
|
|
231
|
+
'package_info' => { 'name' => serv['package_name'],
|
|
232
|
+
'path' => serv['ova_path'],
|
|
233
|
+
},
|
|
234
|
+
'application' => { 'name' => serv['application_name'],
|
|
235
|
+
'version' => serv['application_version'],
|
|
236
|
+
'descr' => serv['application_description'],
|
|
237
|
+
},
|
|
238
|
+
'signing' => { 'key_type' => serv['key_type'],
|
|
239
|
+
'method' => serv['signing_method'],
|
|
240
|
+
},
|
|
241
|
+
'licensing' => { 'name' => serv['licensing_name'],
|
|
242
|
+
'version' => serv['licensing_version'],
|
|
243
|
+
},
|
|
244
|
+
'reservation' => { 'disk' => serv['disk_reservation'],
|
|
245
|
+
'memory' => serv['memory_reservation'],
|
|
246
|
+
'cpu' => serv['cpu_reservation'],
|
|
247
|
+
},
|
|
248
|
+
}
|
|
249
|
+
# rubocop:enable Style/AlignHash
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
assert_equal(vir_hsh_hsh, Platform.virtual_services)
|
|
253
|
+
end
|
|
254
|
+
end
|
|
@@ -0,0 +1,322 @@
|
|
|
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/portchannel_global'
|
|
17
|
+
require_relative '../lib/cisco_node_utils/platform'
|
|
18
|
+
|
|
19
|
+
# TestX__CLASS_NAME__X - Minitest for X__CLASS_NAME__X node utility class
|
|
20
|
+
class TestPortchannelGlobal < CiscoTestCase
|
|
21
|
+
@skip_unless_supported = 'portchannel_global'
|
|
22
|
+
@@cleaned = false # rubocop:disable Style/ClassVars
|
|
23
|
+
DEFAULT_NAME = 'default'
|
|
24
|
+
|
|
25
|
+
def setup
|
|
26
|
+
super
|
|
27
|
+
cleanup unless @@cleaned
|
|
28
|
+
@@cleaned = true # rubocop:disable Style/ClassVars
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def teardown
|
|
32
|
+
cleanup
|
|
33
|
+
super
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def cleanup
|
|
37
|
+
ethernet = node.product_id[/N(3|7|8|9)/] ? '' : 'ethernet'
|
|
38
|
+
config_no_warn "no port-channel load-balance #{ethernet}"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def n3k_is_t2?
|
|
42
|
+
return unless /N3/ =~ node.product_id
|
|
43
|
+
Platform.chassis['descr'][/(Nexus3000 C31|Nexus 31)/] ? true : false
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def n3k_in_n3k_mode?
|
|
47
|
+
return unless /N3/ =~ node.product_id
|
|
48
|
+
return if node.product_id.include?('-F')
|
|
49
|
+
mode = config('show system switch-mode')
|
|
50
|
+
# note: an n3k in n9k mode displays: 'system switch-mode n9k'
|
|
51
|
+
patterns = ['system switch-mode n3k',
|
|
52
|
+
'Switch mode configuration is not.*applicable']
|
|
53
|
+
mode.match("#{patterns[0]}|#{patterns[1]}") ? true : false
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def create_portchannel_global(name=DEFAULT_NAME)
|
|
57
|
+
PortChannelGlobal.new(name)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def test_hash_distribution
|
|
61
|
+
global = create_portchannel_global
|
|
62
|
+
if validate_property_excluded?('portchannel_global', 'hash_distribution')
|
|
63
|
+
assert_raises(Cisco::UnsupportedError) do
|
|
64
|
+
global.hash_distribution = 'fixed'
|
|
65
|
+
end
|
|
66
|
+
assert_nil(global.hash_distribution)
|
|
67
|
+
else
|
|
68
|
+
global.hash_distribution = 'fixed'
|
|
69
|
+
assert_equal('fixed', global.hash_distribution)
|
|
70
|
+
global.hash_distribution =
|
|
71
|
+
global.default_hash_distribution
|
|
72
|
+
assert_equal(global.default_hash_distribution,
|
|
73
|
+
global.hash_distribution)
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def test_load_defer
|
|
78
|
+
global = create_portchannel_global
|
|
79
|
+
if validate_property_excluded?('portchannel_global', 'load_defer')
|
|
80
|
+
assert_raises(Cisco::UnsupportedError) do
|
|
81
|
+
global.load_defer = 1000
|
|
82
|
+
end
|
|
83
|
+
assert_nil(global.load_defer)
|
|
84
|
+
else
|
|
85
|
+
global.load_defer = 1000
|
|
86
|
+
assert_equal(1000, global.load_defer)
|
|
87
|
+
global.load_defer =
|
|
88
|
+
global.default_load_defer
|
|
89
|
+
assert_equal(global.default_load_defer,
|
|
90
|
+
global.load_defer)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def test_resilient
|
|
95
|
+
global = create_portchannel_global
|
|
96
|
+
if validate_property_excluded?('portchannel_global', 'resilient')
|
|
97
|
+
assert_raises(Cisco::UnsupportedError) { global.resilient = true }
|
|
98
|
+
assert_nil(global.resilient)
|
|
99
|
+
return
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Verify that hardware supports feature. Unfortunately the current cli
|
|
103
|
+
# only displays a warning and does not raise an error so we have to
|
|
104
|
+
# test for it explicitly.
|
|
105
|
+
cmd = 'port-channel load-balance resilient'
|
|
106
|
+
skip('Skip test: Feature is not supported on this device') if
|
|
107
|
+
config(cmd)[/Resilient Hashing Mode unsupported/]
|
|
108
|
+
global = create_portchannel_global
|
|
109
|
+
# For n3k the default is different from n9k
|
|
110
|
+
if n3k_in_n3k_mode?
|
|
111
|
+
global.resilient = false
|
|
112
|
+
refute(global.resilient)
|
|
113
|
+
global.resilient = global.default_resilient
|
|
114
|
+
assert_equal(global.default_resilient, global.resilient)
|
|
115
|
+
else
|
|
116
|
+
config('no ' + cmd)
|
|
117
|
+
global = create_portchannel_global
|
|
118
|
+
global.resilient = true
|
|
119
|
+
assert(global.resilient)
|
|
120
|
+
global.resilient = global.default_resilient
|
|
121
|
+
assert_equal(global.default_resilient, global.resilient)
|
|
122
|
+
end
|
|
123
|
+
rescue Cisco::CliError => e
|
|
124
|
+
check_and_raise_error(e, 'This feature is not supported on this platform')
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def test_load_balance_no_rotate_no_symmetry
|
|
128
|
+
skip('Test not supported on this platform') unless n3k_in_n3k_mode?
|
|
129
|
+
|
|
130
|
+
global = create_portchannel_global
|
|
131
|
+
global.send(:port_channel_load_balance=,
|
|
132
|
+
'src-dst', 'ip-only', nil, nil, false, nil, nil)
|
|
133
|
+
assert_equal('src-dst',
|
|
134
|
+
global.bundle_select)
|
|
135
|
+
assert_equal('ip-only',
|
|
136
|
+
global.bundle_hash)
|
|
137
|
+
assert_equal(false, global.symmetry)
|
|
138
|
+
global.send(
|
|
139
|
+
:port_channel_load_balance=,
|
|
140
|
+
global.default_bundle_select,
|
|
141
|
+
global.default_bundle_hash,
|
|
142
|
+
nil,
|
|
143
|
+
nil,
|
|
144
|
+
global.default_symmetry,
|
|
145
|
+
nil,
|
|
146
|
+
nil)
|
|
147
|
+
assert_equal(
|
|
148
|
+
global.default_bundle_select,
|
|
149
|
+
global.bundle_select)
|
|
150
|
+
assert_equal(
|
|
151
|
+
global.default_bundle_hash,
|
|
152
|
+
global.bundle_hash)
|
|
153
|
+
assert_equal(
|
|
154
|
+
global.default_symmetry,
|
|
155
|
+
global.symmetry)
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def test_load_balance_no_rotate
|
|
159
|
+
skip('Test not supported on this platform') unless
|
|
160
|
+
n3k_is_t2? && n3k_in_n3k_mode?
|
|
161
|
+
|
|
162
|
+
global = create_portchannel_global
|
|
163
|
+
global.send(:port_channel_load_balance=,
|
|
164
|
+
'src-dst', 'ip-only', nil, nil, true, nil, nil)
|
|
165
|
+
assert_equal('src-dst',
|
|
166
|
+
global.bundle_select)
|
|
167
|
+
assert_equal('ip-only',
|
|
168
|
+
global.bundle_hash)
|
|
169
|
+
assert_equal(true, global.symmetry)
|
|
170
|
+
global.send(
|
|
171
|
+
:port_channel_load_balance=,
|
|
172
|
+
global.default_bundle_select,
|
|
173
|
+
global.default_bundle_hash,
|
|
174
|
+
nil,
|
|
175
|
+
nil,
|
|
176
|
+
global.default_symmetry,
|
|
177
|
+
nil,
|
|
178
|
+
nil)
|
|
179
|
+
assert_equal(
|
|
180
|
+
global.default_bundle_select,
|
|
181
|
+
global.bundle_select)
|
|
182
|
+
assert_equal(
|
|
183
|
+
global.default_bundle_hash,
|
|
184
|
+
global.bundle_hash)
|
|
185
|
+
assert_equal(
|
|
186
|
+
global.default_symmetry,
|
|
187
|
+
global.symmetry)
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
def test_load_balance_sym_concat_rot
|
|
191
|
+
# rubocop:disable Style/MultilineOperationIndentation
|
|
192
|
+
skip('Test not supported on this platform') if n3k_in_n3k_mode? ||
|
|
193
|
+
validate_property_excluded?('portchannel_global', 'symmetry')
|
|
194
|
+
# rubocop:enable Style/MultilineOperationIndentation
|
|
195
|
+
# TBD: concat not supported; add N9k-EX to allowed platforms list and
|
|
196
|
+
# use proper _exclude tags
|
|
197
|
+
skip('TBD: Limited support for N9k-EX') if node.product_id[/N9K.*EX/]
|
|
198
|
+
|
|
199
|
+
global = create_portchannel_global
|
|
200
|
+
global.send(:port_channel_load_balance=,
|
|
201
|
+
'src-dst', 'ip-l4port', nil, nil, true, true, 4)
|
|
202
|
+
assert_equal('src-dst',
|
|
203
|
+
global.bundle_select)
|
|
204
|
+
assert_equal('ip-l4port',
|
|
205
|
+
global.bundle_hash)
|
|
206
|
+
assert_equal(true, global.symmetry)
|
|
207
|
+
assert_equal(true, global.concatenation)
|
|
208
|
+
assert_equal(4, global.rotate)
|
|
209
|
+
global.send(
|
|
210
|
+
:port_channel_load_balance=,
|
|
211
|
+
global.default_bundle_select,
|
|
212
|
+
global.default_bundle_hash,
|
|
213
|
+
nil,
|
|
214
|
+
nil,
|
|
215
|
+
global.default_symmetry,
|
|
216
|
+
global.default_concatenation,
|
|
217
|
+
global.default_rotate)
|
|
218
|
+
assert_equal(
|
|
219
|
+
global.default_bundle_select,
|
|
220
|
+
global.bundle_select)
|
|
221
|
+
assert_equal(
|
|
222
|
+
global.default_bundle_hash,
|
|
223
|
+
global.bundle_hash)
|
|
224
|
+
assert_equal(
|
|
225
|
+
global.default_symmetry,
|
|
226
|
+
global.symmetry)
|
|
227
|
+
assert_equal(
|
|
228
|
+
global.default_concatenation,
|
|
229
|
+
global.concatenation)
|
|
230
|
+
assert_equal(global.default_rotate,
|
|
231
|
+
global.rotate)
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
# assert_hash_poly_crc
|
|
235
|
+
# Depending on the chipset, hash_poly may have have a different
|
|
236
|
+
# default value within the same platform family (this is done to
|
|
237
|
+
# avoid polarization) but there is currently no command available
|
|
238
|
+
# to dynamically determine the default state. As a result the
|
|
239
|
+
# getter simply hard-codes a default value which means it may
|
|
240
|
+
# encounter occasional idempotence issues.
|
|
241
|
+
# For testing purposes this becomes a best-effort test; i.e. we expect the
|
|
242
|
+
# hash_poly test to pass for all asserts except the one that matches the
|
|
243
|
+
# default value for that chipset.
|
|
244
|
+
def assert_hash_poly_crc(exp, actual)
|
|
245
|
+
assert_equal(exp, actual) if exp == actual
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
def test_load_balance_hash_poly
|
|
249
|
+
global = create_portchannel_global
|
|
250
|
+
if validate_property_excluded?('portchannel_global', 'hash_poly')
|
|
251
|
+
skip('Test not supported on this platform')
|
|
252
|
+
return
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
global.send(:port_channel_load_balance=,
|
|
256
|
+
'src-dst', 'ip-only', 'CRC10c', nil, nil, nil, nil)
|
|
257
|
+
assert_equal('src-dst', global.bundle_select)
|
|
258
|
+
assert_equal('ip-only', global.bundle_hash)
|
|
259
|
+
assert_hash_poly_crc('CRC10c', global.hash_poly)
|
|
260
|
+
|
|
261
|
+
global.send(:port_channel_load_balance=,
|
|
262
|
+
'dst', 'mac', 'CRC10a', nil, nil, nil, nil)
|
|
263
|
+
assert_equal('dst', global.bundle_select)
|
|
264
|
+
assert_equal('mac', global.bundle_hash)
|
|
265
|
+
assert_hash_poly_crc('CRC10a', global.hash_poly)
|
|
266
|
+
|
|
267
|
+
global.send(:port_channel_load_balance=,
|
|
268
|
+
global.default_bundle_select,
|
|
269
|
+
global.default_bundle_hash,
|
|
270
|
+
'CRC10b', nil, nil, nil, nil)
|
|
271
|
+
assert_equal(global.default_bundle_select, global.bundle_select)
|
|
272
|
+
assert_equal(global.default_bundle_hash, global.bundle_hash)
|
|
273
|
+
assert_hash_poly_crc('CRC10b', global.hash_poly)
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
def test_load_balance_asym_rot
|
|
277
|
+
global = create_portchannel_global
|
|
278
|
+
if validate_property_excluded?('portchannel_global', 'asymmetric')
|
|
279
|
+
skip('Test not supported on this platform')
|
|
280
|
+
return
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
global.send(:port_channel_load_balance=,
|
|
284
|
+
'src-dst', 'ip-vlan', nil, true, nil, nil, 4)
|
|
285
|
+
assert_equal('src-dst', global.bundle_select)
|
|
286
|
+
assert_equal('ip-vlan', global.bundle_hash)
|
|
287
|
+
assert_equal(true, global.asymmetric)
|
|
288
|
+
assert_equal(4, global.rotate)
|
|
289
|
+
|
|
290
|
+
global.send(:port_channel_load_balance=,
|
|
291
|
+
global.default_bundle_select,
|
|
292
|
+
global.default_bundle_hash,
|
|
293
|
+
nil, global.default_asymmetric,
|
|
294
|
+
nil, nil, global.default_rotate)
|
|
295
|
+
assert_equal(global.default_bundle_select, global.bundle_select)
|
|
296
|
+
assert_equal(global.default_bundle_hash, global.bundle_hash)
|
|
297
|
+
assert_equal(global.default_asymmetric, global.asymmetric)
|
|
298
|
+
assert_equal(global.default_rotate, global.rotate)
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
def test_load_balance_no_hash_rot
|
|
302
|
+
global = create_portchannel_global
|
|
303
|
+
if validate_property_excluded?('portchannel_global', 'rotate')
|
|
304
|
+
skip('Test not supported on this platform')
|
|
305
|
+
return
|
|
306
|
+
end
|
|
307
|
+
global.send(:port_channel_load_balance=,
|
|
308
|
+
'src-dst', 'ip-vlan', nil, nil, nil, nil, 4)
|
|
309
|
+
assert_equal('src-dst', global.bundle_select)
|
|
310
|
+
assert_equal('ip-vlan', global.bundle_hash)
|
|
311
|
+
assert_equal(4, global.rotate)
|
|
312
|
+
|
|
313
|
+
global.send(:port_channel_load_balance=,
|
|
314
|
+
global.default_bundle_select,
|
|
315
|
+
global.default_bundle_hash,
|
|
316
|
+
nil, nil,
|
|
317
|
+
nil, nil, global.default_rotate)
|
|
318
|
+
assert_equal(global.default_bundle_select, global.bundle_select)
|
|
319
|
+
assert_equal(global.default_bundle_hash, global.bundle_hash)
|
|
320
|
+
assert_equal(global.default_rotate, global.rotate)
|
|
321
|
+
end
|
|
322
|
+
end
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Minitest for RadiusGlobal class
|
|
3
|
+
#
|
|
4
|
+
# Copyright (c) 2014-2016 Cisco and/or its affiliates.
|
|
5
|
+
#
|
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
# you may not use this file except in compliance with the License.
|
|
8
|
+
# You may obtain a copy of the License at
|
|
9
|
+
#
|
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
#
|
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
# See the License for the specific language governing permissions and
|
|
16
|
+
# limitations under the License.
|
|
17
|
+
|
|
18
|
+
require_relative 'ciscotest'
|
|
19
|
+
require_relative '../lib/cisco_node_utils/radius_global'
|
|
20
|
+
|
|
21
|
+
# TestRadiusGlobal - Minitest for RadiusGlobal node utility.
|
|
22
|
+
class TestRadiusGlobal < CiscoTestCase
|
|
23
|
+
@skip_unless_supported = 'radius_global'
|
|
24
|
+
|
|
25
|
+
def setup
|
|
26
|
+
# setup runs at the beginning of each test
|
|
27
|
+
super
|
|
28
|
+
no_radius_global
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def teardown
|
|
32
|
+
# teardown runs at the end of each test
|
|
33
|
+
no_radius_global
|
|
34
|
+
super
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def no_radius_global
|
|
38
|
+
# Turn the feature off for a clean test.
|
|
39
|
+
config('no radius-server timeout 2',
|
|
40
|
+
'no radius-server retransmit 3')
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# TESTS
|
|
44
|
+
|
|
45
|
+
def test_radius_global
|
|
46
|
+
id = 'default'
|
|
47
|
+
|
|
48
|
+
global = Cisco::RadiusGlobal.new(id)
|
|
49
|
+
assert_includes(Cisco::RadiusGlobal.radius_global, id)
|
|
50
|
+
assert_equal(Cisco::RadiusGlobal.radius_global[id], global)
|
|
51
|
+
|
|
52
|
+
# Default Checking
|
|
53
|
+
assert_equal(global.timeout, global.default_timeout)
|
|
54
|
+
assert_equal(global.retransmit_count, global.default_retransmit_count)
|
|
55
|
+
|
|
56
|
+
global.retransmit_count = 3
|
|
57
|
+
assert_equal(Cisco::RadiusGlobal.radius_global[id].retransmit_count,
|
|
58
|
+
3)
|
|
59
|
+
assert_equal(global.retransmit_count,
|
|
60
|
+
3)
|
|
61
|
+
|
|
62
|
+
global.timeout = 2
|
|
63
|
+
assert_equal(Cisco::RadiusGlobal.radius_global[id].timeout,
|
|
64
|
+
2)
|
|
65
|
+
assert_equal(global.timeout,
|
|
66
|
+
2)
|
|
67
|
+
|
|
68
|
+
if platform == :nexus
|
|
69
|
+
key = 'aaaAAAGGTTYTYY 44444444 72'
|
|
70
|
+
global.key_set(key, 7)
|
|
71
|
+
assert_match(/#{key}/, global.key)
|
|
72
|
+
assert_match(/#{key}/, Cisco::RadiusGlobal.radius_global[id].key)
|
|
73
|
+
assert_equal(7, global.key_format)
|
|
74
|
+
unless Platform.image_version[/I2|I4/] # legacy defect CSCvb57180
|
|
75
|
+
# Change to type 6
|
|
76
|
+
key = 'JDYkqyIFWeBvzpljSfWmRZrmRSRE8'
|
|
77
|
+
global.key_set(key, 6)
|
|
78
|
+
assert_match(/#{key}/, global.key)
|
|
79
|
+
assert_equal(6, global.key_format)
|
|
80
|
+
end
|
|
81
|
+
elsif platform == :ios_xr
|
|
82
|
+
global.key_set('QsEfThUkO', nil)
|
|
83
|
+
assert(!global.key.nil?)
|
|
84
|
+
assert(!Cisco::RadiusGlobal.radius_global[id].key.nil?)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Setting back to default and re-checking
|
|
88
|
+
global.timeout = nil
|
|
89
|
+
global.retransmit_count = nil
|
|
90
|
+
global.key_set(nil, nil)
|
|
91
|
+
assert_equal(global.timeout, global.default_timeout)
|
|
92
|
+
assert_equal(global.retransmit_count, global.default_retransmit_count)
|
|
93
|
+
assert_nil(global.key)
|
|
94
|
+
|
|
95
|
+
# Default source interface
|
|
96
|
+
global.source_interface = global.default_source_interface
|
|
97
|
+
assert_nil(global.source_interface)
|
|
98
|
+
|
|
99
|
+
# Set source interface
|
|
100
|
+
interface = 'loopback0'
|
|
101
|
+
global.source_interface = interface
|
|
102
|
+
assert_equal(interface, global.source_interface)
|
|
103
|
+
|
|
104
|
+
# Remove source interface
|
|
105
|
+
global.source_interface = nil
|
|
106
|
+
assert_nil(global.source_interface)
|
|
107
|
+
end
|
|
108
|
+
end
|