cisco_node_utils 1.2.0 → 1.3.0

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 (255) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +13 -0
  5. data/.travis.yml +4 -1
  6. data/CHANGELOG.md +81 -2
  7. data/CONTRIBUTING.md +2 -17
  8. data/Gemfile +5 -0
  9. data/README.md +92 -47
  10. data/Rakefile +23 -1
  11. data/bin/git/hooks/hook_lib +7 -0
  12. data/bin/git/hooks/pre-commit/check_unstaged_changes +18 -0
  13. data/bin/git/hooks/pre-commit/rubocop +7 -2
  14. data/bin/git/hooks/pre-commit/validate-diffs +18 -4
  15. data/bin/git/hooks/pre-commit/validate-yaml +18 -0
  16. data/bin/git/update-hooks +64 -6
  17. data/cisco_node_utils.gemspec +9 -6
  18. data/docs/README-develop-best-practices.md +149 -50
  19. data/docs/README-develop-node-utils-APIs.md +92 -42
  20. data/docs/README-maintainers.md +7 -4
  21. data/docs/README-test-execution.md +57 -0
  22. data/docs/cisco_node_utils.yaml.example +30 -0
  23. data/docs/template-router.rb +4 -0
  24. data/ext/mkrf_conf.rb +63 -0
  25. data/lib/.rubocop.yml +2 -2
  26. data/lib/cisco_node_utils.rb +5 -0
  27. data/lib/cisco_node_utils/aaa_authentication_login.rb +5 -6
  28. data/lib/cisco_node_utils/aaa_authorization_service.rb +1 -1
  29. data/lib/cisco_node_utils/ace.rb +165 -12
  30. data/lib/cisco_node_utils/acl.rb +2 -1
  31. data/lib/cisco_node_utils/bgp.rb +184 -21
  32. data/lib/cisco_node_utils/bgp_af.rb +94 -249
  33. data/lib/cisco_node_utils/bgp_neighbor.rb +94 -14
  34. data/lib/cisco_node_utils/bgp_neighbor_af.rb +75 -8
  35. data/lib/cisco_node_utils/bridge_domain.rb +183 -0
  36. data/lib/cisco_node_utils/bridge_domain_vni.rb +206 -0
  37. data/lib/cisco_node_utils/cisco_cmn_utils.rb +85 -2
  38. data/lib/cisco_node_utils/client.rb +35 -0
  39. data/lib/cisco_node_utils/client/client.rb +234 -0
  40. data/lib/cisco_node_utils/client/grpc.rb +33 -0
  41. data/lib/cisco_node_utils/client/grpc/client.rb +311 -0
  42. data/lib/cisco_node_utils/client/grpc/ems.proto +148 -0
  43. data/lib/cisco_node_utils/client/grpc/ems.rb +111 -0
  44. data/lib/cisco_node_utils/client/grpc/ems_services.rb +49 -0
  45. data/lib/cisco_node_utils/client/nxapi.rb +31 -0
  46. data/lib/cisco_node_utils/client/nxapi/client.rb +305 -0
  47. data/lib/cisco_node_utils/client/utils.rb +164 -0
  48. data/lib/cisco_node_utils/cmd_ref/README_YAML.md +222 -254
  49. data/lib/cisco_node_utils/cmd_ref/aaa_auth_login_service.yaml +11 -8
  50. data/lib/cisco_node_utils/cmd_ref/aaa_authentication_login.yaml +22 -15
  51. data/lib/cisco_node_utils/cmd_ref/aaa_authorization_service.yaml +11 -8
  52. data/lib/cisco_node_utils/cmd_ref/acl.yaml +21 -16
  53. data/lib/cisco_node_utils/cmd_ref/bgp.yaml +239 -109
  54. data/lib/cisco_node_utils/cmd_ref/bgp_af.yaml +114 -55
  55. data/lib/cisco_node_utils/cmd_ref/bgp_neighbor.yaml +76 -52
  56. data/lib/cisco_node_utils/cmd_ref/bgp_neighbor_af.yaml +106 -62
  57. data/lib/cisco_node_utils/cmd_ref/bridge_domain.yaml +71 -0
  58. data/lib/cisco_node_utils/cmd_ref/bridge_domain_vni.yaml +33 -0
  59. data/lib/cisco_node_utils/cmd_ref/dnsclient.yaml +35 -14
  60. data/lib/cisco_node_utils/cmd_ref/encapsulation.yaml +25 -0
  61. data/lib/cisco_node_utils/cmd_ref/evpn_vni.yaml +23 -17
  62. data/lib/cisco_node_utils/cmd_ref/fabricpath.yaml +94 -83
  63. data/lib/cisco_node_utils/cmd_ref/fabricpath_topology.yaml +22 -17
  64. data/lib/cisco_node_utils/cmd_ref/feature.yaml +76 -26
  65. data/lib/cisco_node_utils/cmd_ref/images.yaml +3 -2
  66. data/lib/cisco_node_utils/cmd_ref/interface.yaml +381 -153
  67. data/lib/cisco_node_utils/cmd_ref/interface_channel_group.yaml +21 -11
  68. data/lib/cisco_node_utils/cmd_ref/interface_ospf.yaml +21 -21
  69. data/lib/cisco_node_utils/cmd_ref/interface_portchannel.yaml +30 -21
  70. data/lib/cisco_node_utils/cmd_ref/interface_service_vni.yaml +18 -13
  71. data/lib/cisco_node_utils/cmd_ref/inventory.yaml +26 -31
  72. data/lib/cisco_node_utils/cmd_ref/itd_device_group.yaml +83 -0
  73. data/lib/cisco_node_utils/cmd_ref/itd_service.yaml +119 -0
  74. data/lib/cisco_node_utils/cmd_ref/memory.yaml +17 -6
  75. data/lib/cisco_node_utils/cmd_ref/ntp_config.yaml +10 -3
  76. data/lib/cisco_node_utils/cmd_ref/ntp_server.yaml +17 -5
  77. data/lib/cisco_node_utils/cmd_ref/ospf.yaml +33 -29
  78. data/lib/cisco_node_utils/cmd_ref/overlay_global.yaml +12 -10
  79. data/lib/cisco_node_utils/cmd_ref/pim.yaml +16 -19
  80. data/lib/cisco_node_utils/cmd_ref/portchannel_global.yaml +40 -25
  81. data/lib/cisco_node_utils/cmd_ref/radius_global.yaml +17 -12
  82. data/lib/cisco_node_utils/cmd_ref/radius_server.yaml +71 -35
  83. data/lib/cisco_node_utils/cmd_ref/radius_server_group.yaml +10 -5
  84. data/lib/cisco_node_utils/cmd_ref/show_system.yaml +6 -2
  85. data/lib/cisco_node_utils/cmd_ref/show_version.yaml +47 -43
  86. data/lib/cisco_node_utils/cmd_ref/snmp_community.yaml +13 -11
  87. data/lib/cisco_node_utils/cmd_ref/snmp_group.yaml +4 -2
  88. data/lib/cisco_node_utils/cmd_ref/snmp_notification_receiver.yaml +23 -21
  89. data/lib/cisco_node_utils/cmd_ref/snmp_server.yaml +26 -22
  90. data/lib/cisco_node_utils/cmd_ref/snmp_user.yaml +19 -17
  91. data/lib/cisco_node_utils/cmd_ref/snmpnotification.yaml +18 -6
  92. data/lib/cisco_node_utils/cmd_ref/stp_global.yaml +234 -0
  93. data/lib/cisco_node_utils/cmd_ref/syslog_server.yaml +24 -9
  94. data/lib/cisco_node_utils/cmd_ref/syslog_settings.yaml +5 -3
  95. data/lib/cisco_node_utils/cmd_ref/system.yaml +4 -3
  96. data/lib/cisco_node_utils/cmd_ref/tacacs_server.yaml +22 -20
  97. data/lib/cisco_node_utils/cmd_ref/tacacs_server_group.yaml +27 -15
  98. data/lib/cisco_node_utils/cmd_ref/tacacs_server_host.yaml +45 -16
  99. data/lib/cisco_node_utils/cmd_ref/vdc.yaml +21 -11
  100. data/lib/cisco_node_utils/cmd_ref/virtual_service.yaml +3 -2
  101. data/lib/cisco_node_utils/cmd_ref/vlan.yaml +60 -32
  102. data/lib/cisco_node_utils/cmd_ref/vpc.yaml +118 -101
  103. data/lib/cisco_node_utils/cmd_ref/vrf.yaml +54 -58
  104. data/lib/cisco_node_utils/cmd_ref/vrf_af.yaml +118 -0
  105. data/lib/cisco_node_utils/cmd_ref/vtp.yaml +19 -25
  106. data/lib/cisco_node_utils/cmd_ref/vxlan_vtep.yaml +28 -18
  107. data/lib/cisco_node_utils/cmd_ref/vxlan_vtep_vni.yaml +34 -17
  108. data/lib/cisco_node_utils/cmd_ref/yum.yaml +6 -4
  109. data/lib/cisco_node_utils/command_reference.rb +261 -142
  110. data/lib/cisco_node_utils/constants.rb +33 -0
  111. data/lib/cisco_node_utils/encapsulation.rb +112 -0
  112. data/lib/cisco_node_utils/environment.rb +102 -0
  113. data/lib/cisco_node_utils/evpn_vni.rb +5 -3
  114. data/lib/cisco_node_utils/exceptions.rb +111 -0
  115. data/lib/cisco_node_utils/fabricpath_global.rb +52 -35
  116. data/lib/cisco_node_utils/fabricpath_topology.rb +44 -57
  117. data/lib/cisco_node_utils/feature.rb +165 -3
  118. data/lib/cisco_node_utils/interface.rb +1051 -260
  119. data/lib/cisco_node_utils/interface_channel_group.rb +11 -10
  120. data/lib/cisco_node_utils/interface_ospf.rb +1 -2
  121. data/lib/cisco_node_utils/interface_portchannel.rb +4 -12
  122. data/lib/cisco_node_utils/interface_service_vni.rb +7 -7
  123. data/lib/cisco_node_utils/itd_device_group.rb +248 -0
  124. data/lib/cisco_node_utils/itd_device_group_node.rb +144 -0
  125. data/lib/cisco_node_utils/itd_service.rb +523 -0
  126. data/lib/cisco_node_utils/logger.rb +75 -0
  127. data/lib/cisco_node_utils/node.rb +62 -192
  128. data/lib/cisco_node_utils/node_util.rb +56 -10
  129. data/lib/cisco_node_utils/overlay_global.rb +2 -2
  130. data/lib/cisco_node_utils/pim.rb +2 -13
  131. data/lib/cisco_node_utils/pim_group_list.rb +1 -1
  132. data/lib/cisco_node_utils/pim_rp_address.rb +1 -1
  133. data/lib/cisco_node_utils/platform.rb +52 -21
  134. data/lib/cisco_node_utils/portchannel_global.rb +89 -19
  135. data/lib/cisco_node_utils/radius_server.rb +168 -37
  136. data/lib/cisco_node_utils/router_ospf.rb +20 -35
  137. data/lib/cisco_node_utils/router_ospf_vrf.rb +4 -4
  138. data/lib/cisco_node_utils/snmpserver.rb +1 -6
  139. data/lib/cisco_node_utils/snmpuser.rb +6 -4
  140. data/lib/cisco_node_utils/stp_global.rb +676 -0
  141. data/lib/cisco_node_utils/syslog_server.rb +77 -18
  142. data/lib/cisco_node_utils/syslog_settings.rb +1 -1
  143. data/lib/cisco_node_utils/tacacs_server_group.rb +8 -4
  144. data/lib/cisco_node_utils/tacacs_server_host.rb +115 -25
  145. data/lib/cisco_node_utils/vdc.rb +12 -0
  146. data/lib/cisco_node_utils/version.rb +1 -1
  147. data/lib/cisco_node_utils/vlan.rb +147 -29
  148. data/lib/cisco_node_utils/vpc.rb +55 -3
  149. data/lib/cisco_node_utils/vrf.rb +72 -11
  150. data/lib/cisco_node_utils/vrf_af.rb +114 -29
  151. data/lib/cisco_node_utils/vtp.rb +34 -52
  152. data/lib/cisco_node_utils/vxlan_vtep.rb +34 -8
  153. data/lib/cisco_node_utils/vxlan_vtep_vni.rb +36 -4
  154. data/lib/minitest/environment_plugin.rb +31 -0
  155. data/lib/minitest/log_level_plugin.rb +41 -0
  156. data/spec/client_spec.rb +7 -0
  157. data/spec/environment_spec.rb +263 -0
  158. data/spec/grpc_client_spec.rb +23 -0
  159. data/spec/isolate/all_clients_spec.rb +9 -0
  160. data/spec/isolate/grpc_only_spec.rb +16 -0
  161. data/spec/isolate/no_clients_spec.rb +26 -0
  162. data/spec/isolate/nxapi_only_spec.rb +16 -0
  163. data/spec/nxapi_client_spec.rb +42 -0
  164. data/spec/schema.yaml +75 -0
  165. data/spec/shared_examples_for_clients.rb +14 -0
  166. data/spec/spec_helper.rb +91 -0
  167. data/spec/whitespace_spec.rb +10 -0
  168. data/spec/yaml_spec.rb +42 -0
  169. data/tests/.rubocop.yml +2 -2
  170. data/tests/CSCuxdublin-1.0.0-7.0.3.I3.1.lib32_n9000.rpm +0 -0
  171. data/tests/basetest.rb +96 -36
  172. data/tests/ciscotest.rb +220 -12
  173. data/tests/cmd_config.yaml +71 -49
  174. data/tests/cmd_config_invalid.yaml +1 -1
  175. data/tests/test_aaa_authentication_login.rb +1 -0
  176. data/tests/test_aaa_authentication_login_service.rb +9 -0
  177. data/tests/test_aaa_authorization_service.rb +173 -367
  178. data/tests/test_ace.rb +171 -100
  179. data/tests/test_acl.rb +10 -1
  180. data/tests/test_bgp_af.rb +395 -728
  181. data/tests/test_bgp_neighbor.rb +274 -115
  182. data/tests/test_bgp_neighbor_af.rb +178 -77
  183. data/tests/test_bridge_domain.rb +191 -0
  184. data/tests/test_bridge_domain_vni.rb +116 -0
  185. data/tests/test_client_utils.rb +111 -0
  186. data/tests/test_command_config.rb +9 -5
  187. data/tests/test_command_reference.rb +380 -102
  188. data/tests/test_dns_domain.rb +13 -3
  189. data/tests/test_domain_name.rb +13 -3
  190. data/tests/test_encapsulation.rb +77 -0
  191. data/tests/test_evpn_vni.rb +25 -7
  192. data/tests/test_fabricpath_global.rb +167 -163
  193. data/tests/test_fabricpath_topology.rb +12 -33
  194. data/tests/test_feature.rb +215 -0
  195. data/tests/test_grpc.rb +166 -0
  196. data/tests/test_interface.rb +585 -344
  197. data/tests/test_interface_bdi.rb +80 -0
  198. data/tests/test_interface_channel_group.rb +6 -3
  199. data/tests/test_interface_ospf.rb +26 -24
  200. data/tests/test_interface_portchannel.rb +1 -0
  201. data/tests/test_interface_private_vlan.rb +724 -0
  202. data/tests/test_interface_service_vni.rb +37 -66
  203. data/tests/test_interface_svi.rb +98 -101
  204. data/tests/test_interface_switchport.rb +419 -549
  205. data/tests/test_itd_device_group.rb +145 -0
  206. data/tests/test_itd_device_group_node.rb +199 -0
  207. data/tests/test_itd_service.rb +298 -0
  208. data/tests/test_logger.rb +43 -0
  209. data/tests/test_name_server.rb +11 -2
  210. data/tests/test_node.rb +16 -75
  211. data/tests/test_node_ext.rb +174 -163
  212. data/tests/test_node_util.rb +119 -0
  213. data/tests/test_ntp_config.rb +5 -1
  214. data/tests/test_ntp_server.rb +2 -2
  215. data/tests/test_nxapi.rb +221 -0
  216. data/tests/test_overlay_global.rb +47 -38
  217. data/tests/test_pim.rb +2 -0
  218. data/tests/test_pim_group_list.rb +2 -0
  219. data/tests/test_pim_rp_address.rb +2 -0
  220. data/tests/test_platform.rb +86 -39
  221. data/tests/test_portchannel_global.rb +211 -135
  222. data/tests/test_radius_global.rb +13 -5
  223. data/tests/test_radius_server.rb +256 -104
  224. data/tests/test_radius_server_group.rb +2 -0
  225. data/tests/test_router_bgp.rb +781 -485
  226. data/tests/test_router_ospf.rb +26 -103
  227. data/tests/test_router_ospf_vrf.rb +52 -57
  228. data/tests/test_snmp_notification_receiver.rb +2 -0
  229. data/tests/test_snmpcommunity.rb +2 -0
  230. data/tests/test_snmpgroup.rb +2 -0
  231. data/tests/test_snmpnotification.rb +40 -21
  232. data/tests/test_snmpserver.rb +2 -0
  233. data/tests/test_snmpuser.rb +2 -0
  234. data/tests/test_stp_global.rb +563 -0
  235. data/tests/test_syslog_server.rb +32 -8
  236. data/tests/test_syslog_settings.rb +22 -9
  237. data/tests/test_tacacs_server.rb +32 -27
  238. data/tests/test_tacacs_server_group.rb +100 -45
  239. data/tests/test_tacacs_server_host.rb +135 -43
  240. data/tests/test_vdc.rb +2 -16
  241. data/tests/test_vlan.rb +106 -54
  242. data/tests/test_vlan_mt_full.rb +11 -21
  243. data/tests/test_vlan_private.rb +669 -0
  244. data/tests/test_vpc.rb +312 -159
  245. data/tests/test_vrf.rb +122 -113
  246. data/tests/test_vrf_af.rb +238 -0
  247. data/tests/test_vtp.rb +58 -102
  248. data/tests/test_vxlan_vtep.rb +38 -17
  249. data/tests/test_vxlan_vtep_vni.rb +61 -9
  250. data/tests/test_yum.rb +49 -25
  251. metadata +122 -36
  252. data/lib/cisco_node_utils/cmd_ref/fex.yaml +0 -9
  253. data/lib/cisco_node_utils/cmd_ref/vni.yaml +0 -76
  254. data/lib/cisco_node_utils/vni.rb +0 -227
  255. data/tests/test_vni.rb +0 -106
