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,690 @@
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 'ciscotest'
16
+ require_relative '../lib/cisco_node_utils/router_ospf'
17
+ require_relative '../lib/cisco_node_utils/router_ospf_vrf'
18
+
19
+ # TestRouterOspfVrf - Minitest for RouterOspfVrf node utility class
20
+ class TestRouterOspfVrf < CiscoTestCase
21
+ @skip_unless_supported = 'ospf'
22
+ @@pre_clean_needed = true # rubocop:disable Style/ClassVars
23
+
24
+ def setup
25
+ super
26
+ remove_all_ospfs if @@pre_clean_needed
27
+ @@pre_clean_needed = false # rubocop:disable Style/ClassVars
28
+ end
29
+
30
+ def teardown
31
+ remove_all_ospfs
32
+ super
33
+ end
34
+
35
+ def test_redistribute
36
+ routers = %w(alpha beta)
37
+ vrfs = %w(default zed)
38
+ routers.each do |rtr|
39
+ vrfs.each do |vrf|
40
+ dbg = sprintf('[RTR %s VRF %s]', rtr, vrf)
41
+ af = RouterOspfVrf.new(rtr, vrf)
42
+ redistribute_cmd(af, dbg)
43
+ end
44
+ end
45
+ end
46
+
47
+ def redistribute_cmd(af, dbg)
48
+ # rubocop:disable Style/WordArray
49
+ # Initial 'should' state
50
+ master = [['direct', 'rm_direct'],
51
+ ['lisp', 'rm_lisp'],
52
+ ['static', 'rm_static'],
53
+ ['eigrp 1', 'rm_eigrp'],
54
+ ['isis 2', 'rm_isis'],
55
+ ['ospf 3', 'rm_ospf'],
56
+ ['rip 4', 'rm_rip'],
57
+ ['bgp 5', 'rm_bgp']]
58
+ # rubocop:enable Style/WordArray
59
+
60
+ # Test: Add all protocols w/route-maps when no cmds are present
61
+ should = master.clone
62
+ af.redistribute = should
63
+ result = af.redistribute
64
+ assert_equal(should.sort, result.sort,
65
+ "#{dbg} Test 1. From empty, to all protocols")
66
+
67
+ # Test: remove half of the protocols
68
+ should.shift(4)
69
+ af.redistribute = should
70
+ result = af.redistribute
71
+ assert_equal(should.sort, result.sort,
72
+ "#{dbg} Test 2. Remove half of the protocols")
73
+
74
+ # Test: restore the removed protocols
75
+ should = master.clone
76
+ af.redistribute = should
77
+ result = af.redistribute
78
+ assert_equal(should.sort, result.sort,
79
+ "#{dbg} Test 3. Restore the removed protocols")
80
+
81
+ # Test: Change route-maps on existing commands
82
+ should = master.map { |prot_only, rm| [prot_only, "#{rm}_2"] }
83
+ af.redistribute = should
84
+ result = af.redistribute
85
+ assert_equal(should.sort, result.sort,
86
+ "#{dbg} Test 4. Change route-maps on existing commands")
87
+
88
+ # Test: 'default'
89
+ should = af.default_redistribute
90
+ af.redistribute = should
91
+ result = af.redistribute
92
+ assert_equal(should.sort, result.sort,
93
+ "#{dbg} Test 5. 'Default'")
94
+ end
95
+
96
+ def assert_match_vrf_line(routername, vrfname, cmd=nil)
97
+ match_vrf_line(routername, vrfname, cmd, true)
98
+ end
99
+
100
+ def refute_match_vrf_line(routername, vrfname, cmd=nil)
101
+ match_vrf_line(routername, vrfname, cmd, false)
102
+ end
103
+
104
+ def match_vrf_line(routername, vrfname, cmd=nil, match_cmd=true)
105
+ s = @device.cmd('show run ospf all | sec "router ospf" | no-more')
106
+ pattern = /router ospf #{routername}/
107
+ assert_match(pattern, s)
108
+ vrf_found = false
109
+ # If no vrf or cmd, just finding the router is enough
110
+ return true if vrfname == 'default' && cmd.nil?
111
+
112
+ # Else, look for the vrf and/or cmd
113
+ pattern.match(s).post_match.each_line do |line|
114
+ # Skip blank lines
115
+ next if /^\s*$/.match(line)
116
+ if !vrf_found && vrfname != 'default'
117
+ # Have to find the VRF before checking for cmd
118
+ assert_match(/^\s+(.*)/, line,
119
+ "Exited 'router ospf #{routername}' submode "\
120
+ "before finding 'vrf #{vrfname}'. Output:\n#{s}")
121
+ vrf_found = true if /vrf\s#{vrfname}/ =~ line
122
+ return true if cmd.nil?
123
+ next
124
+ end
125
+
126
+ # If we get here, either we found the VRF we want or we want no VRF
127
+ if !match_cmd
128
+ # If we find a new VRF, we're done
129
+ return true if /vrf\s.*/ =~ line
130
+ # Fail if we find the unwanted command
131
+ refute_match(cmd, line)
132
+ else
133
+ # Fail if we hit a VRF before finding our cmd
134
+ refute_match(/vrf\s.*/, line,
135
+ "Found vrf line before finding #{cmd} under vrf default")
136
+ # We're done if we found the command
137
+ return true if cmd =~ line
138
+ end
139
+ end
140
+ if !vrf_found && vrfname != 'default'
141
+ flunk("Ran out of output before finding 'vrf #{vrfname}':\n#{s}")
142
+ elsif cmd && match_cmd
143
+ flunk("Ran out of output before finding #{cmd}:\n#{s}")
144
+ end
145
+ end
146
+
147
+ def create_routerospf(ospfname='ospfTest')
148
+ RouterOspf.new(ospfname)
149
+ end
150
+
151
+ def create_routerospfvrf(router='Wolfpack', name='default')
152
+ RouterOspfVrf.new(router, name)
153
+ end
154
+
155
+ def config_from_hash(hash)
156
+ config('feature ospf')
157
+ cfg = []
158
+ hash.each do |k, v|
159
+ # Assuming all values are in hash
160
+ cfg << "router ospf #{k}"
161
+ v.each do |k1, v1|
162
+ cfg << "vrf #{v1[:vrf]}" if (k1 != 'default')
163
+ cfg << "auto-cost reference-bandwidth #{v1[:cov]}"
164
+ cfg << "default-metric #{v1[:dm]}"
165
+ cfg << "router-id #{v1[:id]}"
166
+ cfg << "timers throttle lsa #{v1[:l1]} #{v1[:l2]} #{v1[:l3]}"
167
+ cfg << "timers throttle spf #{v1[:s1]} #{v1[:s2]} #{v1[:s3]}"
168
+ end
169
+ end
170
+ config(*cfg)
171
+ end
172
+
173
+ def test_collection_size
174
+ create_routerospfvrf('green')
175
+ vrfs = RouterOspfVrf.vrfs
176
+ assert_equal(1, vrfs.size, 'Error: Collection is not one')
177
+ create_routerospfvrf('green', 'NC_State')
178
+ vrfs = RouterOspfVrf.vrfs
179
+ assert_equal(2, vrfs['green'].size, 'Error: Collection is not two')
180
+ create_routerospfvrf('green', 'Duke')
181
+ create_routerospfvrf('green', 'Carolina')
182
+ vrfs = RouterOspfVrf.vrfs
183
+ assert_equal(4, vrfs['green'].size, 'Error: Collection is not four')
184
+ RouterOspf.routers.each_value(&:destroy)
185
+ vrfs = RouterOspfVrf.vrfs
186
+ assert_empty(vrfs, 'Error: Collection is not empty')
187
+ end
188
+
189
+ # rubocop:disable Style/AlignHash
190
+ MULTIPLE_OSPFS = Hash.new { |h, k| h[k] = {} }.merge(
191
+ 'ospfTest' => {
192
+ 'default' => {
193
+ vrf: 'default', cov: 90,
194
+ cot: RouterOspfVrf::OSPF_AUTO_COST[:mbps], dm: 15_000,
195
+ id: '9.0.0.2', l1: 130, l2: 530, l3: 1030, s1: 300,
196
+ s2: 600, s3: 1100
197
+ }
198
+ },
199
+ 'bxb300' => {
200
+ 'default' => {
201
+ vrf: 'default', cov: 200,
202
+ cot: RouterOspfVrf::OSPF_AUTO_COST[:mbps], dm: 10_000,
203
+ id: '10.0.0.3', l1: 130, l2: 530, l3: 1030, s1: 300,
204
+ s2: 600, s3: 1100
205
+ }
206
+ },
207
+ )
208
+ # rubocop:enable Style/AlignHash
209
+
210
+ def test_collection_not_empty_valid
211
+ # pre-populate values
212
+ config_from_hash(MULTIPLE_OSPFS)
213
+
214
+ routers = RouterOspf.routers
215
+ # validate the collection
216
+ routers.each_key do |routername|
217
+ vrfs = RouterOspfVrf.vrfs
218
+ refute_empty(vrfs, 'Error: Collection is empty')
219
+ hv = MULTIPLE_OSPFS.fetch(routername.to_s)
220
+ next if hv.nil?
221
+ hv = hv['default']
222
+ vrfs[routername].each_value do |vrf|
223
+ auto_cost_value = [] << hv[:cov] << hv[:cot]
224
+ assert_equal(hv[:vrf], vrf.name,
225
+ 'Error: Collection, vrf name')
226
+ assert_equal(auto_cost_value, vrf.auto_cost,
227
+ 'Error: Collection, auto cost')
228
+ assert_equal(hv[:dm], vrf.default_metric,
229
+ 'Error: Collection, default metric')
230
+ assert_equal(hv[:id], vrf.router_id,
231
+ 'Error: Collection, router id')
232
+ lsa = [] << hv[:l1] << hv[:l2] << hv[:l3]
233
+ assert_equal(lsa, vrf.timer_throttle_lsa,
234
+ 'Error: Collection, timer throttle lsa')
235
+ spf = [] << hv[:s1] << hv[:s2] << hv[:s3]
236
+ assert_equal(spf, vrf.timer_throttle_spf,
237
+ 'Error: Collection, timer throttle spf')
238
+ end
239
+ end
240
+ end
241
+
242
+ def test_create_vrf_nil
243
+ assert_raises(TypeError) { RouterOspfVrf.new(nil, 'testvrf') }
244
+ end
245
+
246
+ def test_create_name_zero_length
247
+ RouterOspf.new('testOspf')
248
+ assert_raises(ArgumentError) do
249
+ RouterOspfVrf.new('testOspf', '')
250
+ end
251
+ end
252
+
253
+ def test_create_valid
254
+ ospfname = 'ospfTest'
255
+
256
+ vrfname = 'default'
257
+ vrf = RouterOspfVrf.new(ospfname, vrfname)
258
+ assert_match_vrf_line(ospfname, vrfname)
259
+ assert_equal(vrfname, vrf.name,
260
+ "Error: #{vrfname} vrf, create failed")
261
+ end
262
+
263
+ def test_get_parent_name
264
+ routerospf = create_routerospf
265
+ vrf = create_routerospfvrf(routerospf.name)
266
+ assert_equal(routerospf.name, vrf.parent.name,
267
+ 'Error: Parent value is not correct')
268
+ end
269
+
270
+ def test_get_name
271
+ vrfname = 'default'
272
+ vrf = create_routerospfvrf('green')
273
+ assert_match_vrf_line('green', vrfname)
274
+ assert_equal(vrfname, vrf.name,
275
+ "Error: #{vrfname} vrf, name get value mismatch")
276
+ end
277
+
278
+ def test_destroy
279
+ vrfname = 'default'
280
+ vrf = create_routerospfvrf
281
+ assert_raises(RuntimeError) do
282
+ vrf.destroy
283
+ end
284
+ assert_match_vrf_line(vrf.parent.name, vrfname)
285
+ end
286
+
287
+ def test_auto_cost
288
+ vrf = create_routerospfvrf
289
+ auto_cost_value = [400_000, RouterOspfVrf::OSPF_AUTO_COST[:mbps]]
290
+
291
+ vrf.auto_cost_set(auto_cost_value[0], :mbps)
292
+ pattern = /\s+auto-cost reference-bandwidth #{auto_cost_value[0]}/
293
+ assert_match_vrf_line(vrf.parent.name, vrf.name, pattern)
294
+ assert_equal(auto_cost_value, vrf.auto_cost,
295
+ 'Error: auto-cost, get value mismatch')
296
+ end
297
+
298
+ def test_auto_cost_multiple_vrf
299
+ routerospf = create_routerospf
300
+ vrf = create_routerospfvrf(routerospf.name)
301
+ vrf1 = create_routerospfvrf(routerospf.name, 'testvrf')
302
+ auto_cost_value = [600_000, RouterOspfVrf::OSPF_AUTO_COST[:mbps]]
303
+
304
+ vrf.auto_cost_set(auto_cost_value[0], :mbps)
305
+ pattern = /\s+auto-cost reference-bandwidth #{auto_cost_value[0]}/
306
+ assert_match_vrf_line(routerospf.name, vrf.name, pattern)
307
+ assert_equal(auto_cost_value, vrf.auto_cost,
308
+ "Error: #{vrf.name} vrf, auto-cost get value mismatch")
309
+
310
+ # vrf 1
311
+ auto_cost_value = [500_000, RouterOspfVrf::OSPF_AUTO_COST[:mbps]]
312
+
313
+ vrf1.auto_cost_set(auto_cost_value[0], :mbps)
314
+ pattern = /\s+auto-cost reference-bandwidth #{auto_cost_value[0]}/
315
+ assert_match_vrf_line(routerospf.name, vrf1.name, pattern)
316
+ assert_equal(auto_cost_value, vrf1.auto_cost,
317
+ "Error: #{vrf1.name} vrf, auto-cost get value mismatch")
318
+ end
319
+
320
+ def test_get_default_auto_cost
321
+ vrf = create_routerospfvrf
322
+ # NXOS specific
323
+ auto_cost_value = [40, RouterOspfVrf::OSPF_AUTO_COST[:gbps]]
324
+ assert_equal(auto_cost_value, vrf.default_auto_cost,
325
+ 'Error: default auto-cost get value mismatch')
326
+ assert_equal(auto_cost_value, vrf.auto_cost,
327
+ 'Error: auto-cost get value default mismatch')
328
+ end
329
+
330
+ def test_bfd
331
+ routerospf = create_routerospf
332
+ vrf = create_routerospfvrf(routerospf.name)
333
+ vrf1 = create_routerospfvrf(routerospf.name, 'testvrf')
334
+ assert_equal(vrf.default_bfd, vrf.bfd)
335
+ assert_equal(vrf1.default_bfd, vrf1.bfd)
336
+ vrf.bfd = true
337
+ vrf1.bfd = true
338
+ assert_equal(true, vrf.bfd)
339
+ assert_equal(true, vrf1.bfd)
340
+ vrf.bfd = vrf.default_bfd
341
+ vrf1.bfd = vrf1.default_bfd
342
+ assert_equal(vrf.default_bfd, vrf.bfd)
343
+ assert_equal(vrf1.default_bfd, vrf1.bfd)
344
+ end
345
+
346
+ def test_default_metric
347
+ vrf = create_routerospfvrf
348
+ metric = 30_000
349
+ vrf.default_metric = metric
350
+ pattern = /\s+default-metric #{metric}/
351
+ assert_match_vrf_line(vrf.parent.name, vrf.name, pattern)
352
+ assert_equal(metric, vrf.default_metric,
353
+ "Error: #{vrf.name} vrf, default-metric get value mismatch")
354
+
355
+ skip_versions = ['7.0.3.I7.3']
356
+ return unless step_unless_legacy_defect(skip_versions, 'CSCvi74876: Cannot remove default metric')
357
+ vrf.default_metric = vrf.default_default_metric
358
+ refute_match_vrf_line(vrf.parent.name, vrf.name, pattern)
359
+ end
360
+
361
+ def test_default_metric_multiple_vrf
362
+ routerospf = create_routerospf
363
+ vrf = create_routerospfvrf(routerospf.name)
364
+ vrf1 = create_routerospfvrf(routerospf.name, 'testvrf')
365
+ metric = 35_000
366
+
367
+ vrf.default_metric = metric
368
+ pattern = /\s+default-metric #{metric}/
369
+ assert_match_vrf_line(routerospf.name, vrf.name, pattern)
370
+ assert_equal(metric, vrf.default_metric,
371
+ "Error: #{vrf.name} vrf, default-metric get value mismatch")
372
+
373
+ # vrf 1
374
+ metric = 25_000
375
+ vrf1.default_metric = metric
376
+ pattern = /\s+default-metric #{metric}/
377
+ assert_match_vrf_line(routerospf.name, vrf1.name, pattern)
378
+ assert_equal(metric, vrf1.default_metric,
379
+ "Error: #{vrf1.name} vrf, default-metric get value mismatch")
380
+ end
381
+
382
+ def test_log_adjacency_changes
383
+ vrf = create_routerospfvrf
384
+
385
+ assert_equal(:none, vrf.log_adjacency,
386
+ 'Error: log-adjacency get value mismatch')
387
+
388
+ vrf.log_adjacency = :log
389
+ pattern = /\s+log-adjacency-changes/
390
+ assert_match_vrf_line(vrf.parent.name, vrf.name, pattern)
391
+ assert_equal(:log, vrf.log_adjacency,
392
+ 'Error: log-adjacency get value mismatch')
393
+
394
+ vrf.log_adjacency = :detail
395
+ pattern = /\s+log-adjacency-changes detail/
396
+ assert_match_vrf_line(vrf.parent.name, vrf.name, pattern)
397
+ assert_equal(:detail, vrf.log_adjacency,
398
+ "Error: #{vrf.name} vrf, " \
399
+ 'log-adjacency detail get value mismatch')
400
+
401
+ vrf.log_adjacency = vrf.default_log_adjacency
402
+ pattern = /\s+log-adjacency-changes(.*)/
403
+ refute_match_vrf_line(vrf.parent.name, vrf.name, pattern)
404
+ end
405
+
406
+ def test_log_adjacency_multiple_vrf
407
+ routerospf = create_routerospf
408
+ vrf = create_routerospfvrf(routerospf.name)
409
+ vrf1 = create_routerospfvrf(routerospf.name, 'testvrf')
410
+
411
+ vrf.log_adjacency = :log
412
+ pattern = /\s+log-adjacency-changes/
413
+ assert_match_vrf_line(routerospf.name, vrf.name, pattern)
414
+ assert_equal(:log, vrf.log_adjacency,
415
+ "Error: #{vrf.name} vrf, log-adjacency get value mismatch")
416
+
417
+ # vrf 1
418
+ vrf1.log_adjacency = :detail
419
+ pattern = /\s+log-adjacency-changes/
420
+ assert_match_vrf_line(routerospf.name, vrf1.name, pattern)
421
+ assert_equal(:detail, vrf1.log_adjacency,
422
+ "Error: #{vrf1.name} vrf, log-adjacency get value mismatch")
423
+ end
424
+
425
+ def test_log_adjacency_multiple_vrf_2
426
+ routerospf = create_routerospf
427
+ vrf_default = create_routerospfvrf(routerospf.name)
428
+ vrf1 = create_routerospfvrf(routerospf.name, 'testvrf')
429
+ # DO NOT set log_adjacency for default vrf
430
+ # DO set log_adjacency for non-default vrf
431
+
432
+ vrf1.log_adjacency = :detail
433
+ pattern = /\s+log-adjacency-changes/
434
+ assert_match_vrf_line(routerospf.name, vrf1.name, pattern)
435
+ assert_equal(:detail, vrf1.log_adjacency,
436
+ "Error: #{vrf1.name} vrf, log-adjacency get value mismatch")
437
+
438
+ assert_equal(:none, vrf_default.log_adjacency,
439
+ "Error: #{vrf_default.name} vrf_default, " \
440
+ 'log-adjacency get value mismatch')
441
+ end
442
+
443
+ def test_router_id
444
+ vrf = create_routerospfvrf
445
+ id = '8.1.1.3'
446
+ vrf.router_id = id
447
+ pattern = /\s+router-id #{id}/
448
+ assert_match_vrf_line(vrf.parent.name, vrf.name, pattern)
449
+ assert_equal(id, vrf.router_id,
450
+ "Error: #{vrf.name} vrf, router-id get value mismatch")
451
+
452
+ vrf.router_id = vrf.default_router_id
453
+ refute_match_vrf_line(vrf.parent.name, vrf.name, pattern)
454
+ end
455
+
456
+ def test_router_id_multiple_vrf
457
+ routerospf = create_routerospf
458
+ vrf = create_routerospfvrf(routerospf.name)
459
+ vrf1 = create_routerospfvrf(routerospf.name, 'testvrf')
460
+ id = '8.1.1.3'
461
+
462
+ vrf.router_id = id
463
+ pattern = /\s+router-id #{id}/
464
+ assert_match_vrf_line(routerospf.name, vrf.name, pattern)
465
+ assert_equal(id, vrf.router_id,
466
+ "Error: #{vrf.name} vrf, router-id get value mismatch")
467
+
468
+ # vrf 1
469
+ id = '10.1.1.3'
470
+
471
+ vrf1.router_id = id
472
+ pattern = /\s+router-id #{id}/
473
+ assert_match_vrf_line(routerospf.name, vrf1.name, pattern)
474
+ assert_equal(id, vrf1.router_id,
475
+ "Error: #{vrf1.name} vrf, router-id get value mismatch")
476
+ end
477
+
478
+ def test_timer_throttle_lsa
479
+ vrf = create_routerospfvrf
480
+ lsa = [] << 100 << 500 << 1000
481
+ vrf.timer_throttle_lsa_set(lsa[0], lsa[1], lsa[2])
482
+
483
+ pattern = /\s+timers throttle lsa #{lsa[0]} #{lsa[1]} #{lsa[2]}/
484
+ assert_match_vrf_line(vrf.parent.name, vrf.name, pattern)
485
+ assert_equal(lsa, vrf.timer_throttle_lsa,
486
+ "Error: #{vrf.name} vrf, timer throttle lsa " \
487
+ 'get values mismatch')
488
+ end
489
+
490
+ def test_timer_throttle_lsa_multiple_vrf
491
+ routerospf = create_routerospf
492
+ vrf = create_routerospfvrf(routerospf.name)
493
+ vrf1 = create_routerospfvrf(routerospf.name, 'testvrf')
494
+ lsa = [] << 100 << 500 << 1000
495
+
496
+ vrf.timer_throttle_lsa_set(lsa[0], lsa[1], lsa[2])
497
+ pattern = /\s+timers throttle lsa #{lsa[0]} #{lsa[1]} #{lsa[2]}/
498
+ assert_match_vrf_line(routerospf.name, vrf.name, pattern)
499
+ assert_equal(lsa, vrf.timer_throttle_lsa,
500
+ "Error: #{vrf.name} vrf, timer throttle lsa " \
501
+ 'get values mismatch')
502
+
503
+ lsa = [] << 300 << 700 << 2000
504
+
505
+ vrf1.timer_throttle_lsa_set(lsa[0], lsa[1], lsa[2])
506
+ pattern = /\s+timers throttle lsa #{lsa[0]} #{lsa[1]} #{lsa[2]}/
507
+ assert_match_vrf_line(routerospf.name, vrf1.name, pattern)
508
+ assert_equal(lsa, vrf1.timer_throttle_lsa,
509
+ "Error: #{vrf1.name} vrf, timer throttle lsa " \
510
+ 'get values mismatch')
511
+ end
512
+
513
+ def test_get_default_timer_throttle_lsa
514
+ vrf = create_routerospfvrf
515
+ lsa = [0, 5000, 5000]
516
+ assert_equal(lsa[0], vrf.timer_throttle_lsa_start,
517
+ "Error: #{vrf.name} vrf, timer throttle lsa start not correct")
518
+ assert_equal(lsa[1], vrf.timer_throttle_lsa_hold,
519
+ "Error: #{vrf.name} vrf, timer throttle lsa hold not correct")
520
+ assert_equal(lsa[2], vrf.timer_throttle_lsa_max,
521
+ "Error: #{vrf.name} vrf, timer throttle lsa max not correct")
522
+ assert_equal(lsa[0], vrf.default_timer_throttle_lsa_start,
523
+ 'Error: default timer throttle lsa start not correct')
524
+ assert_equal(lsa[1], vrf.default_timer_throttle_lsa_hold,
525
+ 'Error: default timer throttle lsa hold not correct')
526
+ assert_equal(lsa[2], vrf.default_timer_throttle_lsa_max,
527
+ 'Error: default timer throttle lsa max not correct')
528
+ end
529
+
530
+ def test_timer_throttle_spf
531
+ vrf = create_routerospfvrf
532
+ spf = [250, 500, 1000]
533
+
534
+ vrf.timer_throttle_spf_set(spf[0], spf[1], spf[2])
535
+ pattern = /\s+timers throttle spf #{spf[0]} #{spf[1]} #{spf[2]}/
536
+ assert_match_vrf_line(vrf.parent.name, vrf.name, pattern)
537
+ assert_equal(spf, vrf.timer_throttle_spf,
538
+ "Error: #{vrf.name} vrf, timer throttle spf " \
539
+ 'get values mismatch')
540
+ end
541
+
542
+ def test_timer_throttle_spf_multiple_vrf
543
+ routerospf = create_routerospf
544
+ vrf = create_routerospfvrf(routerospf.name)
545
+ vrf1 = create_routerospfvrf(routerospf.name, 'testvrf')
546
+ spf = [] << 250 << 500 << 1000
547
+
548
+ vrf.timer_throttle_spf_set(spf[0], spf[1], spf[2])
549
+ pattern = /\s+timers throttle spf #{spf[0]} #{spf[1]} #{spf[2]}/
550
+ assert_match_vrf_line(routerospf.name, vrf.name, pattern)
551
+ assert_equal(spf, vrf.timer_throttle_spf,
552
+ "Error: #{vrf.name} vrf, timer throttle spf " \
553
+ 'get values mismatch')
554
+
555
+ spf = [] << 300 << 700 << 2000
556
+
557
+ vrf1.timer_throttle_spf_set(spf[0], spf[1], spf[2])
558
+ pattern = /\s+timers throttle spf #{spf[0]} #{spf[1]} #{spf[2]}/
559
+ assert_match_vrf_line(routerospf.name, vrf1.name, pattern)
560
+ assert_equal(spf, vrf1.timer_throttle_spf,
561
+ "Error: #{vrf1.name} vrf, timer throttle spf " \
562
+ 'get values mismatch')
563
+ end
564
+
565
+ def test_get_default_timer_throttle_spf
566
+ vrf = create_routerospfvrf
567
+ spf = [200, 1000, 5000]
568
+ assert_equal(spf[0], vrf.default_timer_throttle_spf_start,
569
+ 'Error: default timer throttle spf not correct')
570
+ assert_equal(spf[1], vrf.default_timer_throttle_spf_hold,
571
+ 'Error: default timer throttle hold not correct')
572
+ assert_equal(spf[2], vrf.default_timer_throttle_spf_max,
573
+ 'Error: default timer throttle max not correct')
574
+ assert_equal(spf[0], vrf.timer_throttle_spf_start,
575
+ "Error: #{vrf.name} vrf, " \
576
+ 'default timer throttle spf not correct')
577
+ assert_equal(spf[1], vrf.timer_throttle_spf_hold,
578
+ "Error: #{vrf.name} vrf, " \
579
+ 'default timer throttle hold not correct')
580
+ assert_equal(spf[2], vrf.timer_throttle_spf_max,
581
+ "Error: #{vrf.name} vrf, " \
582
+ 'default timer throttle max not correct')
583
+ end
584
+
585
+ def test_create_valid_destroy_default
586
+ ospfname = 'ospfTest'
587
+ routerospf = RouterOspf.new(ospfname)
588
+ vrfname = 'default'
589
+ vrf = RouterOspfVrf.new(routerospf.name, vrfname)
590
+ assert_match_vrf_line(ospfname, vrfname)
591
+ assert_equal(vrfname, vrf.name,
592
+ "Error: #{vrfname} vrf, create failed")
593
+ assert_raises(RuntimeError) do
594
+ vrf.destroy
595
+ end
596
+ end
597
+
598
+ # rubocop:disable Style/AlignHash
599
+ MULTIPLE_OSPFS_MULTIPLE_VRFS = Hash.new { |h, k| h[k] = {} }.merge(
600
+ 'ospfTest' => {
601
+ 'default' => {
602
+ vrf: 'default', cov: 90,
603
+ cot: RouterOspfVrf::OSPF_AUTO_COST[:mbps], dm: 15_000,
604
+ id: '9.0.0.2', l1: 130, l2: 530, l3: 1030, s1: 300,
605
+ s2: 600, s3: 1100
606
+ }
607
+ },
608
+ 'bxb300' => {
609
+ 'default' => {
610
+ vrf: 'default', cov: 200,
611
+ cot: RouterOspfVrf::OSPF_AUTO_COST[:mbps], dm: 10_000,
612
+ id: '10.0.0.3', l1: 130, l2: 530, l3: 1030, s1: 300,
613
+ s2: 600, s3: 1100
614
+ },
615
+ 'nondefault' => {
616
+ vrf: 'nondefault', cov: 300,
617
+ cot: RouterOspfVrf::OSPF_AUTO_COST[:mbps], dm: 30_000,
618
+ id: '10.0.0.4', l1: 230, l2: 730, l3: 2030, s1: 400,
619
+ s2: 700, s3: 2100
620
+ },
621
+ },
622
+ )
623
+ # rubocop:enable Style/AlignHash
624
+
625
+ def test_collection_router_multi_vrfs
626
+ config_from_hash(MULTIPLE_OSPFS_MULTIPLE_VRFS)
627
+ routers = RouterOspf.routers
628
+ # validate the collection
629
+ routers.each_key do |routername|
630
+ vrfs = RouterOspfVrf.vrfs
631
+ refute_empty(vrfs, 'Error: Collection is empty')
632
+ unless MULTIPLE_OSPFS_MULTIPLE_VRFS.key?(routername)
633
+ puts "%Error: hash does not have hash key #{routername}"
634
+ end
635
+ ospfh = MULTIPLE_OSPFS_MULTIPLE_VRFS.fetch(routername)
636
+ vrfs[routername].each do |name, vrf|
637
+ puts "%Error: hash key #{routername} not found" unless ospfh.key?(name)
638
+ hv = ospfh.fetch(name)
639
+ auto_cost_value = [] << hv[:cov] << hv[:cot]
640
+ assert_equal(hv[:vrf], vrf.name,
641
+ 'Error: Collection, vrf name')
642
+ assert_equal(auto_cost_value, vrf.auto_cost,
643
+ 'Error: Collection, auto cost')
644
+ assert_equal(hv[:dm], vrf.default_metric,
645
+ 'Error: Collection, default metric')
646
+ assert_equal(hv[:id], vrf.router_id,
647
+ 'Error: Collection, router id')
648
+ lsa = [] << hv[:l1] << hv[:l2] << hv[:l3]
649
+ assert_equal(lsa, vrf.timer_throttle_lsa,
650
+ 'Error: Collection, timer throttle lsa')
651
+ spf = [] << hv[:s1] << hv[:s2] << hv[:s3]
652
+ assert_equal(spf, vrf.timer_throttle_spf,
653
+ 'Error: Collection, timer throttle spf')
654
+ end
655
+ end
656
+ end
657
+
658
+ def test_timer_throttle_lsa_start_hold_max
659
+ vrf = create_routerospfvrf
660
+ vrf.timer_throttle_lsa_set(250, 900, 5001)
661
+ assert_equal(250, vrf.timer_throttle_lsa_start,
662
+ "Error: #{vrf.name} vrf, start timer throttle lsa not correct")
663
+ assert_equal(900, vrf.timer_throttle_lsa_hold,
664
+ "Error: #{vrf.name} vrf, hold timer throttle lsa not correct")
665
+ assert_equal(5001, vrf.timer_throttle_lsa_max,
666
+ "Error: #{vrf.name} vrf, max timer throttle lsa not correct")
667
+ end
668
+
669
+ def test_timer_throttle_spf_start_hold_max
670
+ vrf = create_routerospfvrf
671
+ vrf.timer_throttle_spf_set(250, 900, 5001)
672
+ assert_equal(250, vrf.timer_throttle_spf_start,
673
+ "Error: #{vrf.name} vrf, start timer throttle spf not correct")
674
+ assert_equal(900, vrf.timer_throttle_spf_hold,
675
+ "Error: #{vrf.name} vrf, hold timer throttle spf not correct")
676
+ assert_equal(5001, vrf.timer_throttle_spf_max,
677
+ "Error: #{vrf.name} vrf, max timer throttle spf not correct")
678
+ end
679
+
680
+ def test_noninstantiated
681
+ create_routerospf
682
+ vrf = RouterOspfVrf.new('absent', 'absent', false)
683
+ vrf.auto_cost
684
+ vrf.default_metric
685
+ vrf.log_adjacency
686
+ vrf.router_id
687
+ vrf.timer_throttle_lsa
688
+ vrf.timer_throttle_spf
689
+ end
690
+ end