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
@@ -34,9 +34,17 @@ class TestSyslogServer < CiscoTestCase
34
34
 
35
35
  def no_syslogserver
36
36
  # Turn the feature off for a clean test.
37
- config('no logging server 1.2.3.4',
38
- 'no logging server 2003::2',
39
- 'no vrf context red')
37
+ if platform == :ios_xr
38
+ config('no logging 1.2.3.4',
39
+ 'no logging 1.2.3.4 vrf red',
40
+ 'no logging 2003::2',
41
+ 'no logging 2003::2 vrf red',
42
+ 'no vrf red')
43
+ else
44
+ config('no logging server 1.2.3.4',
45
+ 'no logging server 2003::2',
46
+ 'no vrf context red')
47
+ end
40
48
  end
41
49
 
42
50
  # TESTS
@@ -48,6 +56,7 @@ class TestSyslogServer < CiscoTestCase
48
56
  server = Cisco::SyslogServer.new(id, 2, 'default', true)
49
57
  assert_includes(Cisco::SyslogServer.syslogservers, id)
50
58
  assert_equal(server, Cisco::SyslogServer.syslogservers[id])
59
+ assert_equal(2, Cisco::SyslogServer.syslogservers[id].level)
51
60
 
52
61
  server.destroy
53
62
  refute_includes(Cisco::SyslogServer.syslogservers, id)
@@ -60,6 +69,7 @@ class TestSyslogServer < CiscoTestCase
60
69
  server = Cisco::SyslogServer.new(id, 2, 'default', true)
61
70
  assert_includes(Cisco::SyslogServer.syslogservers, id)
62
71
  assert_equal(server, Cisco::SyslogServer.syslogservers[id])
72
+ assert_equal(2, Cisco::SyslogServer.syslogservers[id].level)
63
73
 
64
74
  server.destroy
65
75
  refute_includes(Cisco::SyslogServer.syslogservers, id)
@@ -72,11 +82,13 @@ class TestSyslogServer < CiscoTestCase
72
82
  refute_includes(Cisco::SyslogServer.syslogservers, id2)
73
83
 
74
84
  server = Cisco::SyslogServer.new(id, 2, 'default', true)
75
- server2 = Cisco::SyslogServer.new(id2, 2, 'default', true)
85
+ server2 = Cisco::SyslogServer.new(id2, 3, 'default', true)
76
86
  assert_includes(Cisco::SyslogServer.syslogservers, id)
77
87
  assert_equal(server, Cisco::SyslogServer.syslogservers[id])
88
+ assert_equal(2, Cisco::SyslogServer.syslogservers[id].level)
78
89
  assert_includes(Cisco::SyslogServer.syslogservers, id2)
79
90
  assert_equal(server2, Cisco::SyslogServer.syslogservers[id2])
91
+ assert_equal(3, Cisco::SyslogServer.syslogservers[id2].level)
80
92
 
81
93
  server.destroy
82
94
  server2.destroy
@@ -85,28 +97,40 @@ class TestSyslogServer < CiscoTestCase
85
97
  end
86
98
 
87
99
  def test_create_destroy_single_vrf_ipv4
88
- config('vrf context red')
100
+ if platform == :ios_xr
101
+ config('vrf red')
102
+ else
103
+ config('vrf context red')
104
+ end
105
+
89
106
  id = '1.2.3.4'
90
107
 
91
108
  refute_includes(Cisco::SyslogServer.syslogservers, id)
92
109
 
93
- server = Cisco::SyslogServer.new(id, 2, 'red', true)
110
+ server = Cisco::SyslogServer.new(id, 4, 'red', true)
94
111
  assert_includes(Cisco::SyslogServer.syslogservers, id)
95
112
  assert_equal(server, Cisco::SyslogServer.syslogservers[id])
113
+ assert_equal(4, Cisco::SyslogServer.syslogservers[id].level)
96
114
 
97
115
  server.destroy
98
116
  refute_includes(Cisco::SyslogServer.syslogservers, id)
99
117
  end
100
118
 
