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
data/tests/test_vrf.rb CHANGED
@@ -14,8 +14,6 @@
14
14
 
15
15
  require_relative 'ciscotest'
16
16
  require_relative '../lib/cisco_node_utils/vrf'
17
- require_relative '../lib/cisco_node_utils/vrf_af'
18
- require_relative '../lib/cisco_node_utils/vni'
19
17
 
20
18
  include Cisco
21
19
 
@@ -31,14 +29,18 @@ class TestVrf < CiscoTestCase
31
29
  end
32
30
 
33
31
  def teardown
34
- super
35
32
  remove_all_vrfs
33
+ super
36
34
  end
37
35
 
38
- def test_collection_not_empty
36
+ def test_collection_default
39
37
  vrfs = Vrf.vrfs
40
- refute_empty(vrfs, 'VRF collection is empty')
41
- assert(vrfs.key?('management'), 'VRF management does not exist')
38
+ if platform == :nexus
39
+ refute_empty(vrfs, 'VRF collection is empty')
40
+ assert(vrfs.key?('management'), 'VRF management does not exist')
41
+ else
42
+ assert_empty(vrfs, 'VRF collection is not empty')
43
+ end
42
44
  end
43
45
 
44
46
  def test_create_and_destroy
@@ -71,16 +73,36 @@ class TestVrf < CiscoTestCase
71
73
  end
72
74
  end
73
75
 
76
+ # This helper is needed on some platforms to allow enough time for the
77
+ # 'shutdown' process to complete before 'no shutdown' can be successful.
78
+ def shutdown_with_sleep(obj, val)
79
+ obj.shutdown = val
80
+ rescue CliError => e
81
+ raise unless e.message[/ERROR: Shutdown of VRF .* in progress/]
82
+ sleep 1
83
+ tries ||= 1
84
+ retry unless (tries += 1) > 20
85
+ end
86
+
74
87
  def test_shutdown
75
88
  v = Vrf.new('test_shutdown')
89
+ if validate_property_excluded?('vrf', 'shutdown')
90
+ assert_nil(v.shutdown)
91
+ assert_nil(v.default_shutdown)
92
+ assert_raises(Cisco::UnsupportedError) { v.shutdown = true }
93
+ v.destroy
94
+ return
95
+ end
76
96
  v.shutdown = true
77
97
  assert(v.shutdown)
78
- v.shutdown = false
98
+
99
+ shutdown_with_sleep(v, false)
79
100
  refute(v.shutdown)
80
101
 
81
102
  v.shutdown = true
82
103
  assert(v.shutdown)
83
- v.shutdown = v.default_shutdown
104
+
105
+ shutdown_with_sleep(v, v.default_shutdown)
84
106
  refute(v.shutdown)
85
107
  v.destroy
86
108
  end
@@ -97,9 +119,68 @@ class TestVrf < CiscoTestCase
97
119
  v.destroy
98
120
  end
99
121
 
122
+ def test_mhost
123
+ v = Vrf.new('test_mhost')
124
+ t_intf = 'Loopback100'
125
+ if validate_property_excluded?('vrf', 'mhost_default_interface')
126
+ assert_nil(v.mhost_ipv4_default_interface)
127
+ assert_nil(v.mhost_ipv6_default_interface)
128
+ assert_raises(Cisco::UnsupportedError) do
129
+ v.mhost_ipv4_default_interface = t_intf
130
+ end
131
+ assert_raises(Cisco::UnsupportedError) do
132
+ v.mhost_ipv6_default_interface = t_intf
133
+ end
134
+ v.destroy
135
+ return
136
+ end
137
+ config("interface #{t_intf}")
138
+ %w(mhost_ipv4_default_interface mhost_ipv6_default_interface).each do |mh|
139
+ df = v.send("default_#{mh}")
140
+ result = v.send("#{mh}")
141
+ assert_equal(df, result, "Test1.1 : #{mh} should be default value")
142
+
143
+ v.send("#{mh}=", t_intf)
144
+ result = v.send("#{mh}")
145
+ assert_equal(t_intf, result,
146
+ "Test2.1 :vrf #{mh} should be set to #{t_intf}")
147
+
148
+ df = v.send("default_#{mh}")
149
+ v.send("#{mh}=", "#{df}")
150
+ result = v.send("#{mh}")
151
+ assert_equal(df, result,
152
+ "Test3.1 :vrf #{mh} should be set to default value")
153
+ end
154
+ config("no interface #{t_intf}")
155
+ v.destroy
156
+ end
157
+
158
+ def test_remote_route_filtering
159
+ v = Vrf.new('test_remote_route_filtering')
160
+ if validate_property_excluded?('vrf', 'remote_route_filtering')
161
+ refute(v.remote_route_filtering)
162
+ assert_raises(Cisco::UnsupportedError) do
163
+ v.remote_route_filtering = false
164
+ end
165
+ v.destroy
166
+ return
167
+ end
168
+ assert(v.remote_route_filtering,
169
+ 'Test1.1, remote_route_filtering should be default value')
170
+ v.remote_route_filtering = false
171
+ refute(v.remote_route_filtering,
172
+ 'Test2.1, remote_route_filtering should be set to false')
173
+ v.remote_route_filtering = v.default_remote_route_filtering
174
+ assert(v.remote_route_filtering,
175
+ 'Test3.1, remote_route_filtering should be set to default value')
176
+ v.destroy
177
+ end
178
+
100
179
  def test_vni
