cisco_node_utils 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (114) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +4 -0
  3. data/.rubocop.yml +81 -1
  4. data/.travis.yml +9 -0
  5. data/CHANGELOG.md +72 -6
  6. data/CONTRIBUTING.md +32 -7
  7. data/README.md +70 -7
  8. data/Rakefile +17 -0
  9. data/bin/check_metric_limits.rb +109 -0
  10. data/bin/git/hooks/commit-msg/enforce_style +81 -0
  11. data/bin/git/hooks/hook_lib +108 -0
  12. data/bin/git/hooks/hooks-wrapper +38 -0
  13. data/bin/git/hooks/post-flow-hotfix-start/update-version +24 -0
  14. data/bin/git/hooks/post-flow-release-finish/update-version +29 -0
  15. data/bin/git/hooks/post-flow-release-start/update-version +19 -0
  16. data/bin/git/hooks/post-merge/update-hooks +6 -0
  17. data/bin/git/hooks/post-rewrite/update-hooks +6 -0
  18. data/bin/git/hooks/pre-commit/rubocop +20 -0
  19. data/bin/git/hooks/pre-commit/validate-diffs +31 -0
  20. data/bin/git/hooks/pre-push/check-changelog +24 -0
  21. data/bin/git/hooks/pre-push/rubocop +7 -0
  22. data/bin/git/update-hooks +65 -0
  23. data/cisco_node_utils.gemspec +9 -3
  24. data/docs/README-develop-best-practices.md +404 -0
  25. data/docs/README-develop-node-utils-APIs.md +215 -365
  26. data/docs/README-maintainers.md +33 -3
  27. data/docs/template-router.rb +89 -91
  28. data/docs/template-test_router.rb +52 -55
  29. data/lib/.rubocop.yml +18 -0
  30. data/lib/cisco_node_utils.rb +2 -19
  31. data/lib/cisco_node_utils/README_YAML.md +1 -9
  32. data/lib/cisco_node_utils/bgp.rb +664 -0
  33. data/lib/cisco_node_utils/bgp_af.rb +530 -0
  34. data/lib/cisco_node_utils/bgp_neighbor.rb +425 -0
  35. data/lib/cisco_node_utils/bgp_neighbor_af.rb +709 -0
  36. data/lib/cisco_node_utils/cisco_cmn_utils.rb +59 -25
  37. data/lib/cisco_node_utils/command_reference.rb +72 -74
  38. data/lib/cisco_node_utils/command_reference_common.yaml +174 -9
  39. data/lib/cisco_node_utils/command_reference_common_bgp.yaml +535 -0
  40. data/lib/cisco_node_utils/command_reference_n7k.yaml +4 -0
  41. data/lib/cisco_node_utils/command_reference_n9k.yaml +0 -9
  42. data/lib/cisco_node_utils/configparser_lib.rb +152 -147
  43. data/lib/cisco_node_utils/dns_domain.rb +79 -0
  44. data/lib/cisco_node_utils/domain_name.rb +71 -0
  45. data/lib/cisco_node_utils/interface.rb +167 -161
  46. data/lib/cisco_node_utils/interface_ospf.rb +78 -81
  47. data/lib/cisco_node_utils/name_server.rb +64 -0
  48. data/lib/cisco_node_utils/node.rb +154 -198
  49. data/lib/cisco_node_utils/node_util.rb +61 -0
  50. data/lib/cisco_node_utils/ntp_config.rb +65 -0
  51. data/lib/cisco_node_utils/ntp_server.rb +76 -0
  52. data/lib/cisco_node_utils/platform.rb +174 -165
  53. data/lib/cisco_node_utils/radius_global.rb +146 -0
  54. data/lib/cisco_node_utils/radius_server.rb +295 -0
  55. data/lib/cisco_node_utils/router_ospf.rb +59 -63
  56. data/lib/cisco_node_utils/router_ospf_vrf.rb +226 -210
  57. data/lib/cisco_node_utils/snmpcommunity.rb +52 -58
  58. data/lib/cisco_node_utils/snmpgroup.rb +22 -23
  59. data/lib/cisco_node_utils/snmpserver.rb +99 -103
  60. data/lib/cisco_node_utils/snmpuser.rb +294 -274
  61. data/lib/cisco_node_utils/syslog_server.rb +92 -0
  62. data/lib/cisco_node_utils/syslog_settings.rb +69 -0
  63. data/lib/cisco_node_utils/tacacs_server.rb +137 -133
  64. data/lib/cisco_node_utils/tacacs_server_host.rb +84 -87
  65. data/lib/cisco_node_utils/version.rb +2 -1
  66. data/lib/cisco_node_utils/vlan.rb +28 -31
  67. data/lib/cisco_node_utils/vrf.rb +80 -0
  68. data/lib/cisco_node_utils/vtp.rb +100 -97
  69. data/lib/cisco_node_utils/yum.rb +15 -17
  70. data/tests/.rubocop.yml +15 -0
  71. data/tests/basetest.rb +81 -36
  72. data/tests/ciscotest.rb +38 -78
  73. data/{lib/cisco_node_utils → tests}/platform_info.rb +12 -8
  74. data/{lib/cisco_node_utils → tests}/platform_info.yaml +1 -1
  75. data/tests/test_bgp_af.rb +920 -0
  76. data/tests/test_bgp_neighbor.rb +403 -0
  77. data/tests/test_bgp_neighbor_af.rb +589 -0
  78. data/tests/test_command_config.rb +65 -62
  79. data/tests/test_command_reference.rb +31 -45
  80. data/tests/test_dns_domain.rb +113 -0
  81. data/tests/test_domain_name.rb +86 -0
  82. data/tests/test_interface.rb +424 -548
  83. data/tests/test_interface_ospf.rb +248 -432
  84. data/tests/test_interface_svi.rb +56 -79
  85. data/tests/test_interface_switchport.rb +196 -272
  86. data/tests/test_name_server.rb +85 -0
  87. data/tests/test_node.rb +7 -6
  88. data/tests/test_node_ext.rb +133 -186
  89. data/tests/test_ntp_config.rb +49 -0
  90. data/tests/test_ntp_server.rb +74 -0
  91. data/tests/test_platform.rb +58 -37
  92. data/tests/test_radius_global.rb +78 -0
  93. data/tests/test_radius_server.rb +185 -0
  94. data/tests/test_router_bgp.rb +838 -0
  95. data/tests/test_router_ospf.rb +49 -80
  96. data/tests/test_router_ospf_vrf.rb +274 -392
  97. data/tests/test_snmpcommunity.rb +128 -172
  98. data/tests/test_snmpgroup.rb +12 -14
  99. data/tests/test_snmpserver.rb +160 -189
  100. data/tests/test_snmpuser.rb +568 -717
  101. data/tests/test_syslog_server.rb +88 -0
  102. data/tests/test_syslog_settings.rb +54 -0
  103. data/tests/test_tacacs_server.rb +113 -148
  104. data/tests/test_tacacs_server_host.rb +108 -161
  105. data/tests/test_vlan.rb +63 -79
  106. data/tests/test_vrf.rb +92 -0
  107. data/tests/test_vtp.rb +108 -126
  108. data/tests/test_yum.rb +47 -41
  109. metadata +92 -56
  110. data/.rubocop_todo.yml +0 -293
  111. data/docs/.rubocop.yml +0 -13
  112. data/docs/template-feature.rb +0 -45
  113. data/docs/template-test_feature.rb +0 -51
  114. data/tests/test_all_cisco.rb +0 -46