101
119
  def test_create_destroy_single_vrf_ipv6
102
- config('vrf context red')
120
+ if platform == :ios_xr
121
+ config('vrf red')
122
+ else
123
+ config('vrf context red')
124
+ end
125
+
103
126
  id = '2003::2'
104
127
 
105
128
  refute_includes(Cisco::SyslogServer.syslogservers, id)
106
129
 
107
- server = Cisco::SyslogServer.new(id, 2, 'red', true)
130
+ server = Cisco::SyslogServer.new(id, 5, 'red', true)
108
131
  assert_includes(Cisco::SyslogServer.syslogservers, id)
109
132
  assert_equal(server, Cisco::SyslogServer.syslogservers[id])
133
+ assert_equal(5, Cisco::SyslogServer.syslogservers[id].level)
110
134
 
111
135
  server.destroy
112
136
  refute_includes(Cisco::SyslogServer.syslogservers, id)
@@ -21,12 +21,14 @@ require_relative '../lib/cisco_node_utils/syslog_settings'
21
21
  # TestSyslogSetting - Minitest for SyslogSetting node utility.
22
22
  class TestSyslogSettings < CiscoTestCase
23
23
  def setup
24
+ return if platform != :nexus
24
25
  # setup runs at the beginning of each test
25
26
  super
26
27
  no_syslogsettings
27
28
  end
28
29
 
29
30
  def teardown
31
+ return if platform != :nexus
30
32
  # teardown runs at the end of each test
31
33
  no_syslogsettings
32
34
  super
@@ -41,14 +43,25 @@ class TestSyslogSettings < CiscoTestCase
41
43
 
42
44
  def test_syslogsettings_create
43
45
  syslog_setting = Cisco::SyslogSettings.new('default')
44
- assert_includes(Cisco::SyslogSettings.syslogsettings, 'default')
45
- assert_equal(Cisco::SyslogSettings.syslogsettings['default'],
46
- syslog_setting)
47
-
48
- syslog_setting.timestamp = 'milliseconds'
49
- assert_equal(Cisco::SyslogSettings.syslogsettings['default'].timestamp,
50
- 'milliseconds')
51
- assert_equal(syslog_setting.timestamp,
52
- 'milliseconds')
46
+
47
+ if platform == :ios_xr
48
+ assert_nil(syslog_setting.timestamp)
49
+ assert_raises(Cisco::UnsupportedError) do
50
+ syslog_setting.timestamp = 'milliseconds'
51
+ end
52
+ else
53
+ assert_includes(Cisco::SyslogSettings.syslogsettings, 'default')
54
+ assert_equal(syslog_setting,
55
+ Cisco::SyslogSettings.syslogsettings['default'],
56
+ )
57
+
58
+ syslog_setting.timestamp = 'milliseconds'
59
+ assert_equal('milliseconds',
60
+ Cisco::SyslogSettings.syslogsettings['default'].timestamp,
61
+ )
62
+ assert_equal('milliseconds',
63
+ syslog_setting.timestamp,
64
+ )
65
+ end
53
66
  end
54
67
  end
@@ -17,6 +17,8 @@ require_relative '../lib/cisco_node_utils/tacacs_server'
17
17
 
18
18
  # TestTacacsServer - Minitest for TacacsServer node utility
19
19
  class TestTacacsServer < CiscoTestCase
20
+ @skip_unless_supported = 'tacacs_server'
21
+
20
22
  def assert_tacacsserver_feature
21
23
  assert_show_match(command: 'show run all | no-more',
22
24
  pattern: /feature tacacs\+/)
@@ -33,16 +35,22 @@ class TestTacacsServer < CiscoTestCase
33
35
  # 'directed-request' command is under 'show run aaa all'
34
36
  @default_show_command = 'show run tacacs all | no-more ; ' \
35
37
  'show run aaa all | no-more'
38
+ config_no_warn('no feature tacacs+')
36
39
  end
37
40
 
38
- def test_tacacsserver_create_valid
41
+ def teardown
42
+ config_no_warn('no feature tacacs+')
43
+ super
44
+ end
45
+
46
+ def test_create_valid
39
47
  tacacs = TacacsServer.new