101
- skip('Platform does not support MT-lite') unless Vni.mt_lite_support
102
180
  vrf = Vrf.new('test_vni')
181
+ assert_equal(vrf.default_vni, vrf.vni,
182
+ 'vrf vni should be set to default value')
183
+
103
184
  vrf.vni = 4096
104
185
  assert_equal(4096, vrf.vni,
105
186
  "vrf vni should be set to '4096'")
@@ -107,10 +188,25 @@ class TestVrf < CiscoTestCase
107
188
  assert_equal(vrf.default_vni, vrf.vni,
108
189
  'vrf vni should be set to default value')
109
190
  vrf.destroy
191
+ rescue RuntimeError => e
192
+ hardware_supports_feature?(e.message)
110
193
  end
111
194
 
112
195
  def test_route_distinguisher
113
- v = Vrf.new('blue')
196
+ skip_nexus_i2_image?
197
+ # Check for compatible linecard (if platform requires it) and set it up
198
+ vxlan_linecard?
199
+ vdc_lc_state('f3')
200
+
201
+ v = Vrf.new('green')
202
+ if validate_property_excluded?('vrf', 'route_distinguisher')
203
+ # Must be configured under BGP in IOS XR
204
+ assert_nil(v.route_distinguisher)
205
+ assert_nil(v.default_route_distinguisher)
206
+ assert_raises(Cisco::UnsupportedError) { v.route_distinguisher = 'auto' }
207
+ v.destroy
208
+ return
209
+ end
114
210
  v.route_distinguisher = 'auto'
115
211
  assert_equal('auto', v.route_distinguisher)
116
212
 
@@ -126,110 +222,23 @@ class TestVrf < CiscoTestCase
126
222
  v.destroy
127
223
  end
128
224
 
