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
@@ -322,12 +322,4 @@ vtp:
322
322
 
323
323
  ## Style Guide
324
324
 
325
- Please keep all feature names in alphabetical order, and all options under a
326
- feature in alphabetical order as well. As YAML permits duplicate entries
327
- (in which case the last entry overrides any earlier entries), keeping a
328
- consistent order helps to prevent accidentally introducing such duplication.
329
-
330
- Note that `~` is the YAML syntax that corresponds to Ruby's `nil`.
331
-
332
- Use the key-value wildcarding style wherever possible, as it's more flexible
333
- than the printf-style wildcarding.
325
+ Please see [YAML Best Practices](../../docs/README-develop-best-practices.md#ydbp).
@@ -0,0 +1,664 @@
1
+ # June 2015, Michael G Wiebe
2
+ #
3
+ # Copyright (c) 2015 Cisco and/or its affiliates.
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require_relative 'node_util'
18
+
19
+ module Cisco
20
+ # RouterBgp - node utility class for BGP general config management
21
+ class RouterBgp < NodeUtil
22
+ attr_reader :asnum, :vrf
23
+
24
+ def initialize(asnum, vrf='default', instantiate=true)
25
+ fail ArgumentError unless vrf.is_a? String
26
+ fail ArgumentError unless vrf.length > 0
27
+ @asnum = RouterBgp.process_asnum(asnum)
28
+ @vrf = vrf
29
+ if @vrf == 'default'
30
+ @get_args = @set_args = { asnum: @asnum }
31
+ else
32
+ @get_args = @set_args = { asnum: @asnum, vrf: @vrf }
33
+ end
34
+ create if instantiate
35
+ end
36
+
37
+ def self.process_asnum(asnum)
38
+ err_msg = "BGP asnum must be either a 'String' or an" \
39
+ " 'Integer' object"
40
+ fail ArgumentError, err_msg unless asnum.is_a?(Integer) ||
41
+ asnum.is_a?(String)
42
+ if asnum.is_a? String
43
+ # Match ASDOT '1.5' or ASPLAIN '55' strings
44
+ fail ArgumentError unless /^(\d+|\d+\.\d+)$/.match(asnum)
45
+ asnum = RouterBgp.dot_to_big(asnum) if /\d+\.\d+/.match(asnum)
46
+ end
47
+ asnum.to_i
48
+ end
49
+
50
+ # Create a hash of all router bgp default and non-default
51
+ # vrf instances
52
+ def self.routers
53
+ bgp_ids = config_get('bgp', 'router')
54
+ return {} if bgp_ids.nil?
55
+
56
+ hash_final = {}
57
+ # TODO: Remove loop if only single ASN supported by RFC?
58
+ bgp_ids.each do |asnum|
59
+ asnum = asnum.to_i unless /\d+.\d+/.match(asnum)
60
+ hash_tmp = { asnum =>
61
+ { 'default' => RouterBgp.new(asnum, 'default', false) } }
62
+ vrf_ids = config_get('bgp', 'vrf', asnum: asnum)
63
+ unless vrf_ids.nil?
64
+ vrf_ids.each do |vrf|
65
+ hash_tmp[asnum][vrf] = RouterBgp.new(asnum, vrf, false)
66
+ end
67
+ end
68
+ hash_final.merge!(hash_tmp)
69
+ end
70
+ return hash_final
71
+ rescue Cisco::CliError => e
72
+ # cmd will syntax reject when feature is not enabled
73
+ raise unless e.clierror =~ /Syntax error/
74
+ return {}
75
+ end
76
+
77
+ def self.enabled
78
+ feat = config_get('bgp', 'feature')
79
+ return !(feat.nil? || feat.empty?)
80
+ rescue Cisco::CliError => e
81
+ # cmd will syntax reject when feature is not enabled
82
+ raise unless e.clierror =~ /Syntax error/
83
+ return false
84
+ end
85
+
86
+ def self.enable(state='')
87
+ config_set('bgp', 'feature', state: state)
88
+ end
89
+
90
+ # Convert BGP ASN ASDOT+ to ASPLAIN
91
+ def self.dot_to_big(dot_str)
92
+ fail ArgumentError unless dot_str.is_a? String
93
+ return dot_str unless /\d+\.\d+/.match(dot_str)
94
+ mask = 0b1111111111111111
95
+ high = dot_str.to_i
96
+ low = 0
97
+ low_match = dot_str.match(/\.(\d+)/)
98
+ low = low_match[1].to_i if low_match
99
+ high_bits = (mask & high) << 16
100
+ low_bits = mask & low
101
+ high_bits + low_bits
102
+ end
103
+
104
+ def router_bgp(asnum, vrf, state='')
105
+ # Only one bgp autonomous system number is allowed
106
+ # Raise an error if one is already configured that
107
+ # differs from the one being created.
108
+ configured = config_get('bgp', 'router')
109
+ if !configured.nil? && configured.first.to_s != asnum.to_s
110
+ fail %(
111
+ Changing the BGP Autonomous System Number is not allowed.
112
+ Current BGP asn: #{configured.first}
113
+ Attempted change to asn: #{asnum})
114
+ end
115
+ @set_args[:state] = state
116
+ if vrf == 'default'
117
+ config_set('bgp', 'router', @set_args)
118
+ else
119
+ config_set('bgp', 'vrf', @set_args)
120
+ end
121
+ set_args_keys_default
122
+ end
123
+
124
+ def enable_create_router_bgp(asnum, vrf)
125
+ RouterBgp.enable
126
+ router_bgp(asnum, vrf)
127
+ end
128
+
129
+ # Create one router bgp instance
130
+ def create
131
+ if RouterBgp.enabled
132
+ router_bgp(@asnum, @vrf)
133
+ else
134
+ enable_create_router_bgp(@asnum, @vrf)
135
+ end
136
+ end
137
+
138
+ # Destroy router bgp instance
139
+ def destroy
140
+ vrf_ids = config_get('bgp', 'vrf', asnum: @asnum)
141
+ vrf_ids = ['default'] if vrf_ids.nil?
142
+ if vrf_ids.size == 1 || @vrf == 'default'
143
+ RouterBgp.enable('no')
144
+ else
145
+ router_bgp(asnum, @vrf, 'no')
146
+ end
147
+ rescue Cisco::CliError => e
148
+ # cmd will syntax reject when feature is not enabled
149
+ raise unless e.clierror =~ /Syntax error/
150
+ end
151
+
152
+ # Helper method to delete @set_args hash keys
153
+ def set_args_keys_default
154
+ if @vrf == 'default'
155
+ @set_args = { asnum: @asnum }
156
+ else
157
+ @set_args = { asnum: @asnum, vrf: @vrf }
158
+ end
159
+ end
160
+
161
+ # Attributes:
162
+
163
+ # Bestpath Getters
164
+ def bestpath_always_compare_med
165
+ match = config_get('bgp', 'bestpath_always_compare_med', @get_args)
166
+ match.nil? ? default_bestpath_always_compare_med : true
167
+ end
168
+
169
+ def bestpath_aspath_multipath_relax
170
+ match = config_get('bgp', 'bestpath_aspath_multipath_relax', @get_args)
171
+ match.nil? ? default_bestpath_aspath_multipath_relax : true
172
+ end
173
+
174
+ def bestpath_compare_routerid
175
+ match = config_get('bgp', 'bestpath_compare_routerid', @get_args)
176
+ match.nil? ? default_bestpath_compare_routerid : true
177
+ end
178
+
179
+ def bestpath_cost_community_ignore
180
+ match = config_get('bgp', 'bestpath_cost_community_ignore', @get_args)
181
+ match.nil? ? default_bestpath_cost_community_ignore : true
182
+ end
183
+
184
+ def bestpath_med_confed
185
+ match = config_get('bgp', 'bestpath_med_confed', @get_args)
186
+ match.nil? ? default_bestpath_med_confed : true
187
+ end
188
+
189
+ def bestpath_med_missing_as_worst
190
+ match = config_get('bgp', 'bestpath_med_missing_as_worst', @get_args)
191
+ match.nil? ? default_bestpath_med_missing_as_worst : true
192
+ end
193
+
194
+ def bestpath_med_non_deterministic
195
+ match = config_get('bgp', 'bestpath_med_non_deterministic', @get_args)
196
+ match.nil? ? default_bestpath_med_non_deterministic : true
197
+ end
198
+
199
+ # Bestpath Setters
200
+ def bestpath_always_compare_med=(enable)
201
+ @set_args[:state] = (enable ? '' : 'no')
202
+ config_set('bgp', 'bestpath_always_compare_med', @set_args)
203
+ set_args_keys_default
204
+ end
205
+
206
+ def bestpath_aspath_multipath_relax=(enable)
207
+ @set_args[:state] = (enable ? '' : 'no')
208
+ config_set('bgp', 'bestpath_aspath_multipath_relax', @set_args)
209
+ set_args_keys_default
210
+ end
211
+
212
+ def bestpath_compare_routerid=(enable)
213
+ @set_args[:state] = (enable ? '' : 'no')
214
+ config_set('bgp', 'bestpath_compare_routerid', @set_args)
215
+ set_args_keys_default
216
+ end
217
+
218
+ def bestpath_cost_community_ignore=(enable)
219
+ @set_args[:state] = (enable ? '' : 'no')
220
+ config_set('bgp', 'bestpath_cost_community_ignore', @set_args)
221
+ set_args_keys_default
222
+ end
223
+
224
+ def bestpath_med_confed=(enable)
225
+ @set_args[:state] = (enable ? '' : 'no')
226
+ config_set('bgp', 'bestpath_med_confed', @set_args)
227
+ set_args_keys_default
228
+ end
229
+
230
+ def bestpath_med_missing_as_worst=(enable)
231
+ @set_args[:state] = (enable ? '' : 'no')
232
+ config_set('bgp', 'bestpath_med_missing_as_worst', @set_args)
233
+ set_args_keys_default
234
+ end
235
+
236
+ def bestpath_med_non_deterministic=(enable)
237
+ @set_args[:state] = (enable ? '' : 'no')
238
+ config_set('bgp', 'bestpath_med_non_deterministic', @set_args)
239
+ set_args_keys_default
240
+ end
241
+
242
+ # Bestpath Defaults
243
+ def default_bestpath_always_compare_med
244
+ config_get_default('bgp', 'bestpath_always_compare_med')
245
+ end
246
+
247
+ def default_bestpath_aspath_multipath_relax
248
+ config_get_default('bgp', 'bestpath_aspath_multipath_relax')
249
+ end
250
+
251
+ def default_bestpath_compare_routerid
252
+ config_get_default('bgp', 'bestpath_compare_routerid')
253
+ end
254
+
255
+ def default_bestpath_cost_community_ignore
256
+ config_get_default('bgp', 'bestpath_cost_community_ignore')
257
+ end
258
+
259
+ def default_bestpath_med_confed
260
+ config_get_default('bgp', 'bestpath_med_confed')
261
+ end
262
+
263
+ def default_bestpath_med_missing_as_worst
264
+ config_get_default('bgp', 'bestpath_med_missing_as_worst')
265
+ end
266
+
267
+ def default_bestpath_med_non_deterministic
268
+ config_get_default('bgp', 'bestpath_med_non_deterministic')
269
+ end
270
+
271
+ # Cluster Id (Getter/Setter/Default)
272
+ def cluster_id
273
+ match = config_get('bgp', 'cluster_id', @get_args)
274
+ match.nil? ? default_cluster_id : match.first
275
+ end
276
+
277
+ def cluster_id=(id)
278
+ # In order to remove a bgp cluster_id you cannot simply issue
279
+ # 'no bgp cluster-id'. IMO this should be possible because you
280
+ # can only configure a single bgp cluster-id.
281
+ #
282
+ # HACK: specify a dummy id when removing the feature.
283
+ dummy_id = 1
284
+ if id == default_cluster_id
285
+ @set_args[:state] = 'no'
286
+ @set_args[:id] = dummy_id
287
+ else
288
+ @set_args[:state] = ''
289
+ @set_args[:id] = id
290
+ end
291
+ config_set('bgp', 'cluster_id', @set_args)
292
+ set_args_keys_default
293
+ end
294
+
295
+ def default_cluster_id
296
+ config_get_default('bgp', 'cluster_id')
297
+ end
298
+
299
+ # Confederation Id (Getter/Setter/Default)
300
+ def confederation_id
301
+ match = config_get('bgp', 'confederation_id', @get_args)
302
+ match.nil? ? default_confederation_id : match.first
303
+ end
304
+
305
+ def confederation_id=(id)
306
+ # In order to remove a bgp confed id you cannot simply issue
307
+ # 'no bgp confederation id'. IMO this should be possible
308
+ # because you can only configure a single bgp confed id.
309
+ #
310
+ # HACK: specify a dummy id when removing the feature.
311
+ dummy_id = 1
312
+ if id == default_confederation_id
313
+ @set_args[:state] = 'no'
314
+ @set_args[:id] = dummy_id
315
+ else
316
+ @set_args[:state] = ''
317
+ @set_args[:id] = id
318
+ end
319
+ config_set('bgp', 'confederation_id', @set_args)
320
+ set_args_keys_default
321
+ end
322
+
323
+ def default_confederation_id
324
+ config_get_default('bgp', 'confederation_id')
325
+ end
326
+
327
+ # Enforce First As (Getter/Setter/Default)
328
+ def enforce_first_as
329
+ match = config_get('bgp', 'enforce_first_as', @get_args)
330
+ match.nil? ? false : true
331
+ end
332
+
333
+ def enforce_first_as=(enable)
334
+ @set_args[:state] = (enable ? '' : 'no')
335
+ config_set('bgp', 'enforce_first_as', @set_args)
336
+ set_args_keys_default
337
+ end
338
+
339
+ def default_enforce_first_as
340
+ config_get_default('bgp', 'enforce_first_as')
341
+ end
342
+
343
+ # Confederation Peers (Getter/Setter/Default)
344
+ def confederation_peers
345
+ match = config_get('bgp', 'confederation_peers', @get_args)
346
+ match.nil? ? default_confederation_peers : match.first
347
+ end
348
+
349
+ def confederation_peers_set(peers)
350
+ # The confederation peers command is additive so we first need to
351
+ # remove any existing peers.
352
+ unless confederation_peers.empty?
353
+ @set_args[:state] = 'no'
354
+ @set_args[:peer_list] = confederation_peers
355
+ config_set('bgp', 'confederation_peers', @set_args)
356
+ end
357
+ unless peers == default_confederation_peers
358
+ @set_args[:state] = ''
359
+ @set_args[:peer_list] = peers
360
+ config_set('bgp', 'confederation_peers', @set_args)
361
+ end
362
+ set_args_keys_default
363
+ end
364
+
365
+ def default_confederation_peers
366
+ config_get_default('bgp', 'confederation_peers')
367
+ end
368
+
369
+ # Graceful Restart Getters
370
+ def graceful_restart
371
+ match = config_get('bgp', 'graceful_restart', @get_args)
372
+ match.nil? ? false : true
373
+ end
374
+
375
+ def graceful_restart_timers_restart
376
+ match = config_get('bgp', 'graceful_restart_timers_restart', @get_args)
377
+ match.nil? ? default_graceful_restart_timers_restart : match.first.to_i
378
+ end
379
+
380
+ def graceful_restart_timers_stalepath_time
381
+ match = config_get('bgp', 'graceful_restart_timers_stalepath_time',
382
+ @get_args)
383
+ if match.nil?
384
+ default_graceful_restart_timers_stalepath_time
385
+ else
386
+ match.first.to_i
387
+ end
388
+ end
389
+
390
+ def graceful_restart_helper
391
+ match = config_get('bgp', 'graceful_restart_helper', @get_args)
392
+ match.nil? ? default_graceful_restart_helper : true
393
+ end
394
+
395
+ # Graceful Restart Setters
396
+ def graceful_restart=(enable)
397
+ @set_args[:state] = (enable ? '' : 'no')
398
+ config_set('bgp', 'graceful_restart', @set_args)
399
+ set_args_keys_default
400
+ end
401
+
402
+ def graceful_restart_timers_restart=(seconds)
403
+ if seconds == default_graceful_restart_timers_restart
404
+ @set_args[:state] = 'no'
405
+ @set_args[:seconds] = ''
406
+ else
407
+ @set_args[:state] = ''
408
+ @set_args[:seconds] = seconds
409
+ end
410
+ config_set('bgp', 'graceful_restart_timers_restart', @set_args)
411
+ set_args_keys_default
412
+ end
413
+
414
+ def graceful_restart_timers_stalepath_time=(seconds)
415
+ if seconds == default_graceful_restart_timers_stalepath_time
416
+ @set_args[:state] = 'no'
417
+ @set_args[:seconds] = ''
418
+ else
419
+ @set_args[:state] = ''
420
+ @set_args[:seconds] = seconds
421
+ end
422
+ config_set('bgp', 'graceful_restart_timers_stalepath_time', @set_args)
423
+ set_args_keys_default
424
+ end
425
+
426
+ def graceful_restart_helper=(enable)
427
+ @set_args[:state] = (enable ? '' : 'no')
428
+ config_set('bgp', 'graceful_restart_helper', @set_args)
429
+ set_args_keys_default
430
+ end
431
+
432
+ # Graceful Restart Defaults
433
+ def default_graceful_restart
434
+ config_get_default('bgp', 'graceful_restart')
435
+ end
436
+
437
+ def default_graceful_restart_timers_restart
438
+ config_get_default('bgp', 'graceful_restart_timers_restart')
439
+ end
440
+
441
+ def default_graceful_restart_timers_stalepath_time
442
+ config_get_default('bgp', 'graceful_restart_timers_stalepath_time')
443
+ end
444
+
445
+ def default_graceful_restart_helper
446
+ config_get_default('bgp', 'graceful_restart_helper')
447
+ end
448
+
449
+ # MaxAs Limit (Getter/Setter/Default)
450
+ def maxas_limit
451
+ match = config_get('bgp', 'maxas_limit', @get_args)
452
+ match.nil? ? default_maxas_limit : match.first.to_i
453
+ end
454
+
455
+ def maxas_limit=(limit)
456
+ if limit == default_maxas_limit
457
+ @set_args[:state] = 'no'
458
+ @set_args[:limit] = ''
459
+ else
460
+ @set_args[:state] = ''
461
+ @set_args[:limit] = limit
462
+ end
463
+ config_set('bgp', 'maxas_limit', @set_args)
464
+ set_args_keys_default
465
+ end
466
+
467
+ def default_maxas_limit
468
+ config_get_default('bgp', 'maxas_limit')
469
+ end
470
+
471
+ # Log Neighbor Changes (Getter/Setter/Default)
472
+ def log_neighbor_changes
473
+ match = config_get('bgp', 'log_neighbor_changes', @get_args)
474
+ match.nil? ? default_log_neighbor_changes : true
475
+ end
476
+
477
+ def log_neighbor_changes=(enable)
478
+ @set_args[:state] = (enable ? '' : 'no')
479
+ config_set('bgp', 'log_neighbor_changes', @set_args)
480
+ set_args_keys_default
481
+ end
482
+
483
+ def default_log_neighbor_changes
484
+ config_get_default('bgp', 'log_neighbor_changes')
485
+ end
486
+
487
+ # Neighbor fib down accelerate (Getter/Setter/Default)
488
+ def neighbor_fib_down_accelerate
489
+ match = config_get('bgp', 'neighbor_fib_down_accelerate', @get_args)
490
+ match.nil? ? default_neighbor_fib_down_accelerate : true
491
+ end
492
+
493
+ def neighbor_fib_down_accelerate=(enable)
494
+ @set_args[:state] = (enable ? '' : 'no')
495
+ config_set('bgp', 'neighbor_fib_down_accelerate', @set_args)
496
+ set_args_keys_default
497
+ end
498
+
499
+ def default_neighbor_fib_down_accelerate
500
+ config_get_default('bgp', 'neighbor_fib_down_accelerate')
501
+ end
502
+
503
+ # Reconnect Interval (Getter/Setter/Default)
504
+ def reconnect_interval
505
+ match = config_get('bgp', 'reconnect_interval', @get_args)
506
+ match.nil? ? default_reconnect_interval : match.first.to_i
507
+ end
508
+
509
+ def reconnect_interval=(seconds)
510
+ if seconds == default_reconnect_interval
511
+ @set_args[:state] = 'no'
512
+ @set_args[:seconds] = ''
513
+ else
514
+ @set_args[:state] = ''
515
+ @set_args[:seconds] = seconds
516
+ end
517
+ config_set('bgp', 'reconnect_interval', @set_args)
518
+ set_args_keys_default
519
+ end
520
+
521
+ def default_reconnect_interval
522
+ config_get_default('bgp', 'reconnect_interval')
523
+ end
524
+
525
+ # Router ID (Getter/Setter/Default)
526
+ def router_id
527
+ match = config_get('bgp', 'router_id', @get_args)
528
+ match.nil? ? default_router_id : match.first
529
+ end
530
+
531
+ def router_id=(id)
532
+ # In order to remove a bgp router-id you cannot simply issue
533
+ # 'no bgp router-id'. Dummy-id specified to work around this.
534
+ dummy_id = '1.2.3.4'
535
+ if id == default_router_id
536
+ @set_args[:state] = 'no'
537
+ @set_args[:id] = dummy_id
538
+ else
539
+ @set_args[:state] = ''
540
+ @set_args[:id] = id
541
+ end
542
+ config_set('bgp', 'router_id', @set_args)
543
+ set_args_keys_default
544
+ end
545
+
546
+ def default_router_id
547
+ config_get_default('bgp', 'router_id')
548
+ end
549
+
550
+ # Shutdown (Getter/Setter/Default)
551
+ def shutdown
552
+ match = config_get('bgp', 'shutdown', @asnum)
553
+ match.nil? ? default_shutdown : true
554
+ end
555
+
556
+ def shutdown=(enable)
557
+ @set_args[:state] = (enable ? '' : 'no')
558
+ config_set('bgp', 'shutdown', @set_args)
559
+ set_args_keys_default
560
+ end
561
+
562
+ def default_shutdown
563
+ config_get_default('bgp', 'shutdown')
564
+ end
565
+
566
+ # Supress Fib Pending (Getter/Setter/Default)
567
+ def suppress_fib_pending
568
+ match = config_get('bgp', 'suppress_fib_pending', @get_args)
569
+ match.nil? ? default_suppress_fib_pending : true
570
+ end
571
+
572
+ def suppress_fib_pending=(enable)
573
+ enable == true ? @set_args[:state] = '' : @set_args[:state] = 'no'
574
+ config_set('bgp', 'suppress_fib_pending', @set_args)
575
+ set_args_keys_default
576
+ end
577
+
578
+ def default_suppress_fib_pending
579
+ config_get_default('bgp', 'suppress_fib_pending')
580
+ end
581
+
582
+ # BGP Timers Getters
583
+ def timer_bgp_keepalive_hold
584
+ match = config_get('bgp', 'timer_bgp_keepalive_hold', @get_args)
585
+ match.nil? ? default_timer_bgp_keepalive_hold : match.first
586
+ end
587
+
588
+ def timer_bgp_keepalive
589
+ keepalive, _hold = timer_bgp_keepalive_hold
590
+ return default_timer_bgp_keepalive if keepalive.nil?
591
+ keepalive.to_i
592
+ end
593
+
594
+ def timer_bgp_holdtime
595
+ _keepalive, hold = timer_bgp_keepalive_hold
596
+ return default_timer_bgp_holdtime if hold.nil?
597
+ hold.to_i
598
+ end
599
+
600
+ def timer_bestpath_limit
601
+ match = config_get('bgp', 'timer_bestpath_limit', @get_args)
602
+ match.nil? ? default_timer_bestpath_limit : match.first.to_i
603
+ end
604
+
605
+ def timer_bestpath_limit_always
606
+ match = config_get('bgp', 'timer_bestpath_limit_always', @get_args)
607
+ match.nil? ? default_timer_bestpath_limit_always : true
608
+ end
609
+
610
+ # BGP Timers Setters
611
+ def timer_bgp_keepalive_hold_set(keepalive, hold)
612
+ if keepalive == default_timer_bgp_keepalive &&
613
+ hold == default_timer_bgp_holdtime
614
+ @set_args[:state] = 'no'
615
+ @set_args[:keepalive] = keepalive
616
+ @set_args[:hold] = hold
617
+ else
618
+ @set_args[:state] = ''
619
+ @set_args[:keepalive] = keepalive
620
+ @set_args[:hold] = hold
621
+ end
622
+ config_set('bgp', 'timer_bgp_keepalive_hold', @set_args)
623
+ set_args_keys_default
624
+ end
625
+
626
+ def timer_bestpath_limit_set(seconds, always=false)
627
+ if always
628
+ feature = 'timer_bestpath_limit_always'
629
+ else
630
+ feature = 'timer_bestpath_limit'
631
+ end
632
+ if seconds == default_timer_bestpath_limit
633
+ @set_args[:state] = 'no'
634
+ @set_args[:seconds] = ''
635
+ else
636
+ @set_args[:state] = ''
637
+ @set_args[:seconds] = seconds
638
+ end
639
+ config_set('bgp', feature, @set_args)
640
+ set_args_keys_default
641
+ end
642
+
643
+ # BGP Timers Defaults
644
+ def default_timer_bgp_keepalive_hold
645
+ ["#{default_timer_bgp_keepalive}", "#{default_timer_bgp_holdtime}"]
646
+ end
647
+
648
+ def default_timer_bgp_keepalive
649
+ config_get_default('bgp', 'timer_bgp_keepalive')
650
+ end
651
+
652
+ def default_timer_bgp_holdtime
653
+ config_get_default('bgp', 'timer_bgp_hold')
654
+ end
655
+
656
+ def default_timer_bestpath_limit
657
+ config_get_default('bgp', 'timer_bestpath_limit')
658
+ end
659
+
660
+ def default_timer_bestpath_limit_always
661
+ config_get_default('bgp', 'timer_bestpath_limit_always')
662
+ end
663
+ end
664
+ end