@@ -20,6 +20,8 @@ include Cisco
20
20
 
21
21
  # TestFabricpathTopo - Minitest for Fabricpath Topo node utils
22
22
  class TestFabricpathTopo < CiscoTestCase
23
+ @skip_unless_supported = 'fabricpath_topology'
24
+
23
25
  def setup
24
26
  # setup runs at the beginning of each test
25
27
  super
@@ -36,8 +38,7 @@ class TestFabricpathTopo < CiscoTestCase
36
38
 
37
39
  def no_feature_fabricpath
38
40
  # Turn the feature off for a clean test.
39
- config('no feature-set fabricpath')
40
- config('no install feature-set fabricpath')
41
+ config_no_warn('no feature-set fabricpath')
41
42
  end
42
43
 
43
44
  # TESTS
@@ -50,49 +51,27 @@ class TestFabricpathTopo < CiscoTestCase
50
51
  assert_equal(:enabled, @topo.fabricpath_feature,
51
52
  'Fabricpath feature should have been enabled')
52
53
  topos = FabricpathTopo.topos
53
- assert_equal(2, topos.length,
54
- 'Number of Topos should be 2')
54
+ assert_equal(1, topos.length,
55
+ 'Number of Topos should be 1')
55
56
  end
56
57
 
57
58
  def test_topo_destroy
