cisco_node_utils_mgx 2.1.0.1

Sign up to get free protection for your applications and to get access to all the features.
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,988 @@
1
+ # June 2015, Michael G Wiebe
2
+ #
3
+ # Copyright (c) 2015-2017 Cisco and/or its affiliates.
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require_relative 'cisco_cmn_utils'
18
+ require_relative 'node_util'
19
+ require_relative 'feature'
20
+ require_relative 'logger'
21
+
22
+ module Cisco
23
+ # RouterBgp - node utility class for BGP general config management
24
+ class RouterBgp < NodeUtil
25
+ attr_reader :asnum, :vrf
26
+
27
+ def initialize(asnum, vrf='default', instantiate=true)
28
+ fail ArgumentError unless vrf.is_a? String
29
+ fail ArgumentError unless vrf.length > 0
30
+ @asnum = RouterBgp.validate_asnum(asnum)
31
+ @vrf = vrf
32
+ set_args_keys_default
33
+ create if instantiate
34
+ end
35
+
36
+ def to_s
37
+ "BGP #{asnum} VRF '#{vrf}'"
38
+ end
39
+
40
+ # Create a hash of all router bgp default and non-default
41
+ # vrf instances
42
+ def self.routers
43
+ asnum = config_get('bgp', 'router')
44
+ return {} if asnum.nil?
45
+
46
+ hash_final = {}
47
+ asnum = asnum.to_i unless /\d+.\d+/.match(asnum)
48
+ hash_tmp = {
49
+ asnum => { 'default' => RouterBgp.new(asnum, 'default', false) }
50
+ }
51
+ vrf_ids = config_get('bgp', 'vrf', asnum: asnum)
52
+ unless vrf_ids.nil?
53
+ vrf_ids.each do |vrf|
54
+ hash_tmp[asnum][vrf] = RouterBgp.new(asnum, vrf, false)
55
+ end
56
+ end
57
+ hash_final.merge!(hash_tmp)
58
+ return hash_final
59
+ rescue Cisco::CliError
60
+ # cmd will error when feature 'bgp' is not enabled
61
+ raise if Feature.bgp_enabled?
62
+ return {}
63
+ end
64
+
65
+ def self.validate_asnum(asnum)
66
+ err_msg = 'BGP asnum must be type String or Integer'
67
+ fail ArgumentError, err_msg unless asnum.is_a?(Integer) ||
68
+ asnum.is_a?(String)
69
+ if asnum.is_a? String
70
+ # Match ASDOT '1.5' or ASPLAIN '55' strings
71
+ fail ArgumentError unless /^(\d+|\d+\.\d+)$/.match(asnum)
72
+ end
73
+ asnum.to_s
74
+ end
75
+
76
+ def router_bgp(state='')
77
+ @set_args[:state] = state
78
+ if vrf == 'default'
79
+ config_set('bgp', 'router', @set_args)
80
+ else
81
+ config_set('bgp', 'vrf', @set_args)
82
+ end
83
+ set_args_keys_default
84
+ end
85
+
86
+ # Create one router bgp instance
87
+ def create
88
+ Feature.bgp_enable if platform == :nexus
89
+ router_bgp
90
+ wait_for_process_initialized
91
+ end
92
+
93
+ # Destroy router bgp instance
94
+ def destroy
95
+ router_bgp('no')
96
+ end
97
+
98
+ def process_initialized?
99
+ config_get('bgp', 'process_initialized')
100
+ end
101
+
102
+ def wait_for_process_initialized
103
+ return unless node.product_id[/N(5|6|8)/]
104
+
105
+ # Hack for slow-start platforms which will have setter failures if the
106
+ # bgp instance is still initializing. To see this problem in a sandbox
107
+ # do 'router bgp 1 ; router bgp 1 ; shutdown'.
108
+ 4.times do
109
+ return if process_initialized?
110
+ sleep 1
111
+ node.cache_flush
112
+ end
113
+ fail 'BGP process is not initialized yet'
114
+ end
115
+
116
+ # Helper method to delete @set_args hash keys
117
+ def set_args_keys_default
118
+ @set_args = { asnum: @asnum }
119
+ @set_args[:vrf] = @vrf unless @vrf == 'default'
120
+ @get_args = @set_args
121
+ end
122
+
123
+ # Attributes:
124
+
125
+ # nsr Getter
126
+ def nsr
127
+ return nil if platform == :ios_xr && @vrf != 'default'
128
+ config_get('bgp', 'nsr', @get_args)
129
+ end
130
+
131
+ # Bestpath Getters
132
+ def bestpath_always_compare_med
133
+ config_get('bgp', 'bestpath_always_compare_med', @get_args)
134
+ end
135
+
136
+ def bestpath_aspath_multipath_relax
137
+ config_get('bgp', 'bestpath_aspath_multipath_relax', @get_args)
138
+ end
139
+
140
+ def bestpath_compare_routerid
141
+ config_get('bgp', 'bestpath_compare_routerid', @get_args)
142
+ end
143
+
144
+ def bestpath_cost_community_ignore
145
+ config_get('bgp', 'bestpath_cost_community_ignore', @get_args)
146
+ end
147
+
148
+ def bestpath_med_confed
149
+ return nil if platform == :ios_xr && @vrf != 'default'
150
+ config_get('bgp', 'bestpath_med_confed', @get_args)
151
+ end
152
+
153
+ def bestpath_med_missing_as_worst
154
+ config_get('bgp', 'bestpath_med_missing_as_worst', @get_args)
155
+ end
156
+
157
+ def bestpath_med_non_deterministic
158
+ config_get('bgp', 'bestpath_med_non_deterministic', @get_args)
159
+ end
160
+
161
+ # nsr Setter
162
+ def nsr=(enable)
163
+ if platform == :ios_xr && @vrf != 'default'
164
+ fail Cisco::UnsupportedError.new('bgp', 'nsr', 'set', 'nsr is not ' \
165
+ 'configurable on a per-VRF basis on ios_xr')
166
+ end
167
+ @set_args[:state] = (enable ? '' : 'no')
168
+ config_set('bgp', 'nsr', @set_args)
169
+ set_args_keys_default
170
+ end
171
+
172
+ # Bestpath Setters
173
+ def bestpath_always_compare_med=(enable)
174
+ @set_args[:state] = (enable ? '' : 'no')
175
+ config_set('bgp', 'bestpath_always_compare_med', @set_args)
176
+ set_args_keys_default
177
+ end
178
+
179
+ def bestpath_aspath_multipath_relax=(enable)
180
+ @set_args[:state] = (enable ? '' : 'no')
181
+ config_set('bgp', 'bestpath_aspath_multipath_relax', @set_args)
182
+ set_args_keys_default
183
+ end
184
+
185
+ def bestpath_compare_routerid=(enable)
186
+ @set_args[:state] = (enable ? '' : 'no')
187
+ config_set('bgp', 'bestpath_compare_routerid', @set_args)
188
+ set_args_keys_default
189
+ end
190
+
191
+ def bestpath_cost_community_ignore=(enable)
192
+ @set_args[:state] = (enable ? '' : 'no')
193
+ config_set('bgp', 'bestpath_cost_community_ignore', @set_args)
194
+ set_args_keys_default
195
+ end
196
+
197
+ def bestpath_med_confed=(enable)
198
+ if platform == :ios_xr && @vrf != 'default'
199
+ fail Cisco::UnsupportedError.new('bgp', 'bestpath_med_confed', 'set',
200
+ 'bestpath_med_confed is not ' \
201
+ 'configurable on a per-VRF basis ' \
202
+ 'on IOS XR')
203
+ end
204
+ @set_args[:state] = (enable ? '' : 'no')
205
+ config_set('bgp', 'bestpath_med_confed', @set_args)
206
+ set_args_keys_default
207
+ end
208
+
209
+ def bestpath_med_missing_as_worst=(enable)
210
+ @set_args[:state] = (enable ? '' : 'no')
211
+ config_set('bgp', 'bestpath_med_missing_as_worst', @set_args)
212
+ set_args_keys_default
213
+ end
214
+
215
+ def bestpath_med_non_deterministic=(enable)
216
+ @set_args[:state] = (enable ? '' : 'no')
217
+ config_set('bgp', 'bestpath_med_non_deterministic', @set_args)
218
+ set_args_keys_default
219
+ end
220
+
221
+ # nsr Default
222
+ def default_nsr
223
+ return nil if platform == :ios_xr && @vrf != 'default'
224
+ config_get_default('bgp', 'nsr')
225
+ end
226
+
227
+ # Bestpath Defaults
228
+ def default_bestpath_always_compare_med
229
+ config_get_default('bgp', 'bestpath_always_compare_med')
230
+ end
231
+
232
+ def default_bestpath_aspath_multipath_relax
233
+ config_get_default('bgp', 'bestpath_aspath_multipath_relax')
234
+ end
235
+
236
+ def default_bestpath_compare_routerid
237
+ config_get_default('bgp', 'bestpath_compare_routerid')
238
+ end
239
+
240
+ def default_bestpath_cost_community_ignore
241
+ config_get_default('bgp', 'bestpath_cost_community_ignore')
242
+ end
243
+
244
+ def default_bestpath_med_confed
245
+ return nil if platform == :ios_xr && @vrf != 'default'
246
+ config_get_default('bgp', 'bestpath_med_confed')
247
+ end
248
+
249
+ def default_bestpath_med_missing_as_worst
250
+ config_get_default('bgp', 'bestpath_med_missing_as_worst')
251
+ end
252
+
253
+ def default_bestpath_med_non_deterministic
254
+ config_get_default('bgp', 'bestpath_med_non_deterministic')
255
+ end
256
+
257
+ # Cluster Id (Getter/Setter/Default)
258
+ def cluster_id
259
+ return nil if platform == :ios_xr && @vrf != 'default'
260
+ config_get('bgp', 'cluster_id', @get_args)
261
+ end
262
+
263
+ def cluster_id=(id)
264
+ # In order to remove a bgp cluster_id you cannot simply issue
265
+ # 'no bgp cluster-id'. IMO this should be possible because you
266
+ # can only configure a single bgp cluster-id.
267
+ if platform == :ios_xr && @vrf != 'default'
268
+ fail Cisco::UnsupportedError.new('bgp', 'cluster_id', 'set',
269
+ 'cluster-id is not configurable ' \
270
+ 'on a per-VRF basis on IOS XR')
271
+ end
272
+ # HACK: specify a dummy id when removing the property.
273
+ dummy_id = 1
274
+ if id == default_cluster_id
275
+ @set_args[:state] = 'no'
276
+ @set_args[:id] = dummy_id
277
+ else
278
+ @set_args[:state] = ''
279
+ @set_args[:id] = id
280
+ end
281
+ config_set('bgp', 'cluster_id', @set_args)
282
+ set_args_keys_default
283
+ end
284
+
285
+ def default_cluster_id
286
+ return nil if platform == :ios_xr && @vrf != 'default'
287
+ config_get_default('bgp', 'cluster_id')
288
+ end
289
+
290
+ # Confederation Id (Getter/Setter/Default)
291
+ def confederation_id
292
+ return nil if platform == :ios_xr && @vrf != 'default'
293
+ config_get('bgp', 'confederation_id', @get_args)
294
+ end
295
+
296
+ def confederation_id=(id)
297
+ # In order to remove a bgp confed id you cannot simply issue
298
+ # 'no bgp confederation id'. IMO this should be possible
299
+ # because you can only configure a single bgp confed id.
300
+ if platform == :ios_xr && @vrf != 'default'
301
+ fail Cisco::UnsupportedError.new('bgp', 'confederation_id', 'set',
302
+ 'confederation-id is not ' \
303
+ 'configurable ' \
304
+ 'on a per-VRF basis on IOS XR')
305
+ end
306
+ # HACK: specify a dummy id when removing the property.
307
+ dummy_id = 1
308
+ if id == default_confederation_id
309
+ @set_args[:state] = 'no'
310
+ @set_args[:id] = dummy_id
311
+ else
312
+ @set_args[:state] = ''
313
+ @set_args[:id] = id
314
+ end
315
+ config_set('bgp', 'confederation_id', @set_args)
316
+ set_args_keys_default
317
+ end
318
+
319
+ def default_confederation_id
320
+ return nil if platform == :ios_xr && @vrf != 'default'
321
+ config_get_default('bgp', 'confederation_id')
322
+ end
323
+
324
+ #
325
+ # disable-policy-batching (Getter/Setter/Default)
326
+ #
327
+ def disable_policy_batching
328
+ config_get('bgp', 'disable_policy_batching', @get_args)
329
+ end
330
+
331
+ def disable_policy_batching=(enable)
332
+ @set_args[:state] = (enable ? '' : 'no')
333
+ config_set('bgp', 'disable_policy_batching', @set_args)
334
+ set_args_keys_default
335
+ end
336
+
337
+ def default_disable_policy_batching
338
+ config_get_default('bgp', 'disable_policy_batching')
339
+ end
340
+
341
+ #
342
+ # disable-policy-batching ipv4 prefix-list <prefix_list>
343
+ #
344
+ def disable_policy_batching_ipv4
345
+ config_get('bgp', 'disable_policy_batching_ipv4', @get_args)
346
+ end
347
+
348
+ def disable_policy_batching_ipv4=(prefix_list)
349
+ dummy_prefixlist = 'x'
350
+ if prefix_list == default_disable_policy_batching_ipv4
351
+ @set_args[:state] = 'no'
352
+ @set_args[:prefix_list] = dummy_prefixlist
353
+ else
354
+ @set_args[:state] = ''
355
+ @set_args[:prefix_list] = prefix_list
356
+ end
357
+ config_set('bgp', 'disable_policy_batching_ipv4', @set_args)
358
+ set_args_keys_default
359
+ end
360
+
361
+ def default_disable_policy_batching_ipv4
362
+ config_get_default('bgp', 'disable_policy_batching_ipv4')
363
+ end
364
+
365
+ #
366
+ # disable-policy-batching ipv6 prefix-list <prefix_list>
367
+ #
368
+ def disable_policy_batching_ipv6
369
+ config_get('bgp', 'disable_policy_batching_ipv6', @get_args)
370
+ end
371
+
372
+ def disable_policy_batching_ipv6=(prefix_list)
373
+ dummy_prefixlist = 'x'
374
+ if prefix_list == default_disable_policy_batching_ipv6
375
+ @set_args[:state] = 'no'
376
+ @set_args[:prefix_list] = dummy_prefixlist
377
+ else
378
+ @set_args[:state] = ''
379
+ @set_args[:prefix_list] = prefix_list
380
+ end
381
+ config_set('bgp', 'disable_policy_batching_ipv6', @set_args)
382
+ set_args_keys_default
383
+ end
384
+
385
+ def default_disable_policy_batching_ipv6
386
+ config_get_default('bgp', 'disable_policy_batching_ipv6')
387
+ end
388
+
389
+ # Enforce First As (Getter/Setter/Default)
390
+ def enforce_first_as
391
+ config_get('bgp', 'enforce_first_as', @get_args)
392
+ end
393
+
394
+ def enforce_first_as=(enable)
395
+ # TODO: write a helper method for this repeated logic
396
+ # enforce_first_as is on by default (=>true)
397
+ # XR=>true = enable enforce_first_as = 'no bgp enforce-first-as disable'
398
+ # XR=>false = disable enforce_first_as = 'bgp enforce-first-as disable'
399
+ # Nexus nvgens the 'no' command.
400
+ # Nexus=>true = enable enforce_first_as = 'enforce-first-as'
401
+ # Nexus=>false = disable enforce_first_as = 'no enforce-first-as'
402
+ enable = !enable if platform == :ios_xr
403
+ @set_args[:state] = (enable ? '' : 'no')
404
+ config_set('bgp', 'enforce_first_as', @set_args)
405
+ set_args_keys_default
406
+ end
407
+
408
+ def default_enforce_first_as
409
+ config_get_default('bgp', 'enforce_first_as')
410
+ end
411
+
412
+ # event-history
413
+ # event-history cli [ size <size> ]
414
+ # Nvgen as True With optional 'size <size>
415
+ def event_history_cli
416
+ match = config_get('bgp', 'event_history_cli', @get_args)
417
+ return unless match.is_a?(Array)
418
+ return 'false' if match[0] == 'no '
419
+ return unless match[1]
420
+ return match[1] if match[1][/\A\d+\z/]
421
+ 'size_' + match[1]
422
+ end
423
+
424
+ def event_history_cli=(val)
425
+ size = val[/small|medium|large|disable|\A\d+\z/]
426
+ @set_args[:size] = size.nil? ? '' : "size #{size}"
427
+ @set_args[:state] = val[/false/] ? 'no' : ''
428
+ config_set('bgp', 'event_history_cli', @set_args)
429
+ set_args_keys_default
430
+ end
431
+
432
+ # event-history detail [ size <size> ]
433
+ # Nvgen as True With optional 'size <size>
434
+ def event_history_detail
435
+ match = config_get('bgp', 'event_history_detail', @get_args)
436
+ return unless match.is_a?(Array)
437
+ return 'false' if match[0] == 'no '
438
+ return 'true' unless match[1]
439
+ return match[1] if match[1][/\A\d+\z/]
440
+ 'size_' + match[1]
441
+ end
442
+
443
+ def event_history_detail=(val)
444
+ size = val[/small|medium|large|disable|\A\d+\z/]
445
+ @set_args[:size] = size.nil? ? '' : "size #{size}"
446
+ @set_args[:state] = val[/false/] ? 'no' : ''
447
+ config_set('bgp', 'event_history_detail', @set_args)
448
+ set_args_keys_default
449
+ end
450
+
451
+ # event-history errors [ size <size> ]
452
+ # Nvgen as True With optional 'size <size>
453
+ def event_history_errors
454
+ match = config_get('bgp', 'event_history_errors', @get_args)
455
+ return unless match.is_a?(Array)
456
+ return 'false' if match[0] == 'no '
457
+ return unless match[1]
458
+ return match[1] if match[1][/\A\d+\z/]
459
+ 'size_' + match[1]
460
+ end
461
+
462
+ def event_history_errors=(val)
463
+ size = val[/small|medium|large|disable|\A\d+\z/]
464
+ @set_args[:size] = size.nil? ? '' : "size #{size}"
465
+ @set_args[:state] = val[/false/] ? 'no' : ''
466
+ config_set('bgp', 'event_history_errors', @set_args)
467
+ set_args_keys_default
468
+ end
469
+
470
+ # event-history events [ size <size> ]
471
+ # Nvgen as True With optional 'size <size>
472
+ def event_history_events
473
+ match = config_get('bgp', 'event_history_events', @get_args)
474
+ return unless match.is_a?(Array)
475
+ return 'false' if match[0] == 'no '
476
+ return unless match[1]
477
+ return match[1] if match[1][/\A\d+\z/]
478
+ 'size_' + match[1]
479
+ end
480
+
481
+ def event_history_events=(val)
482
+ size = val[/small|medium|large|disable|\A\d+\z/]
483
+ @set_args[:size] = size.nil? ? '' : "size #{size}"
484
+ @set_args[:state] = val[/false/] ? 'no' : ''
485
+ config_set('bgp', 'event_history_events', @set_args)
486
+ set_args_keys_default
487
+ end
488
+
489
+ # event-history objstore [ size <size> ]
490
+ # Nvgen as True With optional 'size <size>
491
+ def event_history_objstore
492
+ match = config_get('bgp', 'event_history_objstore', @get_args)
493
+ return unless match.is_a?(Array)
494
+ return 'false' if match[0] == 'no '
495
+ return 'true' unless match[1]
496
+ return match[1] if match[1][/\A\d+\z/]
497
+ 'size_' + match[1]
498
+ end
499
+
500
+ def event_history_objstore=(val)
501
+ size = val[/small|medium|large|disable|\A\d+\z/]
502
+ @set_args[:size] = size.nil? ? '' : "size #{size}"
503
+ @set_args[:state] = val[/false/] ? 'no' : ''
504
+ config_set('bgp', 'event_history_objstore', @set_args)
505
+ set_args_keys_default
506
+ end
507
+
508
+ # event-history periodic [ size <size> ]
509
+ # Nvgen as True With optional 'size <size>
510
+ def event_history_periodic
511
+ match = config_get('bgp', 'event_history_periodic', @get_args)
512
+ return unless match.is_a?(Array)
513
+ return 'false' if match[0] == 'no '
514
+ return unless match[1]
515
+ return match[1] if match[1][/\A\d+\z/]
516
+ 'size_' + match[1]
517
+ end
518
+
519
+ def event_history_periodic=(val)
520
+ size = val[/small|medium|large|disable|\A\d+\z/] unless val[/false|true/]
521
+ @set_args[:size] = size.nil? ? '' : "size #{size}"
522
+ @set_args[:state] = val[/false/] ? 'no' : ''
523
+ config_set('bgp', 'event_history_periodic', @set_args)
524
+ set_args_keys_default
525
+ end
526
+
527
+ # Fast External fallover (Getter/Setter/Default)
528
+ def fast_external_fallover
529
+ config_get('bgp', 'fast_external_fallover', @get_args)
530
+ end
531
+
532
+ def fast_external_fallover=(enable)
533
+ # TODO: write a helper method for this repeated logic
534
+ # fast_external_fallover is on by default (=>true)
535
+ # XR=>true = 'no bgp fast-external-fallover disable'
536
+ # XR=>false = 'bgp fast-external-fallover disable'
537
+ # Nexus nvgens the 'no' command.
538
+ # Nexus=>true = 'fast-external-fallover'
539
+ # Nexus=>false = 'no fast-external-fallover'
540
+ enable = !enable if platform == :ios_xr
541
+ @set_args[:state] = (enable ? '' : 'no')
542
+ config_set('bgp', 'fast_external_fallover', @set_args)
543
+ set_args_keys_default
544
+ end
545
+
546
+ def default_fast_external_fallover
547
+ config_get_default('bgp', 'fast_external_fallover')
548
+ end
549
+
550
+ # Flush Routes (Getter/Setter/Default)
551
+ def flush_routes
552
+ config_get('bgp', 'flush_routes', @get_args)
553
+ end
554
+
555
+ def flush_routes=(enable)
556
+ @set_args[:state] = (enable ? '' : 'no')
557
+ config_set('bgp', 'flush_routes', @set_args)
558
+ set_args_keys_default
559
+ end
560
+
561
+ def default_flush_routes
562
+ config_get_default('bgp', 'flush_routes')
563
+ end
564
+
565
+ # Confederation Peers (Getter/Setter/Default)
566
+ def confederation_peers
567
+ # NX: confederation peers is retrieved as a string '1 2 3'
568
+ # XR: retrieved as an array.
569
+ # So make it an array in the NX case.
570
+ # Sort the end results to make it consistent across both platforms.
571
+ return nil if platform == :ios_xr && @vrf != 'default'
572
+ peers = config_get('bgp', 'confederation_peers', @get_args)
573
+ peers = peers.split(' ') if peers.is_a?(String)
574
+ peers.sort
575
+ end
576
+
577
+ def confederation_peers=(should)
578
+ # confederation peers are additive. So create a delta hash of entries
579
+ # and only apply the changes
580
+ if platform == :ios_xr && @vrf != 'default'
581
+ fail Cisco::UnsupportedError.new('bgp', 'confederation_peers', 'set',
582
+ 'confederation-peers is not ' \
583
+ 'configurable ' \
584
+ 'on a per-VRF basis on IOS XR')
585
+ end
586
+ should = should.flatten
587
+ is = confederation_peers
588
+
589
+ delta_hash = Utils.delta_add_remove(should, is)
590
+ return if delta_hash.values.flatten.empty?
591
+ [:add, :remove].each do |action|
592
+ Cisco::Logger.debug('confederation_peers delta ' \
593
+ "#{@get_args}\n #{action}: " \
594
+ "#{delta_hash[action]}")
595
+ delta_hash[action].each do |peer|
596
+ state = (action == :add) ? '' : 'no'
597
+ @set_args[:state] = state
598
+ @set_args[:peer] = peer
599
+
600
+ config_set('bgp', 'confederation_peers', @set_args)
601
+ end
602
+ end
603
+ end
604
+
605
+ def default_confederation_peers
606
+ return nil if platform == :ios_xr && @vrf != 'default'
607
+ config_get_default('bgp', 'confederation_peers')
608
+ end
609
+
610
+ # Graceful Restart Getters
611
+ def graceful_restart
612
+ return nil if platform == :ios_xr && @vrf != 'default'
613
+ config_get('bgp', 'graceful_restart', @get_args)
614
+ end
615
+
616
+ def graceful_restart_timers_restart
617
+ return nil if platform == :ios_xr && @vrf != 'default'
618
+ config_get('bgp', 'graceful_restart_timers_restart', @get_args)
619
+ end
620
+
621
+ def graceful_restart_timers_stalepath_time
622
+ return nil if platform == :ios_xr && @vrf != 'default'
623
+ config_get('bgp', 'graceful_restart_timers_stalepath_time', @get_args)
624
+ end
625
+
626
+ def graceful_restart_helper
627
+ return nil if platform == :ios_xr && @vrf != 'default'
628
+ config_get('bgp', 'graceful_restart_helper', @get_args)
629
+ end
630
+
631
+ # Graceful Restart Setters
632
+ def graceful_restart=(enable)
633
+ if platform == :ios_xr && @vrf != 'default'
634
+ fail Cisco::UnsupportedError.new('bgp', 'graceful_restart', 'set',
635
+ 'graceful_restart is not ' \
636
+ 'configurable ' \
637
+ 'on a per-VRF basis on IOS XR')
638
+ end
639
+ @set_args[:state] = (enable ? '' : 'no')
640
+ config_set('bgp', 'graceful_restart', @set_args)
641
+ set_args_keys_default
642
+ end
643
+
644
+ def graceful_restart_timers_restart=(seconds)
645
+ if platform == :ios_xr && @vrf != 'default'
646
+ fail Cisco::UnsupportedError.new('bgp',
647
+ 'graceful_restart_timers_restart',
648
+ 'set',
649
+ 'graceful_restart_timers_restart is ' \
650
+ 'not configurable ' \
651
+ 'on a per-VRF basis on IOS XR')
652
+ end
653
+ if seconds == default_graceful_restart_timers_restart
654
+ @set_args[:state] = 'no'
655
+ @set_args[:seconds] = ''
656
+ else
657
+ @set_args[:state] = ''
658
+ @set_args[:seconds] = seconds
659
+ end
660
+ config_set('bgp', 'graceful_restart_timers_restart', @set_args)
661
+ set_args_keys_default
662
+ end
663
+
664
+ def graceful_restart_timers_stalepath_time=(seconds)
665
+ if platform == :ios_xr && @vrf != 'default'
666
+ fail Cisco::UnsupportedError.new('bgp',
667
+ 'graceful_restart_timers_' \
668
+ 'stalepath_time', 'set',
669
+ 'graceful_restart_timers_' \
670
+ 'stalepath_time is not configurable ' \
671
+ 'on a per-VRF basis on IOS XR')
672
+ end
673
+ if seconds == default_graceful_restart_timers_stalepath_time
674
+ @set_args[:state] = 'no'
675
+ @set_args[:seconds] = ''
676
+ else
677
+ @set_args[:state] = ''
678
+ @set_args[:seconds] = seconds
679
+ end
680
+ config_set('bgp', 'graceful_restart_timers_stalepath_time', @set_args)
681
+ set_args_keys_default
682
+ end
683
+
684
+ def graceful_restart_helper=(enable)
685
+ if platform == :ios_xr && @vrf != 'default'
686
+ fail Cisco::UnsupportedError.new('bgp',
687
+ 'graceful_restart_helper', 'set',
688
+ 'graceful_restart_helper ' \
689
+ 'is not configurable ' \
690
+ 'on a per-VRF basis on IOS XR')
691
+ end
692
+ @set_args[:state] = (enable ? '' : 'no')
693
+ config_set('bgp', 'graceful_restart_helper', @set_args)
694
+ set_args_keys_default
695
+ end
696
+
697
+ # Graceful Restart Defaults
698
+ def default_graceful_restart
699
+ return nil if platform == :ios_xr && @vrf != 'default'
700
+ config_get_default('bgp', 'graceful_restart')
701
+ end
702
+
703
+ def default_graceful_restart_timers_restart
704
+ return nil if platform == :ios_xr && @vrf != 'default'
705
+ config_get_default('bgp', 'graceful_restart_timers_restart')
706
+ end
707
+
708
+ def default_graceful_restart_timers_stalepath_time
709
+ return nil if platform == :ios_xr && @vrf != 'default'
710
+ config_get_default('bgp', 'graceful_restart_timers_stalepath_time')
711
+ end
712
+
713
+ def default_graceful_restart_helper
714
+ return nil if platform == :ios_xr && @vrf != 'default'
715
+ config_get_default('bgp', 'graceful_restart_helper')
716
+ end
717
+
718
+ # Isolate (Getter/Setter/Default)
719
+ def isolate
720
+ config_get('bgp', 'isolate', @get_args)
721
+ end
722
+
723
+ def isolate=(enable)
724
+ @set_args[:state] = (enable ? '' : 'no')
725
+ config_set('bgp', 'isolate', @set_args)
726
+ set_args_keys_default
727
+ end
728
+
729
+ def default_isolate
730
+ config_get_default('bgp', 'isolate')
731
+ end
732
+
733
+ # MaxAs Limit (Getter/Setter/Default)
734
+ def maxas_limit
735
+ config_get('bgp', 'maxas_limit', @get_args)
736
+ end
737
+
738
+ def maxas_limit=(limit)
739
+ if limit == default_maxas_limit
740
+ @set_args[:state] = 'no'
741
+ @set_args[:limit] = ''
742
+ else
743
+ @set_args[:state] = ''
744
+ @set_args[:limit] = limit
745
+ end
746
+ config_set('bgp', 'maxas_limit', @set_args)
747
+ set_args_keys_default
748
+ end
749
+
750
+ def default_maxas_limit
751
+ config_get_default('bgp', 'maxas_limit')
752
+ end
753
+
754
+ # Log Neighbor Changes (Getter/Setter/Default)
755
+ def log_neighbor_changes
756
+ config_get('bgp', 'log_neighbor_changes', @get_args)
757
+ end
758
+
759
+ def log_neighbor_changes=(enable)
760
+ # XR logging is on by default (=>true)
761
+ # XR=>true = enable logging = 'no bgp log neighbor changes disable'
762
+ # XR=>false = disable logging = 'bgp log neighbor changes disable'
763
+ # Nexus logging is off by default (=>false)
764
+ # Nexus=>true = enable logging = 'log-neighbor-changes'
765
+ # Nexus=>false = disable logging = 'no log-neighbor-changes'
766
+ enable = !enable if platform == :ios_xr
767
+ @set_args[:state] = (enable ? '' : 'no')
768
+ config_set('bgp', 'log_neighbor_changes', @set_args)
769
+ set_args_keys_default
770
+ end
771
+
772
+ def default_log_neighbor_changes
773
+ config_get_default('bgp', 'log_neighbor_changes')
774
+ end
775
+
776
+ # Neighbor down fib accelerate (Getter/Setter/Default)
777
+ def neighbor_down_fib_accelerate
778
+ config_get('bgp', 'neighbor_down_fib_accelerate', @get_args)
779
+ end
780
+
781
+ def neighbor_down_fib_accelerate=(enable)
782
+ @set_args[:state] = (enable ? '' : 'no')
783
+ config_set('bgp', 'neighbor_down_fib_accelerate', @set_args)
784
+ set_args_keys_default
785
+ end
786
+
787
+ def default_neighbor_down_fib_accelerate
788
+ config_get_default('bgp', 'neighbor_down_fib_accelerate')
789
+ end
790
+
791
+ # Reconnect Interval (Getter/Setter/Default)
792
+ def reconnect_interval
793
+ config_get('bgp', 'reconnect_interval', @get_args)
794
+ end
795
+
796
+ def reconnect_interval=(seconds)
797
+ if seconds == default_reconnect_interval
798
+ @set_args[:state] = 'no'
799
+ @set_args[:seconds] = ''
800
+ else
801
+ @set_args[:state] = ''
802
+ @set_args[:seconds] = seconds
803
+ end
804
+ config_set('bgp', 'reconnect_interval', @set_args)
805
+ set_args_keys_default
806
+ end
807
+
808
+ def default_reconnect_interval
809
+ config_get_default('bgp', 'reconnect_interval')
810
+ end
811
+
812
+ # route_distinguisher
813
+ # Note that this property is supported by both bgp and vrf providers.
814
+ def route_distinguisher
815
+ return nil if @vrf.nil? || @vrf == 'default'
816
+ config_get('bgp', 'route_distinguisher', @get_args)
817
+ end
818
+
819
+ def route_distinguisher=(rd)
820
+ if @vrf.nil? || @vrf == 'default'
821
+ fail Cisco::UnsupportedError.new('bgp', 'route_distinguisher', 'set',
822
+ 'route_distinguisher is not ' \
823
+ 'configurable on a default VRF')
824
+ end
825
+
826
+ # N3k I2 images require 'nv overlay evpn' for rd and also require
827
+ # explicit values when removing the rd command. These restrictions are
828
+ # not not needed in I3 and newer images.
829
+ Feature.nv_overlay_evpn_enable if
830
+ Utils.nexus_i2_image || node.product_id[/N[567]/]
831
+
832
+ if rd == default_route_distinguisher
833
+ return if route_distinguisher.empty?
834
+ @set_args[:state] = 'no'
835
+ @set_args[:rd] = route_distinguisher
836
+ else
837
+ @set_args[:state] = ''
838
+ @set_args[:rd] = rd
839
+ end
840
+ config_set('bgp', 'route_distinguisher', @set_args)
841
+ set_args_keys_default
842
+ end
843
+
844
+ def default_route_distinguisher
845
+ return nil if @vrf.nil? || @vrf == 'default'
846
+ config_get_default('bgp', 'route_distinguisher')
847
+ end
848
+
849
+ # Router ID (Getter/Setter/Default)
850
+ def router_id
851
+ config_get('bgp', 'router_id', @get_args)
852
+ end
853
+
854
+ def router_id=(id)
855
+ # In order to remove a bgp router-id you cannot simply issue
856
+ # 'no bgp router-id'. On some platforms you can specify a dummy
857
+ # value, but on N7K at least you need the current router_id.
858
+ if id == default_router_id
859
+ # Nothing to do if router_id is already set to default.
860
+ return if router_id == default_router_id
861
+ @set_args[:state] = 'no'
862
+ @set_args[:id] = router_id
863
+ else
864
+ @set_args[:state] = ''
865
+ @set_args[:id] = id
866
+ end
867
+ config_set('bgp', 'router_id', @set_args)
868
+ set_args_keys_default
869
+ end
870
+
871
+ def default_router_id
872
+ config_get_default('bgp', 'router_id')
873
+ end
874
+
875
+ # Shutdown (Getter/Setter/Default)
876
+ def shutdown
877
+ config_get('bgp', 'shutdown', @asnum)
878
+ end
879
+
880
+ def shutdown=(enable)
881
+ @set_args[:state] = (enable ? '' : 'no')
882
+ config_set('bgp', 'shutdown', @set_args)
883
+ set_args_keys_default
884
+ end
885
+
886
+ def default_shutdown
887
+ config_get_default('bgp', 'shutdown')
888
+ end
889
+
890
+ # Supress Fib Pending (Getter/Setter/Default)
891
+ def suppress_fib_pending
892
+ val = config_get('bgp', 'suppress_fib_pending', @get_args)
893
+ val.nil? ? false : val
894
+ end
895
+
896
+ def suppress_fib_pending=(enable)
897
+ enable == true ? @set_args[:state] = '' : @set_args[:state] = 'no'
898
+ config_set('bgp', 'suppress_fib_pending', @set_args)
899
+ set_args_keys_default
900
+ end
901
+
902
+ def default_suppress_fib_pending
903
+ config_get_default('bgp', 'suppress_fib_pending')
904
+ end
905
+
906
+ # BGP Timers Getters
907
+ def timer_bgp_keepalive_hold
908
+ match = config_get('bgp', 'timer_bgp_keepalive_hold', @get_args)
909
+ match.nil? ? default_timer_bgp_keepalive_hold : match
910
+ end
911
+
912
+ def timer_bgp_keepalive
913
+ keepalive, _hold = timer_bgp_keepalive_hold
914
+ return default_timer_bgp_keepalive if keepalive.nil?
915
+ keepalive.to_i
916
+ end
917
+
918
+ def timer_bgp_holdtime
919
+ _keepalive, hold = timer_bgp_keepalive_hold
920
+ return default_timer_bgp_holdtime if hold.nil?
921
+ hold.to_i
922
+ end
923
+
924
+ def timer_bestpath_limit
925
+ config_get('bgp', 'timer_bestpath_limit', @get_args)
926
+ end
927
+
928
+ def timer_bestpath_limit_always
929
+ config_get('bgp', 'timer_bestpath_limit_always', @get_args)
930
+ end
931
+
932
+ # BGP Timers Setters
933
+ def timer_bgp_keepalive_hold_set(keepalive, hold)
934
+ if keepalive == default_timer_bgp_keepalive &&
935
+ hold == default_timer_bgp_holdtime
936
+ @set_args[:state] = 'no'
937
+ @set_args[:keepalive] = keepalive
938
+ @set_args[:hold] = hold
939
+ else
940
+ @set_args[:state] = ''
941
+ @set_args[:keepalive] = keepalive
942
+ @set_args[:hold] = hold
943
+ end
944
+ config_set('bgp', 'timer_bgp_keepalive_hold', @set_args)
945
+ set_args_keys_default
946
+ end
947
+
948
+ def timer_bestpath_limit_set(seconds, always=false)
949
+ if always
950
+ opt = 'timer_bestpath_limit_always'
951
+ else
952
+ opt = 'timer_bestpath_limit'
953
+ end
954
+ if seconds == default_timer_bestpath_limit
955
+ @set_args[:state] = 'no'
956
+ @set_args[:seconds] = ''
957
+ else
958
+ @set_args[:state] = ''
959
+ @set_args[:seconds] = seconds
960
+ end
961
+ config_set('bgp', opt, @set_args)
962
+ set_args_keys_default
963
+ end
964
+
965
+ # BGP Timers Defaults
966
+ def default_timer_bgp_keepalive_hold
967
+ ["#{default_timer_bgp_keepalive}", "#{default_timer_bgp_holdtime}"]
968
+ end
969
+
970
+ def default_timer_bgp_keepalive
971
+ config_get_default('bgp', 'timer_bgp_keepalive')
972
+ end
973
+
974
+ def default_timer_bgp_holdtime
975
+ config_get_default('bgp', 'timer_bgp_hold')
976
+ end
977
+
978
+ def default_timer_bestpath_limit
979
+ return nil if platform == :ios_xr && @vrf != 'default'
980
+ config_get_default('bgp', 'timer_bestpath_limit')
981
+ end
982
+
983
+ def default_timer_bestpath_limit_always
984
+ return nil if platform == :ios_xr && @vrf != 'default'
985
+ config_get_default('bgp', 'timer_bestpath_limit_always')
986
+ end
987
+ end
988
+ end