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,103 @@
|
|
|
1
|
+
# NXAPI implementation of the PimRpAddress class
|
|
2
|
+
#
|
|
3
|
+
# Smitha Gopalan, November 2015
|
|
4
|
+
#
|
|
5
|
+
# Copyright (c) 2015-2016 Cisco and/or its affiliates.
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
# you may not use this file except in compliance with the License.
|
|
9
|
+
# You may obtain a copy of the License at
|
|
10
|
+
#
|
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
#
|
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
# See the License for the specific language governing permissions and
|
|
17
|
+
# limitations under the License.
|
|
18
|
+
|
|
19
|
+
require_relative 'node_util'
|
|
20
|
+
require_relative 'pim'
|
|
21
|
+
|
|
22
|
+
module Cisco
|
|
23
|
+
# node_utils class for pim_rp_address
|
|
24
|
+
class PimRpAddress < NodeUtil
|
|
25
|
+
attr_reader :afi, :rp_addr, :vrf
|
|
26
|
+
|
|
27
|
+
# Constructor with afi, rp_address and vrf
|
|
28
|
+
# -----------------------------------------
|
|
29
|
+
def initialize(afi, vrf, rp_addr, instantiate=true)
|
|
30
|
+
fail ArgumentError unless vrf.is_a?(String) || vrf.length > 0
|
|
31
|
+
@afi = Pim.afi_cli(afi)
|
|
32
|
+
@rp_addr = rp_addr
|
|
33
|
+
@vrf = vrf
|
|
34
|
+
create if instantiate
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Create a hash of [afi][vrf][rp_address]
|
|
38
|
+
# ------------------------------------------------
|
|
39
|
+
def self.rp_addresses
|
|
40
|
+
afis = %w(ipv4) # TBD ipv6
|
|
41
|
+
hash = {}
|
|
42
|
+
return hash unless Feature.pim_enabled?
|
|
43
|
+
afis.each do |afi|
|
|
44
|
+
hash[afi] = {}
|
|
45
|
+
default_vrf = 'default'
|
|
46
|
+
get_args = { afi: Pim.afi_cli(afi) }
|
|
47
|
+
rp_addrs = config_get('pim', 'all_rp_addresses', get_args)
|
|
48
|
+
unless rp_addrs.nil?
|
|
49
|
+
rp_addrs.each do |addr|
|
|
50
|
+
hash[afi][default_vrf] ||= {}
|
|
51
|
+
hash[afi][default_vrf][addr] =
|
|
52
|
+
PimRpAddress.new(afi, default_vrf, addr, false)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
vrf_ids = config_get('vrf', 'all_vrfs')
|
|
56
|
+
vrf_ids.each do |vrf|
|
|
57
|
+
get_args = { afi: Pim.afi_cli(afi), vrf: vrf }
|
|
58
|
+
rp_addrs = config_get('pim', 'all_rp_addresses', get_args)
|
|
59
|
+
next if rp_addrs.nil?
|
|
60
|
+
rp_addrs.each do |addr|
|
|
61
|
+
hash[afi][vrf] ||= {}
|
|
62
|
+
hash[afi][vrf][addr] = PimRpAddress.new(afi, vrf, addr, false)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
hash
|
|
67
|
+
rescue Cisco::CliError => e
|
|
68
|
+
# cmd will syntax reject when feature is not enabled
|
|
69
|
+
raise unless e.clierror =~ /Syntax error/
|
|
70
|
+
return {}
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# set_args_keys_default
|
|
74
|
+
# ----------------------
|
|
75
|
+
def set_args_keys_default
|
|
76
|
+
keys = { afi: @afi, addr: @rp_addr }
|
|
77
|
+
keys[:vrf] = @vrf unless @vrf == 'default'
|
|
78
|
+
@get_args = @set_args = keys
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# set_args_key
|
|
82
|
+
# -------------
|
|
83
|
+
def set_args_keys(hash={}) # rubocop:disable Style/AccessorMethodName
|
|
84
|
+
set_args_keys_default
|
|
85
|
+
@set_args = @get_args.merge!(hash) unless hash.empty?
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Create pim rp_addr instance
|
|
89
|
+
# ------------------------------
|
|
90
|
+
def create
|
|
91
|
+
Feature.pim_enable
|
|
92
|
+
set_args_keys(state: '')
|
|
93
|
+
config_set('pim', 'rp_address', @set_args)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Destroy pim rp_addr instance
|
|
97
|
+
# ------------------------------
|
|
98
|
+
def destroy
|
|
99
|
+
set_args_keys(state: 'no')
|
|
100
|
+
config_set('pim', 'rp_address', @set_args)
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
# Alex Hunsberger, Mar 2015
|
|
2
|
+
#
|
|
3
|
+
# Copyright (c) 2015-2016 Cisco and/or its affiliates.
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
|
|
17
|
+
require_relative 'node_util'
|
|
18
|
+
|
|
19
|
+
module Cisco
|
|
20
|
+
# Platform - class for gathering platform hardware and software information
|
|
21
|
+
class Platform < NodeUtil
|
|
22
|
+
#
|
|
23
|
+
# NX: 7.0(3)I2(3) [build 7.0(3)I2(2.118)]
|
|
24
|
+
# XR: 6.1.1.04I
|
|
25
|
+
def self.image_version
|
|
26
|
+
config_get('show_version', 'version')
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# ex: 'n3500-uk9.6.0.2.A3.0.40.bin'
|
|
30
|
+
def self.system_image
|
|
31
|
+
config_get('show_version', 'system_image')
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Returns package hash with state values
|
|
35
|
+
# Ex: { 'n3000-uk9.6.0.2.U1.1.CSCaa12345.bin' => 'inactive committed',
|
|
36
|
+
# 'n3000-uk9.6.0.2.U1.1.CSCaa12346.bin' => 'active', }
|
|
37
|
+
def self.packages
|
|
38
|
+
pkgs = []
|
|
39
|
+
pkg_hsh = {}
|
|
40
|
+
begin
|
|
41
|
+
pkgs = config_get('images', 'packages')
|
|
42
|
+
rescue RuntimeError => e
|
|
43
|
+
raise unless e.message[/Invalid command/]
|
|
44
|
+
end
|
|
45
|
+
return {} if pkgs.nil?
|
|
46
|
+
pkgs.each { |p| pkg_hsh[p[0]] = p[1].downcase }
|
|
47
|
+
pkg_hsh
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Ex: 'Cisco Nexus3064 Chassis ("48x10GE + 16x10G/4x40G Supervisor")'
|
|
51
|
+
def self.hardware_type
|
|
52
|
+
config_get('show_version', 'description')
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Ex: 'Intel(R) Celeron(R) CPU P450'
|
|
56
|
+
def self.cpu
|
|
57
|
+
config_get('show_version', 'cpu')
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Return hash with keys "total", "used", "free"
|
|
61
|
+
# Ex: { 'total' => '16402252K',
|
|
62
|
+
# 'used' => '5909004K',
|
|
63
|
+
# 'free' => '10493248K' }
|
|
64
|
+
def self.memory
|
|
65
|
+
{
|
|
66
|
+
'total' => config_get('memory', 'total'),
|
|
67
|
+
'used' => config_get('memory', 'used'),
|
|
68
|
+
'free' => config_get('memory', 'free'),
|
|
69
|
+
}
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Ex: 'Processor Board ID FOC15430TEY'
|
|
73
|
+
def self.board
|
|
74
|
+
config_get('show_version', 'board')
|
|
75
|
+
rescue RuntimeError => e
|
|
76
|
+
# Some Nexus platforms may fail to report this value.
|
|
77
|
+
return nil if /No key/ =~ e.message
|
|
78
|
+
raise
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Ex: '1 day(s), 21 hour(s), 46 minute(s), 54 second(s)'
|
|
82
|
+
def self.uptime
|
|
83
|
+
u = config_get('show_version', 'uptime')
|
|
84
|
+
fail 'failed to retrieve platform uptime' if u.nil?
|
|
85
|
+
u
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Ex: '23113 usecs after Mon Jul 1 15:24:29 2013'
|
|
89
|
+
def self.last_reset
|
|
90
|
+
config_get('show_version', 'last_reset_time')
|
|
91
|
+
rescue RuntimeError => e
|
|
92
|
+
# Some Nexus platforms may fail to report this value.
|
|
93
|
+
return nil if /No key/ =~ e.message
|
|
94
|
+
raise
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Ex: 'Reset Requested by CLI command reload'
|
|
98
|
+
def self.reset_reason
|
|
99
|
+
config_get('show_version', 'last_reset_reason')
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Returns chassis hash with keys "descr", "pid", "vid", "sn"
|
|
103
|
+
# Ex: { 'descr' => 'Nexus9000 C9396PX Chassis',
|
|
104
|
+
# 'pid' => 'N9K-C9396PX',
|
|
105
|
+
# 'vid' => 'V02',
|
|
106
|
+
# 'sn' => 'SAL1812NTBP' }
|
|
107
|
+
def self.chassis
|
|
108
|
+
# node.cache_flush # TODO: investigate why this is needed
|
|
109
|
+
all = config_get('inventory', 'chassis')
|
|
110
|
+
return nil if all.nil?
|
|
111
|
+
|
|
112
|
+
# item['name'] value is "\"Chassis\"" on most platforms,
|
|
113
|
+
# but n5k/n6k use "Chassis" so make the quotes optional.
|
|
114
|
+
chas = all.find { |item| item['name'][/^"?Chassis"?$/] }
|
|
115
|
+
return nil if chas.nil?
|
|
116
|
+
{
|
|
117
|
+
'descr' => chas['desc'].tr('"', ''),
|
|
118
|
+
'pid' => chas['productid'],
|
|
119
|
+
'vid' => chas['vendorid'],
|
|
120
|
+
'sn' => chas['serialnum'],
|
|
121
|
+
}
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# Returns hash of hashes with inner keys "name", "descr", "pid", "vid", "sn"
|
|
125
|
+
# Ex: { 'Slot 1' => { 'descr' => '1/10G SFP+ Ethernet Module',
|
|
126
|
+
# 'pid' => 'N9K-C9396PX',
|
|
127
|
+
# 'vid' => 'V02',
|
|
128
|
+
# 'sn' => 'SAL1812NTBP' },
|
|
129
|
+
# 'Slot 2' => { ... }}
|
|
130
|
+
def self.inventory_of(type)
|
|
131
|
+
inv = config_get('inventory', 'all')
|
|
132
|
+
inv_hsh = {}
|
|
133
|
+
return inv_hsh if inv.nil?
|
|
134
|
+
# Nexus gets structured output
|
|
135
|
+
inv_copy = inv.select { |x| x['name'].include? type }
|
|
136
|
+
return inv_hsh if inv_copy.empty?
|
|
137
|
+
# match desired output format
|
|
138
|
+
inv_copy.each do |s|
|
|
139
|
+
inv_hsh[s['name'].tr('"', '')] = { 'descr' => s['desc'].tr('"', ''),
|
|
140
|
+
'pid' => s['productid'],
|
|
141
|
+
'vid' => s['vendorid'],
|
|
142
|
+
'sn' => s['serialnum'] }
|
|
143
|
+
end
|
|
144
|
+
inv_hsh
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# Returns array of hashes with keys "name", "descr", "pid", "vid", "sn"
|
|
148
|
+
def self.slots
|
|
149
|
+
Platform.inventory_of('Slot')
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# Returns array of hashes with keys "name", "descr", "pid", "vid", "sn"
|
|
153
|
+
def self.power_supplies
|
|
154
|
+
Platform.inventory_of('Power Supply')
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# Returns array of hashes with keys "name", "descr", "pid", "vid", "sn"
|
|
158
|
+
def self.fans
|
|
159
|
+
Platform.inventory_of('Fan')
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
# Returns hash of hashes with inner keys "state", "application", ...
|
|
163
|
+
# Ex: { 'chef' => {
|
|
164
|
+
# 'package_info' => { 'name' => 'n3k_chef.ova',
|
|
165
|
+
# 'path' => 'bootflash:/n3k_chef.ova' },
|
|
166
|
+
# 'application' => { 'name' => 'ChefAgent',
|
|
167
|
+
# 'version' => '0.1',
|
|
168
|
+
# 'descr' => 'Cisco Chef Agent' },
|
|
169
|
+
# 'signing' => { 'key_type' => 'Cisco development key',
|
|
170
|
+
# 'method' => 'SHA-1' }
|
|
171
|
+
# 'licensing' => { 'name' => 'none',
|
|
172
|
+
# 'version' => 'none' }
|
|
173
|
+
# 'reservation' => { 'disk' => '111 MB',
|
|
174
|
+
# 'memory' => '0 MB',
|
|
175
|
+
# 'cpu' => '0% system CPU' }},
|
|
176
|
+
# { ... }}
|
|
177
|
+
def self.virtual_services
|
|
178
|
+
# If no virtual-services are installed, this will result
|
|
179
|
+
# in a RuntimeError. We need to rescue this specific case.
|
|
180
|
+
begin
|
|
181
|
+
virts = config_get('virtual_service', 'services')
|
|
182
|
+
rescue RuntimeError => e
|
|
183
|
+
return {} if e.message[/No key \"TABLE_detail\"/]
|
|
184
|
+
raise
|
|
185
|
+
end
|
|
186
|
+
return {} if virts.nil?
|
|
187
|
+
# NXAPI returns hash instead of array if there's only 1
|
|
188
|
+
virts = [virts] if virts.is_a? Hash
|
|
189
|
+
# convert to expected format
|
|
190
|
+
virts_hsh = {}
|
|
191
|
+
virts.each do |serv|
|
|
192
|
+
# rubocop:disable Style/AlignHash
|
|
193
|
+
virts_hsh[serv['name']] = {
|
|
194
|
+
'package_info' => { 'name' => serv['package_name'],
|
|
195
|
+
'path' => serv['ova_path'],
|
|
196
|
+
},
|
|
197
|
+
'application' => { 'name' => serv['application_name'],
|
|
198
|
+
'version' => serv['application_version'],
|
|
199
|
+
'descr' => serv['application_description'],
|
|
200
|
+
},
|
|
201
|
+
'signing' => { 'key_type' => serv['key_type'],
|
|
202
|
+
'method' => serv['signing_method'],
|
|
203
|
+
},
|
|
204
|
+
'licensing' => { 'name' => serv['licensing_name'],
|
|
205
|
+
'version' => serv['licensing_version'],
|
|
206
|
+
},
|
|
207
|
+
'reservation' => { 'disk' => serv['disk_reservation'],
|
|
208
|
+
'memory' => serv['memory_reservation'],
|
|
209
|
+
'cpu' => serv['cpu_reservation'],
|
|
210
|
+
},
|
|
211
|
+
}
|
|
212
|
+
# rubocop:enable Style/AlignHash
|
|
213
|
+
end
|
|
214
|
+
virts_hsh
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
end
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
# December 2015, Sai Chintalapudi
|
|
2
|
+
#
|
|
3
|
+
# Copyright (c) 2015-2016 Cisco and/or its affiliates.
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
|
|
17
|
+
require_relative 'node_util'
|
|
18
|
+
|
|
19
|
+
module Cisco
|
|
20
|
+
# node_utils class for portchannel_global
|
|
21
|
+
class PortChannelGlobal < NodeUtil
|
|
22
|
+
attr_reader :name
|
|
23
|
+
|
|
24
|
+
def initialize(name)
|
|
25
|
+
fail TypeError unless name.is_a?(String)
|
|
26
|
+
fail ArgumentError unless name == 'default'
|
|
27
|
+
@name = name.downcase
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def to_s
|
|
31
|
+
"portchannel_global #{name}"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def self.globals
|
|
35
|
+
{ 'default' => PortChannelGlobal.new('default') }
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
########################################################
|
|
39
|
+
# PROPERTIES #
|
|
40
|
+
########################################################
|
|
41
|
+
|
|
42
|
+
def load_balance_type
|
|
43
|
+
config_get('portchannel_global', 'load_balance_type')
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def hash_distribution
|
|
47
|
+
config_get('portchannel_global', 'hash_distribution')
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def hash_distribution=(val)
|
|
51
|
+
config_set('portchannel_global',
|
|
52
|
+
'hash_distribution', val)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def default_hash_distribution
|
|
56
|
+
config_get_default('portchannel_global', 'hash_distribution')
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def load_defer
|
|
60
|
+
config_get('portchannel_global', 'load_defer')
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def load_defer=(val)
|
|
64
|
+
config_set('portchannel_global', 'load_defer', val)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def default_load_defer
|
|
68
|
+
config_get_default('portchannel_global', 'load_defer')
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def resilient
|
|
72
|
+
config_get('portchannel_global', 'resilient')
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def resilient=(state)
|
|
76
|
+
fail TypeError unless state == true || state == false
|
|
77
|
+
no_cmd = (state ? '' : 'no')
|
|
78
|
+
config_set('portchannel_global', 'resilient', no_cmd)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def default_resilient
|
|
82
|
+
config_get_default('portchannel_global', 'resilient')
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# port-channel load-balance is a complicated command
|
|
86
|
+
# and this has so many forms in the same device and in
|
|
87
|
+
# different devices.
|
|
88
|
+
# For ex:
|
|
89
|
+
# port-channel load-balance src-dst ip rotate 4 concatenation symmetric
|
|
90
|
+
# port-channel load-balance resilient
|
|
91
|
+
# port-channel load-balance ethernet destination-mac CRC10c
|
|
92
|
+
# port-channel load-balance ethernet source-ip
|
|
93
|
+
# port-channel load-balance dst ip-l4port rotate 4 asymmetric
|
|
94
|
+
# port-channel load-balance dst ip-l4port-vlan module 9
|
|
95
|
+
# port-channel load-balance hash-modulo
|
|
96
|
+
# we need to eliminate all the clutter and get the correct
|
|
97
|
+
# line of config first and after that get index of each property
|
|
98
|
+
# and get the property value because some properties may or
|
|
99
|
+
# may not be present always.
|
|
100
|
+
# This method returns a hash
|
|
101
|
+
def port_channel_load_balance
|
|
102
|
+
lb = config_get('portchannel_global',
|
|
103
|
+
'port_channel_load_balance')
|
|
104
|
+
hash = {}
|
|
105
|
+
lb.each do |line|
|
|
106
|
+
next if line[/(internal|resilient|module|fex|hash)/]
|
|
107
|
+
params = line.split
|
|
108
|
+
lb_type = config_get('portchannel_global', 'load_balance_type')
|
|
109
|
+
case lb_type.to_sym
|
|
110
|
+
when :no_rotate # n3k
|
|
111
|
+
_parse_no_rotate_params(hash, params, line)
|
|
112
|
+
when :ethernet # n6k
|
|
113
|
+
_parse_ethernet_params(hash, params)
|
|
114
|
+
when :asymmetric # n7k
|
|
115
|
+
_parse_asymmetric_params(hash, params, line)
|
|
116
|
+
when :no_hash # n9k-f or n3k-f
|
|
117
|
+
_parse_no_hash_params(hash, params)
|
|
118
|
+
when :symmetry # n9k
|
|
119
|
+
_parse_symmetry_params(hash, params, line)
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
hash
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def asymmetric
|
|
126
|
+
port_channel_load_balance[:asymmetric]
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def default_asymmetric
|
|
130
|
+
config_get_default('portchannel_global',
|
|
131
|
+
'asymmetric')
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def bundle_hash
|
|
135
|
+
port_channel_load_balance[:bundle_hash]
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def default_bundle_hash
|
|
139
|
+
config_get_default('portchannel_global',
|
|
140
|
+
'bundle_hash')
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def bundle_select
|
|
144
|
+
port_channel_load_balance[:bundle_select]
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def default_bundle_select
|
|
148
|
+
config_get_default('portchannel_global',
|
|
149
|
+
'bundle_select')
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def concatenation
|
|
153
|
+
port_channel_load_balance[:concatenation]
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def default_concatenation
|
|
157
|
+
config_get_default('portchannel_global',
|
|
158
|
+
'concatenation')
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def hash_poly
|
|
162
|
+
port_channel_load_balance[:hash_poly]
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def rotate
|
|
166
|
+
port_channel_load_balance[:rotate]
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def default_rotate
|
|
170
|
+
config_get_default('portchannel_global',
|
|
171
|
+
'rotate')
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def symmetry
|
|
175
|
+
port_channel_load_balance[:symmetry]
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def default_symmetry
|
|
179
|
+
config_get_default('portchannel_global',
|
|
180
|
+
'symmetry')
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
def port_channel_load_balance=(bselect, bhash, hpoly, asy, sy, conc, rot)
|
|
184
|
+
lb_type = config_get('portchannel_global', 'load_balance_type')
|
|
185
|
+
case lb_type.to_sym
|
|
186
|
+
when :no_rotate # n3k
|
|
187
|
+
sym = sy ? 'symmetric' : ''
|
|
188
|
+
if bselect == 'src'
|
|
189
|
+
sel = 'source'
|
|
190
|
+
elsif bselect == 'dst'
|
|
191
|
+
sel = 'destination'
|
|
192
|
+
else
|
|
193
|
+
sel = 'source-dest'
|
|
194
|
+
end
|
|
195
|
+
sel_hash = sel + '-' + bhash
|
|
196
|
+
# port-channel load-balance ethernet source-dest-ip symmetric
|
|
197
|
+
config_set('portchannel_global', 'port_channel_load_balance',
|
|
198
|
+
'ethernet', sel_hash, sym, '', '', '')
|
|
199
|
+
when :ethernet # n6k
|
|
200
|
+
if bselect == 'src'
|
|
201
|
+
sel = 'source'
|
|
202
|
+
elsif bselect == 'dst'
|
|
203
|
+
sel = 'destination'
|
|
204
|
+
else
|
|
205
|
+
sel = 'source-dest'
|
|
206
|
+
end
|
|
207
|
+
sel_hash = sel + '-' + bhash
|
|
208
|
+
# port-channel load-balance ethernet destination-mac CRC10c
|
|
209
|
+
config_set('portchannel_global', 'port_channel_load_balance',
|
|
210
|
+
'ethernet', sel_hash, hpoly, '', '', '')
|
|
211
|
+
when :asymmetric # n7k
|
|
212
|
+
asym = (asy == true) ? 'asymmetric' : ''
|
|
213
|
+
# port-channel load-balance dst ip-l4port rotate 4 asymmetric
|
|
214
|
+
config_set('portchannel_global', 'port_channel_load_balance',
|
|
215
|
+
bselect, bhash, 'rotate', rot.to_s, asym, '')
|
|
216
|
+
when :no_hash # n9k-f or n3k-f
|
|
217
|
+
# port-channel load-balance dst ip-l4port rotate 4
|
|
218
|
+
rot_str = rot.zero? ? '' : 'rotate'
|
|
219
|
+
rot_val = rot.zero? ? '' : rot.to_s
|
|
220
|
+
config_set('portchannel_global', 'port_channel_load_balance',
|
|
221
|
+
bselect, bhash, rot_str, rot_val, '', '')
|
|
222
|
+
when :symmetry # n9k
|
|
223
|
+
sym = sy ? 'symmetric' : ''
|
|
224
|
+
concat = conc ? 'concatenation' : ''
|
|
225
|
+
rot_str = rot.zero? ? '' : 'rotate'
|
|
226
|
+
rot_val = rot.zero? ? '' : rot.to_s
|
|
227
|
+
# port-channel load-balance src-dst ip rotate 4 concatenation symmetric
|
|
228
|
+
config_set('portchannel_global', 'port_channel_load_balance',
|
|
229
|
+
bselect, bhash, rot_str, rot_val, concat, sym)
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
# N3k: The bundle hash and bundle select are merged into one output;
|
|
234
|
+
# also note that the field names are source & destination instead of
|
|
235
|
+
# src & dst as in other devices.
|
|
236
|
+
def _parse_no_rotate_params(hash, params, line)
|
|
237
|
+
sym = (line.include? 'symmetric') ? true : false
|
|
238
|
+
|
|
239
|
+
select_hash = params[1]
|
|
240
|
+
lparams = select_hash.split('-')
|
|
241
|
+
if lparams[0].downcase == 'destination'
|
|
242
|
+
bselect = 'dst'
|
|
243
|
+
bhash = lparams[1]
|
|
244
|
+
# there are bundles hashes like ip-gre which
|
|
245
|
+
# need extra processing
|
|
246
|
+
bhash += '-gre' if select_hash.include? 'gre'
|
|
247
|
+
else
|
|
248
|
+
if select_hash.include? '-dest-'
|
|
249
|
+
bselect = 'src-dst'
|
|
250
|
+
bhash = lparams[2]
|
|
251
|
+
bhash += '-gre' if select_hash.include? 'gre'
|
|
252
|
+
# there are bundles hashes like ip-only and
|
|
253
|
+
# port-only specific to src-dst
|
|
254
|
+
bhash += '-only' if select_hash.include? 'only'
|
|
255
|
+
else
|
|
256
|
+
bselect = 'src'
|
|
257
|
+
bhash = lparams[1]
|
|
258
|
+
# there are bundles hashes like ip-gre which
|
|
259
|
+
# need extra processing
|
|
260
|
+
bhash += '-gre' if select_hash.include? 'gre'
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
hash[:bundle_select] = bselect
|
|
264
|
+
hash[:bundle_hash] = bhash
|
|
265
|
+
hash[:symmetry] = sym
|
|
266
|
+
hash
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
# N5k/N6k: The bundle hash and bundle select are merged into one output;
|
|
270
|
+
# also note that the field names are source & destination instead of
|
|
271
|
+
# src & dst as in other devices.
|
|
272
|
+
def _parse_ethernet_params(hash, params)
|
|
273
|
+
hash_poly = params[2]
|
|
274
|
+
|
|
275
|
+
# Depending on the chipset, hash_poly may have have a different
|
|
276
|
+
# default value within the same platform family (this is done to
|
|
277
|
+
# avoid polarization) but there is currently no command available
|
|
278
|
+
# to dynamically determine the default state. As a result the
|
|
279
|
+
# getter simply hard-codes a default value which means it may
|
|
280
|
+
# encounter occasional idempotence issues.
|
|
281
|
+
hash_poly = hash_poly.nil? ? 'CRC10b' : hash_poly
|
|
282
|
+
|
|
283
|
+
select_hash = params[1]
|
|
284
|
+
lparams = select_hash.split('-')
|
|
285
|
+
if lparams[0].downcase == 'destination'
|
|
286
|
+
bselect = 'dst'
|
|
287
|
+
bhash = lparams[1]
|
|
288
|
+
else
|
|
289
|
+
if select_hash.include? '-dest-'
|
|
290
|
+
bselect = 'src-dst'
|
|
291
|
+
bhash = lparams[2]
|
|
292
|
+
# there are bundles hashes like ip-only and
|
|
293
|
+
# port-only specific to src-dst
|
|
294
|
+
bhash += '-only' if select_hash.include? 'only'
|
|
295
|
+
else
|
|
296
|
+
bselect = 'src'
|
|
297
|
+
bhash = lparams[1]
|
|
298
|
+
end
|
|
299
|
+
end
|
|
300
|
+
hash[:bundle_select] = bselect
|
|
301
|
+
hash[:bundle_hash] = bhash
|
|
302
|
+
hash[:hash_poly] = hash_poly
|
|
303
|
+
hash
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
def _parse_asymmetric_params(hash, params, line)
|
|
307
|
+
bselect = params[0]
|
|
308
|
+
bhash = params[1]
|
|
309
|
+
# asymmetric keyword does not show up if it is false
|
|
310
|
+
asym = (line.include? 'asymmetric') ? true : false
|
|
311
|
+
ri = params.index('rotate')
|
|
312
|
+
rotate = params[ri + 1].to_i
|
|
313
|
+
hash[:bundle_select] = bselect
|
|
314
|
+
hash[:bundle_hash] = bhash
|
|
315
|
+
hash[:asymmetric] = asym
|
|
316
|
+
hash[:rotate] = rotate
|
|
317
|
+
hash
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
def _parse_no_hash_params(hash, params)
|
|
321
|
+
bselect = params[0]
|
|
322
|
+
bhash = params[1]
|
|
323
|
+
ri = params.index('rotate')
|
|
324
|
+
rotate = params[ri + 1].to_i
|
|
325
|
+
hash[:bundle_select] = bselect
|
|
326
|
+
hash[:bundle_hash] = bhash
|
|
327
|
+
hash[:rotate] = rotate
|
|
328
|
+
hash
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
def _parse_symmetry_params(hash, params, line)
|
|
332
|
+
bselect = params[0]
|
|
333
|
+
bhash = params[1]
|
|
334
|
+
ri = params.index('rotate')
|
|
335
|
+
rotate = params[ri + 1].to_i
|
|
336
|
+
# concatenation and symmetry keywords do not show up if false
|
|
337
|
+
concat = (line.include? 'concatenation') ? true : false
|
|
338
|
+
sym = (line.include? 'symmetric') ? true : false
|
|
339
|
+
hash[:bundle_select] = bselect
|
|
340
|
+
hash[:bundle_hash] = bhash
|
|
341
|
+
hash[:symmetry] = sym
|
|
342
|
+
hash[:rotate] = rotate
|
|
343
|
+
hash[:concatenation] = concat
|
|
344
|
+
hash
|
|
345
|
+
end
|
|
346
|
+
end # class
|
|
347
|
+
end # module
|