40
48
  assert_tacacsserver_feature
41
49
  tacacs.destroy
42
50
  end
43
51
 
44
- def test_tacacsserver_get_encryption_type
45
- config('no feature tacacs+', 'feature tacacs+')
52
+ def test_get_encryption_type
53
+ config_no_warn('feature tacacs+')
46
54
  encryption_type = TACACS_SERVER_ENC_UNKNOWN
47
55
  # Get encryption password when not configured
48
56
  tacacs = TacacsServer.new
@@ -72,16 +80,14 @@ class TestTacacsServer < CiscoTestCase
72
80
  tacacs.destroy
73
81
  end
74
82
 
75
- def test_tacacsserver_get_default_encryption
83
+ def test_get_default_encryption
76
84
  # Ruby can use defines, but only they're not initialized from an enum
77
85
  assert_equal(TACACS_SERVER_ENC_NONE,
78
86
  TacacsServer.default_encryption_type,
79
87
  'Error: Tacacs Server, default encryption incorrect')
80
88
  end
81
89
 
82
- def test_tacacsserver_get_encryption_password
83
- # Get encryption password when not configured
84
- config('no feature tacacs+')
90
+ def test_get_encryption_password
85
91
  tacacs = TacacsServer.new
86
92
  assert_equal(node.config_get_default('tacacs_server',
87
93
  'encryption_password'),
@@ -102,14 +108,14 @@ class TestTacacsServer < CiscoTestCase
102
108
  tacacs.destroy
103
109
  end
104
110
 
105
- def test_tacacsserver_get_default_encryption_password
111
+ def test_get_default_encryption_password
106
112
  assert_equal(node.config_get_default('tacacs_server',
107
113
  'encryption_password'),
108
114
  TacacsServer.default_encryption_password,
109
115
  'Error: Tacacs Server, default encryption password incorrect')
110
116
  end
111
117
 
112
- def test_tacacsserver_key_set
118
+ def test_key_set
113
119
  enc_type = TACACS_SERVER_ENC_NONE
114
120
  # This one is needed since the 'sh run' will always display the type
115
121
  # differently than the used encryption config type.
@@ -135,8 +141,7 @@ class TestTacacsServer < CiscoTestCase
135
141
  tacacs.destroy
136
142
  end
137
143
 
138
- def test_tacacsserver_key_unconfigure
139
- config('no feature tacacs+')
144
+ def test_key_unconfigure
140
145
  enc_type = TACACS_SERVER_ENC_NONE
141
146
  # This one is needed since the 'sh run' will always display the type
142
147
  # differently than the used encryption config type.
@@ -158,7 +163,7 @@ class TestTacacsServer < CiscoTestCase
158
163
  tacacs.destroy
159
164
  end
160
165
 
161
- def test_tacacsserver_get_timeout
166
+ def test_get_timeout
162
167
  tacacs = TacacsServer.new
163
168
  timeout = node.config_get_default('tacacs_server', 'timeout')
164
169
  assert_equal(timeout, tacacs.timeout,
@@ -171,13 +176,13 @@ class TestTacacsServer < CiscoTestCase
171
176
  tacacs.destroy
172
177
  end
173
178
 
174
- def test_tacacsserver_get_default_timeout
179
+ def test_get_default_timeout
175
180
  assert_equal(node.config_get_default('tacacs_server', 'timeout'),
176
181
  TacacsServer.default_timeout,
177
182
  'Error: Tacacs Server, default timeout incorrect')
178
183
  end
179
184
 
180
- def test_tacacsserver_set_timeout
185
+ def test_set_timeout
181
186
  timeout = 45
182
187
 
183
188
  tacacs = TacacsServer.new
@@ -199,7 +204,7 @@ class TestTacacsServer < CiscoTestCase
199
204
  tacacs.destroy
200
205
  end
201
206
 
202
- def test_tacacsserver_get_deadtime
207
+ def test_get_deadtime
203
208
  tacacs = TacacsServer.new
204
209
  deadtime = node.config_get_default('tacacs_server', 'deadtime')
205
210
  assert_equal(deadtime, tacacs.deadtime,
@@ -212,13 +217,13 @@ class TestTacacsServer < CiscoTestCase
212
217
  tacacs.destroy
213
218
  end
214
219
 
215
- def test_tacacsserver_get_default_deadtime
220
+ def test_get_default_deadtime
216
221
  assert_equal(node.config_get_default('tacacs_server', 'deadtime'),
217
222
  TacacsServer.default_deadtime,
218
223
  'Error: Tacacs Server, default deadtime incorrect')
219
224
  end
220
225
 
221
- def test_tacacsserver_set_deadtime
226
+ def test_set_deadtime
222
227
  deadtime = 1250
223
228
 
224
229
  tacacs = TacacsServer.new
@@ -238,7 +243,7 @@ class TestTacacsServer < CiscoTestCase
238
243
  tacacs.destroy
239
244
  end
240
245
 
241
- def test_tacacsserver_get_directed_request
246
+ def test_get_directed_request
242
247
  config('feature tacacs', 'tacacs-server directed-request')
243
248
  tacacs = TacacsServer.new
244
249
  assert(tacacs.directed_request?,
@@ -250,13 +255,13 @@ class TestTacacsServer < CiscoTestCase
250
255
  tacacs.destroy
251
256
  end
252
257
 
253
- def test_tacacsserver_get_default_directed_request
258
+ def test_get_default_directed_request
254
259
  assert_equal(node.config_get_default('tacacs_server', 'directed_request'),
255
260
  TacacsServer.default_directed_request,
256
261
  'Error: Tacacs Server, default directed-request incorrect')
257
262
  end
258
263
 
259
- def test_tacacsserver_set_directed_request
264
+ def test_set_directed_request
260
265
  config('feature tacacs', 'tacacs-server directed-request')
261
266
  state = true
262
267
  tacacs = TacacsServer.new
@@ -294,34 +299,34 @@ class TestTacacsServer < CiscoTestCase
294
299
  tacacs.destroy
295
300
  end
296
301
 
297
- def test_tacacsserver_get_source_interface
298
- config('no ip tacacs source-interface')
302
+ def test_get_source_interface
303
+ config_no_warn('no ip tacacs source-interface')
299
304
  tacacs = TacacsServer.new
300
305
  intf = node.config_get_default('tacacs_server', 'source_interface')
301
306
  assert_equal(intf, tacacs.source_interface,
302
307
  'Error: Tacacs Server, source-interface set')
303
308
 
304
- intf = 'Ethernet1/1'
309
+ intf = 'loopback41'
305
310
  config("ip tacacs source-interface #{intf}")
306
311
  assert_equal(intf, tacacs.source_interface,
307
312
  'Error: Tacacs Server, source-interface not correct')
308
313
  tacacs.destroy
309
314
  end
310
315
 
311
- def test_tacacsserver_get_default_source_interface
316
+ def test_get_default_source_interface
312
317
  assert_equal(node.config_get_default('tacacs_server', 'source_interface'),
313
318
  TacacsServer.default_source_interface,
314
319
  'Error: Tacacs Server, default source-interface incorrect')
315
320
  end
316
321
 
317
- def test_tacacsserver_set_source_interface
322
+ def test_set_source_interface
318
323
  config('feature tacacs+', 'no ip tacacs source-int')
319
324
  intf = node.config_get_default('tacacs_server', 'source_interface')
320
325
  tacacs = TacacsServer.new
321
326
  assert_equal(intf, tacacs.source_interface,
322
327
  'Error: Tacacs Server, source-interface set')
323
328
 
324
- intf = 'Ethernet1/1'
329
+ intf = 'loopback41'
325
330
  tacacs.source_interface = intf
326
331
  line = assert_show_match(pattern: /ip tacacs source-interface #{intf}/,
327
332
  msg: 'source-interface not configured')
@@ -344,7 +349,7 @@ class TestTacacsServer < CiscoTestCase
344
349
  tacacs.destroy
345
350
  end
346
351
 
347
- def test_tacacsserver_destroy
352
+ def test_destroy
348
353
  tacacs = TacacsServer.new
349
354
  assert_tacacsserver_feature
350
355
  tacacs.destroy
@@ -18,17 +18,34 @@ require_relative '../lib/cisco_node_utils/tacacs_server_host'
18
18
 
19
19
  # Test class for Tacacs Server Group
20
20
  class TestTacacsServerGroup < CiscoTestCase
21
+ @skip_unless_supported = 'tacacs_server_group'
22
+
23
+ def setup
24
+ super
25
+ # TBD: Remove once CSCuz44696 is resolved.
26
+ skip('This test is not currently supported on 7.0(3)I3 images') if
27
+ node.os_version[/7.0\(3\)I3\(/]
28
+ end
29
+
21
30
  def clean_tacacs_config
22
31
  config('no feature tacacs',
23
32
  'feature tacacs')
24
33
  end
25
34
 
26
35
  def create_tacacsserverhost(name='defaulttest')
27
- TacacsServerHost.new(name)
36
+ config("tacacs-server host #{name}")
37
+ end
38
+
39
+ def detach_tacacsserverhost(name)
40
+ config("no tacacs-server host #{name}")
28
41
  end
29
42
 
30
- def detach_tacacsserverhost(host)
31
- host.destroy
43
+ def config_command
44
+ if platform == :ios_xr
45
+ 'show running-config aaa'
46
+ else
47
+ 'show run tacacs+ all | no-more'
48
+ end
32
49
  end
33
50
 
34
51
  def detach_aaaservergroup(aaa_server_group)
@@ -65,7 +82,7 @@ class TestTacacsServerGroup < CiscoTestCase
65
82
  def test_create_valid_tacacs
66
83
  group_name = 'Group1'
67
84
  aaa_group = TacacsServerGroup.new(group_name)
68
- assert_show_match(command: 'show run tacacs+ all | no-more',
85
+ assert_show_match(command: config_command,
69
86
  pattern: /#{group_name}/)
70
87
 
71
88
  detach_aaaservergroup(aaa_group)
@@ -77,9 +94,9 @@ class TestTacacsServerGroup < CiscoTestCase
77
94
  aaa_group1 = TacacsServerGroup.new(group_name1)
78
95
  aaa_group2 = TacacsServerGroup.new(group_name2)
79
96
 
80
- assert_show_match(command: 'show run tacacs+ all | no-more',
97
+ assert_show_match(command: config_command,
81
98
  pattern: /#{group_name1}/)
82
- assert_show_match(command: 'show run tacacs+ all | no-more',
99
+ assert_show_match(command: config_command,
83
100
  pattern: /#{group_name2}/)
84
101
 
85
102
  detach_aaaservergroup(aaa_group1)
@@ -87,6 +104,8 @@ class TestTacacsServerGroup < CiscoTestCase
87
104
  end
88
105
 
89
106
  def test_collection_empty_tacacs
107
+ return if platform == :ios_xr
108
+
90
109
  clean_tacacs_config
91
110
  aaa_group_list = TacacsServerGroup.groups
92
111
  assert_empty(aaa_group_list,
@@ -124,10 +143,10 @@ class TestTacacsServerGroup < CiscoTestCase
124
143
 
125
144
  def test_servers_tacacs
126
145
  clean_tacacs_config
127
- server_name1 = 'server1'
128
- server_name2 = 'server2'
129
- server1 = create_tacacsserverhost(server_name1)
130
- server2 = create_tacacsserverhost(server_name2)
146
+ server_name1 = '1.1.1.1'
147
+ server_name2 = '2.2.2.2'
148
+ create_tacacsserverhost(server_name1)
149
+ create_tacacsserverhost(server_name2)
131
150
 
132
151
  aaa_group = TacacsServerGroup.new('Group1')
133
152
 
@@ -141,41 +160,41 @@ class TestTacacsServerGroup < CiscoTestCase
141
160
  servers = aaa_group.servers
142
161
  assert_equal(2, servers.size,
143
162
  'Error: Collection is not two servers')
144
- assert(servers.include?('server1'),
163
+ assert(servers.include?(server_name1),
145
164
  "Error: Collection does not contain #{server_name1}")
146
- assert(servers.include?('server2'),
165
+ assert(servers.include?(server_name2),
147
166
  "Error: Collection does not contain #{server_name2}")
148
167
 
149
168
  detach_aaaservergroup(aaa_group)
150
- detach_tacacsserverhost(server1)
151
- detach_tacacsserverhost(server2)
169
+ detach_tacacsserverhost(server_name1)
170
+ detach_tacacsserverhost(server_name2)
152
171
  end
153
172
 
154
173
  def test_add_server_tacacs
155
- server_name1 = 'server1'
156
- server_name2 = 'server2'
157
- server1 = create_tacacsserverhost(server_name1)
158
- server2 = create_tacacsserverhost(server_name2)
174
+ server_name1 = '1.1.1.1'
175
+ server_name2 = '2.2.2.2'
176
+ create_tacacsserverhost(server_name1)
177
+ create_tacacsserverhost(server_name2)
159
178
 
160
179
  aaa_group = TacacsServerGroup.new('Group1')
161
180
  aaa_group.servers = [server_name1, server_name2]
162
181
 
163
- assert_show_match(command: 'show run tacacs+ all | no-more',
182
+ assert_show_match(command: config_command,
164
183
  pattern: /server #{server_name1}/)
165
- assert_show_match(command: 'show run tacacs+ all | no-more',
184
+ assert_show_match(command: config_command,
166
185
  pattern: /server #{server_name2}/)
167
186
 
168
187
  detach_aaaservergroup(aaa_group)
169
- detach_tacacsserverhost(server1)
170
- detach_tacacsserverhost(server2)
188
+ detach_tacacsserverhost(server_name1)
189
+ detach_tacacsserverhost(server_name2)
171
190
  end
172
191
 
173
192
  def test_remove_server_tacacs
174
193
  clean_tacacs_config
175
- server_name1 = 'server1'
176
- server_name2 = 'server2'
177
- server1 = create_tacacsserverhost(server_name1)
178
- server2 = create_tacacsserverhost(server_name2)
194
+ server_name1 = '1.1.1.1'
195
+ server_name2 = '2.2.2.2'
196
+ create_tacacsserverhost(server_name1)
197
+ create_tacacsserverhost(server_name2)
179
198
 
180
199
  aaa_group = TacacsServerGroup.new('Group1')
181
200
  aaa_group.servers = [server_name1, server_name2]
@@ -187,24 +206,24 @@ class TestTacacsServerGroup < CiscoTestCase
187
206
 
188
207
  # Now remove them and then check again
189
208
  aaa_group.servers = [server_name2]
190
- refute_show_match(command: 'show run tacacs+ all | no-more',
209
+ refute_show_match(command: config_command,
191
210
  pattern: /server #{server_name1}/)
192
211
 
193
212
  aaa_group.servers = []
194
- refute_show_match(command: 'show run tacacs+ all | no-more',
213
+ refute_show_match(command: config_command,
195
214
  pattern: /server #{server_name2}/)
196
215
 
197
216
  detach_aaaservergroup(aaa_group)
198
- detach_tacacsserverhost(server1)
199
- detach_tacacsserverhost(server2)
217
+ detach_tacacsserverhost(server_name1)
218
+ detach_tacacsserverhost(server_name2)
200
219
  end
201
220
 
202
221
  def test_remove_server_twice_tacacs
203
222
  clean_tacacs_config
204
- server_name1 = 'server1'
205
- server_name2 = 'server2'
206
- server1 = create_tacacsserverhost(server_name1)
207
- server2 = create_tacacsserverhost(server_name2)
223
+ server_name1 = '1.1.1.1'
224
+ server_name2 = '2.2.2.2'
225
+ create_tacacsserverhost(server_name1)
226
+ create_tacacsserverhost(server_name2)
208
227
 
209
228
  aaa_group = TacacsServerGroup.new('Group1')
210
229
  aaa_group.servers = [server_name1, server_name2]
@@ -216,12 +235,12 @@ class TestTacacsServerGroup < CiscoTestCase
216
235
 
217
236
  # Remove server 1
218
237
  aaa_group.servers = [server_name2]
219
- refute_show_match(command: 'show run tacacs+ all | no-more',
238
+ refute_show_match(command: config_command,
220
239
  pattern: /server #{server_name1}/)
221
240
 
222
241
  # Now remove server 2
223
242
  aaa_group.servers = []
224
- refute_show_match(command: 'show run tacacs+ all | no-more',
243
+ refute_show_match(command: config_command,
225
244
  pattern: /server #{server_name2}/)
226
245
 
227
246
  # Check collection size
@@ -229,11 +248,15 @@ class TestTacacsServerGroup < CiscoTestCase
229
248
  assert_empty(servers, 'Error: Collection not empty')
230
249
 
231
250
  detach_aaaservergroup(aaa_group)
232
- detach_tacacsserverhost(server1)
233
- detach_tacacsserverhost(server2)
251
+ detach_tacacsserverhost(server_name1)
252
+ detach_tacacsserverhost(server_name2)
234
253
  end
235
254
 
236
255
  def test_get_vrf_tacacs
256
+ # TODO
257
+ return if validate_property_excluded?('tacacs_server_group',
258
+ 'vrf')
259
+
237
260
  group_name1 = 'Group1'
238
261
  aaa_group = TacacsServerGroup.new(group_name1)
239
262
 
@@ -255,6 +278,10 @@ class TestTacacsServerGroup < CiscoTestCase
255
278
  end
256
279
 
257
280
  def test_get_default_vrf_tacacs
281
+ # TODO
282
+ return if validate_property_excluded?('tacacs_server_group',
283
+ 'vrf')
284
+
258
285
  aaa_group = TacacsServerGroup.new('Group1')
259
286
  assert_equal(cmd_ref.lookup('tacacs_server_group', 'vrf').default_value,
260
287
  aaa_group.default_vrf,
@@ -263,10 +290,14 @@ class TestTacacsServerGroup < CiscoTestCase
263
290
  end
264
291
 
265
292
  def test_set_vrf_tacacs
293
+ # TODO
294
+ return if validate_property_excluded?('tacacs_server_group',
295
+ 'vrf')
296
+
266
297
  vrf = 'management-123'
267
298
  aaa_group = TacacsServerGroup.new('Group1')
268
299
  aaa_group.vrf = vrf
269
- assert_show_match(command: 'show run tacacs+ all | no-more',
300
+ assert_show_match(command: config_command,
270
301
  pattern: /use-vrf #{vrf}/)
271
302
 
272
303
  # Invalid case
@@ -277,6 +308,10 @@ class TestTacacsServerGroup < CiscoTestCase
277
308
  end
278
309
 
279
310
  def test_get_deadtime_tacacs
311
+ # TODO
312
+ return if validate_property_excluded?('tacacs_server_group',
313
+ 'deadtime')
314
+
280
315
  group_name = 'Group1'
281
316
  aaa_group = TacacsServerGroup.new(group_name)
282
317
 
@@ -298,6 +333,10 @@ class TestTacacsServerGroup < CiscoTestCase
298
333
  end
299
334
 
300
335
  def test_get_default_deadtime_tacacs
336
+ # TODO
337
+ return if validate_property_excluded?('tacacs_server_group',
338
+ 'deadtime')
339
+
301
340
  aaa_group = TacacsServerGroup.new('Group1')
302
341
  assert_equal(
303
342
  cmd_ref.lookup('tacacs_server_group', 'deadtime').default_value,
@@ -307,10 +346,14 @@ class TestTacacsServerGroup < CiscoTestCase
307
346
  end
308
347
 
309
348
  def test_set_deadtime_tacacs
349
+ # TODO
350
+ return if validate_property_excluded?('tacacs_server_group',
351
+ 'deadtime')
352
+
310
353
  deadtime = 1250
311
354
  aaa_group = TacacsServerGroup.new('Group1')
312
355
  aaa_group.deadtime = deadtime
313
- assert_show_match(command: 'show run tacacs+ all | no-more',
356
+ assert_show_match(command: config_command,
314
357
  pattern: /deadtime #{deadtime}/,
315
358
  msg: 'Error: deadtime not configured')
316
359
  # Invalid case
@@ -322,6 +365,10 @@ class TestTacacsServerGroup < CiscoTestCase
322
365
  end
323
366
 
324
367
  def test_get_source_interface_tacacs
368
+ # TODO
369
+ return if validate_property_excluded?('tacacs_server_group',
370
+ 'source_interface')
371
+
325
372
  group_name = 'Group1'
326
373
  aaa_group = TacacsServerGroup.new(group_name)
327
374
  intf =
@@ -329,12 +376,12 @@ class TestTacacsServerGroup < CiscoTestCase
329
376
  assert_equal(intf, aaa_group.source_interface,
330
377
  'Error: TacacsServerGroup, source-interface set')
331
378
 
332
- intf = 'Ethernet1/1'
379
+ intf = interfaces[0]
333
380
  create_source_interface(group_name, 'tacacs+', intf)
334
381
  assert_equal(intf, aaa_group.source_interface,
335
382
  'Error: TacacsServerGroup, source-interface not correct')
336
383
 
337
- intf = 'Ethernet1/32'
384
+ intf = interfaces[1]
338
385
  create_source_interface(group_name, 'tacacs+', intf)
339
386
  assert_equal(intf, aaa_group.source_interface,
340
387
  'Error: TacacsServerGroup, source-interface not correct')
@@ -343,6 +390,10 @@ class TestTacacsServerGroup < CiscoTestCase
343
390
  end
344
391
 
345
392
  def test_get_default_source_interface_tacacs
393
+ # TODO
394
+ return if validate_property_excluded?('tacacs_server_group',
395
+ 'source_interface')
396
+
346
397
  aaa_group = TacacsServerGroup.new('Group1')
347
398
  assert_equal(
348
399
  cmd_ref.lookup('tacacs_server_group', 'source_interface').default_value,
@@ -352,6 +403,10 @@ class TestTacacsServerGroup < CiscoTestCase
352
403
  end
353
404
 
354
405
  def test_set_source_interface_tacacs
406
+ # TODO
407
+ return if validate_property_excluded?('tacacs_server_group',
408
+ 'source_interface')
409
+
355
410
  intf =
356
411
  cmd_ref.lookup('tacacs_server_group', 'source_interface').default_value
357
412
  aaa_group = TacacsServerGroup.new('Group1')
@@ -359,13 +414,13 @@ class TestTacacsServerGroup < CiscoTestCase
359
414
  'Error: Aaa_Group Server, source-interface not default')
360
415
 
361
416
  aaa_group.source_interface = 'loopback1'
362
- assert_show_match(command: 'show run tacacs+ all | no-more',
417
+ assert_show_match(command: config_command,
363
418
  pattern: /source-interface loopback1/,
364
419
  msg: 'Error: source-interface not correct')
365
420
 
366
421
  aaa_group.source_interface =
367
422
  cmd_ref.lookup('tacacs_server_group', 'source_interface').default_value
368
- refute_show_match(command: 'show run tacacs+ all | no-more',
423
+ refute_show_match(command: config_command,
369
424
  pattern: /source-interface loopback1/)
370
425
 
371
426
  # Invalid case
@@ -399,7 +454,7 @@ class TestTacacsServerGroup < CiscoTestCase
399
454
  aaa_group = TacacsServerGroup.new(group_name)
400
455
 
401
456
  detach_aaaservergroup(aaa_group)
402
- refute_show_match(command: 'show run tacacs+ all | no-more',
457
+ refute_show_match(command: config_command,
403
458
  pattern: /#{group_name}/)
404
459
  end
405
460
  end