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,444 @@
1
+ # Common Utilities for Puppet Resources.
2
+ #
3
+ # Copyright (c) 2014-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
+ # Add some general-purpose constants and APIs to the Cisco namespace
18
+ module Cisco
19
+ # global constants
20
+ DEFAULT_INSTANCE_NAME = 'default'
21
+
22
+ # Encryption - helper class for translating encryption type CLI
23
+ class Encryption
24
+ # password encryption types
25
+ def self.cli_to_symbol(cli)
26
+ case cli
27
+ when '0', 0, 'clear'
28
+ :cleartext
29
+ when '3', 3
30
+ :"3des" # yuck :-(
31
+ when '5', 5, 'encrypted'
32
+ :md5
33
+ when '6', 6
34
+ :aes
35
+ when '7', 7
36
+ :cisco_type_7
37
+ else
38
+ fail KeyError
39
+ end
40
+ end
41
+
42
+ def self.symbol_to_cli(symbol)
43
+ symbol = symbol.downcase if symbol.is_a? String
44
+ case symbol
45
+ when :cleartext, :none, 'cleartext', 'none', '0', 0
46
+ '0'
47
+ when :"3des", '3des', '3', 3
48
+ '3'
49
+ when :md5, 'md5', '5', 5
50
+ '5'
51
+ when :aes, 'aes', '6', 6
52
+ '6'
53
+ when :cisco_type_7, :type_7, 'cisco_type_7', 'type_7', '7', 7
54
+ '7'
55
+ else
56
+ fail KeyError
57
+ end
58
+ end
59
+ end
60
+
61
+ # ChefUtils - helper class for Chef code generation
62
+ class ChefUtils
63
+ def self.generic_prop_set(klass, rlbname, props)
64
+ props.each do |prop|
65
+ klass.instance_eval do
66
+ # Helper Chef setter method, e.g.:
67
+ # if @new_resource.foo.nil?
68
+ # def_prop = @rlb.default_foo
69
+ # @new_resource.foo(def_prop)
70
+ # end
71
+ # current = @rlb.foo
72
+ # if current != @new_resource.foo
73
+ # converge_by("update foo '#{current}' => " +
74
+ # "'#{@new_resource.foo}'") do
75
+ # @rlb.foo=(@new_resource.foo)
76
+ # end
77
+ # end
78
+ if @new_resource.send(prop).nil?
79
+ def_prop = instance_variable_get(rlbname).send("default_#{prop}")
80
+ # Set resource to default if recipe property is not specified
81
+ @new_resource.send(prop, def_prop)
82
+ end
83
+ current = instance_variable_get(rlbname).send(prop)
84
+ if current != @new_resource.send(prop)
85
+ converge_by("update #{prop} '#{current}' => " \
86
+ "'#{@new_resource.send(prop)}'") do
87
+ instance_variable_get(rlbname).send("#{prop}=",
88
+ @new_resource.send(prop))
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end # class ChefUtils
95
+
96
+ # General utility class
97
+ class Utils
98
+ require 'ipaddr'
99
+
100
+ # Helper utility to check for older Nexus I2 images
101
+ def self.nexus_i2_image
102
+ require_relative 'platform'
103
+ true if Platform.image_version[/7.0.3.I2/]
104
+ end
105
+
106
+ def self.image_version?(ver_regexp)
107
+ require_relative 'platform'
108
+ return true if Platform.image_version[ver_regexp]
109
+ end
110
+
111
+ def self.chassis_pid?(ver_regexp)
112
+ require_relative 'platform'
113
+ return true if Platform.chassis['pid'][ver_regexp]
114
+ end
115
+
116
+ def self.fretta?
117
+ require_relative 'platform'
118
+ Platform.slots.each do |_x, row|
119
+ return true if row['pid'][/-R/]
120
+ end
121
+ false
122
+ end
123
+
124
+ # Helper utility method for ip/prefix format networks.
125
+ # For ip/prefix format '1.1.1.1/24' or '2000:123:38::34/64',
126
+ # we need to mask the address using the prefix length so that they
127
+ # are converted to '1.1.1.0/24' or '2000:123:38::/64'
128
+ def self.process_network_mask(network)
129
+ mask = network.split('/')[1]
130
+ address = IPAddr.new(network).to_s
131
+ network = address + '/' + mask unless mask.nil?
132
+ network
133
+ end
134
+
135
+ # Helper to build a hash of add/remove commands for a nested array.
136
+ # Useful for network, redistribute, etc.
137
+ # should: an array of expected cmds (manifest/recipe)
138
+ # current: an array of existing cmds on the device
139
+ def self.depth(a)
140
+ return 0 unless a.is_a?(Array)
141
+ 1 + depth(a[0])
142
+ end
143
+
144
+ def self.delta_add_remove(should, current=[], opt=nil)
145
+ current = [] if current.nil?
146
+ should = [] if should.nil?
147
+
148
+ # Remove nil entries from array
149
+ should.each(&:compact!) if depth(should) > 1
150
+ delta = { add: should - current, remove: current - should }
151
+
152
+ # Some cli properties cannot be updated, thus must be removed first
153
+ return delta if opt == :updates_not_allowed
154
+
155
+ # Delete entries from :remove if f1 is an update to an existing command
156
+ delta[:add].each do |id, _|
157
+ # Differentiate between comparing nested and unnested arrays by
158
+ # checking the depth of the array.
159
+ if depth(should) == 1
160
+ delta[:remove].delete_if { |f1| [f1] if f1.to_s == id.to_s }
161
+ else
162
+ delta[:remove].delete_if { |f1, f2| [f1, f2] if f1.to_s == id.to_s }
163
+ end
164
+ end
165
+ delta
166
+ end # delta_add_remove
167
+
168
+ def self.length_to_bitmask(length)
169
+ IPAddr.new('255.255.255.255').mask(length).to_s
170
+ end
171
+
172
+ def self.bitmask_to_length(bitmask)
173
+ # Convert bitmask to a 32-bit integer,
174
+ # convert that to binary, and count the 1s
175
+ IPAddr.new(bitmask).to_i.to_s(2).count('1')
176
+ rescue IPAddr::InvalidAddressError => e
177
+ raise ArgumentError, "bitmask '#{bitmask}' is not valid: #{e}"
178
+ end
179
+
180
+ # Helper to 0-pad a mac address.
181
+ def self.zero_pad_macaddr(mac)
182
+ return nil if mac.nil? || mac.empty?
183
+ o1, o2, o3 = mac.split('.').map { |o| o.to_i(16).to_s(10) }
184
+ sprintf('%04x.%04x.%04x', o1, o2, o3)
185
+ end
186
+
187
+ # For spanning tree range based parameters, the range
188
+ # is very dynamic and so before the parameters are set,
189
+ # the rest of the range needs to be reset
190
+ # For ex: if the ranges 2-42 and 83-200 are getting set,
191
+ # and the total range of the given parameter is 1-4000
192
+ # then 1,43-82,201-4000 needs to be reset. This method
193
+ # takes the set ranges and gives back the range to be reset
194
+ def self.get_reset_range(total_range, remove_ranges)
195
+ fail 'invalid range' unless total_range.include?('-')
196
+ return total_range if remove_ranges.empty?
197
+
198
+ trs = total_range.gsub('-', '..')
199
+ tra = trs.split('..').map { |d| Integer(d) }
200
+ tr = tra[0]..tra[1]
201
+ tarray = tr.to_a
202
+ remove_ranges.each do |rr, _val|
203
+ rarray = rr.gsub('-', '..').split(',')
204
+ rarray.each do |elem|
205
+ if elem.include?('..')
206
+ elema = elem.split('..').map { |d| Integer(d) }
207
+ ele = elema[0]..elema[1]
208
+ tarray -= ele.to_a
209
+ else
210
+ tarray.delete(elem.to_i)
211
+ end
212
+ end
213
+ end
214
+ Utils.array_to_str(tarray)
215
+ end
216
+
217
+ # This method converts an array to string form
218
+ # for ex: if the array has 1, 2 to 10, 83 to 2014, 3022
219
+ # and the string will be "1,2-10,83-2014,3022"
220
+ def self.array_to_str(array, sort=true)
221
+ farray = sort ? array.compact.uniq.sort : array.compact
222
+ lranges = []
223
+ unless farray.empty?
224
+ l = array.first
225
+ r = nil
226
+ farray.each do |aelem|
227
+ if r && aelem != r.succ
228
+ if l == r
229
+ lranges << l
230
+ else
231
+ lranges << Range.new(l, r)
232
+ end
233
+ l = aelem
234
+ end
235
+ r = aelem
236
+ end
237
+ if l == r
238
+ lranges << l
239
+ else
240
+ lranges << Range.new(l, r)
241
+ end
242
+ end
243
+ lranges.to_s.gsub('..', '-').delete('[').delete(']').delete(' ')
244
+ end
245
+
246
+ # normalize_range_array
247
+ #
248
+ # Given a list of ranges, merge any overlapping ranges and sort them.
249
+ #
250
+ # Note: The ranges are converted to ruby ranges for easy merging,
251
+ # then converted back to a cli-syntax range.
252
+ #
253
+ # Accepts an array or string:
254
+ # ["2-5", "9", "4-6"] -or- '2-5, 9, 4-6' -or- ["2-5, 9, 4-6"]
255
+ # Returns a merged and ordered range as an array or string:
256
+ # ["2-6", "9"] -or- '2-6,9'
257
+ #
258
+ def self.normalize_range_array(range, fmt=:array)
259
+ return range if range.nil? || range.empty?
260
+ range = range.clone
261
+
262
+ # Handle string within an array: ["2-5, 9, 4-6"] to '2-5, 9, 4-6'
263
+ range = range.shift if range.is_a?(Array) && range.length == 1
264
+
265
+ # Handle string only: '2-5, 9, 4-6' to ["2-5", "9", "4-6"]
266
+ range = range.split(',') if range.is_a?(String)
267
+
268
+ # Convert to ruby-syntax ranges
269
+ range = dash_range_to_ruby_range(range)
270
+
271
+ # Sort & Merge
272
+ merged = merge_range(range)
273
+
274
+ # Convert back to cli dash-syntax
275
+ merged_array = ruby_range_to_dash_range(merged)
276
+
277
+ return merged_array.join(',') if fmt == :string
278
+ merged_array
279
+ end
280
+
281
+ # Convert a cli-dash-syntax range to ruby-range. This is useful for
282
+ # preparing inputs to merge_range().
283
+ #
284
+ # Inputs an array or string of dash-syntax ranges -> returns an array
285
+ # of ruby ranges.
286
+ #
287
+ # Accepts an array or string: ["2-5", "9", "4-6"] or '2-5, 9, 4-6'
288
+ # Returns an array of ranges: [2..5, 9..9, 4..6]
289
+ #
290
+ def self.dash_range_to_ruby_range(range)
291
+ range = range.split(',') if range.is_a?(String)
292
+ range.map! do |rng|
293
+ if rng[/-/]
294
+ # '2-5' -> 2..5
295
+ rng.split('-').inject { |a, e| a.to_i..e.to_i }
296
+ else
297
+ # '9' -> 9..9
298
+ rng.to_i..rng.to_i
299
+ end
300
+ end
301
+ range
302
+ end
303
+
304
+ # Convert a ruby-range to cli-dash-syntax.
305
+ #
306
+ # Inputs an array of ruby ranges -> returns an array or string of
307
+ # dash-syntax ranges.
308
+ #
309
+ # when (:array) [2..6, 9..9] -> ['2-6', '9']
310
+ #
311
+ # when (:string) [2..6, 9..9] -> '2-6, 9'
312
+ #
313
+ def self.ruby_range_to_dash_range(range, type=:array)
314
+ fail unless range.is_a?(Array)
315
+ range.map! do |r|
316
+ if r.first == r.last
317
+ # 9..9 -> '9'
318
+ r.first.to_s
319
+ else
320
+ # 2..6 -> '2-6'
321
+ r.first.to_s + '-' + r.last.to_s
322
+ end
323
+ end
324
+ return range.join(', ') if type == :string
325
+ range
326
+ end
327
+
328
+ # Convert a dash-range set into individual elements.
329
+ # This is useful for preparing inputs to delta_add_remove().
330
+ #
331
+ # Inputs an array or string of dash-ranges:
332
+ # ["2-5", "9", "4-6"] or '2-5, 9, 4-6' or ['2-5, 9, 4-6']
333
+ # Returns an array of range elements:
334
+ # ["2", "3", "4", "5", "6", "9"]
335
+ #
336
+ def self.dash_range_to_elements(range)
337
+ return [] if range.nil?
338
+ range = range.shift if range.is_a?(Array) && range.length == 1
339
+ range = range.split(',') if range.is_a?(String)
340
+
341
+ final = []
342
+ range = dash_range_to_ruby_range(range)
343
+ range.each do |rng|
344
+ # 2..5 maps to ["2", "3", "4", "5"]
345
+ final << rng.map(&:to_s)
346
+ end
347
+ final.flatten.uniq.sort
348
+ end
349
+
350
+ # Merge overlapping ranges.
351
+ #
352
+ # Inputs an array of ruby ranges: [2..5, 9..9, 4..6]
353
+ # Returns an array of merged ruby ranges: [2..6, 9..9]
354
+ #
355
+ def self.merge_range(range)
356
+ # sort to lowest range 'first' values:
357
+ # [2..5, 9..9, 4..6] -> [2..5, 4..6, 9..9]
358
+ range = range.sort_by(&:first)
359
+
360
+ *merged = range.shift
361
+ range.each do |r|
362
+ lastr = merged[-1]
363
+ if lastr.last >= r.first - 1
364
+ merged[-1] = lastr.first..[r.last, lastr.last].max
365
+ else
366
+ merged.push(r)
367
+ end
368
+ end
369
+ merged
370
+ end # merge_range
371
+
372
+ def self.add_quotes(value)
373
+ return value if image_version?(/7.3.[0-1]/) || value.nil?
374
+ value = "'#{value}'" unless
375
+ value.start_with?('"', "'") && value.end_with?('"', "'")
376
+ value
377
+ end # add_quotes
378
+
379
+ # This method is used in config_get for CLIs which
380
+ # have multiple properties in the same output
381
+ # Given a match_method which defines regex pattern and the
382
+ # match criteria, this method, extracts the value of
383
+ # a property with or without a prefix.
384
+ # For ex. if the regex pattern is something like:
385
+ # (?<action>\S+)?
386
+ # the property to extract is action and prefix is nil
387
+ # for (?<src_port>range \S+)
388
+ # the property to extract is src_port and prefix is range
389
+ def self.extract_value(match_method, prop, prefix=nil)
390
+ prefix = prop if prefix.nil?
391
+ mm = match_method
392
+
393
+ return nil if mm.nil?
394
+
395
+ return nil unless mm.names.include?(prop)
396
+
397
+ # extract and return value that follows prefix + <space>
398
+ regexp = Regexp.new("#{Regexp.escape(prefix)} (?<extracted>.*)")
399
+ value_match = regexp.match(mm[prop])
400
+ return nil if value_match.nil?
401
+ value_match[:extracted]
402
+ end
403
+
404
+ # This method is used in config_set for CLIs which
405
+ # can set multiple properties using the same CLI.
406
+ # This method attaches prefix to the given property
407
+ # when the prefix is different from the property name
408
+ # else it attaches property name itself. It also
409
+ # appends the value to be set.
410
+ # For ex. if the set_value is <precedence> <time_range>
411
+ # the prop for precedence could be 'precedence', and
412
+ # for time_range, the prop and prefix could be 'time_range'
413
+ # and 'time-range'
414
+ def self.attach_prefix(val, prop, prefix=nil)
415
+ prefix = prop.to_s if prefix.nil?
416
+ val.to_s.empty? ? val : "#{prefix} #{val}"
417
+ end
418
+
419
+ # Helper utility to normalize the interface name pattern to be filtered.
420
+ # This is only a problem on N7k which has to use a section filter
421
+ # due to a show run int bug (no 'all' keyword for some interfaces).
422
+ def self.normalize_intf_pattern(show_name)
423
+ return '' if show_name.nil? || show_name.empty?
424
+ require_relative 'platform'
425
+ return show_name unless Platform.hardware_type[/Nexus7/]
426
+ return show_name if show_name[-1] == '$' # already normalized
427
+ pat = show_name.downcase + '$'
428
+ case pat
429
+ when /ethernet/
430
+ pat.sub!(/ethernet/, 'Ethernet')
431
+ when /loopback/
432
+ pat.sub!(/loopback/, 'loopback')
433
+ when /port-channel/
434
+ pat.sub!(/port-channel/, 'port-channel')
435
+ when /vlan/
436
+ pat.sub!(/vlan/, 'Vlan')
437
+ else
438
+ # wildcard the first char of the name
439
+ pat.sub!(/./, '.')
440
+ end
441
+ pat
442
+ end
443
+ end # class Utils
444
+ end # module Cisco
@@ -0,0 +1,238 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # October 2015, Glenn F. Matthews
4
+ #
5
+ # Copyright (c) 2015-2016 Cisco and/or its affiliates.
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ require_relative '../environment'
20
+ require_relative '../exceptions'
21
+ require_relative 'utils'
22
+ require_relative '../constants'
23
+ require_relative '../logger'
24
+
25
+ include Cisco::Logger
26
+
27
+ # Base class for clients of various RPC formats
28
+ class Cisco::Client
29
+ @@clients = [] # rubocop:disable Style/ClassVars
30
+
31
+ def self.clients
32
+ @@clients
33
+ end
34
+
35
+ # Each subclass should call this method to register itself.
36
+ def self.register_client(client)
37
+ @@clients << client
38
+ end
39
+
40
+ attr_reader :data_formats, :platform
41
+
42
+ def initialize(data_formats: [],
43
+ platform: nil,
44
+ **kwargs)
45
+ if self.class == Cisco::Client
46
+ fail NotImplementedError, 'Cisco::Client is an abstract class. ' \
47
+ "Instantiate one of #{@@clients} or use Cisco::Client.create() instead"
48
+ end
49
+ self.class.validate_args(**kwargs)
50
+ @host = kwargs[:host]
51
+ @port = kwargs[:port]
52
+ @address = @port.nil? ? @host : "#{@host}:#{@port}"
53
+ @username = kwargs[:username]
54
+ @password = kwargs[:password]
55
+ self.data_formats = data_formats
56
+ self.platform = platform
57
+ @cache_enable = true
58
+ @cache_auto = true
59
+ cache_flush
60
+ end
61
+
62
+ def self.validate_args(**kwargs)
63
+ host = kwargs[:host]
64
+ unless host.nil?
65
+ fail TypeError, 'invalid address' unless host.is_a?(String)
66
+ fail ArgumentError, 'empty address' if host.empty?
67
+ end
68
+ username = kwargs[:username]
69
+ unless username.nil?
70
+ fail TypeError, 'invalid username' unless username.is_a?(String)
71
+ fail ArgumentError, 'empty username' if username.empty?
72
+ end
73
+ password = kwargs[:password]
74
+ unless password.nil?
75
+ fail TypeError, 'invalid password' unless password.is_a?(String)
76
+ fail ArgumentError, 'empty password' if password.empty?
77
+ end
78
+ end
79
+
80
+ def supports?(data_format)
81
+ data_formats.include?(data_format)
82
+ end
83
+
84
+ # Try to create an instance of an appropriate subclass
85
+ def self.create(environment_name=nil)
86
+ fail 'No client implementations available!' if clients.empty?
87
+ debug "Trying to establish client connection. clients = #{clients}"
88
+ environment = Cisco::Environment.environment(environment_name)
89
+ host = environment[:host]
90
+ errors = []
91
+ clients.each do |client_class|
92
+ begin
93
+ debug "Trying to connect to #{host} as #{client_class}"
94
+ client = client_class.new(**environment)
95
+ debug "#{client_class} connected successfully"
96
+ return client
97
+ rescue Cisco::ClientError, TypeError, ArgumentError => e
98
+ debug "Unable to connect to #{host} as #{client_class}: #{e.message}"
99
+ debug e.backtrace.join("\n ")
100
+ errors << e
101
+ end
102
+ end
103
+ handle_errors(errors)
104
+ end
105
+
106
+ def self.handle_errors(errors)
107
+ # ClientError means we tried to connect but failed,
108
+ # so it's 'more significant' than input validation errors.
109
+ client_errors = errors.select { |e| e.kind_of? Cisco::ClientError }
110
+ if !client_errors.empty?
111
+ # Reraise the specific error if just one
112
+ fail client_errors[0] if client_errors.length == 1
113
+ # Otherwise clump them together into a new error
114
+ e_cls = client_errors[0].class
115
+ unless client_errors.all? { |e| e.class == e_cls }
116
+ e_cls = Cisco::ClientError
117
+ end
118
+ fail e_cls, ("Unable to establish any client connection:\n" +
119
+ errors.each(&:message).join("\n"))
120
+ elsif errors.any? { |e| e.kind_of? ArgumentError }
121
+ fail ArgumentError, ("Invalid arguments:\n" +
122
+ errors.each(&:message).join("\n"))
123
+ elsif errors.any? { |e| e.kind_of? TypeError }
124
+ fail TypeError, ("Invalid arguments:\n" +
125
+ errors.each(&:message).join("\n"))
126
+ end
127
+ fail Cisco::ClientError, 'No client connected, but no errors were reported?'
128
+ end
129
+
130
+ def to_s
131
+ @address.to_s
132
+ end
133
+
134
+ def inspect
135
+ "<#{self.class} of #{@address}>"
136
+ end
137
+
138
+ def cache_enable?
139
+ @cache_enable
140
+ end
141
+
142
+ def cache_enable=(enable)
143
+ @cache_enable = enable
144
+ cache_flush unless enable
145
+ end
146
+
147
+ def cache_auto?
148
+ @cache_auto
149
+ end
150
+
151
+ attr_writer :cache_auto
152
+
153
+ # Clear the cache of CLI output results.
154
+ #
155
+ # If cache_auto is true (default) then this will be performed automatically
156
+ # whenever a set() is called, but providers may also call this
157
+ # to explicitly force the cache to be cleared.
158
+ def cache_flush
159
+ # to be implemented by subclasses
160
+ end
161
+
162
+ # Configure the given state on the device.
163
+ #
164
+ # @raise [RequestNotSupported] if this client doesn't support the given
165
+ # data_format
166
+ #
167
+ # @param data_format one of Cisco::DATA_FORMATS. Default is :cli
168
+ # @param context [String, Array<String>] Context for the configuration
169
+ # @param values [String, Array<String>] Actual configuration to set
170
+ # @param kwargs data-format-specific args
171
+ def set(data_format: :cli,
172
+ context: nil,
173
+ values: nil,
174
+ **_kwargs)
175
+ # subclasses will generally want to call Client.munge_to_array()
176
+ # on context and/or values before calling super()
177
+ fail Cisco::RequestNotSupported unless self.supports?(data_format)
178
+ cache_flush if cache_auto?
179
+ Cisco::Logger.debug("Set state using data format '#{data_format}'")
180
+ Cisco::Logger.debug(" with context:\n #{context.join("\n ")}") \
181
+ unless context.nil? || context.empty?
182
+ Cisco::Logger.debug(" to value(s):\n #{values.join("\n ")}") \
183
+ unless values.nil? || values.empty?
184
+ # to be implemented by subclasses
185
+ end
186
+
187
+ # Get the given state from the device.
188
+ #
189
+ # Unlike set() this will not clear the CLI cache;
190
+ # multiple calls with the same parameters may return cached data
191
+ # rather than querying the device repeatedly.
192
+ #
193
+ # @raise [RequestNotSupported] if the client doesn't support the data_format
194
+ # @raise [RequestFailed] if the command is rejected by the device
195
+ #
196
+ # @param data_format one of Cisco::DATA_FORMATS. Default is :cli
197
+ # @param command [String] the get command to execute
198
+ # @param context [String, Array<String>] Context to refine/filter the results
199
+ # @param value [String, Regexp] Specific key or regexp to look up
200
+ # @param kwargs data-format-specific args
201
+ # @return [String, Hash, nil] The state found, or nil if not found.
202
+ def get(data_format: :cli,
203
+ command: nil,
204
+ context: nil,
205
+ value: nil,
206
+ **_kwargs)
207
+ # subclasses will generally want to call Client.munge_to_array()
208
+ # on context and/or value before calling super()
209
+ fail Cisco::RequestNotSupported unless self.supports?(data_format)
210
+ Cisco::Logger.debug("Get state using data format '#{data_format}'")
211
+ Cisco::Logger.debug(" executing command:\n #{command}") \
212
+ unless command.nil? || command.empty?
213
+ Cisco::Logger.debug(" with context:\n #{context.join("\n ")}") \
214
+ unless context.nil? || context.empty?
215
+ Cisco::Logger.debug(" to get value: #{value}") \
216
+ unless value.nil?
217
+ # to be implemented by subclasses
218
+ end
219
+
220
+ private
221
+
222
+ # Set the list of data formats supported by this client.
223
+ # If the client supports multiple formats, and a given feature or property
224
+ # can be managed by multiple formats, the list order indicates preference.
225
+ def data_formats=(data_formats)
226
+ data_formats = [data_formats] unless data_formats.is_a?(Array)
227
+ unknown = data_formats - Cisco::DATA_FORMATS
228
+ fail ArgumentError, "unknown data formats: #{unknown}" unless unknown.empty?
229
+ @data_formats = data_formats
230
+ end
231
+
232
+ # Set the platform of the node managed by this client.
233
+ def platform=(platform)
234
+ fail ArgumentError, "unknown platform #{platform}" \
235
+ unless Cisco::PLATFORMS.include?(platform)
236
+ @platform = platform
237
+ end
238
+ end