129
- def test_vrf_af_create_destroy
130
- v1 = VrfAF.new('cyan', %w(ipv4 unicast))
131
- v2 = VrfAF.new('cyan', %w(ipv6 unicast))
132
- v3 = VrfAF.new('red', %w(ipv4 unicast))
133
- v4 = VrfAF.new('blue', %w(ipv4 unicast))
134
- v5 = VrfAF.new('red', %w(ipv6 unicast))
135
- assert_equal(2, VrfAF.afs['cyan'].keys.count)
136
- assert_equal(2, VrfAF.afs['red'].keys.count)
137
- assert_equal(1, VrfAF.afs['blue'].keys.count)
138
-
139
- v1.destroy
140
- v5.destroy
141
- assert_equal(1, VrfAF.afs['cyan'].keys.count)
142
- assert_equal(1, VrfAF.afs['red'].keys.count)
143
- assert_equal(1, VrfAF.afs['blue'].keys.count)
144
-
145
- v2.destroy
146
- v3.destroy
147
- v4.destroy
148
- assert_equal(0, VrfAF.afs['cyan'].keys.count)
149
- assert_equal(0, VrfAF.afs['red'].keys.count)
150
- assert_equal(0, VrfAF.afs['blue'].keys.count)
151
- end
152
-
153
- def test_route_target
154
- [%w(ipv4 unicast), %w(ipv6 unicast)].each { |af| route_target(af) }
155
- end
156
-
157
- def route_target(af)
158
- # Common tester for route-target properties. Tests evpn and non-evpn.
159
- # route_target_both_auto
160
- # route_target_both_auto_evpn
161
- # route_target_export
162
- # route_target_export_evpn
163
- # route_target_import
164
- # route_target_import_evpn
165
- vrf = 'red'
166
- v = VrfAF.new(vrf, af)
167
-
168
- # test route target both auto and route target both auto evpn
169
- refute(v.default_route_target_both_auto,
170
- 'default value for route target both auto should be false')
171
-
172
- refute(v.default_route_target_both_auto_evpn,
173
- 'default value for route target both auto evpn should be false')
174
-
175
- v.route_target_both_auto = true
176
- assert(v.route_target_both_auto, "vrf context #{vrf} af #{af}: "\
177
- 'v route-target both auto should be enabled')
178
-
179
- v.route_target_both_auto = false
180
- refute(v.route_target_both_auto, "vrf context #{vrf} af #{af}: "\
181
- 'v route-target both auto should be disabled')
182
-
183
- v.route_target_both_auto_evpn = true
184
- assert(v.route_target_both_auto_evpn, "vrf context #{vrf} af #{af}: "\
185
- 'v route-target both auto evpn should be enabled')
186
-
187
- v.route_target_both_auto_evpn = false
188
- refute(v.route_target_both_auto_evpn, "vrf context #{vrf} af #{af}: "\
189
- 'v route-target both auto evpn should be disabled')
190
-
191
- opts = [:import, :export]
192
-
193
- # Master list of communities to test against
194
- master = ['1:1', '2:2', '3:3', '4:5']
195
-
196
- # Test 1: both/import/export when no commands are present. Each target
197
- # option will be tested with and without evpn (6 separate types)
198
- should = master.clone
199
- route_target_tester(v, af, opts, should, 'Test 1')
200
-
201
- # Test 2: remove half of the entries
202
- should = ['1:1', '4:4']
203
- route_target_tester(v, af, opts, should, 'Test 2')
204
-
205
- # Test 3: restore the removed entries
206
- should = master.clone
207
- route_target_tester(v, af, opts, should, 'Test 3')
208
-
209
- # Test 4: 'default'
210
- should = v.default_route_target_import
211
- route_target_tester(v, af, opts, should, 'Test 4')
212
- end
213
-
214
- def route_target_tester(v, af, opts, should, test_id)
215
- # First configure all four property types
216
- opts.each do |opt|
217
- # non-evpn
218
- v.send("route_target_#{opt}=", should)
219
- # evpn
220
- v.send("route_target_#{opt}_evpn=", should)
225
+ def test_vpn_id
226
+ v = Vrf.new('test_vpn_id')
227
+ if validate_property_excluded?('vrf', 'vpn_id')
228
+ assert_nil(v.vpn_id)
229
+ assert_raises(Cisco::UnsupportedError) { v.vpn_id = '1:1' }
230
+ v.destroy
231
+ return
221
232
  end
222
-
223
- # Now check the results
224
- opts.each do |opt|
225
- # non-evpn
226
- result = v.send("route_target_#{opt}")
227
- assert_equal(should, result,
228
- "#{test_id} : #{af} : route_target_#{opt}")
229
- # evpn
230
- result = v.send("route_target_#{opt}_evpn")
231
- assert_equal(should, result,
232
- "#{test_id} : #{af} : route_target_#{opt}_evpn")
233
+ assert_equal(v.default_vpn_id, v.vpn_id,
234
+ 'Test1.1, vpn_id should be default value')
235
+ %w(1:1 abcdef:12345678).each do |id|
236
+ v.vpn_id = id
237
+ assert_equal(id, v.vpn_id, "Test2.1, vpn_id should be set to #{id}")
233
238
  end
239
+ v.vpn_id = v.default_vpn_id
240
+ assert_equal(v.default_vpn_id, v.vpn_id,
241
+ 'Test3.1, vpn_id should be set to default value')
242
+ v.destroy
234
243
  end
235
244
  end
