cisco_node_utils 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
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