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,149 @@
|
|
|
1
|
+
#
|
|
2
|
+
# NXAPI implementation of TacacsServerGroup class
|
|
3
|
+
#
|
|
4
|
+
# April 2015, Alex Hunsberger
|
|
5
|
+
#
|
|
6
|
+
# Copyright (c) 2015-2016 Cisco and/or its affiliates.
|
|
7
|
+
#
|
|
8
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
9
|
+
# you may not use this file except in compliance with the License.
|
|
10
|
+
# You may obtain a copy of the License at
|
|
11
|
+
#
|
|
12
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
13
|
+
#
|
|
14
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
15
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
16
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
17
|
+
# See the License for the specific language governing permissions and
|
|
18
|
+
# limitations under the License.
|
|
19
|
+
|
|
20
|
+
require_relative 'node_util'
|
|
21
|
+
require_relative 'tacacs_server'
|
|
22
|
+
|
|
23
|
+
module Cisco
|
|
24
|
+
# NXAPI implementation of AAA Server Group class
|
|
25
|
+
class TacacsServerGroup < NodeUtil
|
|
26
|
+
attr_reader :name
|
|
27
|
+
|
|
28
|
+
def initialize(name, create=true)
|
|
29
|
+
fail TypeError unless name.is_a? String
|
|
30
|
+
@name = name
|
|
31
|
+
|
|
32
|
+
return unless create
|
|
33
|
+
|
|
34
|
+
TacacsServer.new.enable if platform != :ios_xr && !TacacsServer.enabled
|
|
35
|
+
config_set('tacacs_server_group', 'group', state: '', name: name)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def destroy
|
|
39
|
+
config_set('tacacs_server_group', 'group', state: 'no', name: @name)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def servers
|
|
43
|
+
config_get('tacacs_server_group', 'servers', @name)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def servers=(new_servs)
|
|
47
|
+
fail TypeError unless new_servs.is_a? Array
|
|
48
|
+
current_servs = servers
|
|
49
|
+
new_servs.each do |s|
|
|
50
|
+
# add any servers not yet configured
|
|
51
|
+
next if current_servs.include? s
|
|
52
|
+
config_set('tacacs_server_group',
|
|
53
|
+
'servers',
|
|
54
|
+
name: @name,
|
|
55
|
+
state: '',
|
|
56
|
+
server: s)
|
|
57
|
+
end
|
|
58
|
+
current_servs.each do |s|
|
|
59
|
+
# remove any undesired existing servers
|
|
60
|
+
next if new_servs.include? s
|
|
61
|
+
config_set('tacacs_server_group',
|
|
62
|
+
'servers',
|
|
63
|
+
name: @name,
|
|
64
|
+
state: 'no',
|
|
65
|
+
server: s)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def default_servers
|
|
70
|
+
config_get_default('tacacs_server_group', 'servers')
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def ==(other)
|
|
74
|
+
name == other.name
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# for netdev compatibility
|
|
78
|
+
def self.tacacs_server_groups
|
|
79
|
+
groups
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def self.groups
|
|
83
|
+
grps = {}
|
|
84
|
+
if platform == :ios_xr
|
|
85
|
+
tacgroups = config_get('tacacs_server_group', 'group')
|
|
86
|
+
else
|
|
87
|
+
tacgroups = config_get('tacacs_server_group', 'group') if
|
|
88
|
+
TacacsServer.enabled
|
|
89
|
+
end
|
|
90
|
+
unless tacgroups.nil?
|
|
91
|
+
tacgroups.each { |s| grps[s] = TacacsServerGroup.new(s, false) }
|
|
92
|
+
end
|
|
93
|
+
grps
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def vrf
|
|
97
|
+
# vrf is always present in running config
|
|
98
|
+
v = config_get('tacacs_server_group', 'vrf', @name)
|
|
99
|
+
v.nil? ? default_vrf : v
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def vrf=(v)
|
|
103
|
+
fail TypeError unless v.is_a? String
|
|
104
|
+
# vrf = "default" is equivalent to unconfiguring vrf
|
|
105
|
+
config_set('tacacs_server_group', 'vrf', name: @name, state: '', vrf: v)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def default_vrf
|
|
109
|
+
config_get_default('tacacs_server_group', 'vrf')
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def deadtime
|
|
113
|
+
d = config_get('tacacs_server_group', 'deadtime', @name)
|
|
114
|
+
d.nil? ? default_deadtime : d.to_i
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def deadtime=(t)
|
|
118
|
+
no_cmd = t == default_deadtime ? 'no' : ''
|
|
119
|
+
config_set('tacacs_server_group',
|
|
120
|
+
'deadtime',
|
|
121
|
+
name: @name,
|
|
122
|
+
state: no_cmd,
|
|
123
|
+
deadtime: t)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def default_deadtime
|
|
127
|
+
config_get_default('tacacs_server_group', 'deadtime')
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def source_interface
|
|
131
|
+
i = config_get('tacacs_server_group', 'source_interface', @name)
|
|
132
|
+
i.nil? ? default_source_interface : i.downcase
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def source_interface=(s)
|
|
136
|
+
fail TypeError unless s.is_a? String
|
|
137
|
+
no_cmd = s == default_source_interface ? 'no' : ''
|
|
138
|
+
config_set('tacacs_server_group',
|
|
139
|
+
'source_interface',
|
|
140
|
+
name: @name,
|
|
141
|
+
state: no_cmd,
|
|
142
|
+
interface: s)
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def default_source_interface
|
|
146
|
+
config_get_default('tacacs_server_group', 'source_interface')
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
# Alex Hunsberger, March 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
|
+
require_relative 'tacacs_server'
|
|
19
|
+
|
|
20
|
+
module Cisco
|
|
21
|
+
# TacacsServerHost - node utility class for TACACS+ server host config
|
|
22
|
+
class TacacsServerHost < NodeUtil
|
|
23
|
+
attr_reader :name
|
|
24
|
+
@hosts = {}
|
|
25
|
+
|
|
26
|
+
def initialize(name, instantiate=true, host_port=nil)
|
|
27
|
+
fail TypeError unless name.is_a? String
|
|
28
|
+
fail ArgumentError if name.empty?
|
|
29
|
+
@name = name
|
|
30
|
+
|
|
31
|
+
if platform == :ios_xr
|
|
32
|
+
if host_port.nil?
|
|
33
|
+
@port = config_get_default('tacacs_server_host', 'port')
|
|
34
|
+
else
|
|
35
|
+
fail ArgumentError, 'host_port must be an Integer' \
|
|
36
|
+
unless host_port.is_a?(Integer)
|
|
37
|
+
@port = host_port
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
create if instantiate
|
|
42
|
+
|
|
43
|
+
return if platform == :ios_xr
|
|
44
|
+
|
|
45
|
+
return if host_port.nil?
|
|
46
|
+
fail ArgumentError, 'host_port must be an Integer' \
|
|
47
|
+
unless host_port.is_a?(Integer)
|
|
48
|
+
self.port = host_port
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def self.hosts
|
|
52
|
+
hosts = {}
|
|
53
|
+
return hosts unless Feature.tacacs_enabled?
|
|
54
|
+
|
|
55
|
+
hosts_list = config_get('tacacs_server_host', 'hosts')
|
|
56
|
+
return hosts if hosts_list.nil? || hosts_list.empty?
|
|
57
|
+
|
|
58
|
+
hosts_list.each do |name|
|
|
59
|
+
if platform == :ios_xr
|
|
60
|
+
host_port = config_get('tacacs_server_host', 'port', ip: name)
|
|
61
|
+
host_port = host_port[0] if host_port.is_a?(Array)
|
|
62
|
+
host_port = host_port.to_i
|
|
63
|
+
|
|
64
|
+
hosts[name] = TacacsServerHost.new(name, false, host_port)
|
|
65
|
+
else
|
|
66
|
+
hosts[name] = TacacsServerHost.new(name, false) if @hosts[name].nil?
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
hosts
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def create
|
|
73
|
+
destroy if platform == :ios_xr
|
|
74
|
+
Feature.tacacs_enable
|
|
75
|
+
config_set('tacacs_server_host',
|
|
76
|
+
'host',
|
|
77
|
+
state: '',
|
|
78
|
+
ip: name,
|
|
79
|
+
port: @port)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def destroy
|
|
83
|
+
if platform == :ios_xr
|
|
84
|
+
# This provider only support a 1-1 mapping between host and ports.
|
|
85
|
+
# Thus, we must remove the other entries on different ports.
|
|
86
|
+
all_hosts = config_get('tacacs_server_host',
|
|
87
|
+
'host_port_pairs',
|
|
88
|
+
ip: @name)
|
|
89
|
+
return unless all_hosts.is_a?(Array)
|
|
90
|
+
|
|
91
|
+
warn("#{name} is configured multiple times on the device" \
|
|
92
|
+
' (possibly using different ports). This is unsupported by this' \
|
|
93
|
+
' API and the duplicate entries are being deleted.') \
|
|
94
|
+
if all_hosts.count > 1
|
|
95
|
+
|
|
96
|
+
all_hosts.each do |host_port|
|
|
97
|
+
config_set('tacacs_server_host',
|
|
98
|
+
'host',
|
|
99
|
+
state: 'no',
|
|
100
|
+
ip: @name,
|
|
101
|
+
port: host_port)
|
|
102
|
+
end
|
|
103
|
+
else
|
|
104
|
+
config_set('tacacs_server_host',
|
|
105
|
+
'host',
|
|
106
|
+
state: 'no',
|
|
107
|
+
ip: @name,
|
|
108
|
+
port: @port)
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def port
|
|
113
|
+
platform == :ios_xr ? @port : config_get('tacacs_server_host',
|
|
114
|
+
'port',
|
|
115
|
+
ip: @name)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def port=(n)
|
|
119
|
+
fail("'port' setter method not applicable for this platform." \
|
|
120
|
+
'port must be passed in to the constructor.') \
|
|
121
|
+
if platform == :ios_xr
|
|
122
|
+
|
|
123
|
+
config_set('tacacs_server_host', 'port', ip: @name, port: n.to_i)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def self.default_port
|
|
127
|
+
config_get_default('tacacs_server_host', 'port')
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def encryption_type
|
|
131
|
+
type = config_get('tacacs_server_host',
|
|
132
|
+
'encryption_type',
|
|
133
|
+
ip: @name,
|
|
134
|
+
port: @port)
|
|
135
|
+
type.nil? ? TACACS_SERVER_ENC_UNKNOWN : type.to_i
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def self.default_encryption_type
|
|
139
|
+
TacacsServer.default_encryption_type
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def encryption_password
|
|
143
|
+
str = config_get('tacacs_server_host',
|
|
144
|
+
'encryption_password',
|
|
145
|
+
ip: @name,
|
|
146
|
+
port: @port)
|
|
147
|
+
return str if str.nil? || str.empty?
|
|
148
|
+
index = str.index('port')
|
|
149
|
+
str = str[0..index - 2] unless index.nil?
|
|
150
|
+
str.strip
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def self.default_encryption_password
|
|
154
|
+
config_get_default('tacacs_server_host', 'encryption_password')
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def encryption_key_set(enctype, password)
|
|
158
|
+
fail TypeError unless enctype.is_a? Fixnum
|
|
159
|
+
fail ArgumentError if password && ![TACACS_SERVER_ENC_NONE,
|
|
160
|
+
TACACS_SERVER_ENC_CISCO_TYPE_7,
|
|
161
|
+
TACACS_SERVER_ENC_UNKNOWN,
|
|
162
|
+
].include?(enctype)
|
|
163
|
+
password = Utils.add_quotes(password) unless password.empty?
|
|
164
|
+
# if enctype is TACACS_SERVER_ENC_UNKNOWN, we'll unset the key
|
|
165
|
+
if enctype == TACACS_SERVER_ENC_UNKNOWN
|
|
166
|
+
# if current encryption type is not TACACS_SERVER_ENC_UNKNOWN, we need
|
|
167
|
+
# to unset the key value. Otherwise, the box is not configured with key,
|
|
168
|
+
# thus we don't need to do anything
|
|
169
|
+
if encryption_type != TACACS_SERVER_ENC_UNKNOWN
|
|
170
|
+
config_set('tacacs_server_host',
|
|
171
|
+
'encryption',
|
|
172
|
+
state: 'no',
|
|
173
|
+
ip: @name,
|
|
174
|
+
port: @port,
|
|
175
|
+
enc_type: encryption_type,
|
|
176
|
+
password: encryption_password)
|
|
177
|
+
end
|
|
178
|
+
else
|
|
179
|
+
config_set('tacacs_server_host',
|
|
180
|
+
'encryption',
|
|
181
|
+
state: '',
|
|
182
|
+
ip: @name,
|
|
183
|
+
port: @port,
|
|
184
|
+
enc_type: enctype,
|
|
185
|
+
password: password)
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def timeout
|
|
190
|
+
config_get('tacacs_server_host',
|
|
191
|
+
'timeout',
|
|
192
|
+
ip: @name,
|
|
193
|
+
port: @port)
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
def timeout=(t)
|
|
197
|
+
fail TypeError unless t.is_a? Fixnum
|
|
198
|
+
return if t == timeout
|
|
199
|
+
|
|
200
|
+
config_set('tacacs_server_host',
|
|
201
|
+
'timeout',
|
|
202
|
+
state: '',
|
|
203
|
+
ip: @name,
|
|
204
|
+
port: @port,
|
|
205
|
+
timeout: t)
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
def self.default_timeout
|
|
209
|
+
config_get_default('tacacs_server_host', 'timeout')
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def ==(other)
|
|
213
|
+
name == other.name
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
end
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# October 2016, Michael G Wiebe and Rahul Shenoy
|
|
2
|
+
#
|
|
3
|
+
# Copyright (c) 2016-2017 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
|
+
require_relative 'logger'
|
|
19
|
+
|
|
20
|
+
module Cisco
|
|
21
|
+
# Upgrade - node util class for upgrading Cisco devices
|
|
22
|
+
class Upgrade < NodeUtil
|
|
23
|
+
# Delete install logs from previous installation
|
|
24
|
+
def self.clear_status
|
|
25
|
+
config_set('upgrade', 'clear_status')
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Deletes 'image' from 'uri'
|
|
29
|
+
def self.delete(image, uri='bootflash:')
|
|
30
|
+
config_set('upgrade', 'delete', image: image, uri: uri)
|
|
31
|
+
rescue Cisco::CliError => e
|
|
32
|
+
raise e
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Deletes currently booted image
|
|
36
|
+
def self.delete_boot(uri='bootflash:')
|
|
37
|
+
# Incase of a N9K, N3K and N9Kv the system and kickstart images are
|
|
38
|
+
# the same.
|
|
39
|
+
# Incase of a N5K, N6K and N7K the system and kickstart images are
|
|
40
|
+
# different.
|
|
41
|
+
system_image = config_get('show_version', 'system_image').split('/')[-1]
|
|
42
|
+
kickstart_image = config_get('show_version', 'boot_image').split('/')[-1]
|
|
43
|
+
if kickstart_image == system_image
|
|
44
|
+
config_set('upgrade', 'delete_boot', image: system_image, uri: uri)
|
|
45
|
+
else
|
|
46
|
+
config_set('upgrade', 'delete_boot', image: system_image,
|
|
47
|
+
uri: uri)
|
|
48
|
+
config_set('upgrade', 'delete_boot', image: kickstart_image,
|
|
49
|
+
uri: uri)
|
|
50
|
+
end
|
|
51
|
+
rescue Cisco::CliError => e
|
|
52
|
+
raise e
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Returns version of the 'image'
|
|
56
|
+
def self.image_version(image=nil, uri=nil)
|
|
57
|
+
# Returns version of currently booted image by default
|
|
58
|
+
if image && uri
|
|
59
|
+
config_get('upgrade', 'image_version', image: image, uri: uri)
|
|
60
|
+
else
|
|
61
|
+
version = config_get('show_version', 'version')
|
|
62
|
+
# show version displays version differently for release and
|
|
63
|
+
# development builds.
|
|
64
|
+
# Eg: release build
|
|
65
|
+
# NXOS: version 7.0(3)I4(2)
|
|
66
|
+
# Eg: development build
|
|
67
|
+
# NXOS: version 7.0(3)IFD6(1) [build 7.0(3)IGD7(0.65)]
|
|
68
|
+
return version unless version[/build\s+\S+/]
|
|
69
|
+
version.split(' ')[-1].split(']')[0]
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Return the nxos image installed on the device
|
|
74
|
+
def self.package
|
|
75
|
+
config_get('show_version', 'system_image')
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Return true if box is online and config mode is ready to be used
|
|
79
|
+
def self.box_online?
|
|
80
|
+
output = config_set('upgrade', 'is_box_online')
|
|
81
|
+
output[0]['body'] == {}
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def self.save_config
|
|
85
|
+
config_set('upgrade', 'save_config')
|
|
86
|
+
rescue Cisco::CliError => e
|
|
87
|
+
raise e
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Returns True if device upgraded
|
|
91
|
+
def self.upgraded?
|
|
92
|
+
return false unless config_get('upgrade', 'upgraded')
|
|
93
|
+
(0..500).each do
|
|
94
|
+
sleep 1
|
|
95
|
+
return true if box_online?
|
|
96
|
+
end
|
|
97
|
+
fail 'Configuration is still blocked'
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Attempts to upgrade the device to 'image'
|
|
101
|
+
def self.upgrade(image, uri='bootflash:', del_boot=false,
|
|
102
|
+
force_all=false)
|
|
103
|
+
delete_boot(uri) if del_boot
|
|
104
|
+
force_all ? upgrade_str = 'upgrade_force' : upgrade_str = 'upgrade'
|
|
105
|
+
begin
|
|
106
|
+
Cisco::Logger.debug("Upgrading to version: #{image}")
|
|
107
|
+
config_set('upgrade', upgrade_str, image: image, uri: uri)
|
|
108
|
+
rescue Cisco::RequestFailed, Cisco::CliError => e1
|
|
109
|
+
# raise if install command failed
|
|
110
|
+
raise e1 if e1.class == Cisco::CliError
|
|
111
|
+
# Catch 'Backend Processing Error'. Install continues inspite of the
|
|
112
|
+
# error thrown. Resend install command and expect a CliError.
|
|
113
|
+
begin
|
|
114
|
+
config_set('upgrade', upgrade_str, image: image, uri: uri)
|
|
115
|
+
rescue Cisco::CliError => e2
|
|
116
|
+
raise e2 unless
|
|
117
|
+
e2.message.include?('Another install procedure may be in progress')
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
#
|
|
2
|
+
# NXAPI implementation of VDC class
|
|
3
|
+
#
|
|
4
|
+
# December 2015, Chris Van Heuveln
|
|
5
|
+
#
|
|
6
|
+
# Copyright (c) 2015-2016 Cisco and/or its affiliates.
|
|
7
|
+
#
|
|
8
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
9
|
+
# you may not use this file except in compliance with the License.
|
|
10
|
+
# You may obtain a copy of the License at
|
|
11
|
+
#
|
|
12
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
13
|
+
#
|
|
14
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
15
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
16
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
17
|
+
# See the License for the specific language governing permissions and
|
|
18
|
+
# limitations under the License.
|
|
19
|
+
|
|
20
|
+
require_relative 'node_util'
|
|
21
|
+
|
|
22
|
+
module Cisco
|
|
23
|
+
# node_utils class for vdc
|
|
24
|
+
class Vdc < NodeUtil
|
|
25
|
+
attr_reader :name
|
|
26
|
+
|
|
27
|
+
def initialize(name, instantiate=true)
|
|
28
|
+
@vdc = (name == 'default') ? Vdc.default_vdc_name : name
|
|
29
|
+
create if instantiate
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def self.vdcs
|
|
33
|
+
hash = {}
|
|
34
|
+
vdc_list = config_get('vdc', 'all_vdcs')
|
|
35
|
+
return hash if vdc_list.nil?
|
|
36
|
+
|
|
37
|
+
vdc_list.each do |vdc_name|
|
|
38
|
+
hash[vdc_name] = Vdc.new(vdc_name, false)
|
|
39
|
+
end
|
|
40
|
+
hash
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def self.vdc_support
|
|
44
|
+
config_get('vdc', 'vdc_support')
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def self.default_vdc_name
|
|
48
|
+
vdc = config_get('vdc', 'default_vdc_name')
|
|
49
|
+
fail 'default vdc not found, platform may not support vdc' if vdc.nil?
|
|
50
|
+
vdc
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def create
|
|
54
|
+
fail ArgumentError,
|
|
55
|
+
'There is currently no support for non-default VDCs' unless
|
|
56
|
+
@vdc == Vdc.default_vdc_name
|
|
57
|
+
# noop for 'default' vdc
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def ==(other)
|
|
61
|
+
name == other.name
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
########################################################
|
|
65
|
+
# PROPERTIES #
|
|
66
|
+
########################################################
|
|
67
|
+
|
|
68
|
+
def allocate_interface
|
|
69
|
+
# TBD: This property is only partially implemented because it is currently
|
|
70
|
+
# only used for minitest & beaker.
|
|
71
|
+
config_get('vdc', 'allocate_interface', vdc: @vdc)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def limit_resource_module_type
|
|
75
|
+
str = config_get('vdc', 'limit_resource_module_type', vdc: @vdc)
|
|
76
|
+
str.strip! unless str.nil?
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def limit_resource_module_type=(mods)
|
|
80
|
+
state = mods.empty? ? 'no' : ''
|
|
81
|
+
begin
|
|
82
|
+
# limit-resource commands are time-consuming and process in the
|
|
83
|
+
# background. Back-to-back LR commands may fail if processed too
|
|
84
|
+
# quickly.
|
|
85
|
+
config_set('vdc', 'limit_resource_module_type',
|
|
86
|
+
state: state, vdc: @vdc, mods: mods)
|
|
87
|
+
|
|
88
|
+
# TBD: No interfaces are allocated after changing the module-type
|
|
89
|
+
# so 'allocate' is needed to make this useful. Consider moving
|
|
90
|
+
# this into it's own property.
|
|
91
|
+
config_set('vdc', 'allocate_interface_unallocated', vdc: @vdc)
|
|
92
|
+
|
|
93
|
+
rescue CliError => e
|
|
94
|
+
count ||= 1
|
|
95
|
+
if e.message[/VDC is not in active state/] && (count += 1) < 10
|
|
96
|
+
retry
|
|
97
|
+
end
|
|
98
|
+
raise
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def default_limit_resource_module_type
|
|
103
|
+
config_get_default('vdc', 'limit_resource_module_type')
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def interface_membership
|
|
107
|
+
config_get('vdc', 'membership', vdc: @vdc)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def interface_membership=(intf)
|
|
111
|
+
config_set('vdc', 'membership', vdc: @vdc, intf: intf)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def default_interface_membership
|
|
115
|
+
config_get_default('vdc', 'membership')
|
|
116
|
+
end
|
|
117
|
+
end # Class
|
|
118
|
+
end # Module
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Copyright (c) 2015-2018 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
|
+
# Container module for version number only.
|
|
16
|
+
module CiscoNodeUtils
|
|
17
|
+
VERSION = '2.1.0.1'
|
|
18
|
+
gem_version = Gem::Version.new(Gem::VERSION)
|
|
19
|
+
min_gem_version = Gem::Version.new('2.1.0')
|
|
20
|
+
fail 'Required rubygems version >= 2.1.0' if gem_version < min_gem_version
|
|
21
|
+
end
|