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.
Files changed (357) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +96 -0
  5. data/.travis.yml +17 -0
  6. data/CHANGELOG.md +676 -0
  7. data/CONTRIBUTING.md +43 -0
  8. data/Gemfile +10 -0
  9. data/LICENSE +201 -0
  10. data/README.md +246 -0
  11. data/Rakefile +44 -0
  12. data/SUPPORT.md +3 -0
  13. data/bin/.rubocop.yml +18 -0
  14. data/bin/check_metric_limits.rb +109 -0
  15. data/bin/git/hooks/commit-msg/enforce_style +89 -0
  16. data/bin/git/hooks/hook_lib +115 -0
  17. data/bin/git/hooks/hooks-wrapper +38 -0
  18. data/bin/git/hooks/post-flow-hotfix-start/update-version +24 -0
  19. data/bin/git/hooks/post-flow-release-finish/update-version +29 -0
  20. data/bin/git/hooks/post-flow-release-start/update-version +19 -0
  21. data/bin/git/hooks/post-merge/update-hooks +6 -0
  22. data/bin/git/hooks/post-rewrite/update-hooks +6 -0
  23. data/bin/git/hooks/pre-commit/check_unstaged_changes +18 -0
  24. data/bin/git/hooks/pre-commit/rubocop +25 -0
  25. data/bin/git/hooks/pre-commit/validate-diffs +45 -0
  26. data/bin/git/hooks/pre-commit/validate-yaml +18 -0
  27. data/bin/git/hooks/pre-push/check-changelog +24 -0
  28. data/bin/git/hooks/pre-push/rubocop +7 -0
  29. data/bin/git/update-hooks +123 -0
  30. data/bin/show_running_yang.rb +233 -0
  31. data/cisco_node_utils.gemspec +41 -0
  32. data/docs/README-develop-best-practices.md +521 -0
  33. data/docs/README-develop-node-utils-APIs.md +570 -0
  34. data/docs/README-maintainers.md +77 -0
  35. data/docs/README-test-execution.md +57 -0
  36. data/docs/README-utilities.md +14 -0
  37. data/docs/agent_files.png +0 -0
  38. data/docs/cisco_node_utils.yaml.example +36 -0
  39. data/docs/template-router.rb +123 -0
  40. data/docs/template-test_router.rb +104 -0
  41. data/ext/mkrf_conf.rb +63 -0
  42. data/lib/.rubocop.yml +18 -0
  43. data/lib/cisco_node_utils/aaa_authentication_login.rb +95 -0
  44. data/lib/cisco_node_utils/aaa_authentication_login_service.rb +138 -0
  45. data/lib/cisco_node_utils/aaa_authorization_service.rb +156 -0
  46. data/lib/cisco_node_utils/ace.rb +467 -0
  47. data/lib/cisco_node_utils/acl.rb +101 -0
  48. data/lib/cisco_node_utils/banner.rb +63 -0
  49. data/lib/cisco_node_utils/bfd_global.rb +305 -0
  50. data/lib/cisco_node_utils/bgp.rb +988 -0
  51. data/lib/cisco_node_utils/bgp_af.rb +545 -0
  52. data/lib/cisco_node_utils/bgp_af_aggr_addr.rb +207 -0
  53. data/lib/cisco_node_utils/bgp_neighbor.rb +527 -0
  54. data/lib/cisco_node_utils/bgp_neighbor_af.rb +780 -0
  55. data/lib/cisco_node_utils/bridge_domain.rb +178 -0
  56. data/lib/cisco_node_utils/bridge_domain_vni.rb +206 -0
  57. data/lib/cisco_node_utils/cisco_cmn_utils.rb +444 -0
  58. data/lib/cisco_node_utils/client/client.rb +238 -0
  59. data/lib/cisco_node_utils/client/grpc/client.rb +395 -0
  60. data/lib/cisco_node_utils/client/grpc/ems.proto +148 -0
  61. data/lib/cisco_node_utils/client/grpc/ems.rb +111 -0
  62. data/lib/cisco_node_utils/client/grpc/ems_services.rb +49 -0
  63. data/lib/cisco_node_utils/client/grpc.rb +33 -0
  64. data/lib/cisco_node_utils/client/nxapi/client.rb +368 -0
  65. data/lib/cisco_node_utils/client/nxapi.rb +31 -0
  66. data/lib/cisco_node_utils/client/utils.rb +180 -0
  67. data/lib/cisco_node_utils/client.rb +35 -0
  68. data/lib/cisco_node_utils/cmd_ref/README_YAML.md +590 -0
  69. data/lib/cisco_node_utils/cmd_ref/aaa_auth_login_service.yaml +25 -0
  70. data/lib/cisco_node_utils/cmd_ref/aaa_authentication_login.yaml +38 -0
  71. data/lib/cisco_node_utils/cmd_ref/aaa_authorization_service.yaml +40 -0
  72. data/lib/cisco_node_utils/cmd_ref/acl.yaml +48 -0
  73. data/lib/cisco_node_utils/cmd_ref/banner.yaml +11 -0
  74. data/lib/cisco_node_utils/cmd_ref/bfd_global.yaml +117 -0
  75. data/lib/cisco_node_utils/cmd_ref/bgp.yaml +383 -0
  76. data/lib/cisco_node_utils/cmd_ref/bgp_af.yaml +223 -0
  77. data/lib/cisco_node_utils/cmd_ref/bgp_af_aa.yaml +38 -0
  78. data/lib/cisco_node_utils/cmd_ref/bgp_neighbor.yaml +174 -0
  79. data/lib/cisco_node_utils/cmd_ref/bgp_neighbor_af.yaml +236 -0
  80. data/lib/cisco_node_utils/cmd_ref/bridge_domain.yaml +49 -0
  81. data/lib/cisco_node_utils/cmd_ref/bridge_domain_vni.yaml +33 -0
  82. data/lib/cisco_node_utils/cmd_ref/dhcp_relay_global.yaml +128 -0
  83. data/lib/cisco_node_utils/cmd_ref/dnsclient.yaml +55 -0
  84. data/lib/cisco_node_utils/cmd_ref/encapsulation.yaml +25 -0
  85. data/lib/cisco_node_utils/cmd_ref/evpn_multicast.yaml +12 -0
  86. data/lib/cisco_node_utils/cmd_ref/evpn_multisite.yaml +18 -0
  87. data/lib/cisco_node_utils/cmd_ref/evpn_stormcontrol.yaml +18 -0
  88. data/lib/cisco_node_utils/cmd_ref/evpn_vni.yaml +48 -0
  89. data/lib/cisco_node_utils/cmd_ref/fabricpath.yaml +183 -0
  90. data/lib/cisco_node_utils/cmd_ref/fabricpath_topology.yaml +40 -0
  91. data/lib/cisco_node_utils/cmd_ref/feature.yaml +126 -0
  92. data/lib/cisco_node_utils/cmd_ref/hostname.yaml +8 -0
  93. data/lib/cisco_node_utils/cmd_ref/hsrp_global.yaml +25 -0
  94. data/lib/cisco_node_utils/cmd_ref/images.yaml +8 -0
  95. data/lib/cisco_node_utils/cmd_ref/interface.yaml +781 -0
  96. data/lib/cisco_node_utils/cmd_ref/interface_channel_group.yaml +45 -0
  97. data/lib/cisco_node_utils/cmd_ref/interface_evpn_multisite.yaml +17 -0
  98. data/lib/cisco_node_utils/cmd_ref/interface_hsrp_group.yaml +120 -0
  99. data/lib/cisco_node_utils/cmd_ref/interface_ospf.yaml +112 -0
  100. data/lib/cisco_node_utils/cmd_ref/interface_portchannel.yaml +87 -0
  101. data/lib/cisco_node_utils/cmd_ref/interface_service_vni.yaml +42 -0
  102. data/lib/cisco_node_utils/cmd_ref/inventory.yaml +45 -0
  103. data/lib/cisco_node_utils/cmd_ref/ip_multicast.yaml +22 -0
  104. data/lib/cisco_node_utils/cmd_ref/itd_device_group.yaml +83 -0
  105. data/lib/cisco_node_utils/cmd_ref/itd_service.yaml +119 -0
  106. data/lib/cisco_node_utils/cmd_ref/memory.yaml +24 -0
  107. data/lib/cisco_node_utils/cmd_ref/ntp_auth_key.yaml +10 -0
  108. data/lib/cisco_node_utils/cmd_ref/ntp_config.yaml +27 -0
  109. data/lib/cisco_node_utils/cmd_ref/ntp_server.yaml +34 -0
  110. data/lib/cisco_node_utils/cmd_ref/object_group.yaml +32 -0
  111. data/lib/cisco_node_utils/cmd_ref/ospf.yaml +91 -0
  112. data/lib/cisco_node_utils/cmd_ref/ospf_area.yaml +91 -0
  113. data/lib/cisco_node_utils/cmd_ref/ospf_area_vlink.yaml +88 -0
  114. data/lib/cisco_node_utils/cmd_ref/overlay_global.yaml +37 -0
  115. data/lib/cisco_node_utils/cmd_ref/pim.yaml +43 -0
  116. data/lib/cisco_node_utils/cmd_ref/portchannel_global.yaml +86 -0
  117. data/lib/cisco_node_utils/cmd_ref/radius_global.yaml +37 -0
  118. data/lib/cisco_node_utils/cmd_ref/radius_server.yaml +100 -0
  119. data/lib/cisco_node_utils/cmd_ref/radius_server_group.yaml +19 -0
  120. data/lib/cisco_node_utils/cmd_ref/route_map.yaml +601 -0
  121. data/lib/cisco_node_utils/cmd_ref/show_system.yaml +9 -0
  122. data/lib/cisco_node_utils/cmd_ref/show_version.yaml +84 -0
  123. data/lib/cisco_node_utils/cmd_ref/snmp_community.yaml +81 -0
  124. data/lib/cisco_node_utils/cmd_ref/snmp_group.yaml +9 -0
  125. data/lib/cisco_node_utils/cmd_ref/snmp_notification_receiver.yaml +74 -0
  126. data/lib/cisco_node_utils/cmd_ref/snmp_server.yaml +91 -0
  127. data/lib/cisco_node_utils/cmd_ref/snmp_user.yaml +57 -0
  128. data/lib/cisco_node_utils/cmd_ref/snmpnotification.yaml +23 -0
  129. data/lib/cisco_node_utils/cmd_ref/span_session.yaml +65 -0
  130. data/lib/cisco_node_utils/cmd_ref/stp_global.yaml +235 -0
  131. data/lib/cisco_node_utils/cmd_ref/syslog_facility.yaml +10 -0
  132. data/lib/cisco_node_utils/cmd_ref/syslog_server.yaml +34 -0
  133. data/lib/cisco_node_utils/cmd_ref/syslog_settings.yaml +45 -0
  134. data/lib/cisco_node_utils/cmd_ref/system.yaml +7 -0
  135. data/lib/cisco_node_utils/cmd_ref/tacacs_global.yaml +37 -0
  136. data/lib/cisco_node_utils/cmd_ref/tacacs_server.yaml +63 -0
  137. data/lib/cisco_node_utils/cmd_ref/tacacs_server_group.yaml +45 -0
  138. data/lib/cisco_node_utils/cmd_ref/tacacs_server_host.yaml +64 -0
  139. data/lib/cisco_node_utils/cmd_ref/upgrade.yaml +38 -0
  140. data/lib/cisco_node_utils/cmd_ref/vdc.yaml +52 -0
  141. data/lib/cisco_node_utils/cmd_ref/virtual_service.yaml +8 -0
  142. data/lib/cisco_node_utils/cmd_ref/vlan.yaml +106 -0
  143. data/lib/cisco_node_utils/cmd_ref/vpc.yaml +233 -0
  144. data/lib/cisco_node_utils/cmd_ref/vrf.yaml +86 -0
  145. data/lib/cisco_node_utils/cmd_ref/vrf_af.yaml +139 -0
  146. data/lib/cisco_node_utils/cmd_ref/vtp.yaml +32 -0
  147. data/lib/cisco_node_utils/cmd_ref/vxlan_vtep.yaml +114 -0
  148. data/lib/cisco_node_utils/cmd_ref/vxlan_vtep_vni.yaml +71 -0
  149. data/lib/cisco_node_utils/cmd_ref/yang.yaml +7 -0
  150. data/lib/cisco_node_utils/cmd_ref/yum.yaml +68 -0
  151. data/lib/cisco_node_utils/command_reference.rb +724 -0
  152. data/lib/cisco_node_utils/configparser_lib.rb +195 -0
  153. data/lib/cisco_node_utils/constants.rb +40 -0
  154. data/lib/cisco_node_utils/dhcp_relay_global.rb +302 -0
  155. data/lib/cisco_node_utils/dns_domain.rb +93 -0
  156. data/lib/cisco_node_utils/domain_name.rb +82 -0
  157. data/lib/cisco_node_utils/encapsulation.rb +112 -0
  158. data/lib/cisco_node_utils/environment.rb +110 -0
  159. data/lib/cisco_node_utils/evpn_multicast.rb +66 -0
  160. data/lib/cisco_node_utils/evpn_multisite.rb +96 -0
  161. data/lib/cisco_node_utils/evpn_stormcontrol.rb +84 -0
  162. data/lib/cisco_node_utils/evpn_vni.rb +159 -0
  163. data/lib/cisco_node_utils/exceptions.rb +140 -0
  164. data/lib/cisco_node_utils/fabricpath_global.rb +405 -0
  165. data/lib/cisco_node_utils/fabricpath_topology.rb +137 -0
  166. data/lib/cisco_node_utils/feature.rb +377 -0
  167. data/lib/cisco_node_utils/hostname.rb +62 -0
  168. data/lib/cisco_node_utils/hsrp_global.rb +97 -0
  169. data/lib/cisco_node_utils/interface.rb +2128 -0
  170. data/lib/cisco_node_utils/interface_channel_group.rb +142 -0
  171. data/lib/cisco_node_utils/interface_evpn_multisite.rb +72 -0
  172. data/lib/cisco_node_utils/interface_hsrp_group.rb +557 -0
  173. data/lib/cisco_node_utils/interface_ospf.rb +378 -0
  174. data/lib/cisco_node_utils/interface_portchannel.rb +180 -0
  175. data/lib/cisco_node_utils/interface_service_vni.rb +132 -0
  176. data/lib/cisco_node_utils/ip_multicast.rb +90 -0
  177. data/lib/cisco_node_utils/itd_device_group.rb +228 -0
  178. data/lib/cisco_node_utils/itd_device_group_node.rb +144 -0
  179. data/lib/cisco_node_utils/itd_service.rb +511 -0
  180. data/lib/cisco_node_utils/logger.rb +78 -0
  181. data/lib/cisco_node_utils/name_server.rb +64 -0
  182. data/lib/cisco_node_utils/node.rb +443 -0
  183. data/lib/cisco_node_utils/node_util.rb +111 -0
  184. data/lib/cisco_node_utils/ntp_auth_key.rb +67 -0
  185. data/lib/cisco_node_utils/ntp_config.rb +83 -0
  186. data/lib/cisco_node_utils/ntp_server.rb +86 -0
  187. data/lib/cisco_node_utils/object_group.rb +75 -0
  188. data/lib/cisco_node_utils/object_group_entry.rb +143 -0
  189. data/lib/cisco_node_utils/overlay_global.rb +142 -0
  190. data/lib/cisco_node_utils/pim.rb +131 -0
  191. data/lib/cisco_node_utils/pim_group_list.rb +109 -0
  192. data/lib/cisco_node_utils/pim_rp_address.rb +103 -0
  193. data/lib/cisco_node_utils/platform.rb +217 -0
  194. data/lib/cisco_node_utils/portchannel_global.rb +347 -0
  195. data/lib/cisco_node_utils/radius_global.rb +165 -0
  196. data/lib/cisco_node_utils/radius_server.rb +421 -0
  197. data/lib/cisco_node_utils/radius_server_group.rb +117 -0
  198. data/lib/cisco_node_utils/route_map.rb +2540 -0
  199. data/lib/cisco_node_utils/router_ospf.rb +77 -0
  200. data/lib/cisco_node_utils/router_ospf_area.rb +416 -0
  201. data/lib/cisco_node_utils/router_ospf_area_vlink.rb +313 -0
  202. data/lib/cisco_node_utils/router_ospf_vrf.rb +342 -0
  203. data/lib/cisco_node_utils/snmp_notification_receiver.rb +176 -0
  204. data/lib/cisco_node_utils/snmpcommunity.rb +109 -0
  205. data/lib/cisco_node_utils/snmpgroup.rb +54 -0
  206. data/lib/cisco_node_utils/snmpnotification.rb +57 -0
  207. data/lib/cisco_node_utils/snmpserver.rb +132 -0
  208. data/lib/cisco_node_utils/snmpuser.rb +403 -0
  209. data/lib/cisco_node_utils/span_session.rb +149 -0
  210. data/lib/cisco_node_utils/stp_global.rb +676 -0
  211. data/lib/cisco_node_utils/syslog_facility.rb +64 -0
  212. data/lib/cisco_node_utils/syslog_server.rb +146 -0
  213. data/lib/cisco_node_utils/syslog_settings.rb +174 -0
  214. data/lib/cisco_node_utils/tacacs_global.rb +137 -0
  215. data/lib/cisco_node_utils/tacacs_server.rb +173 -0
  216. data/lib/cisco_node_utils/tacacs_server_group.rb +149 -0
  217. data/lib/cisco_node_utils/tacacs_server_host.rb +216 -0
  218. data/lib/cisco_node_utils/upgrade.rb +122 -0
  219. data/lib/cisco_node_utils/vdc.rb +118 -0
  220. data/lib/cisco_node_utils/version.rb +21 -0
  221. data/lib/cisco_node_utils/vlan.rb +301 -0
  222. data/lib/cisco_node_utils/vpc.rb +466 -0
  223. data/lib/cisco_node_utils/vrf.rb +192 -0
  224. data/lib/cisco_node_utils/vrf_af.rb +327 -0
  225. data/lib/cisco_node_utils/vtp.rb +125 -0
  226. data/lib/cisco_node_utils/vxlan_vtep.rb +286 -0
  227. data/lib/cisco_node_utils/vxlan_vtep_vni.rb +331 -0
  228. data/lib/cisco_node_utils/yang.rb +160 -0
  229. data/lib/cisco_node_utils/yum.rb +213 -0
  230. data/lib/cisco_node_utils.rb +21 -0
  231. data/lib/minitest/environment_plugin.rb +31 -0
  232. data/lib/minitest/log_level_plugin.rb +41 -0
  233. data/spec/client_spec.rb +7 -0
  234. data/spec/environment_spec.rb +384 -0
  235. data/spec/grpc_client_spec.rb +23 -0
  236. data/spec/isolate/all_clients_spec.rb +9 -0
  237. data/spec/isolate/grpc_only_spec.rb +16 -0
  238. data/spec/isolate/no_clients_spec.rb +26 -0
  239. data/spec/isolate/nxapi_only_spec.rb +16 -0
  240. data/spec/nxapi_client_spec.rb +42 -0
  241. data/spec/schema.yaml +82 -0
  242. data/spec/shared_examples_for_clients.rb +14 -0
  243. data/spec/spec_helper.rb +91 -0
  244. data/spec/whitespace_spec.rb +10 -0
  245. data/spec/yaml_spec.rb +42 -0
  246. data/tests/.rubocop.yml +18 -0
  247. data/tests/CSCuxdublin-1.0.0-7.0.3.I3.1.lib32_n9000.rpm +0 -0
  248. data/tests/basetest.rb +243 -0
  249. data/tests/ciscotest.rb +577 -0
  250. data/tests/cmd_config.yaml +75 -0
  251. data/tests/cmd_config_invalid.yaml +16 -0
  252. data/tests/n9000_sample-1.0.0-7.0.3.x86_64.rpm +0 -0
  253. data/tests/noop.rb +7 -0
  254. data/tests/platform_info.rb +63 -0
  255. data/tests/tacacs_server.yaml.example +6 -0
  256. data/tests/test_aaa_authentication_login.rb +243 -0
  257. data/tests/test_aaa_authentication_login_service.rb +761 -0
  258. data/tests/test_aaa_authorization_service.rb +874 -0
  259. data/tests/test_ace.rb +304 -0
  260. data/tests/test_acl.rb +185 -0
  261. data/tests/test_banner.rb +85 -0
  262. data/tests/test_bfd_global.rb +272 -0
  263. data/tests/test_bgp_af.rb +875 -0
  264. data/tests/test_bgp_af_aa.rb +108 -0
  265. data/tests/test_bgp_neighbor.rb +596 -0
  266. data/tests/test_bgp_neighbor_af.rb +781 -0
  267. data/tests/test_bridge_domain.rb +198 -0
  268. data/tests/test_bridge_domain_vni.rb +109 -0
  269. data/tests/test_client_utils.rb +111 -0
  270. data/tests/test_cmn_utils.rb +76 -0
  271. data/tests/test_command_config.rb +206 -0
  272. data/tests/test_command_reference.rb +669 -0
  273. data/tests/test_dhcp_relay_global.rb +286 -0
  274. data/tests/test_dns_domain.rb +123 -0
  275. data/tests/test_domain_name.rb +96 -0
  276. data/tests/test_encapsulation.rb +75 -0
  277. data/tests/test_evpn_multicast.rb +65 -0
  278. data/tests/test_evpn_multisite.rb +70 -0
  279. data/tests/test_evpn_stormcontrol.rb +56 -0
  280. data/tests/test_evpn_vni.rb +131 -0
  281. data/tests/test_fabricpath_global.rb +246 -0
  282. data/tests/test_fabricpath_topology.rb +77 -0
  283. data/tests/test_feature.rb +272 -0
  284. data/tests/test_grpc.rb +166 -0
  285. data/tests/test_hostname.rb +64 -0
  286. data/tests/test_hsrp_global.rb +79 -0
  287. data/tests/test_interface.rb +1958 -0
  288. data/tests/test_interface_bdi.rb +80 -0
  289. data/tests/test_interface_channel_group.rb +131 -0
  290. data/tests/test_interface_evpn_multisite.rb +94 -0
  291. data/tests/test_interface_hsrp.rb +134 -0
  292. data/tests/test_interface_hsrp_group.rb +570 -0
  293. data/tests/test_interface_ospf.rb +820 -0
  294. data/tests/test_interface_portchannel.rb +135 -0
  295. data/tests/test_interface_private_vlan.rb +365 -0
  296. data/tests/test_interface_service_vni.rb +203 -0
  297. data/tests/test_interface_svi.rb +210 -0
  298. data/tests/test_interface_switchport.rb +468 -0
  299. data/tests/test_ip_multicast.rb +80 -0
  300. data/tests/test_itd_device_group.rb +145 -0
  301. data/tests/test_itd_device_group_node.rb +199 -0
  302. data/tests/test_itd_service.rb +314 -0
  303. data/tests/test_logger.rb +43 -0
  304. data/tests/test_name_server.rb +94 -0
  305. data/tests/test_node.rb +50 -0
  306. data/tests/test_node_ext.rb +406 -0
  307. data/tests/test_node_util.rb +119 -0
  308. data/tests/test_ntp_auth_key.rb +77 -0
  309. data/tests/test_ntp_config.rb +100 -0
  310. data/tests/test_ntp_server.rb +146 -0
  311. data/tests/test_nxapi.rb +236 -0
  312. data/tests/test_object_group.rb +122 -0
  313. data/tests/test_overlay_global.rb +108 -0
  314. data/tests/test_pim.rb +203 -0
  315. data/tests/test_pim_group_list.rb +147 -0
  316. data/tests/test_pim_rp_address.rb +155 -0
  317. data/tests/test_platform.rb +254 -0
  318. data/tests/test_portchannel_global.rb +322 -0
  319. data/tests/test_radius_global.rb +108 -0
  320. data/tests/test_radius_server.rb +377 -0
  321. data/tests/test_radius_server_group.rb +151 -0
  322. data/tests/test_route_map.rb +1479 -0
  323. data/tests/test_router_bgp.rb +1325 -0
  324. data/tests/test_router_ospf.rb +56 -0
  325. data/tests/test_router_ospf_area.rb +433 -0
  326. data/tests/test_router_ospf_area_vlink.rb +298 -0
  327. data/tests/test_router_ospf_vrf.rb +690 -0
  328. data/tests/test_snmp_notification_receiver.rb +169 -0
  329. data/tests/test_snmpcommunity.rb +422 -0
  330. data/tests/test_snmpgroup.rb +71 -0
  331. data/tests/test_snmpnotification.rb +91 -0
  332. data/tests/test_snmpserver.rb +251 -0
  333. data/tests/test_snmpuser.rb +666 -0
  334. data/tests/test_span_session.rb +155 -0
  335. data/tests/test_stp_global.rb +575 -0
  336. data/tests/test_syslog_facility.rb +80 -0
  337. data/tests/test_syslog_server.rb +119 -0
  338. data/tests/test_syslog_settings.rb +123 -0
  339. data/tests/test_tacacs_global.rb +109 -0
  340. data/tests/test_tacacs_server.rb +436 -0
  341. data/tests/test_tacacs_server_group.rb +434 -0
  342. data/tests/test_tacacs_server_host.rb +427 -0
  343. data/tests/test_upgrade.rb +105 -0
  344. data/tests/test_vdc.rb +64 -0
  345. data/tests/test_vlan.rb +386 -0
  346. data/tests/test_vlan_private.rb +656 -0
  347. data/tests/test_vpc.rb +548 -0
  348. data/tests/test_vrf.rb +248 -0
  349. data/tests/test_vrf_af.rb +288 -0
  350. data/tests/test_vtp.rb +278 -0
  351. data/tests/test_vxlan_vtep.rb +327 -0
  352. data/tests/test_vxlan_vtep_vni.rb +326 -0
  353. data/tests/test_yang.rb +369 -0
  354. data/tests/test_yum.rb +109 -0
  355. data/tests/upgrade_info.yaml.example +3 -0
  356. data/tests/yum_package.yaml +94 -0
  357. metadata +534 -0
