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