@@ -0,0 +1,146 @@
1
+ # Radius Global provider class
2
+
3
+ # Jonathan Tripathy et al., September 2015
4
+
5
+ # Copyright (c) 2014-2015 Cisco and/or its affiliates.
6
+
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ require_relative 'node_util'
20
+
21
+ module Cisco
22
+ # RadiusGlobal - node utility class for
23
+ # Radius Global configuration management
24
+ class RadiusGlobal < NodeUtil
25
+ attr_reader :name
26
+
27
+ def initialize(name)
28
+ fail TypeError unless name.is_a?(String)
29
+ fail ArgumentError,
30
+ "This provider only accepts an id of 'default'" \
31
+ unless name.eql?('default')
32
+ @name = name
33
+ end
34
+
35
+ def self.radius_global
36
+ hash = {}
37
+ hash['default'] = RadiusGlobal.new('default')
38
+ hash
39
+ end
40
+
41
+ def ==(other)
42
+ name == other.name
43
+ end
44
+
45
+ def timeout
46
+ val = config_get('radius_global', 'timeout')
47
+ val = val[0].to_i unless val.nil?
48
+ val
49
+ end
50
+
51
+ def default_timeout
52
+ val = config_get_default('radius_global', 'timeout').to_i
53
+ val
54
+ end
55
+
56
+ def timeout=(val)
57
+ unless val.nil?
58
+ fail ArgumentError, 'timeout must be an Integer' \
59
+ unless val.is_a?(Integer)
60
+ end
61
+
62
+ if val.nil? && !timeout.nil?
63
+ config_set('radius_global',
64
+ 'timeout',
65
+ state: 'no',
66
+ timeout: timeout)
67
+ else
68
+ config_set('radius_global',
69
+ 'timeout',
70
+ state: '',
71
+ timeout: val)
72
+ end
73
+ end
74
+
75
+ def retransmit_count
76
+ val = config_get('radius_global', 'retransmit')
77
+ val = val[0].to_i unless val.nil?
78
+ val
79
+ end
80
+
81
+ def default_retransmit_count
82
+ val = config_get_default('radius_global', 'retransmit').to_i
83
+ val
84
+ end
85
+
86
+ def retransmit_count=(val)
87
+ unless val.nil?
88
+ fail ArgumentError, 'retransmit_count must be an Integer' \
89
+ unless val.is_a?(Integer)
90
+ end
91
+
92
+ if val.nil? && !retransmit_count.nil?
93
+ config_set('radius_global',
94
+ 'retransmit',
95
+ state: 'no',
96
+ count: retransmit_count)
97
+ else
98
+ config_set('radius_global',
99
+ 'retransmit',
100
+ state: '',
101
+ count: val)
102
+ end
103
+ end
104
+
105
+ def key_format
106
+ val = config_get('radius_global', 'key_format')
107
+ val = val[0].to_i unless val.nil?
108
+ val
109
+ end
110
+
111
+ def key
112
+ val = config_get('radius_global', 'key')
113
+ val = val[0] unless val.nil?
114
+ val
115
+ end
116
+
117
+ def key_set(value, format)
118
+ unless value.nil?
119
+ fail ArgumentError, 'value must be a String' \
120
+ unless value.is_a?(String)
121
+ end
122
+
123
+ unless format.nil?
124
+ fail ArgumentError, 'format must be an Integer' \
125
+ unless format.is_a?(Integer)
126
+ end
127
+
128
+ if value.nil? && !key.nil?
129
+ config_set('radius_global',
130
+ 'key',
131
+ state: 'no',
132
+ key: "#{key_format} #{key}")
133
+ elsif !format.nil?
134
+ config_set('radius_global',
135
+ 'key',
136
+ state: '',
137
+ key: "#{format} #{value}")
138
+ else
139
+ config_set('radius_global',
140
+ 'key',
141
+ state: '',
142
+ key: "#{value}")
143
+ end
144
+ end
145
+ end # class
146
+ end # module
@@ -0,0 +1,295 @@
1
+ # Radius Server provider class
2
+
3
+ # Jonathan Tripathy et al., September 2015
4
+
5
+ # Copyright (c) 2014-2015 Cisco and/or its affiliates.
6
+
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ require File.join(File.dirname(__FILE__), 'node_util')
20
+
21
+ module Cisco
22
+ # RadiusServer - node utility class for
23
+ # Raidus Server configuration management
24
+ class RadiusServer < NodeUtil
25
+ attr_reader :name
26
+
27
+ def initialize(name, instantiate=true)
28
+ unless name[/^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/]
29
+ fail ArgumentError, 'Invalid value (Name is not an IP address)'
30
+ end
31
+ @name = name
32
+
33
+ create if instantiate
34
+ end
35
+
36
+ def self.radiusservers
37
+ hash = {}
38
+
39
+ radiusservers_list = config_get('radius_server', 'hosts')
40
+ return hash if radiusservers_list.nil?
41
+
42
+ radiusservers_list.each do |id|
43
+ hash[id] = RadiusServer.new(id, false)
44
+ end
45
+
46
+ hash
47
+ end
48
+
49
+ def create
50
+ config_set('radius_server',
51
+ 'hosts',
52
+ state: '',
53
+ ip: @name)
54
+ end
55
+
56
+ def destroy
57
+ config_set('radius_server',
58
+ 'hosts',
59
+ state: 'no',
60
+ ip: @name)
61
+ end
62
+
63
+ def ==(other)
64
+ name == other.name
65
+ end
66
+
67
+ def auth_port
68
+ val = config_get('radius_server', 'auth-port', @name)
69
+ val = val[0].to_i unless val.nil?
70
+ val
71
+ end
72
+
73
+ def default_auth_port
74
+ val = config_get_default('radius_server', 'auth-port')
75
+ val
76
+ end
77
+
78
+ def auth_port=(val)
79
+ unless val.nil?
80
+ fail ArgumentError, 'auth_port must be an Integer' \
81
+ unless val.is_a?(Integer)
82
+ end
83
+
84
+ if val.nil? && !auth_port.nil?
85
+ config_set('radius_server',
86
+ 'auth-port',
87
+ state: 'no',
88
+ ip: @name,
89
+ port: auth_port)
90
+ else
91
+ config_set('radius_server',
92
+ 'auth-port',
93
+ state: '',
94
+ ip: @name,
95
+ port: val)
96
+ end
97
+ end
98
+
99
+ def acct_port
100
+ val = config_get('radius_server', 'acct-port', @name)
101
+ val = val[0].to_i unless val.nil?
102
+ val
103
+ end
104
+
105
+ def default_acct_port
106
+ val = config_get_default('radius_server', 'acct-port')
107
+ val
108
+ end
109
+
110
+ def acct_port=(val)
111
+ unless val.nil?
112
+ fail ArgumentError, 'acct_port must be an Integer' \
113
+ unless val.is_a?(Integer)
114
+ end
115
+
116
+ if val.nil? && !acct_port.nil?
117
+ config_set('radius_server',
118
+ 'acct-port',
119
+ state: 'no',
120
+ ip: @name,
121
+ port: acct_port)
122
+ else
123
+ config_set('radius_server',
124
+ 'acct-port',
125
+ state: '',
126
+ ip: @name,
127
+ port: val)
128
+ end
129
+ end
130
+
131
+ def timeout
132
+ val = config_get('radius_server', 'timeout', @name)
133
+ val = val[0].to_i unless val.nil?
134
+ val
135
+ end
136
+
137
+ def default_timeout
138
+ val = config_get_default('radius_server', 'timeout')
139
+ val
140
+ end
141
+
142
+ def timeout=(val)
143
+ unless val.nil?
144
+ fail ArgumentError, 'timeout must be an Integer' \
145
+ unless val.is_a?(Integer)
146
+ end
147
+
148
+ if val.nil? && !timeout.nil?
149
+ config_set('radius_server',
150
+ 'timeout',
151
+ state: 'no',
152
+ ip: @name,
153
+ timeout: timeout)
154
+ else
155
+ config_set('radius_server',
156
+ 'timeout',
157
+ state: '',
158
+ ip: @name,
159
+ timeout: val)
160
+ end
161
+ end
162
+
163
+ def retransmit_count
164
+ val = config_get('radius_server', 'retransmit', @name)
165
+ val = val[0].to_i unless val.nil?
166
+ val
167
+ end
168
+
169
+ def default_retransmit_count
170
+ val = config_get_default('radius_server', 'retransmit')
171
+ val
172
+ end
173
+
174
+ def retransmit_count=(val)
175
+ unless val.nil?
176
+ fail ArgumentError, 'retransmit_count must be an Integer' \
177
+ unless val.is_a?(Integer)
178
+ end
179
+
180
+ if val.nil? && !retransmit_count.nil?
181
+ config_set('radius_server',
182
+ 'retransmit',
183
+ state: 'no',
184
+ ip: @name,
185
+ count: retransmit_count)
186
+ else
187
+ config_set('radius_server',
188
+ 'retransmit',
189
+ state: '',
190
+ ip: @name,
191
+ count: val)
192
+ end
193
+ end
194
+
195
+ def accounting
196
+ val = config_get('radius_server', 'accounting', @name)
197
+ if val.nil?
198
+ false
199
+ else
200
+ val[0].eql?('accounting') ? true : false
201
+ end
202
+ end
203
+
204
+ def default_accounting
205
+ val = config_get_default('radius_server', 'accounting')
206
+ val
207
+ end
208
+
209
+ def accounting=(val)
210
+ if !val
211
+ config_set('radius_server',
212
+ 'accounting',
213
+ state: 'no',
214
+ ip: @name)
215
+ else
216
+ config_set('radius_server',
217
+ 'accounting',
218
+ state: '',
219
+ ip: @name)
220
+ end
221
+ end
222
+
223
+ def authentication
224
+ val = config_get('radius_server', 'authentication', @name)
225
+ if val.nil?
226
+ false
227
+ else
228
+ val[0].eql?('authentication') ? true : false
229
+ end
230
+ end
231
+
232
+ def default_authentication
233
+ val = config_get_default('radius_server', 'authentication')
234
+ val
235
+ end
236
+
237
+ def authentication=(val)
238
+ if !val
239
+ config_set('radius_server',
240
+ 'authentication',
241
+ state: 'no',
242
+ ip: @name)
243
+ else
244
+ config_set('radius_server',
245
+ 'authentication',
246
+ state: '',
247
+ ip: @name)
248
+ end
249
+ end
250
+
251
+ def key_format
252
+ val = config_get('radius_server', 'key_format', @name)
253
+ val = val[0].to_i unless val.nil?
254
+ val
255
+ end
256
+
257
+ def key
258
+ val = config_get('radius_server', 'key', @name)
259
+ val = val[0] unless val.nil?
260
+ val
261
+ end
262
+
263
+ def key_set(value, format)
264
+ unless value.nil?
265
+ fail ArgumentError, 'value must be a String' \
266
+ unless value.is_a?(String)
267
+ end
268
+
269
+ unless format.nil?
270
+ fail ArgumentError, 'format must be an Integer' \
271
+ unless format.is_a?(Integer)
272
+ end
273
+
274
+ if value.nil? && !key.nil?
275
+ config_set('radius_server',
276
+ 'key',
277
+ state: 'no',
278
+ ip: @name,
279
+ key: "#{key_format} #{key}")
280
+ elsif !format.nil?
281
+ config_set('radius_server',
282
+ 'key',
283
+ state: '',
284
+ ip: @name,
285
+ key: "#{format} #{value}")
286
+ else
287
+ config_set('radius_server',
288
+ 'key',
289
+ state: '',
290
+ ip: @name,
291
+ key: "#{value}")
292
+ end
293
+ end
294
+ end # class
295
+ end # module
@@ -1,6 +1,3 @@
1
- #
2
- # NXAPI implementation of RouterOspf class
3
- #
4
1
  # November 2014, Chris Van Heuveln