58
59
  # create and test again
59
- test_topo_create
60
- # puts "deleting Topo #{@topo.topo_name}"
60
+ @topo = FabricpathTopo.new('2')
61
61
  @topo.destroy
62
62
  # now it should be wiped out
63
63
  topos = FabricpathTopo.topos
64
- assert_equal(1, topos.length,
65
- 'Number of Topos should be 1 (default)')
66
- end
67
-
68
- def test_invalid_topo_id
69
- e = assert_raises(CliError) { FabricpathTopo.new('64') }
70
- assert_match(/Invalid number.* range/, e.message)
64
+ assert_equal(0, topos.length,
65
+ 'Number of Topos should be 0 (only default)')
71
66
  end
72
67
 
73
68
  def test_member_vlans
74
69
  @topo = FabricpathTopo.new('25')
75
- topos = FabricpathTopo.topos
76
- default_topo = topos['0']
77
- default_topo_vlans = default_topo.member_vlans.first
78
- # puts "vlans in default topo is #{default_topo_vlans}"
79
- assert_equal('1..4096', default_topo_vlans,
80
- 'default topo should have all VLANS')
81
- @topo.member_vlans = ['2..10', '100', '500']
82
- topo25_vlans = @topo.member_vlans.join(',')
70
+ @topo.topo_name = 'Topo-25'
71
+ @topo.member_vlans = '2-10, 100, 500'
72
+ topo25_vlans = @topo.member_vlans
83
73
  # puts "Topo #{@topo.topo_name} member vlans #{topo25_vlans}"
