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,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