5
2
  #
6
3
  # Copyright (c) 2014-2015 Cisco and/or its affiliates.
@@ -17,80 +14,79 @@
17
14
  # See the License for the specific language governing permissions and
18
15
  # limitations under the License.
19
16
 
20
- require File.join(File.dirname(__FILE__), 'node')
17
+ require_relative 'node_util'
21
18
 
22
19
  module Cisco
23
- class RouterOspf
24
- attr_reader :name
25
-
26
- @@node = Cisco::Node.instance
20
+ # RouterOspf - node utility class for process-level OSPF config management
21
+ class RouterOspf < NodeUtil
22
+ attr_reader :name
27
23
 
28
- def initialize(name, instantiate=true)
29
- raise ArgumentError unless name.length > 0
30
- @name = name
24
+ def initialize(name, instantiate=true)
25
+ fail ArgumentError unless name.length > 0
26
+ @name = name
31
27
 
32
- create if instantiate
33
- end
28
+ create if instantiate
29
+ end
34
30
 
35
- # Create a hash of all router ospf instances
36
- def RouterOspf.routers
37
- ospf_ids = @@node.config_get("ospf", "router")
38
- return {} if ospf_ids.nil?
31
+ # Create a hash of all router ospf instances
32
+ def self.routers
33
+ ospf_ids = config_get('ospf', 'router')
34
+ return {} if ospf_ids.nil?
39
35
 