@@ -0,0 +1,238 @@
1
+ # Copyright (c) 2015-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/vrf_af'
17
+
18
+ include Cisco
19
+
20
+ # TestVrfAf - Minitest for Vrf node utility class
21
+ class TestVrfAf < CiscoTestCase
22
+ @@pre_clean_needed = true # rubocop:disable Style/ClassVars
23
+
24
+ def setup
25
+ super
26
+ return unless @@pre_clean_needed
27
+ nexus_feature_disable
28
+ remove_all_vrfs
29
+ @@pre_clean_needed = false # rubocop:disable Style/ClassVars
30
+ end
31
+
32
+ def teardown
33
+ nexus_feature_disable
34
+ remove_all_vrfs
35
+ super
36
+ end
37
+
38
+ def nexus_feature_disable
39
+ config('no feature bgp')
40
+
41
+ # Some platforms complain when nv overlay is not configured
42
+ config_no_warn('no nv overlay evpn')
43
+
44
+ # Some platforms remove the 'evpn' command when 'no nv overlay evpn'
45
+ # is processed, while others must remove it explicitly.
46
+ config_no_warn('no evpn')
47
+ end
48
+
49
+ def test_create_destroy
50
+ v1 = VrfAF.new('cyan', %w(ipv4 unicast))
51
+ v2 = VrfAF.new('cyan', %w(ipv6 unicast))
52
+ v3 = VrfAF.new('red', %w(ipv4 unicast))
53
+ v4 = VrfAF.new('blue', %w(ipv4 unicast))
54
+ v5 = VrfAF.new('red', %w(ipv6 unicast))
55
+ assert_equal(2, VrfAF.afs['cyan'].keys.count)
56
+ assert_equal(2, VrfAF.afs['red'].keys.count)
57
+ assert_equal(1, VrfAF.afs['blue'].keys.count)
58
+
59
+ v1.destroy
60
+ v5.destroy
61
+ assert_equal(1, VrfAF.afs['cyan'].keys.count)
62
+ assert_equal(1, VrfAF.afs['red'].keys.count)
63
+ assert_equal(1, VrfAF.afs['blue'].keys.count)
64
+
65
+ v2.destroy
66
+ v3.destroy
67
+ v4.destroy
68
+ assert_equal(0, VrfAF.afs['cyan'].keys.count)
69
+ assert_equal(0, VrfAF.afs['red'].keys.count)
70
+ assert_equal(0, VrfAF.afs['blue'].keys.count)
71
+ end
72
+
73
+ #-----------------------------------------
74
+ # test_route_policy
75
+ def test_route_policy
76
+ config('route-policy abc', 'end-policy') if platform == :ios_xr
77
+ [%w(ipv4 unicast), %w(ipv6 unicast)].each { |af| route_policy(af) }
78
+ config('route-policy abc', 'end-policy') if platform == :ios_xr
79
+ end
80
+
81
+ def route_policy(af)
82
+ v = VrfAF.new('black', af)
83
+
84
+ assert_nil(v.default_route_policy_import,
85
+ "Test1.1 : #{af} : route_policy_import")
86
+ assert_nil(v.default_route_policy_export,
87
+ "Test1.2 : #{af} : route_policy_export")
88
+ opts = [:import, :export]
89
+ # test route_target_import
90
+ # test route_target_export
91
+ opts.each do |opt|
92
+ # test route_policy set, from nil to name
93
+ policy_name = 'abc'
94
+ v.send("route_policy_#{opt}=", policy_name)
95
+ result = v.send("route_policy_#{opt}")
96
+ assert_equal(policy_name, result,
97
+ "Test2.1 : #{af} : route_policy_#{opt}")
98
+
99
+ # test route_policy remove, from name to nil
100
+ policy_name = nil
101
+ v.send("route_policy_#{opt}=", policy_name)
102
+ result = v.send("route_policy_#{opt}")
103
+ assert_nil(result, "Test2.2 : #{af} : route_policy_#{opt}")
104
+
105
+ # test route_policy remove, from nil to nil
106
+ v.send("route_policy_#{opt}=", policy_name)
107
+ result = v.send("route_policy_#{opt}")
108
+ assert_nil(result, "Test2.3 : #{af} : route_policy_#{opt}")
109
+ end
110
+ v.destroy
111
+ end
112
+
113
+ def test_route_target
114
+ [%w(ipv4 unicast), %w(ipv6 unicast)].each { |af| route_target(af) }
115
+ end
116
+
117
+ def route_target(af)
118
+ #
119
+ # TBD: The evpn parts of this test need to check for compatible linecards to
120
+ # skip the evpn portions. Don't use vxlan_linecard? as that will cause all
121
+ # tests to be skipped.
122
+ #
123
+ # Common tester for route-target properties. Tests evpn and non-evpn.
124
+ # route_target_both_auto
125
+ # route_target_both_auto_evpn
126
+ # route_target_export
127
+ # route_target_export_evpn
128
+ # route_target_import
129
+ # route_target_import_evpn
130
+ vrf = 'orange'
131
+ v = VrfAF.new(vrf, af)
132
+
133
+ # test route target both auto and route target both auto evpn
134
+ refute(v.default_route_target_both_auto,
135
+ 'default value for route target both auto should be false')
136
+
137
+ refute(v.default_route_target_both_auto_evpn,
138
+ 'default value for route target both auto evpn should be false')
139
+
140
+ if validate_property_excluded?('vrf_af', 'route_target_both_auto')
141
+ assert_raises(Cisco::UnsupportedError) { v.route_target_both_auto = true }
142
+ else
143
+ v.route_target_both_auto = true
144
+ assert(v.route_target_both_auto, "vrf context #{vrf} af #{af}: "\
145
+ 'v route-target both auto should be enabled')
146
+
147
+ v.route_target_both_auto = false
148
+ refute(v.route_target_both_auto, "vrf context #{vrf} af #{af}: "\
149
+ 'v route-target both auto should be disabled')
150
+ end
151
+
152
+ if validate_property_excluded?('vrf_af', 'route_target_both_auto_evpn')
153
+ assert_raises(Cisco::UnsupportedError) do
154
+ v.route_target_both_auto_evpn = true
155
+ end
156
+ else
157
+ v.route_target_both_auto_evpn = true
158
+ assert(v.route_target_both_auto_evpn, "vrf context #{vrf} af #{af}: "\
159
+ 'v route-target both auto evpn should be enabled')
160
+
161
+ v.route_target_both_auto_evpn = false
162
+ refute(v.route_target_both_auto_evpn, "vrf context #{vrf} af #{af}: "\
163
+ 'v route-target both auto evpn should be disabled')
164
+ end
165
+
166
+ opts = [:import, :export]
167
+
168
+ # Master list of communities to test against
169
+ master = ['1:1', '2:2', '3:3', '4:5']
170
+
171
+ # Test 1: both/import/export when no commands are present. Each target
172
+ # option will be tested with and without evpn (6 separate types)
173
+ should = master.clone
174
+ route_target_tester(v, af, opts, should, 'Test 1')
175
+
176
+ # Test 2: remove half of the entries
177
+ should = ['1:1', '4:4']
178
+ route_target_tester(v, af, opts, should, 'Test 2')
179
+
180
+ # Test 3: restore the removed entries
181
+ should = master.clone
182
+ route_target_tester(v, af, opts, should, 'Test 3')
183
+
184
+ # Test 4: 'default'
185
+ should = v.default_route_target_import
186
+ route_target_tester(v, af, opts, should, 'Test 4')
187
+ v.destroy
188
+ end
189
+
190
+ def route_target_tester(v, af, opts, should, test_id)
191
+ # First configure all four property types
192
+ opts.each do |opt|
193
+ # non-evpn
194
+ v.send("route_target_#{opt}=", should)
195
+ # evpn
196
+ if validate_property_excluded?('vrf_af', "route_target_#{opt}_evpn")
197
+ assert_raises(Cisco::UnsupportedError, "route_target_#{opt}_evpn=") do
198
+ v.send("route_target_#{opt}_evpn=", should)
199
+ end
200
+ else
201
+ v.send("route_target_#{opt}_evpn=", should)
202
+ end
203
+ # stitching
204
+ if platform == :nexus
205
+ assert_raises(Cisco::UnsupportedError,
206
+ "route_target_#{opt}_stitching=") do
207
+ v.send("route_target_#{opt}_stitching=", should)
208
+ end
209
+ else
210
+ v.send("route_target_#{opt}_stitching=", should)
211
+ end
212
+ end
213
+
214
+ # Now check the results
215
+ opts.each do |opt|
216
+ # non-evpn
217
+ result = v.send("route_target_#{opt}")
218
+ assert_equal(should, result,
219
+ "#{test_id} : #{af} : route_target_#{opt}")
220
+ # evpn
221
+ result = v.send("route_target_#{opt}_evpn")
222
+ if validate_property_excluded?('vrf_af', "route_target_#{opt}_evpn")
223
+ assert_nil(result)
224
+ else
225
+ assert_equal(should, result,
226
+ "#{test_id} : #{af} : route_target_#{opt}_evpn")
227
+ end
228
+ # stitching
229
+ result = v.send("route_target_#{opt}_stitching")
230
+ if platform == :nexus
231
+ assert_nil(result)
232
+ else
233
+ assert_equal(should, result,
234
+ "#{test_id} : #{af} : route_target_#{opt}_stitching")
235
+ end
236
+ end
237
+ end
238
+ end