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,403 @@
1
+ # Copyright (c) 2014-2016 Cisco and/or its affiliates.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require_relative 'node_util'
16
+
17
+ module Cisco
18
+ # SnmpUser - node utility class for SNMP user configuration management
19
+ class SnmpUser < NodeUtil
20
+ def initialize(name, groups, authproto, authpass, privproto,
21
+ privpass, localizedkey, engineid, instantiate=true)
22
+ initialize_validator(name, groups, authproto, authpass, privproto,
23
+ privpass, engineid, instantiate)
24
+ @name = name
25
+ @engine_id = engineid
26
+
27
+ @authproto = authproto
28
+ @privproto = privproto
29
+ @groups_arr = groups
30
+
31
+ authprotostr = _auth_sym_to_str(authproto)
32
+ privprotostr = _priv_sym_to_str(privproto)
33
+
34
+ return unless instantiate
35
+ # Config string syntax:
36
+ # [no] snmp-server user <user> [group] ...
37
+ # [auth {md5|sha} <passwd1>
38
+ # [priv [aes-128] <passwd2>] [localizedkey] [engineID <id>]
39
+ # ]
40
+ # Assume if multiple groups, apply all config to each
41
+ groups = [''] if groups.empty?
42
+ groups.each do |group|
43
+ config_set('snmp_user', 'user', '',
44
+ name,
45
+ group,
46
+ authpass.empty? ? '' : "auth #{authprotostr} #{authpass}",
47
+ privpass.empty? ? '' : "priv #{privprotostr} #{privpass}",
48
+ localizedkey ? 'localizedkey' : '',
49
+ engineid.empty? ? '' : "engineID #{engineid}")
50
+ end
51
+ end
52
+
53
+ def initialize_validator(name, groups, authproto, authpass, privproto,
54
+ privpass, engineid, instantiate)
55
+ fail TypeError unless name.is_a?(String) &&
56
+ groups.is_a?(Array) &&
57
+ authproto.is_a?(Symbol) &&
58
+ authpass.is_a?(String) &&
59
+ privproto.is_a?(Symbol) &&
60
+ privpass.is_a?(String) &&
61
+ engineid.is_a?(String)
62
+ fail ArgumentError if name.empty?
63
+ # empty password but protocol provided = bad
64
+ # non-empty password and no protocol provided = bad
65
+ if authpass.empty?
66
+ fail ArgumentError if [:sha, :md5].include?(authproto) && instantiate
67
+ else
68
+ fail ArgumentError unless [:sha, :md5].include?(authproto)
69
+ end
70
+ if privpass.empty?
71
+ fail ArgumentError if [:des, :aes128].include?(privproto) && instantiate
72
+ else
73
+ fail ArgumentError unless [:des, :aes128].include?(privproto)
74
+ end
75
+ end
76
+
77
+ def self.users
78
+ users_hash = {}
79
+ # config_get returns hash if 1 user, array if multiple, nil if none
80
+ users = config_get('snmp_user', 'user')
81
+ return users_hash if users.nil?
82
+ users.each do |user|
83
+ # n7k has enforcepriv, use-ipv*acl, avoid them
84
+ next if user[/(enforcePriv|use-ipv4acl|use-ipv6acl)/]
85
+ user_var_hash = _get_snmp_user_parse(user)
86
+ name = user_var_hash[:name]
87
+ engineid = user_var_hash[:engineid]
88
+ if engineid.empty?
89
+ index = name
90
+ else
91
+ index = name + ' ' + engineid
92
+ end
93
+ auth = user_var_hash[:auth]
94
+ priv = user_var_hash[:priv]
95
+ groups_arr = []
96
+ # take care of multiple groups here
97
+ # if the name already exists in hash
98
+ # get all the previous properties
99
+ if users_hash.key?(index)
100
+ groups_arr = users_hash[index].groups
101
+ auth = users_hash[index].auth_protocol
102
+ priv = users_hash[index].priv_protocol
103
+ end
104
+
105
+ # add the group to the array
106
+ groups_arr << _get_group_arr(user_var_hash)
107
+ users_hash[index] = SnmpUser.new(name, groups_arr.flatten, auth,
108
+ '', priv, '', false,
109
+ engineid,
110
+ false)
111
+ end
112
+ users_hash
113
+ end
114
+
115
+ def destroy
116
+ # The parser doesn't care what the real value is but need to come to the
117
+ # end of the parser chain. Hence we just pass in some fake values for
118
+ # auth method and password
119
+ unless auth_password.nil? || auth_password.empty?
120
+ auth_str = "auth #{_auth_sym_to_str(auth_protocol)} #{auth_password}"
121
+ local_str = 'localizedkey'
122
+ end
123
+ unless priv_password.nil? || priv_password.empty?
124
+ priv_str = "priv #{_priv_sym_to_str(priv_protocol)} #{priv_password}"
125
+ end
126
+ config_set('snmp_user', 'user', 'no',
127
+ @name, '', auth_str, priv_str, local_str,
128
+ @engine_id.empty? ? '' : "engineID #{@engine_id}")
129
+ SnmpUser.users.delete(@name + ' ' + @engine_id)
130
+ end
131
+
132
+ attr_reader :name
133
+
134
+ def groups
135
+ @groups_arr
136
+ end
137
+
138
+ def self.default_groups
139
+ [config_get_default('snmp_user', 'group')]
140
+ end
141
+
142
+ def auth_protocol
143
+ @authproto
144
+ end
145
+
146
+ def self.default_auth_protocol
147
+ _auth_str_to_sym(config_get_default('snmp_user', 'auth_protocol'))
148
+ end
149
+
150
+ def self.default_auth_password
151
+ config_get_default('snmp_user', 'auth_password')
152
+ end
153
+
154
+ def self.auth_password(name, engine_id)
155
+ if engine_id.empty?
156
+ users = config_get('snmp_user', 'auth_password')
157
+ return nil if users.nil? || users.empty?
158
+ users.each_entry { |user| return user[1] if user[0] == name }
159
+ else
160
+ users = config_get('snmp_user', 'auth_password_with_engine_id')
161
+ return nil if users.nil? || users.empty?
162
+ users.each_entry do |user|
163
+ return user[1] if user[0] == name && user[2] == engine_id
164
+ end
165
+ end
166
+ nil
167
+ end
168
+
169
+ def auth_password
170
+ SnmpUser.auth_password(@name, @engine_id)
171
+ end
172
+
173
+ def priv_protocol
174
+ @privproto
175
+ end
176
+
177
+ def self.priv_password(name, engine_id)
178
+ if engine_id.empty?
179
+ users = config_get('snmp_user', 'priv_password')
180
+ unless users.nil? || users.empty?
181
+ users.each_entry { |user| return user[1] if user[0] == name }
182
+ end
183
+ else
184
+ users = config_get('snmp_user', 'priv_password_with_engine_id')
185
+ unless users.nil? || users.empty?
186
+ users.each_entry do |user|
187
+ return user[1] if user[0] == name && user[2] == engine_id
188
+ end
189
+ end
190
+ end
191
+ nil
192
+ end
193
+
194
+ def priv_password
195
+ SnmpUser.priv_password(@name, @engine_id)
196
+ end
197
+
198
+ def self.default_priv_protocol
199
+ _priv_str_to_sym(config_get_default('snmp_user', 'priv_protocol'))
200
+ end
201
+
202
+ def self.default_priv_password
203
+ config_get_default('snmp_user', 'priv_password')
204
+ end
205
+
206
+ attr_reader :engine_id
207
+
208
+ def self.default_engine_id
209
+ config_get_default('snmp_user', 'engine_id')
210
+ end
211
+
212
+ # Passwords are hashed and so cannot be retrieved directly, but can be
213
+ # checked for equality. This is done by creating a fake user with the
214
+ # password and then comparing the hashes
215
+ def auth_password_equal?(input_pw, is_localized=false)
216
+ input_pw = input_pw.to_s unless input_pw.is_a?(String)
217
+ # If we provide no password, and no password present, it's a match!
218
+ return true if input_pw.empty? && auth_protocol == :none
219
+ # If we provide no password, but a password is present, or vice versa...
220
+ return false if input_pw.empty? || auth_protocol == :none
221
+ # OK, we have an input password, and a password is configured
222
+ current_pw = auth_password
223
+ if current_pw.nil?
224
+ fail "SNMP user #{@name} #{@engine_id} has auth #{auth_protocol} " \
225
+ "but no password?\n" + @@node.get(command: 'show run snmp all')
226
+ end
227
+
228
+ if is_localized
229
+ # In this case, the password is already hashed.
230
+ hashed_pw = input_pw
231
+ else
232
+ # In this case passed in password is clear text while the running
233
+ # config is hashed value. We need to hash the passed in clear text.
234
+
235
+ # Create dummy user
236
+ config_set('snmp_user', 'user', '', 'dummy_user', '',
237
+ "auth #{_auth_sym_to_str(auth_protocol)} #{input_pw}",
238
+ '', '',
239
+ @engine_id.empty? ? '' : "engineID #{@engine_id}")
240
+
241
+ # Retrieve password hashes
242
+ hashed_pw = SnmpUser.auth_password('dummy_user', @engine_id)
243
+ if hashed_pw.nil?
244
+ fail "SNMP dummy user dummy_user #{@engine_id} was configured " \
245
+ "but password is missing?\n" \
246
+ + @@node.get(command: 'show run snmp all')
247
+ end
248
+
249
+ # Delete dummy user
250
+ config_set('snmp_user', 'user', 'no', 'dummy_user', '',
251
+ "auth #{_auth_sym_to_str(auth_protocol)} #{hashed_pw}",
252
+ '', 'localizedkey',
253
+ @engine_id.empty? ? '' : "engineID #{@engine_id}")
254
+ end
255
+ hashed_pw == current_pw
256
+ end
257
+
258
+ # Passwords are hashed and so cannot be retrieved directly, but can be
259
+ # checked for equality. This is done by creating a fake user with the
260
+ # password and then comparing the hashes
261
+ def priv_password_equal?(input_pw, is_localized=false)
262
+ input_pw = input_pw.to_s unless input_pw.is_a?(String)
263
+ # If no input password, and no password present, true!
264
+ return true if input_pw.empty? && priv_protocol == :none
265
+ # Otherwise, if either one is missing, false!
266
+ return false if input_pw.empty? || priv_protocol == :none
267
+ # Otherwise, we have both input and configured passwords to compare
268
+ current_pw = priv_password
269
+ if current_pw.nil?
270
+ fail "SNMP user #{@name} #{@engine_id} has priv #{priv_protocol} " \
271
+ "but no password?\n" + @@node.get(command: 'show run snmp all')
272
+ end
273
+
274
+ if is_localized
275
+ # In this case, the password is already hashed.
276
+ hashed_pw = input_pw
277
+ else
278
+ # In this case passed in password is clear text while the running
279
+ # config is hashed value. We need to hash the passed in clear text.
280
+
281
+ # Create dummy user
282
+ config_set('snmp_user', 'user', '', 'dummy_user', '',
283
+ "auth #{_auth_sym_to_str(auth_protocol)} #{input_pw}",
284
+ "priv #{_priv_sym_to_str(priv_protocol)} #{input_pw}",
285
+ '',
286
+ @engine_id.empty? ? '' : "engineID #{@engine_id}")
287
+
288
+ # Retrieve password hashes
289
+ dummyau = SnmpUser.auth_password('dummy_user', @engine_id)
290
+ hashed_pw = SnmpUser.priv_password('dummy_user', @engine_id)
291
+ if hashed_pw.nil?
292
+ fail "SNMP dummy user dummy_user #{@engine_id} was configured " \
293
+ "but password is missing?\n" \
294
+ + @@node.get(command: 'show run snmp all')
295
+ end
296
+
297
+ # Delete dummy user
298
+ config_set('snmp_user', 'user', 'no', 'dummy_user', '',
299
+ "auth #{_auth_sym_to_str(auth_protocol)} #{dummyau}",
300
+ "priv #{_priv_sym_to_str(priv_protocol)} #{hashed_pw}",
301
+ 'localizedkey',
302
+ @engine_id.empty? ? '' : "engineID #{@engine_id}")
303
+ end
304
+ hashed_pw == current_pw
305
+ end
306
+
307
+ private
308
+
309
+ def self._get_snmp_user_parse(user)
310
+ user_var = {}
311
+ lparams = user.split
312
+ name = lparams[0]
313
+ engineid_index = lparams.index('engineID')
314
+ auth_index = lparams.index('auth')
315
+ priv_index = lparams.index('priv')
316
+ # engineID always comes after engineid_index
317
+ engineid = engineid_index.nil? ? '' : lparams[engineid_index + 1]
318
+ # authproto always comes after auth_index
319
+ aut = auth_index.nil? ? '' : lparams[auth_index + 1]
320
+ # privproto always comes after priv_index if priv exists
321
+ pri = priv_index.nil? ? '' : lparams[priv_index + 1]
322
+ # for the empty priv protocol default
323
+ pri = 'des' unless pri.empty? || pri == 'aes-128'
324
+ auth = _auth_str_to_sym(aut)
325
+ priv = _priv_str_to_sym(pri)
326
+ user_var[:name] = name
327
+ user_var[:engineid] = engineid
328
+ user_var[:auth] = auth
329
+ user_var[:priv] = priv
330
+ user_var[:auth_index] = auth_index
331
+ user_var[:engineid_index] = engineid_index
332
+ # group may or may not exist but it is always after name
333
+ # lparams[1] can be group, it is not known here,
334
+ # but will be determined in the _get_group_arr method
335
+ user_var[:group] = lparams[1]
336
+ user_var
337
+ end
338
+
339
+ def self._get_group_arr(user_var_hash)
340
+ user_groups = []
341
+ auth_index = user_var_hash[:auth_index]
342
+ engineid_index = user_var_hash[:engineid_index]
343
+ # after the name it can be group or auth or engineID
344
+ # so filter it properly
345
+ user_groups << user_var_hash[:group] unless auth_index == 1 ||
346
+ engineid_index == 1
347
+ user_groups
348
+ end
349
+
350
+ def _auth_sym_to_str(sym)
351
+ case sym
352
+ when :sha
353
+ return 'sha'
354
+ when :md5
355
+ return 'md5'
356
+ else
357
+ return ''
358
+ end
359
+ end
360
+
361
+ def _priv_sym_to_str(sym)
362
+ case sym
363
+ when :des
364
+ return '' # no protocol specified defaults to DES
365
+ when :aes128
366
+ return 'aes-128'
367
+ else
368
+ return ''
369
+ end
370
+ end
371
+
372
+ def _auth_str_to_sym(str)
373
+ SnmpUser._auth_str_to_sym(str)
374
+ end
375
+
376
+ # must be class method b/c it's used by default methods
377
+ def self._auth_str_to_sym(str)
378
+ case str
379
+ when /sha/i
380
+ return :sha
381
+ when /md5/i
382
+ return :md5
383
+ else
384
+ return :none
385
+ end
386
+ end
387
+
388
+ def _priv_str_to_sym(str)
389
+ SnmpUser._priv_str_to_sym(str)
390
+ end
391
+
392
+ def self._priv_str_to_sym(str)
393
+ case str
394
+ when /des/i
395
+ return :des
396
+ when /aes/i
397
+ return :aes128
398
+ else
399
+ return :none
400
+ end
401
+ end
402
+ end
403
+ end
@@ -0,0 +1,149 @@
1
+ # Insert appropriate license here
2
+ require_relative 'node_util'
3
+ require_relative 'interface'
4
+
5
+ module Cisco
6
+ # node utils class for SPAN (switchport analyzer) sessions
7
+ class SpanSession < NodeUtil
8
+ attr_reader :session_id
9
+
10
+ def initialize(session_id, instantiate=true)
11
+ validate_args(session_id.to_i)
12
+ create if instantiate
13
+ end
14
+
15
+ def self.sessions
16
+ hash = {}
17
+ all = config_get('span_session', 'all_sessions')
18
+ return hash if all.nil?
19
+
20
+ all.each do |id|
21
+ hash[id] = SpanSession.new(id, false)
22
+ end
23
+ hash
24
+ end
25
+
26
+ def validate_args(session_id)
27
+ fail TypeError unless session_id.is_a?(Integer)
28
+ @session_id = session_id
29
+ end
30
+
31
+ def create
32
+ config_set('span_session', 'create', id: @session_id)
33
+ end
34
+
35
+ def destroy
36
+ config_set('span_session', 'destroy', id: @session_id)
37
+ end
38
+
39
+ def description
40
+ config_get('span_session', 'description', id: @session_id)
41
+ end
42
+
43
+ def description=(val)
44
+ val = val.to_s
45
+ if val.empty?
46
+ config_set('span_session', 'description', id: @session_id,
47
+ state: 'no', description: '')
48
+ else
49
+ config_set('span_session', 'description', id: @session_id,
50
+ state: '', description: val)
51
+ end
52
+ end
53
+
54
+ def destination
55
+ config_get('span_session', 'destination', id: @session_id).downcase
56
+ end
57
+
58
+ def destination=(int)
59
+ # fail if int is not a valid interface
60
+ fail TypeError unless Interface.interfaces.key?(int.downcase)
61
+ config_set('span_session', 'destination', state: '', id: @session_id,
62
+ intf_name: int)
63
+ end
64
+
65
+ def session_id
66
+ config_get('span_session', 'session_id')
67
+ end
68
+
69
+ def session_id=(id)
70
+ fail TypeError unless id.is_a?(Integer)
71
+ config_set('span_session', 'session_id', id: id, state: '')
72
+ end
73
+
74
+ def shutdown
75
+ config_get('span_session', 'shutdown', id: @session_id)
76
+ end
77
+
78
+ def shutdown=(bool)
79
+ fail TypeError unless bool.is_a?(Boolean)
80
+ config_set('span_session', 'shutdown', id: @session_id, shutdown: bool)
81
+ end
82
+
83
+ def source_interfaces
84
+ ints = config_get('span_session', 'source_interfaces', id: @session_id)
85
+ intf = []
86
+ ints.each { |i| intf << i.map(&:downcase) }
87
+ intf
88
+ end
89
+
90
+ def source_interfaces=(sources)
91
+ fail TypeError unless sources.is_a?(Hash)
92
+ delta_hash = Utils.delta_add_remove(sources.to_a, source_interfaces.to_a,
93
+ :updates_not_allowed)
94
+ return if delta_hash.values.flatten.empty?
95
+ [:remove, :add].each do |action|
96
+ delta_hash[action].each do |name, dir|
97
+ state = (action == :add) ? '' : 'no'
98
+ config_set('span_session', 'source_interfaces', id: @session_id,
99
+ state: state, int_name: name, direction: dir)
100
+ end
101
+ end
102
+ end
103
+
104
+ def default_source_interfaces
105
+ config_get_default('span_session', 'source_interfaces')
106
+ end
107
+
108
+ def source_vlans
109
+ v = config_get('span_session', 'source_vlans', id: @session_id)
110
+ v.empty? ? v : [Utils.normalize_range_array(v[0]), v[1]]
111
+ end
112
+
113
+ def source_vlans=(sources)
114
+ fail TypeError unless sources.is_a?(Hash)
115
+ is = Utils.dash_range_to_elements(source_vlans[0]) unless
116
+ source_vlans.empty?
117
+ should = Utils.dash_range_to_elements(sources[:vlans])
118
+ direction = sources[:direction]
119
+ delta_hash = Utils.delta_add_remove(should, is)
120
+ [:add, :remove].each do |action|
121
+ delta_hash[action].each do |vlans|
122
+ state = (action == :add) ? '' : 'no'
123
+ config_set('span_session', 'source_vlans',
124
+ id: @session_id, state: state,
125
+ vlans: vlans, direction: direction)
126
+ end
127
+ end
128
+ end
129
+
130
+ def default_source_vlans
131
+ config_get_default('span_session', 'source_vlans')
132
+ end
133
+
134
+ def type
135
+ config_get('span_session', 'type', id: @session_id)
136
+ end
137
+
138
+ def type=(str)
139
+ valid_types = ['local', 'rspan', 'erspan-source']
140
+ fail TypeError unless valid_types.include?(str)
141
+ destroy # need to destroy session before changing type
142
+ if str.empty?
143
+ config_set('span_session', 'type', id: @session_id, type: 'local')
144
+ else
145
+ config_set('span_session', 'type', id: @session_id, type: str)
146
+ end
147
+ end
148
+ end # class
149
+ end # module