40
- hash = {}
41
- ospf_ids.each do |name|
42
- hash[name] = RouterOspf.new(name, false)
36
+ hash = {}
37
+ ospf_ids.each do |name|
38
+ hash[name] = RouterOspf.new(name, false)
39
+ end
40
+ return hash
41
+ rescue Cisco::CliError => e
42
+ # cmd will syntax reject when feature is not enabled
43
+ raise unless e.clierror =~ /Syntax error/
44
+ return {}
43
45
  end
44
- return hash
45
- rescue Cisco::CliError => e
46
- # cmd will syntax reject when feature is not enabled
47
- raise unless e.clierror =~ /Syntax error/
48
- return {}
49
- end
50
-
51
- def RouterOspf.enabled
52
- feat = @@node.config_get("ospf", "feature")
53
- return (!feat.nil? and !feat.empty?)
54
- rescue Cisco::CliError => e
55
- # cmd will syntax reject when feature is not enabled
56
- raise unless e.clierror =~ /Syntax error/
57
- return false
58
- end
59
46
 
60
- def RouterOspf.enable(state="")
61
- @@node.config_set("ospf", "feature", state)
62
- end
47
+ def self.enabled
48
+ feat = config_get('ospf', 'feature')
49
+ return (!feat.nil? && !feat.empty?)
50
+ rescue Cisco::CliError => e
51
+ # cmd will syntax reject when feature is not enabled
52
+ raise unless e.clierror =~ /Syntax error/
53
+ return false
54
+ end
63
55
 
