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,425 @@
1
+ # BGP neighbor provider class
2
+ #
3
+ # August 2015, Jie Yang
4
+ #
5
+ # Copyright (c) 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 'ipaddr'
20
+ require_relative 'cisco_cmn_utils'
21
+ require_relative 'node_util'
22
+ require_relative 'bgp'
23
+
24
+ module Cisco
25
+ # RouterBgpNeighbor - node utility class for BGP neighbor configs
26
+ class RouterBgpNeighbor < NodeUtil
27
+ attr_reader :nbr, :vrf, :asn
28
+
29
+ def initialize(asn, vrf, nbr, instantiate=true)
30
+ fail TypeError unless nbr.is_a?(String)
31
+ # for IP/prefix format, such as "1.1.1.1/24" or "2000:123:38::34/64",
32
+ # we need to mask the address using prefix length, so that it becomes
33
+ # something like "1.1.1.0/24" or "2000:123:38::/64"
34
+ @nbr = Utils.process_network_mask(nbr)
35
+ @asn = asn
36
+ @vrf = vrf
37
+ @get_args = @set_args = { asnum: @asn, nbr: @nbr }
38
+ @get_args[:vrf] = @set_args[:vrf] = vrf if vrf != 'default'
39
+
40
+ create if instantiate
41
+ end
42
+
43
+ def self.neighbors
44
+ hash = {}
45
+ RouterBgp.routers.each do |asn, vrf|
46
+ hash[asn] = {}
47
+ vrf.each_key do |vrf_id|
48
+ get_args = { asnum: asn }
49
+ get_args[:vrf] = vrf_id unless vrf_id == 'default'
50
+ neighbor_list = config_get('bgp_neighbor', 'all_neighbors', get_args)
51
+ next if neighbor_list.nil?
52
+
53
+ hash[asn][vrf_id] = {}
54
+ neighbor_list.each do |nbr|
55
+ hash[asn][vrf_id][nbr] = RouterBgpNeighbor.new(asn, vrf_id,
56
+ nbr, false)
57
+ end
58
+ end
59
+ end
60
+ hash
61
+ rescue Cisco::CliError => e
62
+ # Raise the error unless the error message contains "Syntax error", which
63
+ # means the error was caused by feature is not enabled.
64
+ raise unless e.clierror =~ /Syntax error/
65
+ return {}
66
+ end
67
+
68
+ def create
69
+ set_args_keys(state: '')
70
+ config_set('bgp', 'create_destroy_neighbor', @set_args)
71
+ end
72
+
73
+ def destroy
74
+ set_args_keys(state: 'no')
75
+ config_set('bgp', 'create_destroy_neighbor', @set_args)
76
+ end
77
+
78
+ def set_args_keys_default
79
+ keys = { asnum: @asn, nbr: @nbr }
80
+ keys[:vrf] = @vrf unless @vrf == 'default'
81
+ @set_args = keys
82
+ end
83
+
84
+ def set_args_keys(hash={}) # rubocop:disable Style/AccessorMethodName
85
+ set_args_keys_default
86
+ @set_args = @set_args.merge!(hash) unless hash.empty?
87
+ end
88
+
89
+ def description=(desc)
90
+ fail TypeError unless desc.is_a?(String)
91
+ desc.strip!
92
+ set_args_keys(state: desc.empty? ? 'no' : '',
93
+ desc: desc)
94
+ config_set('bgp_neighbor', 'description', @set_args)
95
+ end
96
+
97
+ def description
98
+ desc = config_get('bgp_neighbor', 'description', @get_args)
99
+ return '' if desc.nil?
100
+ desc.shift.strip
101
+ end
102
+
103
+ def default_description
104
+ config_get_default('bgp_neighbor', 'description')
105
+ end
106
+
107
+ def connected_check=(val)
108
+ # the cli is "disable-connected-check", therefore when val is true, we
109
+ # need to set set state to "no"
110
+ set_args_keys(state: (val) ? 'no' : '')
111
+ config_set('bgp_neighbor', 'connected_check', @set_args)
112
+ end
113
+
114
+ def connected_check
115
+ result = config_get('bgp_neighbor', 'connected_check', @get_args)
116
+ result ? false : true
117
+ end
118
+
119
+ def default_connected_check
120
+ config_get_default('bgp_neighbor', 'connected_check')
121
+ end
122
+
123
+ def capability_negotiation=(val)
124
+ # the cli is "dont-capability-negotiate". Therefore when val is true, we
125
+ # need to set state to "no"
126
+ set_args_keys(state: (val) ? 'no' : '')
127
+ config_set('bgp_neighbor', 'capability_negotiation', @set_args)
128
+ end
129
+
130
+ def capability_negotiation
131
+ result = config_get('bgp_neighbor', 'capability_negotiation', @get_args)
132
+ result ? false : true
133
+ end
134
+
135
+ def default_capability_negotiation
136
+ config_get_default('bgp_neighbor', 'capability_negotiation')
137
+ end
138
+
139
+ def dynamic_capability=(val)
140
+ set_args_keys(state: (val) ? '' : 'no')
141
+ config_set('bgp_neighbor', 'dynamic_capability', @set_args)
142
+ end
143
+
144
+ def dynamic_capability
145
+ result = config_get('bgp_neighbor', 'dynamic_capability', @get_args)
146
+ result ? true : false
147
+ end
148
+
149
+ def default_dynamic_capability
150
+ config_get_default('bgp_neighbor', 'dynamic_capability')
151
+ end
152
+
153
+ def ebgp_multihop=(ttl)
154
+ set_args_keys(state: (ttl == default_ebgp_multihop) ? 'no' : '',
155
+ ttl: (ttl == default_ebgp_multihop) ? '' : ttl)
156
+ config_set('bgp_neighbor', 'ebgp_multihop', @set_args)
157
+ end
158
+
159
+ def ebgp_multihop
160
+ result = config_get('bgp_neighbor', 'ebgp_multihop', @get_args)
161
+ result.nil? ? default_ebgp_multihop : result.first.to_i
162
+ end
163
+
164
+ def default_ebgp_multihop
165
+ config_get_default('bgp_neighbor', 'ebgp_multihop')
166
+ end
167
+
168
+ def local_as=(val)
169
+ asnum = RouterBgp.process_asnum(val)
170
+ if asnum == default_local_as
171
+ set_args_keys(state: 'no', local_as: '')
172
+ else
173
+ set_args_keys(state: '', local_as: val)
174
+ end
175
+ config_set('bgp_neighbor', 'local_as', @set_args)
176
+ end
177
+
178
+ def local_as
179
+ result = config_get('bgp_neighbor', 'local_as', @get_args)
180
+ return default_local_as if result.nil?
181
+ return result.first.to_i unless /\d+\.\d+$/.match(result.first)
182
+ result.first
183
+ end
184
+
185
+ def default_local_as
186
+ config_get_default('bgp_neighbor', 'local_as')
187
+ end
188
+
189
+ def log_neighbor_changes=(val)
190
+ val = val.to_sym
191
+ if val == default_log_neighbor_changes
192
+ set_args_keys(state: 'no', disable: '')
193
+ else
194
+ set_args_keys(state: '',
195
+ disable: (val == :enable) ? '' : 'disable')
196
+ end
197
+ config_set('bgp_neighbor', 'log_neighbor_changes', @set_args)
198
+ end
199
+
200
+ def log_neighbor_changes
201
+ result = config_get('bgp_neighbor', 'log_neighbor_changes', @get_args)
202
+ return default_log_neighbor_changes if result.nil?
203
+ return :disable if /disable/.match(result.first)
204
+ :enable
205
+ end
206
+
207
+ def default_log_neighbor_changes
208
+ result = config_get_default('bgp_neighbor', 'log_neighbor_changes')
209
+ result.to_sym
210
+ end
211
+
212
+ def low_memory_exempt=(val)
213
+ set_args_keys(state: (val) ? '' : 'no')
214
+ config_set('bgp_neighbor', 'low_memory_exempt', @set_args)
215
+ end
216
+
217
+ def low_memory_exempt
218
+ result = config_get('bgp_neighbor', 'low_memory_exempt', @get_args)
219
+ result ? true : false
220
+ end
221
+
222
+ def default_low_memory_exempt
223
+ config_get_default('bgp_neighbor', 'low_memory_exempt')
224
+ end
225
+
226
+ def maximum_peers=(val)
227
+ set_args_keys(state: (val == default_maximum_peers) ? 'no' : '',
228
+ num: (val == default_maximum_peers) ? '' : val)
229
+ config_set('bgp_neighbor', 'maximum_peers', @set_args)
230
+ end
231
+
232
+ def maximum_peers
233
+ result = config_get('bgp_neighbor', 'maximum_peers', @get_args)
234
+ result.nil? ? default_maximum_peers : result.first.to_i
235
+ end
236
+
237
+ def default_maximum_peers
238
+ config_get_default('bgp_neighbor', 'maximum_peers')
239
+ end
240
+
241
+ def password_set(val, type=nil)
242
+ val = val.to_s
243
+ if val.strip.empty?
244
+ set_args_keys(state: 'no', type: '', passwd: '')
245
+ elsif type.nil?
246
+ set_args_keys(state: '',
247
+ type: Encryption.symbol_to_cli(default_password_type),
248
+ passwd: val.to_s)
249
+ else
250
+ set_args_keys(state: '',
251
+ type: Encryption.symbol_to_cli(type),
252
+ passwd: val.to_s)
253
+ end
254
+ config_set('bgp_neighbor', 'password', @set_args)
255
+ end
256
+
257
+ def password
258
+ result = config_get('bgp_neighbor', 'password', @get_args)
259
+ result.nil? ? '' : result.first.to_s
260
+ end
261
+
262
+ def default_password
263
+ config_get_default('bgp_neighbor', 'password')
264
+ end
265
+
266
+ def password_type
267
+ result = config_get('bgp_neighbor', 'password_type', @get_args)
268
+ if result.nil?
269
+ default_password_type
270
+ else
271
+ Encryption.cli_to_symbol(result.first.to_i)
272
+ end
273
+ end
274
+
275
+ def default_password_type
276
+ result = config_get_default('bgp_neighbor', 'password_type')
277
+ Encryption.cli_to_symbol(result)
278
+ end
279
+
280
+ def remote_as=(val)
281
+ asnum = RouterBgp.process_asnum(val)
282
+ if asnum == default_remote_as
283
+ set_args_keys(state: 'no', remote_as: '')
284
+ else
285
+ set_args_keys(state: '', remote_as: val)
286
+ end
287
+ config_set('bgp_neighbor', 'remote_as', @set_args)
288
+ end
289
+
290
+ def remote_as
291
+ result = config_get('bgp_neighbor', 'remote_as', @get_args)
292
+ return default_remote_as if result.nil?
293
+ return result.first.to_i unless /\d+\.\d+$/.match(result.first)
294
+ result.first
295
+ end
296
+
297
+ def default_remote_as
298
+ config_get_default('bgp_neighbor', 'remote_as')
299
+ end
300
+
301
+ def remove_private_as=(val)
302
+ val = val.to_sym
303
+ if val == default_remove_private_as
304
+ set_args_keys(state: 'no', option: '')
305
+ else
306
+ set_args_keys(state: '',
307
+ option: (val == :enable) ? '' : val.to_s)
308
+ end
309
+ config_set('bgp_neighbor', 'remove_private_as', @set_args)
310
+ end
311
+
312
+ def remove_private_as
313
+ result = config_get('bgp_neighbor', 'remove_private_as', @get_args)
314
+ return default_remove_private_as if result.nil?
315
+ result.first.nil? ? :enable : result.first.to_sym
316
+ end
317
+
318
+ def default_remove_private_as
319
+ result = config_get_default('bgp_neighbor', 'remove_private_as')
320
+ result.to_sym
321
+ end
322
+
323
+ def shutdown=(val)
324
+ set_args_keys(state: (val) ? '' : 'no')
325
+ config_set('bgp_neighbor', 'shutdown', @set_args)
326
+ end
327
+
328
+ def shutdown
329
+ result = config_get('bgp_neighbor', 'shutdown', @get_args)
330
+ result ? true : false
331
+ end
332
+
333
+ def default_shutdown
334
+ config_get_default('bgp_neighbor', 'shutdown')
335
+ end
336
+
337
+ def suppress_4_byte_as=(val)
338
+ set_args_keys(state: (val) ? '' : 'no')
339
+ config_set('bgp_neighbor', 'suppress_4_byte_as', @set_args)
340
+ end
341
+
342
+ def suppress_4_byte_as
343
+ result = config_get('bgp_neighbor', 'suppress_4_byte_as', @get_args)
344
+ result ? true : false
345
+ end
346
+
347
+ def default_suppress_4_byte_as
348
+ config_get_default('bgp_neighbor', 'suppress_4_byte_as')
349
+ end
350
+
351
+ def timers_set(keepalive, hold)
352
+ if keepalive == default_timers_keepalive &&
353
+ hold == default_timers_holdtime
354
+ set_args_keys(state: 'no', keepalive: timers_keepalive,
355
+ hold: timers_holdtime)
356
+ else
357
+ set_args_keys(state: '', keepalive: keepalive,
358
+ hold: hold)
359
+ end
360
+ config_set('bgp_neighbor', 'timers_keepalive_hold', @set_args)
361
+ end
362
+
363
+ def timers_keepalive_hold
364
+ match = config_get('bgp_neighbor', 'timers_keepalive_hold', @get_args)
365
+ match.nil? ? default_timers_keepalive_hold : match.first
366
+ end
367
+
368
+ def timers_keepalive
369
+ keepalive, _hold = timers_keepalive_hold
370
+ return default_timers_keepalive if keepalive.nil?
371
+ keepalive.to_i
372
+ end
373
+
374
+ def timers_holdtime
375
+ _keepalive, hold = timers_keepalive_hold
376
+ return default_timers_holdtime if hold.nil?
377
+ hold.to_i
378
+ end
379
+
380
+ def default_timers_keepalive
381
+ config_get_default('bgp_neighbor', 'timers_keepalive')
382
+ end
383
+
384
+ def default_timers_holdtime
385
+ config_get_default('bgp_neighbor', 'timers_holdtime')
386
+ end
387
+
388
+ def default_timers_keepalive_hold
389
+ ["#{default_timers_keepalive}", "#{default_timers_holdtime}"]
390
+ end
391
+
392
+ def transport_passive_only=(val)
393
+ set_args_keys(state: (val) ? '' : 'no')
394
+ config_set('bgp_neighbor', 'transport_passive_only', @set_args)
395
+ end
396
+
397
+ def transport_passive_only
398
+ result = config_get('bgp_neighbor', 'transport_passive_only', @get_args)
399
+ result ? true : false
400
+ end
401
+
402
+ def default_transport_passive_only
403
+ config_get_default('bgp_neighbor', 'transport_passive_only')
404
+ end
405
+
406
+ def update_source=(val)
407
+ if val.strip == default_update_source
408
+ set_args_keys(state: 'no', interface: update_source)
409
+ else
410
+ set_args_keys(state: '', interface: val)
411
+ end
412
+ config_set('bgp_neighbor', 'update_source', @set_args)
413
+ end
414
+
415
+ def update_source
416
+ result = config_get('bgp_neighbor', 'update_source', @get_args)
417
+ return default_update_source if result.nil? || result.first.nil?
418
+ result.first.downcase.strip
419
+ end
420
+
421
+ def default_update_source
422
+ config_get_default('bgp_neighbor', 'update_source')
423
+ end
424
+ end # class
425
+ end # module
@@ -0,0 +1,709 @@
1
+ #
2
+ # NXAPI implementation of RouterBgpNeighborAF class
3
+ #
4
+ # August 2015 Chris Van Heuveln
5
+ #
6
+ # Copyright (c) 2015 Cisco and/or its affiliates.
7
+ #
8
+ # Licensed under the Apache License, Version 2.0 (the "License");
9
+ # you may not use this file except in compliance with the License.
10
+ # You may obtain a copy of the License at
11
+ #
12
+ # http://www.apache.org/licenses/LICENSE-2.0
13
+ #
14
+ # Unless required by applicable law or agreed to in writing, software
15
+ # distributed under the License is distributed on an "AS IS" BASIS,
16
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ # See the License for the specific language governing permissions and
18
+ # limitations under the License.
19
+
20
+ require_relative 'cisco_cmn_utils'
21
+ require_relative 'node_util'
22
+ require_relative 'bgp'
23
+
24
+ module Cisco
25
+ # RouterBgpNeighborAF - node utility class for BGP per-neighbor, per-AF config
26
+ class RouterBgpNeighborAF < NodeUtil
27
+ def initialize(asn, vrf, nbr, af, instantiate=true)
28
+ validate_args(asn, vrf, nbr, af)
29
+ create if instantiate
30
+ end
31
+
32
+ def self.afs
33
+ af_hash = {}
34
+ RouterBgp.routers.each do |asn, vrfs|
35
+ af_hash[asn] = {}
36
+
37
+ vrfs.keys.each do |vrf|
38
+ af_hash[asn][vrf] = {}
39
+ get_args = { asnum: asn }
40
+ get_args[:vrf] = vrf unless (vrf == 'default')
41
+
42
+ nbrs = config_get('bgp_neighbor', 'all_neighbors', get_args)
43
+ next if nbrs.nil?
44
+ nbrs.each do |nbr|
45
+ af_hash[asn][vrf][nbr] = {}
46
+ get_args[:nbr] = nbr
47
+ afs = config_get('bgp_neighbor_af', 'all_afs', get_args)
48
+
49
+ next if afs.nil?
50
+ afs.each do |af|
51
+ af_hash[asn][vrf][nbr][af] =
52
+ RouterBgpNeighborAF.new(asn, vrf, nbr, af, false)
53
+ end
54
+ end
55
+ end
56
+ end
57
+ af_hash
58
+ rescue Cisco::CliError => e
59
+ # cmd will syntax reject when feature is not enabled
60
+ raise unless e.clierror =~ /Syntax error/
61
+ return {}
62
+ end
63
+
64
+ def validate_args(asn, vrf, nbr, af)
65
+ asn = RouterBgp.process_asnum(asn)
66
+ fail ArgumentError unless
67
+ vrf.is_a?(String) && (vrf.length > 0)
68
+ fail ArgumentError unless
69
+ nbr.is_a?(String) && (nbr.length > 0)
70
+ fail ArgumentError, "'af' must be an array specifying afi and safi" unless
71
+ af.is_a?(Array) || af.length == 2
72
+
73
+ nbr = Utils.process_network_mask(nbr)
74
+ @asn = asn
75
+ @vrf = vrf
76
+ @nbr = nbr
77
+ @afi, @safi = af
78
+ set_args_keys_default
79
+ end
80
+
81
+ def set_args_keys_default
82
+ keys = { asnum: @asn, nbr: @nbr, afi: @afi, safi: @safi }
83
+ keys[:vrf] = @vrf unless @vrf == 'default'
84
+ @get_args = @set_args = keys
85
+ end
86
+
87
+ # rubocop:disable Style/AccessorMethodName
88
+ def set_args_keys(hash={})
89
+ set_args_keys_default
90
+ @set_args = @get_args.merge!(hash) unless hash.empty?
91
+ end
92
+ # rubocop:enable Style/AccessorMethodNamefor
93
+
94
+ def create
95
+ set_args_keys(state: '')
96
+ config_set('bgp_neighbor', 'af', @set_args)
97
+ end
98
+
99
+ def destroy
100
+ set_args_keys(state: 'no')
101
+ config_set('bgp_neighbor', 'af', @set_args)
102
+ end
103
+
104
+ ########################################################
105
+ # PROPERTIES #
106
+ ########################################################
107
+
108
+ # -----------------------
109
+ # <state> advertise-map <map1> exist-map <map2>
110
+
111
+ # Returns ['<map1>', '<map2>']
112
+ def advertise_map_exist
113
+ arr = config_get('bgp_neighbor_af', 'advertise_map_exist', @get_args)
114
+ return default_advertise_map_exist if arr.nil?
115
+ arr.shift
116
+ end
117
+
118
+ def advertise_map_exist=(arr)
119
+ if arr.empty?
120
+ state = 'no'
121
+ map1, map2 = advertise_map_exist
122
+ else
123
+ map1, map2 = arr
124
+ end
125
+ set_args_keys(state: state, map1: map1, map2: map2)
126
+ config_set('bgp_neighbor_af', 'advertise_map_exist', @set_args)
127
+ end
128
+
129
+ def default_advertise_map_exist
130
+ config_get_default('bgp_neighbor_af', 'advertise_map_exist')
131
+ end
132
+
133
+ # -----------------------
134
+ # <state> advertise-map <map1> non-exist-map <map2> }
135
+
136
+ # Returns ['<map1>', '<map2>']
137
+ def advertise_map_non_exist
138
+ arr = config_get('bgp_neighbor_af', 'advertise_map_non_exist', @get_args)
139
+ return default_advertise_map_non_exist if arr.nil?
140
+ arr.shift
141
+ end
142
+
143
+ def advertise_map_non_exist=(arr)
144
+ if arr.empty?
145
+ state = 'no'
146
+ map1, map2 = advertise_map_non_exist
147
+ else
148
+ map1, map2 = arr
149
+ end
150
+ set_args_keys(state: state, map1: map1, map2: map2)
151
+ config_set('bgp_neighbor_af', 'advertise_map_non_exist', @set_args)
152
+ end
153
+
154
+ def default_advertise_map_non_exist
155
+ config_get_default('bgp_neighbor_af', 'advertise_map_non_exist')
156
+ end
157
+
158
+ # -----------------------
159
+ # <state> allowas-in <max>
160
+ # Nvgens as True -OR- max-occurrences integer
161
+ def allowas_in_get
162
+ val = config_get('bgp_neighbor_af', 'allowas_in', @get_args)
163
+ return nil if val.nil?
164
+ val.shift.split.last.to_i
165
+ end
166
+
167
+ def allowas_in
168
+ allowas_in_get.nil? ? false : true
169
+ end
170
+
171
+ def allowas_in_max
172
+ val = allowas_in_get
173
+ # val.zero? check below is needed to handle a cli defect wherein the
174
+ # default max value does not reliably nvgen
175
+ val = default_allowas_in_max if val.nil? || val.zero?
176
+ val
177
+ end
178
+
179
+ def allowas_in_set(state, max=nil)
180
+ set_args_keys(state: (state ? '' : 'no'), max: max)
181
+ config_set('bgp_neighbor_af', 'allowas_in', @set_args)
182
+ end
183
+
184
+ def default_allowas_in
185
+ config_get_default('bgp_neighbor_af', 'allowas_in')
186
+ end
187
+
188
+ def default_allowas_in_max
189
+ config_get_default('bgp_neighbor_af', 'allowas_in_max')
190
+ end
191
+
192
+ # -----------------------
193
+ # <state> as-override
194
+ def as_override
195
+ state = config_get('bgp_neighbor_af', 'as_override', @get_args)
196
+ state ? true : false
197
+ end
198
+
199
+ def as_override=(state)
200
+ set_args_keys(state: (state ? '' : 'no'))
201
+ config_set('bgp_neighbor_af', 'as_override', @set_args)
202
+ end
203
+
204
+ def default_as_override
205
+ config_get_default('bgp_neighbor_af', 'as_override')
206
+ end
207
+
208
+ # -----------------------
209
+ # <state> capability additional-paths receive <disable>
210
+ # :enable = capability additional-paths receive
211
+ # :disable = capability additional-paths receive disable
212
+ # :inherit = no capability additional-paths receive
213
+ def additional_paths_receive
214
+ val = config_get('bgp_neighbor_af', 'additional_paths_receive', @get_args)
215
+ return default_additional_paths_receive if val.nil?
216
+ /disable/.match(val.first) ? :disable : :enable
217
+ end
218
+
219
+ def additional_paths_receive=(val)
220
+ val = val.to_sym
221
+ if val == default_additional_paths_receive
222
+ set_args_keys(state: 'no', disable: '')
223
+ else
224
+ set_args_keys(state: '', disable: (val == :enable) ? '' : 'disable')
225
+ end
226
+ config_set('bgp_neighbor_af', 'additional_paths_receive', @set_args)
227
+ end
228
+
229
+ def default_additional_paths_receive
230
+ config_get_default('bgp_neighbor_af', 'additional_paths_receive').to_sym
231
+ end
232
+
233
+ # -----------------------
234
+ # <state> capability additional-paths send <disable>
235
+ # :enable = capability additional-paths send
236
+ # :disable = capability additional-paths send disable
237
+ # :inherit = no capability additional-paths send
238
+ def additional_paths_send
239
+ val = config_get('bgp_neighbor_af', 'additional_paths_send', @get_args)
240
+ return default_additional_paths_send if val.nil?
241
+ /disable/.match(val.first) ? :disable : :enable
242
+ end
243
+
244
+ def additional_paths_send=(val)
245
+ val = val.to_sym
246
+ if val == default_additional_paths_send
247
+ set_args_keys(state: 'no', disable: '')
248
+ else
249
+ set_args_keys(state: '', disable: (val == :enable) ? '' : 'disable')
250
+ end
251
+ config_set('bgp_neighbor_af', 'additional_paths_send', @set_args)
252
+ end
253
+
254
+ def default_additional_paths_send
255
+ config_get_default('bgp_neighbor_af', 'additional_paths_send').to_sym
256
+ end
257
+
258
+ # -----------------------
259
+ # <state> default-originate [ route-map <map> ]
260
+ # Nvgens as True with optional 'route-map <map>'
261
+ def default_originate_get
262
+ val = config_get('bgp_neighbor_af', 'default_originate', @get_args)
263
+ return nil if val.nil?
264
+ val = val.shift
265
+ (val[/route-map/]) ? val.split.last : true
266
+ end
267
+
268
+ def default_originate
269
+ default_originate_get.nil? ? false : true
270
+ end
271
+
272
+ def default_originate_route_map
273
+ val = default_originate_get
274
+ return default_default_originate_route_map if val.nil?
275
+ val.is_a?(String) ? val : nil
276
+ end
277
+
278
+ def default_originate_set(state, map=nil)
279
+ map = "route-map #{map}" unless map.nil?
280
+ set_args_keys(state: (state ? '' : 'no'), map: map)
281
+ config_set('bgp_neighbor_af', 'default_originate', @set_args)
282
+ end
283
+
284
+ def default_default_originate
285
+ config_get_default('bgp_neighbor_af', 'default_originate')
286
+ end
287
+
288
+ def default_default_originate_route_map
289
+ config_get_default('bgp_neighbor_af', 'default_originate_route_map')
290
+ end
291
+
292
+ # -----------------------
293
+ # <state> disable-peer-as-check
294
+ def disable_peer_as_check
295
+ state = config_get('bgp_neighbor_af', 'disable_peer_as_check', @get_args)
296
+ state ? true : default_disable_peer_as_check
297
+ end
298
+
299
+ def disable_peer_as_check=(state)
300
+ set_args_keys(state: (state ? '' : 'no'))
301
+ config_set('bgp_neighbor_af', 'disable_peer_as_check', @set_args)
302
+ end
303
+
304
+ def default_disable_peer_as_check
305
+ config_get_default('bgp_neighbor_af', 'disable_peer_as_check')
306
+ end
307
+
308
+ # -----------------------
309
+ # <state> filter-list <str> in
310
+ def filter_list_in
311
+ str = config_get('bgp_neighbor_af', 'filter_list_in', @get_args)
312
+ return default_filter_list_in if str.nil?
313
+ str.shift.strip
314
+ end
315
+
316
+ def filter_list_in=(str)
317
+ str.strip! unless str.nil?
318
+ if str == default_filter_list_in
319
+ state = 'no'
320
+ # Current filter-list name is required for removal
321
+ str = filter_list_in
322
+ return if str.nil?
323
+ end
324
+ set_args_keys(state: state, str: str)
325
+ config_set('bgp_neighbor_af', 'filter_list_in', @set_args)
326
+ end
327
+
328
+ def default_filter_list_in
329
+ config_get_default('bgp_neighbor_af', 'filter_list_in')
330
+ end
331
+
332
+ # -----------------------
333
+ # <state> filter-list <str> out
334
+ def filter_list_out
335
+ str = config_get('bgp_neighbor_af', 'filter_list_out', @get_args)
336
+ return default_filter_list_out if str.nil?
337
+ str.shift.strip
338
+ end
339
+
340
+ def filter_list_out=(str)
341
+ str.strip! unless str.nil?
342
+ if str == default_filter_list_out
343
+ state = 'no'
344
+ # Current filter-list name is required for removal
345
+ str = filter_list_out
346
+ end
347
+ set_args_keys(state: state, str: str)
348
+ config_set('bgp_neighbor_af', 'filter_list_out', @set_args)
349
+ end
350
+
351
+ def default_filter_list_out
352
+ config_get_default('bgp_neighbor_af', 'filter_list_out')
353
+ end
354
+
355
+ # -----------------------
356
+ # <state> maximum-prefix <limit> <threshold> <opt>
357
+ #
358
+ # <threshold> : optional
359
+ # <opt> : optional = [ restart <interval> | warning-only ]
360
+ #
361
+ def max_prefix_get
362
+ str = config_get('bgp_neighbor_af', 'max_prefix', @get_args)
363
+ return nil if str.nil?
364
+
365
+ regexp = Regexp.new('maximum-prefix (?<limit>\d+)' \
366
+ ' *(?<threshold>\d+)?' \
367
+ ' *(?<opt>restart|warning-only)?' \
368
+ ' *(?<interval>\d+)?')
369
+ regexp.match(str.shift)
370
+ end
371
+
372
+ def max_prefix_set(limit, threshold=nil, opt=nil)
373
+ state = limit.nil? ? 'no' : ''
374
+ unless opt.nil?
375
+ opt = opt.respond_to?(:to_i) ? "restart #{opt}" : 'warning-only'
376
+ end
377
+ set_args_keys(state: state, limit: limit,
378
+ threshold: threshold, opt: opt)
379
+ config_set('bgp_neighbor_af', 'max_prefix', @set_args)
380
+ end
381
+
382
+ def max_prefix_limit
383
+ val = max_prefix_get
384
+ return default_max_prefix_limit if val.nil?
385
+ val[:limit].to_i
386
+ end
387
+
388
+ def max_prefix_interval
389
+ val = max_prefix_get
390
+ return default_max_prefix_interval if val.nil?
391
+ (val[:interval].nil?) ? nil : val[:interval].to_i
392
+ end
393
+
394
+ def max_prefix_threshold
395
+ val = max_prefix_get
396
+ return default_max_prefix_threshold if val.nil?
397
+ (val[:threshold].nil?) ? nil : val[:threshold].to_i
398
+ end
399
+
400
+ def max_prefix_warning
401
+ val = max_prefix_get
402
+ return default_max_prefix_warning if val.nil?
403
+ (val[:opt] == 'warning-only') ? true : nil
404
+ end
405
+
406
+ def default_max_prefix_limit
407
+ config_get_default('bgp_neighbor_af', 'max_prefix_limit')
408
+ end
409
+
410
+ def default_max_prefix_interval
411
+ config_get_default('bgp_neighbor_af', 'max_prefix_interval')
412
+ end
413
+
414
+ def default_max_prefix_threshold
415
+ config_get_default('bgp_neighbor_af', 'max_prefix_threshold')
416
+ end
417
+
418
+ def default_max_prefix_warning
419
+ config_get_default('bgp_neighbor_af', 'max_prefix_warning')
420
+ end
421
+
422
+ # -----------------------
423
+ # <state> next-hop-self
424
+ def next_hop_self
425
+ state = config_get('bgp_neighbor_af', 'next_hop_self', @get_args)
426
+ state ? true : false
427
+ end
428
+
429
+ def next_hop_self=(state)
430
+ set_args_keys(state: (state ? '' : 'no'))
431
+ config_set('bgp_neighbor_af', 'next_hop_self', @set_args)
432
+ end
433
+
434
+ def default_next_hop_self
435
+ config_get_default('bgp_neighbor_af', 'next_hop_self')
436
+ end
437
+
438
+ # -----------------------
439
+ # <state> next-hop-third-party
440
+ def next_hop_third_party
441
+ state = config_get('bgp_neighbor_af', 'next_hop_third_party', @get_args)
442
+ state ? true : false
443
+ end
444
+
445
+ def next_hop_third_party=(state)
446
+ set_args_keys(state: (state ? '' : 'no'))
447
+ config_set('bgp_neighbor_af', 'next_hop_third_party', @set_args)
448
+ end
449
+
450
+ def default_next_hop_third_party
451
+ config_get_default('bgp_neighbor_af', 'next_hop_third_party')
452
+ end
453
+
454
+ # -----------------------
455
+ # <state> prefix-list <str> in
456
+ def prefix_list_in
457
+ str = config_get('bgp_neighbor_af', 'prefix_list_in', @get_args)
458
+ return default_prefix_list_in if str.nil?
459
+ str.shift.strip
460
+ end
461
+
462
+ def prefix_list_in=(str)
463
+ str.strip! unless str.nil?
464
+ if str == default_prefix_list_in
465
+ state = 'no'
466
+ # Current prefix-list name is required for removal
467
+ str = prefix_list_in
468
+ return if str.nil?
469
+ end
470
+ set_args_keys(state: state, str: str)
471
+ config_set('bgp_neighbor_af', 'prefix_list_in', @set_args)
472
+ end
473
+
474
+ def default_prefix_list_in
475
+ config_get_default('bgp_neighbor_af', 'prefix_list_in')
476
+ end
477
+
478
+ # -----------------------
479
+ # <state> prefix-list <str> out
480
+ def prefix_list_out
481
+ str = config_get('bgp_neighbor_af', 'prefix_list_out', @get_args)
482
+ return default_prefix_list_out if str.nil?
483
+ str.shift.strip
484
+ end
485
+
486
+ def prefix_list_out=(str)
487
+ str.strip! unless str.nil?
488
+ if str == default_prefix_list_out
489
+ state = 'no'
490
+ # Current prefix-list name is required for removal
491
+ str = prefix_list_out
492
+ end
493
+ set_args_keys(state: state, str: str)
494
+ config_set('bgp_neighbor_af', 'prefix_list_out', @set_args)
495
+ end
496
+
497
+ def default_prefix_list_out
498
+ config_get_default('bgp_neighbor_af', 'prefix_list_out')
499
+ end
500
+
501
+ # -----------------------
502
+ # <state> route-map <str> in
503
+ def route_map_in
504
+ str = config_get('bgp_neighbor_af', 'route_map_in', @get_args)
505
+ return default_route_map_in if str.nil?
506
+ str.shift.strip
507
+ end
508
+
509
+ def route_map_in=(str)
510
+ str.strip! unless str.nil?
511
+ if str == default_route_map_in
512
+ state = 'no'
513
+ # Current route-map name is required for removal
514
+ str = route_map_in
515
+ return if str.nil?
516
+ end
517
+ set_args_keys(state: state, str: str)
518
+ config_set('bgp_neighbor_af', 'route_map_in', @set_args)
519
+ end
520
+
521
+ def default_route_map_in
522
+ config_get_default('bgp_neighbor_af', 'route_map_in')
523
+ end
524
+
525
+ # -----------------------
526
+ # <state> route-map <str> out
527
+ def route_map_out
528
+ str = config_get('bgp_neighbor_af', 'route_map_out', @get_args)
529
+ return default_route_map_out if str.nil?
530
+ str.shift.strip
531
+ end
532
+
533
+ def route_map_out=(str)
534
+ str.strip! unless str.nil?
535
+ if str == default_route_map_out
536
+ state = 'no'
537
+ # Current route-map name is required for removal
538
+ str = route_map_out
539
+ end
540
+ set_args_keys(state: state, str: str)
541
+ config_set('bgp_neighbor_af', 'route_map_out', @set_args)
542
+ end
543
+
544
+ def default_route_map_out
545
+ config_get_default('bgp_neighbor_af', 'route_map_out')
546
+ end
547
+
548
+ # -----------------------
549
+ # <state route-reflector-client
550
+ def route_reflector_client
551
+ state = config_get('bgp_neighbor_af', 'route_reflector_client', @get_args)
552
+ state ? true : false
553
+ end
554
+
555
+ def route_reflector_client=(state)
556
+ set_args_keys(state: (state ? '' : 'no'))
557
+ config_set('bgp_neighbor_af', 'route_reflector_client', @set_args)
558
+ end
559
+
560
+ def default_route_reflector_client
561
+ config_get_default('bgp_neighbor_af', 'route_reflector_client')
562
+ end
563
+
564
+ # -----------------------
565
+ # <state> send-community [ both | extended | standard ]
566
+ # NOTE: 'standard' is default but does not nvgen on some platforms
567
+ # Returns: none, both, extended, or standard
568
+ def send_community
569
+ val = config_get('bgp_neighbor_af', 'send_community', @get_args)
570
+ return default_send_community if val.nil?
571
+ val = val.shift.split.last
572
+ return 'standard' if val[/send-community/] # Workaround
573
+ val
574
+ end
575
+
576
+ def send_community=(val)
577
+ if val[/none/]
578
+ state = 'no'
579
+ val = 'both'
580
+ end
581
+ if val[/extended|standard/]
582
+ case send_community
583
+ when /both/
584
+ state = 'no'
585
+ # Unset the opposite property
586
+ val = val[/extended/] ? 'standard' : 'extended'
587
+
588
+ when /extended|standard/
589
+ # This is an additive property therefore remove the entire command
590
+ # when switching from: ext <--> std
591
+ set_args_keys(state: 'no', attr: 'both')
592
+ config_set('bgp_neighbor_af', 'send_community', @set_args)
593
+ state = ''
594
+ end
595
+ end
596
+ set_args_keys(state: state, attr: val)
597
+ config_set('bgp_neighbor_af', 'send_community', @set_args)
598
+ end
599
+
600
+ def default_send_community
601
+ config_get_default('bgp_neighbor_af', 'send_community')
602
+ end
603
+
604
+ # -----------------------
605
+ # <state> soft-reconfiguration inbound <always>
606
+ # :enable = soft-reconfiguration inbound
607
+ # :always = soft-reconfiguration inbound always
608
+ # :inherit = no soft-reconfiguration inbound
609
+ def soft_reconfiguration_in
610
+ val = config_get('bgp_neighbor_af', 'soft_reconfiguration_in', @get_args)
611
+ return default_soft_reconfiguration_in if val.nil?
612
+ /always/.match(val.first) ? :always : :enable
613
+ end
614
+
615
+ def soft_reconfiguration_in=(val)
616
+ val = val.to_sym
617
+ if val == default_soft_reconfiguration_in
618
+ set_args_keys(state: 'no', always: '')
619
+ else
620
+ set_args_keys(state: '', always: (val == :enable) ? '' : 'always')
621
+ end
622
+ config_set('bgp_neighbor_af', 'soft_reconfiguration_in', @set_args)
623
+ end
624
+
625
+ def default_soft_reconfiguration_in
626
+ config_get_default('bgp_neighbor_af', 'soft_reconfiguration_in').to_sym
627
+ end
628
+
629
+ # -----------------------
630
+ # <state> soo <str>
631
+ def soo
632
+ str = config_get('bgp_neighbor_af', 'soo', @get_args)
633
+ return default_soo if str.nil?
634
+ str.shift.strip
635
+ end
636
+
637
+ def soo=(str)
638
+ str.strip! unless str.nil?
639
+ if str == default_soo
640
+ state = 'no'
641
+ str = soo
642
+ end
643
+ set_args_keys(state: state, str: str)
644
+ config_set('bgp_neighbor_af', 'soo', @set_args)
645
+ end
646
+
647
+ def default_soo
648
+ config_get_default('bgp_neighbor_af', 'soo')
649
+ end
650
+
651
+ # -----------------------
652
+ # <state> suppress-inactive
653
+ def suppress_inactive
654
+ state = config_get('bgp_neighbor_af', 'suppress_inactive', @get_args)
655
+ state ? true : false
656
+ end
657
+
658
+ def suppress_inactive=(state)
659
+ set_args_keys(state: (state ? '' : 'no'))
660
+ config_set('bgp_neighbor_af', 'suppress_inactive', @set_args)
661
+ end
662
+
663
+ def default_suppress_inactive
664
+ config_get_default('bgp_neighbor_af', 'suppress_inactive')
665
+ end
666
+
667
+ # -----------------------
668
+ # <state> unsuppress-map <str>
669
+ def unsuppress_map
670
+ str = config_get('bgp_neighbor_af', 'unsuppress_map', @get_args)
671
+ return default_unsuppress_map if str.nil?
672
+ str.shift.strip
673
+ end
674
+
675
+ def unsuppress_map=(str)
676
+ str.strip! unless str.nil?
677
+ if str == default_unsuppress_map
678
+ state = 'no'
679
+ str = unsuppress_map
680
+ end
681
+ set_args_keys(state: state, str: str)
682
+ config_set('bgp_neighbor_af', 'unsuppress_map', @set_args)
683
+ end
684
+
685
+ def default_unsuppress_map
686
+ config_get_default('bgp_neighbor_af', 'unsuppress_map')
687
+ end
688
+
689
+ # -----------------------
690
+ # <state> weight <int>
691
+ def weight
692
+ int = config_get('bgp_neighbor_af', 'weight', @get_args)
693
+ int.nil? ? default_weight : int.shift
694
+ end
695
+
696
+ def weight=(int)
697
+ if int == default_weight
698
+ state = 'no'
699
+ int = ''
700
+ end
701
+ set_args_keys(state: state, int: int)
702
+ config_set('bgp_neighbor_af', 'weight', @set_args)
703
+ end
704
+
705
+ def default_weight
706
+ config_get_default('bgp_neighbor_af', 'weight')
707
+ end
708
+ end
709
+ end