@@ -0,0 +1,57 @@
1
+ # Executing the tests provided for this gem
2
+
3
+ ## RSpec tests
4
+
5
+ The test files located in the `spec/` directory use [RSpec](http://rspec.info/) as their test framework. These tests are generally standalone and do not generally require any actual Cisco hardware or virtual machines to test against.
6
+
7
+ ### Running a single RSpec test
8
+
9
+ You can execute a single spec file by name:
10
+
11
+ ```bash
12
+ rspec spec/environment_spec.rb
13
+ ```
14
+
15
+ ### Running all RSpec tests
16
+
17
+
18
+ ```bash
19
+ rake spec
20
+ ```
21
+
22
+ ## Minitest tests
23
+
24
+ The test files located in the `tests/` directory use [minitest](https://github.com/seattlerb/minitest/) as their test framework. These tests generally require one or more Cisco routers, switches, or virtual machines to test against.
25
+
26
+ It is recommended that you create a `cisco_node_utils.yaml` file (as described in [README.md](../README.md#configuration) to specify the node(s) under test, but if you do not create such a file, the test will prompt you to enter the required information at runtime:
27
+
28
+ ```bash
29
+ $ rake test
30
+ Enter address or hostname of node under test: 192.168.100.1
31
+ Enter username for node under test: user
32
+ Enter password for node under test: password
33
+ ```
34
+
35
+ ### Running a single minitest test
36
+
37
+ You can execute a single test file by name. If you do not specify the `-e` / `--environment` option, the node labeled as `default` in `cisco_node_utils.yaml` will be used (or, if no such entry exists, you will be prompted to enter the required information as shown above):
38
+
39
+ ```bash
40
+ # Run test against the 'default' node:
41
+ $ ruby tests/test_node.rb
42
+ # Run test against node 'n7k':
43
+ $ ruby tests/test_node.rb --environment n7k
44
+ # Run test against node 'n9k':
45
+ $ ruby tests/test_node.rb -e n9k
46
+ ```
47
+
48
+ ### Running all minitest tests
49
+
50
+ As above, if you do not specify the `--environment` option, the `default` node will be used or you will be prompted if necessary.
51
+
52
+ ```bash
53
+ # Run all tests against the 'default' node:
54
+ $ rake test
55
+ # Run all tests against 'n7k':
56
+ $ rake test TEST_OPTS='--environment=n7k'
57
+ ```
@@ -0,0 +1,14 @@
1
+ # Executable utilities included in this gem
2
+
3
+ ## check_metric_limits.rb
4
+
5
+ This is a helper script for developers. If you're doing refactoring work to
6
+ reduce the code complexity metrics, you can run this script to report the
7
+ worst offenders for each metric and whether you've managed to improve any
8
+ metrics compared to the baseline. Run this script from the base
9
+ cisco-network-node-utils directory to report metrics of code in the
10
+ ./lib and ./tests directories.
11
+
12
+ ```bash
13
+ [cisco-network-node-utils]$ ruby bin/check_metric_limits.rb
14
+ ```
Binary file
@@ -0,0 +1,36 @@
1
+ # The entry labeled 'default' will be used by default.
2
+ # The user can select a different entry by name if desired.
3
+ #
4
+ # default:
5
+ # host: foo
6
+
7
+ # Example config for running NXAPI remotely:
8
+ nxapi_remote:
9
+ host: 192.168.1.100
10
+ username: devops
11
+ password: devops
12
+
13
+ # Example config for running NXAPI on a node:
14
+ nxapi_local:
15
+ # (none needed)
16
+
17
+ # Example config for running NXAPI on a node with default cookie override:
18
+ # User 'nxapi' must be configured with requisite privilages to configure the device.
19
+ # This will override the default 'admin:local' cookie and use 'nxapi:local' instead.
20
+ default:
21
+ cookie: 'nxapi:local'
22
+
23
+ # Example config for running gRPC remotely:
24
+ grpc_remote:
25
+ host: 192.168.1.100
26
+ # gRPC port defaults to 57400 if unset
27
+ # port: 57400
28
+ username: admin
29
+ password: admin
30
+
31
+ # Example config for running gRPC on a node:
32
+ grpc_local:
33
+ port: 57999
34
+ username: admin
35
+ password: admin
36
+
@@ -0,0 +1,123 @@
1
+ # Copyright (c) 2014-2015 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 'node_util'
16
+
17
+ module Cisco
18
+ # X__CLASS_NAME__X - node utility class for X__CLASS_NAME__X config mgmt.
19
+ class X__CLASS_NAME__X < NodeUtil
20
+ attr_reader :name
21
+
22
+ # name: name of the router instance
23
+ # instantiate: true = create router instance
24
+ def initialize(name, instantiate=true)
25
+ fail ArgumentError unless name.length > 0
26
+ @name = name
27
+ create if instantiate
28
+ end
29
+
30
+ def to_s
31
+ "X__CLASS_NAME__X '#{name}'"
32
+ end
33
+
34
+ # Create a hash of all current router instances.
35
+ def self.routers
36
+ instances = config_get('X__RESOURCE_NAME__X', 'router')
37
+ return {} if instances.nil?
38
+ hash = {}
39
+ instances.each do |name|
40
+ hash[name] = X__CLASS_NAME__X.new(name, false)
41
+ end
42
+ return hash
43
+ rescue Cisco::CliError => e
44
+ # CLI will syntax reject when feature is not enabled
45
+ raise unless e.clierror =~ /Syntax error/
46
+ return {}
47
+ end
48
+
49
+ def feature_enabled
50
+ config_get('X__RESOURCE_NAME__X', 'feature')
51
+ rescue Cisco::CliError => e
52
+ # This cmd will syntax reject if feature is not
53
+ # enabled. Just catch the reject and return false.
54
+ return false if e.clierror =~ /Syntax error/
55
+ raise
56
+ end
57
+
58
+ def feature_enable
59
+ config_set('X__RESOURCE_NAME__X', 'feature', state: '')
60
+ end
61
+
62
+ def feature_disable
63
+ config_set('X__RESOURCE_NAME__X', 'feature', state: 'no')
64
+ end
65
+
66
+ # Enable feature and create router instance
67
+ def create
68
+ feature_enable unless feature_enabled
69
+ X__RESOURCE_NAME__X_router
70
+ end
71
+
72
+ # Destroy a router instance; disable feature on last instance
73
+ def destroy
74
+ ids = config_get('X__RESOURCE_NAME__X', 'router')
75
+ return if ids.nil?
76
+ if ids.size == 1
77
+ feature_disable
78
+ else
79
+ X__RESOURCE_NAME__X_router('no')
80
+ end
81
+ rescue Cisco::CliError => e
82
+ # CLI will syntax reject when feature is not enabled
83
+ raise unless e.clierror =~ /Syntax error/
84
+ end
85
+
86
+ def X__RESOURCE_NAME__X_router(state='')
87
+ config_set('X__RESOURCE_NAME__X', 'router', name: @name, state: state)
88
+ end
89
+
90
+ # ----------
91
+ # PROPERTIES
92
+ # ----------
93
+
94
+ # Property methods for boolean property
95
+ def default_X__PROPERTY_BOOL__X
96
+ config_get_default('X__RESOURCE_NAME__X', 'X__PROPERTY_BOOL__X')
97
+ end
98
+
99
+ def X__PROPERTY_BOOL__X
100
+ config_get('X__RESOURCE_NAME__X', 'X__PROPERTY_BOOL__X', name: @name)
101
+ end
102
+
103
+ def X__PROPERTY_BOOL__X=(state)
104
+ state = (state ? '' : 'no')
105
+ config_set('X__RESOURCE_NAME__X', 'X__PROPERTY_BOOL__X',
106
+ name: @name, state: state)
107
+ end
108
+
109
+ # Property methods for integer property
110
+ def default_X__PROPERTY_INT__X
111
+ config_get_default('X__RESOURCE_NAME__X', 'X__PROPERTY_INT__X')
112
+ end
113
+
114
+ def X__PROPERTY_INT__X
115
+ config_get('X__RESOURCE_NAME__X', 'X__PROPERTY_INT__X', name: @name)
116
+ end
117
+
118
+ def X__PROPERTY_INT__X=(val)
119
+ config_set('X__RESOURCE_NAME__X', 'X__PROPERTY_INT__X',
120
+ name: @name, val: val)
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,104 @@
1
+ # Copyright (c) 2014-2015 Cisco and/or its affiliates.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require_relative 'ciscotest'
16
+ require_relative '../lib/cisco_node_utils/router_X__RESOURCE_NAME__X'
17
+
18
+ # TestX__CLASS_NAME__X - Minitest for X__CLASS_NAME__X node utility class
19
+ class TestX__CLASS_NAME__X < CiscoTestCase
20
+ def setup
21
+ # setup runs at the beginning of each test
22
+ super
23
+ no_feature_X__RESOURCE_NAME__X
24
+ end
25
+
26
+ def teardown
27
+ # teardown runs at the end of each test
28
+ no_feature_X__RESOURCE_NAME__X
29
+ super
30
+ end
31
+
32
+ def no_feature_X__RESOURCE_NAME__X
33
+ # Turn the feature off for a clean test.
34
+ config('no feature X__RESOURCE_NAME__X')
35
+ end
36
+
37
+ # TESTS
38
+
39
+ def test_router_create_destroy_one
40
+ id = 'blue'
41
+ rtr = X__CLASS_NAME__X.new(id)
42
+ @default_show_command = "show runn | i 'router X__RESOURCE_NAME__X #{id}'"
43
+ assert_show_match(pattern: /^router X__RESOURCE_NAME__X #{id}$/,
44
+ msg: "failed to create router X__RESOURCE_NAME__X #{id}")
45
+
46
+ rtr.destroy
47
+ refute_show_match(pattern: /^router X__RESOURCE_NAME__X #{id}$/,
48
+ msg: "failed to destroy router X__RESOURCE_NAME__X #{id}")
49
+
50
+ refute_show_match(command: "show runn | i 'feature X__RESOURCE_NAME__X'",
51
+ pattern: /^feature X__RESOURCE_NAME__X$/,
52
+ msg: 'failed to disable feature X__RESOURCE_NAME__X')
53
+ end
54
+
55
+ def test_router_create_destroy_multiple
56
+ id1 = 'blue'
57
+ rtr1 = X__CLASS_NAME__X.new(id1)
58
+ id2 = 'red'
59
+ rtr2 = X__CLASS_NAME__X.new(id2)
60
+
61
+ @default_show_command = "show runn | i 'router X__RESOURCE_NAME__X'"
62
+
63
+ assert_show_match(pattern: /^router X__RESOURCE_NAME__X #{id1}$/,
64
+ msg: "failed to create router X__RESOURCE_NAME__X #{id1}")
65
+
66
+ assert_show_match(pattern: /^router X__RESOURCE_NAME__X #{id2}$/,
67
+ msg: "failed to create router X__RESOURCE_NAME__X #{id2}")
68
+
69
+ rtr1.destroy
70
+ refute_show_match(pattern: /^router X__RESOURCE_NAME__X #{id1}$/,
71
+ msg: "failed to destroy router X__RESOURCE_NAME__X #{id1}")
72
+
73
+ rtr2.destroy
74
+ refute_show_match(pattern: /^router X__RESOURCE_NAME__X #{id2}$/,
75
+ msg: "failed to destroy router X__RESOURCE_NAME__X #{id2}")
76
+
77
+ refute_show_match(command: "show runn | i 'feature X__RESOURCE_NAME__X'",
78
+ pattern: /^feature X__RESOURCE_NAME__X$/,
79
+ msg: 'failed to disable feature X__RESOURCE_NAME__X')
80
+ end
81
+
82
+ def test_router_X__PROPERTY_INT__X
83
+ id = 'blue'
84
+ rtr = X__CLASS_NAME__X.new(id)
85
+ val = 5 # This value depends on property bounds
86
+ rtr.X__PROPERTY_INT__X = val
87
+ assert_equal(rtr.X__PROPERTY_INT__X, val, "X__PROPERTY_INT__X is not #{val}")
88
+
89
+ # Get default value from yaml
90
+ val = node.config_get_default('X__RESOURCE_NAME__X', 'X__PROPERTY_INT__X')
91
+ rtr.X__PROPERTY_INT__X = val
92
+ assert_equal(rtr.X__PROPERTY_INT__X, val, "X__PROPERTY_INT__X is not #{val}")
93
+ end
94
+
95
+ def test_router_X__PROPERTY_BOOL__X
96
+ id = 'blue'
97
+ rtr = X__CLASS_NAME__X.new(id)
98
+ rtr.X__PROPERTY_BOOL__X = true
99
+ assert(rtr.X__PROPERTY_BOOL__X, 'X__PROPERTY_BOOL__X state is not true')
100
+
101
+ rtr.X__PROPERTY_BOOL__X = false
102
+ refute(rtr.X__PROPERTY_BOOL__X, 'X__PROPERTY_BOOL__X state is not false')
103
+ end
104
+ end
data/ext/mkrf_conf.rb ADDED
@@ -0,0 +1,63 @@
1
+ # Inspired by:
2
+ # https://github.com/ruby-debug/ruby-debug-ide/blob/master/ext/mkrf_conf.rb
3
+
4
+ # This file needs to be named mkrf_conf.rb
5
+ # so that rubygems will recognize it as a ruby extension
6
+ # file and not think it is a C extension file
7
+
8
+ require 'rubygems/specification'
9
+ require 'rubygems/dependency'
10
+ require 'rubygems/dependency_installer'
11
+
12
+ # Load up the rubygems dependency installer to install the dependencies
13
+ # we need based on the platform we are running under.
14
+ installer = Gem::DependencyInstaller.new
15
+ deps = []
16
+ begin
17
+ # Try to detect Cisco NX-OS and IOS XR environments
18
+ os = nil
19
+ if File.exist?('/etc/os-release')
20
+ cisco_release_file = nil
21
+ File.foreach('/etc/os-release') do |line|
22
+ next unless line[/^CISCO_RELEASE_INFO=/]
23
+ cisco_release_file = line[/^CISCO_RELEASE_INFO=(.*)$/, 1]
24
+ break
25
+ end
26
+ unless cisco_release_file.nil?
27
+ File.foreach(cisco_release_file) do |line|
28
+ next unless line[/^ID=/]
29
+ os = line[/^ID=(.*)$/, 1]
30
+ break
31
+ end
32
+ end
33
+ end
34
+ puts "Detected client OS as '#{os}'" unless os.nil?
35
+
36
+ # IOS XR doesn't need net_http_unix
37
+ os == 'ios_xr' || deps << Gem::Dependency.new('net_http_unix',
38
+ '~> 0.2', '>= 0.2.1')
39
+ # NX-OS doesn't need gRPC
40
+ os == 'nexus' || deps << Gem::Dependency.new('grpc', '~> 1.30.0')
41
+
42
+ deps.each do |dep|
43
+ installed = dep.matching_specs
44
+ if installed.empty?
45
+ puts "Installing #{dep}"
46
+ installed = installer.install dep
47
+ fail installer.errors[0] unless installer.errors.empty?
48
+ fail "Did not install #{dep}" if installed.empty?
49
+ else
50
+ puts "Found installed gems matching #{dep}:"
51
+ installed.each { |i| puts " #{i.name} (#{i.version})" }
52
+ end
53
+ end
54
+ rescue StandardError => e
55
+ puts e
56
+ puts e.backtrace.join("\n ")
57
+ exit(1)
58
+ end
59
+
60
+ # Create a dummy Rakefile to report successful 'compilation'
61
+ f = File.open(File.join(File.dirname(__FILE__), 'Rakefile'), 'w')
62
+ f.write("task :default\n")
63
+ f.close
data/lib/.rubocop.yml ADDED
@@ -0,0 +1,18 @@
1
+ inherit_from: ../.rubocop.yml
2
+
3
+ # Baseline code complexity metrics for the lib/ subdirectory:
4
+
5
+ Metrics/AbcSize:
6
+ Max: 49
7
+
8
+ Metrics/CyclomaticComplexity:
9
+ Max: 23
10
+
11
+ Metrics/MethodLength:
12
+ Max: 50
13
+
14
+ Metrics/ParameterLists:
15
+ Max: 10
16
+
17
+ Metrics/PerceivedComplexity:
18
+ Max: 24
@@ -0,0 +1,95 @@
1
+ #
2
+ # NXAPI implementation of AaaAuthenticationLogin 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
+
21
+ require_relative 'node_util'
22
+
23
+ module Cisco
24
+ # NXAPI implementation of AAA Authentication Login class
25
+ class AaaAuthenticationLogin < NodeUtil
26
+ # There is no "feature aaa" or "aaa new-model" on nxos, and only one
27
+ # instance which is always available
28
+ def self.ascii_authentication
29
+ config_get('aaa_authentication_login', 'ascii_authentication')
30
+ end
31
+
32
+ def self.ascii_authentication=(val)
33
+ no_cmd = val ? '' : 'no'
34
+ config_set('aaa_authentication_login',
35
+ 'ascii_authentication', no_cmd)
36
+ end
37
+
38
+ def self.default_ascii_authentication
39
+ config_get_default('aaa_authentication_login',
40
+ 'ascii_authentication')
41
+ end
42
+
43
+ def self.chap
44
+ config_get('aaa_authentication_login', 'chap')
45
+ end
46
+
47
+ def self.chap=(val)
48
+ no_cmd = val ? '' : 'no'
49
+ config_set('aaa_authentication_login', 'chap', no_cmd)
50
+ end
51
+
52
+ def self.default_chap
53
+ config_get_default('aaa_authentication_login', 'chap')
54
+ end
55
+
56
+ def self.error_display
57
+ config_get('aaa_authentication_login', 'error_display')
58
+ end
59
+
60
+ def self.error_display=(val)
61
+ no_cmd = val ? '' : 'no'
62
+ config_set('aaa_authentication_login', 'error_display', no_cmd)
63
+ end
64
+
65
+ def self.default_error_display
66
+ config_get_default('aaa_authentication_login', 'error_display')
67
+ end
68
+
69
+ def self.mschap
70
+ config_get('aaa_authentication_login', 'mschap')
71
+ end
72
+
73
+ def self.mschap=(val)
74
+ no_cmd = val ? '' : 'no'
75
+ config_set('aaa_authentication_login', 'mschap', no_cmd)
76
+ end
77
+
78
+ def self.default_mschap
79
+ config_get_default('aaa_authentication_login', 'mschap')
80
+ end
81
+
82
+ def self.mschapv2
83
+ config_get('aaa_authentication_login', 'mschapv2')
84
+ end
85
+
86
+ def self.mschapv2=(val)
87
+ no_cmd = val ? '' : 'no'
88
+ config_set('aaa_authentication_login', 'mschapv2', no_cmd)
89
+ end
90
+
91
+ def self.default_mschapv2
92
+ config_get_default('aaa_authentication_login', 'mschapv2')
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,138 @@
1
+ #
2
+ # NXAPI implementation of AaaAuthenticationLoginService class
3
+ #
4
+ # May 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
+
22
+ module Cisco
23
+ # NXAPI implementation of AAA Authentication Login Service class
24
+ class AaaAuthenticationLoginService < NodeUtil
25
+ attr_reader :name
26
+
27
+ def initialize(name, create=true)
28
+ fail TypeError unless name.is_a? String
29
+ # only console and default are supported currently
30
+ fail ArgumentError unless %w(console default).include? name
31
+ @name = name
32
+
33
+ # console needs to be explicitly created before it appears in
34
+ # "show run aaa all" but oddly not before it shows up in
35
+ # "show aaa authentication"
36
+ return unless create
37
+ m = default_method.to_s
38
+ config_set('aaa_auth_login_service', 'method', '', name, m)
39
+ end
40
+
41
+ def self.services
42
+ servs = {}
43
+ servs_arr = config_get('aaa_auth_login_service', 'services')
44
+ unless servs_arr.nil?
45
+ servs_arr.each do |s|
46
+ servs[s] = AaaAuthenticationLoginService.new(s, false)
47
+ end
48
+ end
49
+ servs
50
+ end
51
+
52
+ def destroy
53
+ # must specify exact current config string to unconfigure
54
+ m = method
55
+ m_str = m == :unselected ? '' : m.to_s
56
+ g_str = groups.join(' ')
57
+
58
+ if g_str.empty?
59
+ # cannot remove default local, so do nothing in this case
60
+ unless m == :local
61
+ unless node.product_id[/N(3|9)K-F/]
62
+ # TBD: These 'no' commands currently error on N(3|9)K-F
63
+ # no aaa authentication login console local
64
+ # no aaa authentication login console none
65
+ config_set('aaa_auth_login_service', 'method',
66
+ 'no', @name, m_str)
67
+ end
68
+ end
69
+ else
70
+ config_set('aaa_auth_login_service', 'groups',
71
+ 'no', @name, g_str, m_str)
72
+ end
73
+ end
74
+
75
+ # groups aren't retrieved via the usual CLI regex memory method because
76
+ # there can be an arbitrary number of groups and specifying a repeating
77
+ # memory regex only captures the last match
78
+ # ex: aaa authentication login default group group1 group2 group3 none
79
+ def groups
80
+ # config_get returns the following format:
81
+ # [{service:"default",method:"group group1 none "},
82
+ # {service:"console",method:"local "}]
83
+ hsh_arr = config_get('aaa_auth_login_service', 'groups')
84
+ fail 'unable to retrieve aaa groups information' if hsh_arr.empty?
85
+ hsh = hsh_arr.find { |x| x['service'] == @name }
86
+ # this should never happen unless @name is invalid
87
+ fail "no aaa info found for service #{@name}" if hsh.nil?
88
+ fail "no method found for #{@name} - api or feature change?" unless
89
+ hsh.key? 'method'
90
+ # ex: ["group", "group1", "local"] or maybe ["none"]
91
+ grps = hsh['method'].strip.split
92
+ return [] if grps.size == 1
93
+ # remove local, none, group keywords
94
+ grps -= %w(none local group)
95
+ grps
96
+ end
97
+
98
+ # default is []
99
+ def default_groups
100
+ config_get_default('aaa_auth_login_service', 'groups')
101
+ end
102
+
103
+ def method
104
+ m = config_get('aaa_auth_login_service', 'method', @name)
105
+ m.nil? ? :unselected : m.to_sym
106
+ end
107
+
108
+ # default is :local
109
+ def default_method
110
+ config_get_default('aaa_auth_login_service', 'method')
111
+ end
112
+
113
+ # groups and method must be set in the same CLI string
114
+ # aaa authentication login { console | default } /
115
+ # none | local | group <group1 [group2, ...]> [none]
116
+ def groups_method_set(grps, m)
117
+ fail TypeError unless grps.is_a? Array
118
+ fail TypeError unless grps.all? { |x| x.is_a? String }
119
+ fail TypeError unless m.is_a? Symbol
120
+ # only the following 3 are supported (unselected = blank)
121
+ fail ArgumentError unless [:none, :local, :unselected].include? m
122
+
123
+ fail "method 'local' not allowed when groups are configured" if
124
+ m == :local && !grps.empty?
125
+ m_str = m == :unselected ? '' : m.to_s
126
+ g_str = grps.join(' ')
127
+
128
+ # config_set depends on whether we're setting groups or not
129
+ if g_str.empty?
130
+ config_set('aaa_auth_login_service', 'method',
131
+ '', @name, m_str)
132
+ else
133
+ config_set('aaa_auth_login_service', 'groups',
134
+ '', @name, g_str, m_str)
135
+ end
136
+ end
137
+ end
138
+ end