64
- def ospf_router(name, state="")
65
- @@node.config_set("ospf", "router", state, name)
66
- end
56
+ def self.enable(state='')
57
+ config_set('ospf', 'feature', state)
58
+ end
67
59
 
68
- def enable_create_router_ospf(name)
69
- RouterOspf.enable
70
- ospf_router(name)
71
- end
60
+ def ospf_router(name, state='')
61
+ config_set('ospf', 'router', state, name)
62
+ end
72
63
 
73
- # Create one router ospf instance
74
- def create
75
- if RouterOspf.enabled
64
+ def enable_create_router_ospf(name)
65
+ RouterOspf.enable
76
66
  ospf_router(name)
77
- else
78
- enable_create_router_ospf(name)
79
67
  end
80
- end
81
68
 
82
- # Destroy one router ospf instance
83
- def destroy
84
- ospf_ids = @@node.config_get("ospf", "router")
85
- return if ospf_ids.nil?
86
- if ospf_ids.size == 1
87
- RouterOspf.enable("no")
88
- else
89
- ospf_router(name, "no")
69
+ # Create one router ospf instance
70
+ def create
71
+ if RouterOspf.enabled
72
+ ospf_router(name)
73
+ else
74
+ enable_create_router_ospf(name)
75
+ end
76
+ end
77
+
78
+ # Destroy one router ospf instance
79
+ def destroy
80
+ ospf_ids = config_get('ospf', 'router')
81
+ return if ospf_ids.nil?
82
+ if ospf_ids.size == 1
83
+ RouterOspf.enable('no')
84
+ else
85
+ ospf_router(name, 'no')
86
+ end
87
+ rescue Cisco::CliError => e
88
+ # cmd will syntax reject when feature is not enabled
89
+ raise unless e.clierror =~ /Syntax error/
90
90
  end
91
- rescue Cisco::CliError => e
92
- # cmd will syntax reject when feature is not enabled
93
- raise unless e.clierror =~ /Syntax error/
94
91
  end
95
92
  end
96
- end