84
- assert_equal('2..10,100,500', topo25_vlans,
74
+ assert_equal('2-10,100,500', topo25_vlans,
85
75
  'Topo 25 not getting set with member vlans')
86
- default_topo_vlans = default_topo.member_vlans.join(',')
87
- # puts "vlans in default topo is #{default_topo_vlans}"
88
- assert_equal('1,11..99,101..499,501..4096', default_topo_vlans,
89
- 'default topo should now have the set
90
- 1,11..99,101..499,501..4096')
91
- end
92
-
93
- def test_member_vlans_invalid
94
- @topo = FabricpathTopo.new('25')
95
- e = assert_raises(RuntimeError) { @topo.member_vlans = ['1..4095'] }
96
- assert_match(%r{Invalid value/range}, e.message)
97
76
  end
98
77
  end
@@ -0,0 +1,215 @@
1
+ # Copyright (c) 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/feature'
17
+ require_relative '../lib/cisco_node_utils/vdc'
18
+
19
+ include Cisco
20
+
21
+ # TestFeature - Minitest for feature class
22
+ class TestFeature < CiscoTestCase
23
+ @skip_unless_supported = 'feature'
24
+
25
+ ###########
26
+ # Helpers #
27
+ ###########
28
+
29
+ # feature test helper
30
+ def feature(feat)
31
+ # Get the feature name string from the yaml
32
+ ref = cmd_ref.lookup('feature', feat).to_s[/set_value:.*feature (.*)/]
33
+
34
+ if ref
35
+ feat_str = Regexp.last_match[1]
36
+ else
37
+ skip("'feature','#{feat}' is unsupported on this node")
38
+ end
39
+
40
+ # Get current state of feature, then disable it
41
+ pre_clean_enabled = Feature.send("#{feat}_enabled?")
42
+ config("no feature #{feat_str}") if pre_clean_enabled
43
+ refute_show_match(
44
+ command: "show running | i '#{feat_str}'",
45
+ pattern: /^#{feat_str}$/,
46
+ msg: "#{feat} (#{feat_str}) is still enabled",
47
+ )
48
+
49
+ Feature.send("#{feat}_enable")
50
+ # Some features (BGP on n5k!) are slow starters...
51
+ unless Feature.send("#{feat}_enabled?")
52
+ sleep 1
53
+ node.cache_flush
54
+ end
55
+ assert(Feature.send("#{feat}_enabled?"),
56
+ "Feature #{feat} (#{feat_str}) is not enabled")
57
+
58
+ # Return testbed to pre-clean state
59
+ config("no feature #{feat_str}") unless pre_clean_enabled
60
+ end
61
+
62
+ ###################
63
+ # Feature tests #
64
+ ###################
65
+ def test_bgp
66
+ feature('bgp')
67
+ end
68
+
69
+ def test_fabric_forwarding
70
+ if node.product_id[/N(3)/]
71
+ assert_nil(Feature.fabric_forwarding_enabled?)
72
+ assert_raises(Cisco::UnsupportedError) do
73
+ Feature.fabric_forwarding_enable
74
+ end
75
+ return
76
+ end
77
+ skip('This feature is only supported on 7.0(3)I2 images') unless
78
+ node.os_version[/7.0\(3\)I2\(/]
79
+ feature('fabric_forwarding')
80
+ end
81
+
82
+ def test_nv_overlay
83
+ if validate_property_excluded?('feature', 'nv_overlay')
84
+ assert_nil(Feature.nv_overlay_enabled?)
85
+ assert_raises(Cisco::UnsupportedError) { Feature.nv_overlay_enable }
86
+ return
87
+ end
88
+
89
+ # Dependency setup
90
+ vxlan_linecard?
91
+ vdc_lc_state('f3')
92
+ config_no_warn('no feature-set fabricpath')
93
+
94
+ feature('nv_overlay')
95
+ end
96
+
97
+ def test_nv_overlay_evpn
98
+ if node.product_id[/N(3)/]
99
+ assert_nil(Feature.nv_overlay_evpn_enabled?)
100
+ assert_raises(Cisco::UnsupportedError) { Feature.nv_overlay_evpn_enable }
101
+ return
102
+ end
103
+ vxlan_linecard?
104
+ vdc_lc_state('f3')
105
+
106
+ # nv_overlay_evpn can't use the 'feature' helper so test it explicitly here
107
+ # Get current state of feature, then disable it
108
+ pre_clean_enabled = Feature.nv_overlay_evpn_enabled?
109
+ feat_str = 'nv overlay evpn'
110
+ config("no #{feat_str}") if pre_clean_enabled
111
+
112
+ refute_show_match(
113
+ command: "show running | i #{feat_str}",
114
+ pattern: /^#{feat_str}$/,
115
+ msg: "(#{feat_str}) is still enabled",
116
+ )
117
+ Feature.nv_overlay_evpn_enable
118
+ assert(Feature.nv_overlay_evpn_enabled?,
119
+ "(#{feat_str}) is not enabled")
120
+ end
121
+
122
+ def test_ospf
123
+ feature('ospf')
124
+ end
125
+
126
+ def test_pim
127
+ feature('pim')
128
+ end
129
+
130
+ def test_private_vlan
131
+ feature('private_vlan')
132
+ end
133
+
134
+ def test_tacacs
135
+ feature('tacacs')
136
+ end
137
+
138
+ def test_vn_segment_vlan_based
139
+ vxlan_linecard?
140
+ Feature.nv_overlay_enable unless node.product_id[/N3/]
141
+ feature('vn_segment_vlan_based')
142
+ rescue RuntimeError => e
143
+ hardware_supports_feature?(e.message)
144
+ end
145
+
146
+ def test_vni
147
+ # Dependency setup
148
+ vxlan_linecard?
149
+ vdc_lc_state('f3')
150
+
151
+ if node.product_id[/N(5|6)/]
152
+ Feature.nv_overlay_enable
153
+ else
154
+ # vni can't be removed if nv overlay is present
155
+ config_no_warn('no feature nv overlay')
156
+ end
157
+ feature('vni')
158
+ rescue RuntimeError => e
159
+ hardware_supports_feature?(e.message)
160
+ end
161
+
162
+ def test_vtp
163
+ feature('vtp')
164
+ end
165
+
166
+ #####################
167
+ # Feature-set tests #
168
+ #####################
169
+
170
+ def test_feature_set_fabric
171
+ if node.product_id[/N(3|8|9)/]
172
+ assert_nil(Feature.fabric_enabled?)
173
+ assert_raises(Cisco::UnsupportedError) { Feature.fabric_enable }
174
+ return
175
+ end
176
+ fs = 'feature-set fabric'
177
+ # Get current state of the feature-set
178
+ feature_set_installed = Feature.fabric_installed?
179
+ feature_enabled = Feature.fabric_enabled?
180
+
181
+ config("no #{fs} ; no install #{fs}") if feature_set_installed
182
+ refute_show_match(
183
+ command: "show running | i '^install #{fs}$'",
184
+ pattern: /^install #{fs}$/,
185
+ msg: "(#{fs}) is still configured",
186
+ )
187
+
188
+ Feature.fabric_enable
189
+ assert(Feature.fabric_enabled?, "(#{fs}) is not enabled")
190
+
191
+ # Return testbed to pre-clean state
192
+ config("no #{fs}") unless feature_enabled
193
+ config("no install #{fs}") unless feature_set_installed
194
+ end
195
+
196
+ def test_feature_set_fex
197
+ if validate_property_excluded?('feature', 'fex')
198
+ assert_nil(Feature.fex_enabled?)
199
+ assert_raises(Cisco::UnsupportedError) { Feature.fex_enable }
200
+ return
201
+ end
202
+ fs = 'feature-set fex'
203
+
204
+ # clean
205
+ config("no #{fs} ; no install #{fs}") if Feature.fex_installed?
206
+ refute_show_match(
207
+ command: "show running | i '^install #{fs}$'",
208
+ pattern: /^install #{fs}$/,
209
+ msg: "(#{fs}) is still configured",
210
+ )
211
+
212
+ Feature.fex_enable
213
+ assert(Feature.fex_enabled?, "(#{fs}) is not enabled")
214
+ end
215
+ end
@@ -0,0 +1,166 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # October 2015, Glenn F. Matthews
4
+ #
5
+ # Copyright (c) 2015-2016 Cisco and/or its affiliates.
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ require_relative 'basetest'
20
+
21
+ # Test case for Cisco::Client::GRPC::Client class
22
+ class TestGRPC < TestCase
23
+ @@client = nil # rubocop:disable Style/ClassVars
24
+
25
+ def self.runnable_methods
26
+ # If we're pointed to an NXAPI node (as evidenced by lack of a port num)
27
+ # then these tests don't apply
28
+ return [:all_skipped] unless Cisco::Environment.environment[:port]
29
+ super
30
+ end
31
+
32
+ def all_skipped
33
+ skip 'Node under test does not appear to use the gRPC client'
34
+ end
35
+
36
+ def client
37
+ unless @@client
38
+ client = Cisco::Client::GRPC.new(Cisco::Environment.environment)
39
+ client.cache_enable = true
40
+ client.cache_auto = true
41
+ @@client = client # rubocop:disable Style/ClassVars
42
+ end
43
+ @@client
44
+ end
45
+
46
+ def test_auth_failure
47
+ env = Cisco::Environment.environment.merge(password: 'wrong password')
48
+ e = assert_raises Cisco::AuthenticationFailed do
49
+ Cisco::Client::GRPC.new(**env)
50
+ end
51
+ assert_equal('gRPC client creation failure: Failed authentication',
52
+ e.message)
53
+ end
54
+
55
+ def test_connection_failure
56
+ # Failure #1: connecting to a port that's listening for a non-gRPC protocol
57
+ env = Cisco::Environment.environment.merge(port: 23)
58
+ e = assert_raises Cisco::ConnectionRefused do
59
+ Cisco::Client::GRPC.new(**env)
60
+ end
61
+ assert_equal('gRPC client creation failure: Connection refused: ',
62
+ e.message)
63
+ # Failure #2: Connecting to a port that's not listening at all
64
+ env = Cisco::Environment.environment.merge(port: 0)
65
+ e = assert_raises Cisco::ConnectionRefused do
66
+ Cisco::Client::GRPC.new(**env)
67
+ end
68
+ assert_equal('gRPC client creation failure: ' \
69
+ 'timed out during initial connection: Deadline Exceeded',
70
+ e.message)
71
+ end
72
+
73
+ def test_set_cli_string
74
+ client.set(context: 'int gi0/0/0/0',
75
+ values: 'description panda')
76
+ run = client.get(command: 'show run int gi0/0/0/0')
77
+ assert_match(/description panda/, run)
78
+ end
79
+
80
+ def test_set_cli_array
81
+ client.set(context: ['int gi0/0/0/0'],
82
+ values: ['description elephant'])
83
+ run = client.get(command: 'show run int gi0/0/0/0')
84
+ assert_match(/description elephant/, run)
85
+ end
86
+
87
+ def test_set_cli_invalid
88
+ e = assert_raises Cisco::CliError do
89
+ client.set(context: ['int gi0/0/0/0'],
90
+ values: ['wark', 'bark bark'])
91
+ end
92
+ # rubocop:disable Style/TrailingWhitespace
93
+ assert_equal('The following commands were rejected:
94
+ int gi0/0/0/0 wark
95
+ int gi0/0/0/0 bark bark
96
+ with error:
97
+
98
+ !! SYNTAX/AUTHORIZATION ERRORS: This configuration failed due to
99
+ !! one or more of the following reasons:
100
+ !! - the entered commands do not exist,
101
+ !! - the entered commands have errors in their syntax,
102
+ !! - the software packages containing the commands are not active,
103
+ !! - the current user is not a member of a task-group that has
104
+ !! permissions to use the commands.
105
+
106
+ int gi0/0/0/0 wark
107
+ int gi0/0/0/0 bark bark
108
+
109
+ ', e.message)
110
+ # rubocop:enable Style/TrailingWhitespace
111
+ # Unlike NXAPI, a gRPC config command is always atomic
112
+ assert_empty(e.successful_input)
113
+ assert_equal(['int gi0/0/0/0 wark', 'int gi0/0/0/0 bark bark'],
114
+ e.rejected_input)
115
+ end
116
+
117
+ def test_get_cli_default
118
+ result = client.get(command: 'show debug')
119
+ s = @device.cmd('show debug')
120
+ # Strip the leading timestamp and trailing prompt from the telnet output
121
+ s = s.split("\n")[2..-2].join("\n")
122
+ assert_equal(s, result)
123
+ end
124
+
125
+ def test_get_cli_invalid
126
+ assert_raises Cisco::CliError do
127
+ client.get(command: 'show fuzz')
128
+ end
129
+ end
130
+
131
+ def test_get_cli_incomplete
132
+ assert_raises Cisco::CliError do
133
+ client.get(command: 'show ')
134
+ end
135
+ end
136
+
137
+ def test_get_cli_explicit
138
+ result = client.get(command: 'show debug', data_format: :cli)
139
+ s = @device.cmd('show debug')
140
+ # Strip the leading timestamp and trailing prompt from the telnet output
141
+ s = s.split("\n")[2..-2].join("\n")
142
+ assert_equal(s, result)
143
+ end
144
+
145
+ def test_get_cli_empty
146
+ result = client.get(command: 'show debug | include foo | exclude foo',
147
+ data_format: :cli)
148
+ assert_nil(result)
149
+ end
150
+
151
+ def test_get_cli_cache
152
+ result = client.get(command: 'show clock', data_format: :cli)
153
+ sleep 2
154
+ assert_equal(result, client.get(command: 'show clock', data_format: :cli))
155
+ end
156
+
157
+ # TODO: add structured output test cases (when supported on XR)
158
+
159
+ def test_smart_create
160
+ autoclient = Cisco::Client.create
161
+ assert_equal(Cisco::Client::GRPC, autoclient.class)
162
+ assert(autoclient.supports?(:cli))
163
+ refute(autoclient.supports?(:nxapi_structured))
164
+ assert_equal(:ios_xr, autoclient.platform)
165
+ end
166
+ end