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,530 @@
1
+ # -*- coding: utf-8 -*-
2
+ # August 2015, Richard Wellum
3
+ #
4
+ # Copyright (c) 2015 Cisco and/or its affiliates.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ require_relative 'cisco_cmn_utils'
19
+ require_relative 'node_util'
20
+ require_relative 'bgp'
21
+
22
+ module Cisco
23
+ # RouterBgpAF - node utility class for BGP address-family config management
24
+ class RouterBgpAF < NodeUtil
25
+ def initialize(asn, vrf, af, instantiate=true)
26
+ fail ArgumentError if vrf.to_s.empty? || af.to_s.empty?
27
+ err_msg = '"af" argument must be an array of two string values ' \
28
+ 'containing an afi + safi tuple'
29
+ fail ArgumentError, err_msg unless af.is_a?(Array) || af.length == 2
30
+ @asn = RouterBgp.process_asnum(asn)
31
+ @vrf = vrf
32
+ @afi, @safi = af
33
+ set_args_keys_default
34
+ create if instantiate
35
+ end
36
+
37
+ def self.afs
38
+ af_hash = {}
39
+ RouterBgp.routers.each do |asn, vrfs|
40
+ af_hash[asn] = {}
41
+ vrfs.keys.each do |vrf_name|
42
+ get_args = { asnum: asn }
43
+ get_args[:vrf] = vrf_name unless (vrf_name == 'default')
44
+ # Call yaml and search for address-family statements
45
+ af_list = config_get('bgp_af', 'all_afs', get_args)
46
+
47
+ next if af_list.nil?
48
+
49
+ af_hash[asn][vrf_name] = {}
50
+ af_list.each do |af|
51
+ af_hash[asn][vrf_name][af] =
52
+ RouterBgpAF.new(asn, vrf_name, af, false)
53
+ end
54
+ end
55
+ end
56
+ af_hash
57
+ end
58
+
59
+ def create
60
+ set_args_keys(state: '')
61
+ config_set('bgp', 'address_family', @set_args)
62
+ end
63
+
64
+ def destroy
65
+ set_args_keys(state: 'no')
66
+ config_set('bgp', 'address_family', @set_args)
67
+ end
68
+
69
+ #
70
+ # Helper methods to delete @set_args hash keys
71
+ #
72
+ def set_args_keys_default
73
+ keys = { asnum: @asn, afi: @afi, safi: @safi }
74
+ keys[:vrf] = @vrf unless @vrf == 'default'
75
+ @get_args = @set_args = keys
76
+ end
77
+
78
+ def set_args_keys(hash={}) # rubocop:disable Style/AccessorMethodName
79
+ set_args_keys_default
80
+ @set_args = @get_args.merge!(hash) unless hash.empty?
81
+ end
82
+
83
+ ########################################################
84
+ # PROPERTIES #
85
+ ########################################################
86
+
87
+ #
88
+ # Client to client (Getter/Setter/Default)
89
+ #
90
+ def client_to_client
91
+ state = config_get('bgp_af', 'client_to_client', @get_args)
92
+ state ? true : false
93
+ end
94
+
95
+ def client_to_client=(state)
96
+ state = (state ? '' : 'no')
97
+ set_args_keys(state: state)
98
+ config_set('bgp_af', 'client_to_client', @set_args)
99
+ end
100
+
101
+ def default_client_to_client
102
+ config_get_default('bgp_af', 'client_to_client')
103
+ end
104
+
105
+ #
106
+ # Default Information (Getter/Setter/Default)
107
+ #
108
+ def default_information_originate
109
+ state = config_get('bgp_af', 'default_information', @get_args)
110
+ state ? true : false
111
+ end
112
+
113
+ def default_information_originate=(state)
114
+ state = (state ? '' : 'no')
115
+ set_args_keys(state: state)
116
+ config_set('bgp_af', 'default_information', @set_args)
117
+ end
118
+
119
+ def default_default_information_originate
120
+ config_get_default('bgp_af', 'default_information')
121
+ end
122
+
123
+ #
124
+ # Next Hop route map (Getter/Setter/Default)
125
+ #
126
+ def next_hop_route_map
127
+ route_map = config_get('bgp_af', 'next_hop_route_map', @get_args)
128
+ return '' if route_map.nil?
129
+ route_map.shift.strip
130
+ end
131
+
132
+ def next_hop_route_map=(route_map)
133
+ route_map.strip!
134
+ if route_map.empty?
135
+ state = 'no'
136
+ # Dummy routemap required if not configured.
137
+ if next_hop_route_map.empty?
138
+ route_map = 'dummy_routemap'
139
+ else
140
+ route_map = next_hop_route_map
141
+ end
142
+ end
143
+ set_args_keys(state: state, route_map: route_map)
144
+ config_set('bgp_af', 'next_hop_route_map', @set_args)
145
+ end
146
+
147
+ def default_next_hop_route_map
148
+ config_get_default('bgp_af', 'next_hop_route_map')
149
+ end
150
+
151
+ #
152
+ # additional paths (Getter/Setter/Default)
153
+ #
154
+
155
+ # additional_paths_send
156
+ def additional_paths_send
157
+ state = config_get('bgp_af', 'additional_paths_send', @get_args)
158
+ state ? true : false
159
+ end
160
+
161
+ def additional_paths_send=(state)
162
+ state = (state ? '' : 'no')
163
+ set_args_keys(state: state)
164
+ config_set('bgp_af', 'additional_paths_send', @set_args)
165
+ end
166
+
167
+ def default_additional_paths_send
168
+ config_get_default('bgp_af', 'additional_paths_send')
169
+ end
170
+
171
+ # additional_paths_receive
172
+ def additional_paths_receive
173
+ state = config_get('bgp_af', 'additional_paths_receive', @get_args)
174
+ state ? true : false
175
+ end
176
+
177
+ def additional_paths_receive=(state)
178
+ state = (state ? '' : 'no')
179
+ set_args_keys(state: state)
180
+ config_set('bgp_af', 'additional_paths_receive', @set_args)
181
+ end
182
+
183
+ def default_additional_paths_receive
184
+ config_get_default('bgp_af', 'additional_paths_receive')
185
+ end
186
+
187
+ # additional_paths_install
188
+ def additional_paths_install
189
+ state = config_get('bgp_af', 'additional_paths_install', @get_args)
190
+ state ? true : false
191
+ end
192
+
193
+ def additional_paths_install=(state)
194
+ state = (state ? '' : 'no')
195
+ set_args_keys(state: state)
196
+ config_set('bgp_af', 'additional_paths_install', @set_args)
197
+ end
198
+
199
+ def default_additional_paths_install
200
+ config_get_default('bgp_af', 'additional_paths_install')
201
+ end
202
+
203
+ # additional_paths_selection
204
+ def additional_paths_selection
205
+ route_map = config_get('bgp_af', 'additional_paths_selection', @get_args)
206
+ return '' if route_map.nil?
207
+ route_map.shift.strip
208
+ end
209
+
210
+ def additional_paths_selection=(route_map)
211
+ route_map.strip!
212
+ if route_map.empty?
213
+ state = 'no'
214
+ # Dummy routemap required if not configured.
215
+ if additional_paths_selection.empty?
216
+ route_map = 'dummy_routemap'
217
+ else
218
+ route_map = additional_paths_selection
219
+ end
220
+ end
221
+ set_args_keys(state: state, route_map: route_map)
222
+ config_set('bgp_af', 'additional_paths_selection', @set_args)
223
+ end
224
+
225
+ def default_additional_paths_selection
226
+ config_get_default('bgp_af', 'additional_paths_selection')
227
+ end
228
+
229
+ #
230
+ # dampen_igp_metric (Getter/Setter/Default)
231
+ #
232
+
233
+ # dampen_igp_metric
234
+ def dampen_igp_metric
235
+ result = config_get('bgp_af', 'dampen_igp_metric', @get_args)
236
+ result ? result.first.to_i : nil
237
+ end
238
+
239
+ def dampen_igp_metric=(val)
240
+ set_args_keys(state: (val.nil?) ? 'no' : '',
241
+ num: (val.nil?) ? '' : val)
242
+ config_set('bgp_af', 'dampen_igp_metric', @set_args)
243
+ end
244
+
245
+ def default_dampen_igp_metric
246
+ config_get_default('bgp_af', 'dampen_igp_metric')
247
+ end
248
+
249
+ #
250
+ # dampening (Getter/Setter/Default)
251
+ #
252
+
253
+ # The data presented to or retrieved from the config_set and config_get
254
+ # for dampening is one of 4 possibilities:
255
+ #
256
+ # Value Meaning
257
+ # ----- -------
258
+ # nil Dampening is not configured
259
+ # '' || [] Dampening is configured with no options
260
+ # [1,3,4,5,nil] Dampening + decay, reuse, suppress, suppress_max
261
+ # [nil,nil,nil,'route-map'] Dampening + routemap
262
+ def dampening
263
+ data = config_get('bgp_af', 'dampening', @get_args)
264
+
265
+ if data.nil?
266
+ # no dampening
267
+ return nil
268
+ end
269
+
270
+ data = data.flatten
271
+
272
+ # dampening nil nil nil nil nil
273
+ val = ''
274
+
275
+ if !data[4].nil?
276
+ # dampening nil nil nil nil route-map
277
+ val = data[4]
278
+ elsif !data[3].nil? && data[4].nil?
279
+ # dampening 1 2 3 4 nil
280
+ val = data[0..3]
281
+ end
282
+
283
+ val
284
+ end
285
+
286
+ # Return true if dampening is enabled, else false.
287
+ def dampening_state
288
+ !dampening.nil?
289
+ end
290
+
291
+ # For all of the following dampening getters, half_time, reuse_time,
292
+ # suppress_time, and max_suppress_time, return nil if dampening
293
+ # is not configured, but also return nil if a dampening routemap
294
+ # is configured because they are mutually exclusive.
295
+ def dampening_half_time
296
+ return nil if dampening.nil? || dampening_routemap_configured?
297
+ if dampening.is_a?(Array)
298
+ dampening[0].to_i
299
+ else
300
+ default_dampening_half_time
301
+ end
302
+ end
303
+
304
+ def dampening_reuse_time
305
+ return nil if dampening.nil? || dampening_routemap_configured?
306
+ if dampening.is_a?(Array)
307
+ dampening[1].to_i
308
+ else
309
+ default_dampening_reuse_time
310
+ end
311
+ end
312
+
313
+ def dampening_suppress_time
314
+ return nil if dampening.nil? || dampening_routemap_configured?
315
+ if dampening.is_a?(Array)
316
+ dampening[2].to_i
317
+ else
318
+ default_dampening_suppress_time
319
+ end
320
+ end
321
+
322
+ def dampening_max_suppress_time
323
+ return nil if dampening.nil? || dampening_routemap_configured?
324
+ if dampening.is_a?(Array)
325
+ dampening[3].to_i
326
+ else
327
+ default_dampening_max_suppress_time
328
+ end
329
+ end
330
+
331
+ def dampening_routemap
332
+ if dampening.nil? || (dampening.is_a?(String) && dampening.size > 0)
333
+ return dampening
334
+ end
335
+ default_dampening_routemap
336
+ end
337
+
338
+ def dampening_routemap_configured?
339
+ if dampening_routemap.is_a?(String) && dampening_routemap.size > 0
340
+ true
341
+ else
342
+ false
343
+ end
344
+ end
345
+
346
+ def dampening=(damp_array)
347
+ fail ArgumentError if damp_array.kind_of?(Array) &&
348
+ !(damp_array.length == 4 ||
349
+ damp_array.length == 0)
350
+
351
+ # Set defaults args
352
+ state = ''
353
+ route_map = ''
354
+ decay = ''
355
+ reuse = ''
356
+ suppress = ''
357
+ suppress_max = ''
358
+
359
+ if damp_array.nil?
360
+ # 'no dampening ...' command - no dampening handles all cases
361
+ state = 'no'
362
+ CiscoLogger.debug("Dampening 'no dampening'")
363
+ elsif damp_array.empty?
364
+ # 'dampening' command - nothing to do here
365
+ CiscoLogger.debug("Dampening 'dampening'")
366
+ elsif damp_array.size == 4
367
+ # 'dampening dampening_decay dampening_reuse \
368
+ # dampening_suppress dampening_suppress_max' command
369
+ decay = damp_array[0]
370
+ reuse = damp_array[1]
371
+ suppress = damp_array[2]
372
+ suppress_max = damp_array[3]
373
+ CiscoLogger.debug("Dampening 'dampening #{damp_array.join(' ')}''")
374
+ elsif route_map.is_a? String
375
+ # 'dampening route-map WORD' command
376
+ route_map = "route-map #{damp_array}"
377
+ route_map.strip!
378
+ CiscoLogger.debug("Dampening 'dampening #{route_map}'")
379
+ else
380
+ # Array not in a valid format
381
+ fail ArgumentError
382
+ end
383
+
384
+ # Set final args
385
+ set_args_keys(
386
+ state: state,
387
+ route_map: route_map,
388
+ decay: decay,
389
+ reuse: reuse,
390
+ suppress: suppress,
391
+ suppress_max: suppress_max,
392
+ )
393
+ CiscoLogger.debug("Dampening args=#{@set_args}")
394
+ config_set('bgp_af', 'dampening', @set_args)
395
+ end
396
+
397
+ def default_dampening
398
+ config_get_default('bgp_af', 'dampening')
399
+ end
400
+
401
+ def default_dampening_state
402
+ config_get_default('bgp_af', 'dampening_state')
403
+ end
404
+
405
+ def default_dampening_max_suppress_time
406
+ config_get_default('bgp_af', 'dampening_max_suppress_time')
407
+ end
408
+
409
+ def default_dampening_half_time
410
+ config_get_default('bgp_af', 'dampening_half_time')
411
+ end
412
+
413
+ def default_dampening_reuse_time
414
+ config_get_default('bgp_af', 'dampening_reuse_time')
415
+ end
416
+
417
+ def default_dampening_routemap
418
+ config_get_default('bgp_af', 'dampening_routemap')
419
+ end
420
+
421
+ def default_dampening_suppress_time
422
+ config_get_default('bgp_af', 'dampening_suppress_time')
423
+ end
424
+
425
+ #
426
+ # maximum_paths (Getter/Setter/Default)
427
+ #
428
+
429
+ # maximum_paths
430
+ def maximum_paths
431
+ result = config_get('bgp_af', 'maximum_paths', @get_args)
432
+ result.nil? ? default_maximum_paths : result.first.to_i
433
+ end
434
+
435
+ def maximum_paths=(val)
436
+ set_args_keys(state: (val == default_maximum_paths) ? 'no' : '',
437
+ num: (val == default_maximum_paths) ? '' : val)
438
+ config_set('bgp_af', 'maximum_paths', @set_args)
439
+ end
440
+
441
+ def default_maximum_paths
442
+ config_get_default('bgp_af', 'maximum_paths')
443
+ end
444
+
445
+ #
446
+ # maximum_paths_ibgp (Getter/Setter/Default)
447
+ #
448
+
449
+ # maximum_paths_ibgp
450
+ def maximum_paths_ibgp
451
+ result = config_get('bgp_af', 'maximum_paths_ibgp', @get_args)
452
+ result.nil? ? default_maximum_paths_ibgp : result.first.to_i
453
+ end
454
+
455
+ def maximum_paths_ibgp=(val)
456
+ set_args_keys(state: (val == default_maximum_paths_ibgp) ? 'no' : '',
457
+ num: (val == default_maximum_paths_ibgp) ? '' : val)
458
+ config_set('bgp_af', 'maximum_paths_ibgp', @set_args)
459
+ end
460
+
461
+ def default_maximum_paths_ibgp
462
+ config_get_default('bgp_af', 'maximum_paths_ibgp')
463
+ end
464
+
465
+ #
466
+ # Networks (Getter/Setter/Default)
467
+ #
468
+
469
+ # Build an array of all network commands currently on the device
470
+ def networks
471
+ cmds = config_get('bgp_af', 'network', @get_args)
472
+ cmds.nil? ? default_networks : cmds.each(&:compact!)
473
+ end
474
+
475
+ # networks setter.
476
+ # Processes a hash of network commands from delta_add_remove().
477
+ def networks=(should_list)
478
+ delta_hash = Utils.delta_add_remove(should_list, networks)
479
+ return if delta_hash.values.flatten.empty?
480
+ [:add, :remove].each do |action|
481
+ CiscoLogger.debug("networks delta #{@get_args}\n #{action}: " \
482
+ "#{delta_hash[action]}")
483
+ delta_hash[action].each do |network, route_map|
484
+ state = (action == :add) ? '' : 'no'
485
+ network = Utils.process_network_mask(network)
486
+ route_map = "route-map #{route_map}" unless route_map.nil?
487
+ set_args_keys(state: state, network: network, route_map: route_map)
488
+ config_set('bgp_af', 'network', @set_args)
489
+ end
490
+ end
491
+ end
492
+
493
+ def default_networks
494
+ config_get_default('bgp_af', 'network')
495
+ end
496
+
497
+ #
498
+ # Redistribute (Getter/Setter/Default)
499
+ #
500
+
501
+ # Build an array of all redistribute commands currently on the device
502
+ def redistribute
503
+ cmds = config_get('bgp_af', 'redistribute', @get_args)
504
+ cmds.nil? ? default_redistribute : cmds.each(&:compact!)
505
+ end
506
+
507
+ # redistribute setter.
508
+ # Process a hash of redistribute commands from delta_add_remove().
509
+ def redistribute=(should)
510
+ delta_hash = Utils.delta_add_remove(should, redistribute)
511
+ return if delta_hash.values.flatten.empty?
512
+ [:add, :remove].each do |action|
513
+ CiscoLogger.debug("redistribute delta #{@get_args}\n #{action}: " \
514
+ "#{delta_hash[action]}")
515
+ delta_hash[action].each do |protocol, policy|
516
+ state = (action == :add) ? '' : 'no'
517
+ set_args_keys(state: state, protocol: protocol, policy: policy)
518
+
519
+ # route-map/policy may be optional on some platforms
520
+ cmd = policy.nil? ? 'redistribute' : 'redistribute_policy'
521
+ config_set('bgp_af', cmd, @set_args)
522
+ end
523
+ end
524
+ end
525
+
526
+ def default_redistribute
527
+ config_get_default('bgp_af', 'redistribute')
528
+ end
529
+ end
530
+ end