cisco_node_utils 1.0.1 → 1.1.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 (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