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.
- checksums.yaml +7 -0
- data/.gitignore +4 -0
- data/.rubocop.yml +81 -1
- data/.travis.yml +9 -0
- data/CHANGELOG.md +72 -6
- data/CONTRIBUTING.md +32 -7
- data/README.md +70 -7
- data/Rakefile +17 -0
- data/bin/check_metric_limits.rb +109 -0
- data/bin/git/hooks/commit-msg/enforce_style +81 -0
- data/bin/git/hooks/hook_lib +108 -0
- data/bin/git/hooks/hooks-wrapper +38 -0
- data/bin/git/hooks/post-flow-hotfix-start/update-version +24 -0
- data/bin/git/hooks/post-flow-release-finish/update-version +29 -0
- data/bin/git/hooks/post-flow-release-start/update-version +19 -0
- data/bin/git/hooks/post-merge/update-hooks +6 -0
- data/bin/git/hooks/post-rewrite/update-hooks +6 -0
- data/bin/git/hooks/pre-commit/rubocop +20 -0
- data/bin/git/hooks/pre-commit/validate-diffs +31 -0
- data/bin/git/hooks/pre-push/check-changelog +24 -0
- data/bin/git/hooks/pre-push/rubocop +7 -0
- data/bin/git/update-hooks +65 -0
- data/cisco_node_utils.gemspec +9 -3
- data/docs/README-develop-best-practices.md +404 -0
- data/docs/README-develop-node-utils-APIs.md +215 -365
- data/docs/README-maintainers.md +33 -3
- data/docs/template-router.rb +89 -91
- data/docs/template-test_router.rb +52 -55
- data/lib/.rubocop.yml +18 -0
- data/lib/cisco_node_utils.rb +2 -19
- data/lib/cisco_node_utils/README_YAML.md +1 -9
- data/lib/cisco_node_utils/bgp.rb +664 -0
- data/lib/cisco_node_utils/bgp_af.rb +530 -0
- data/lib/cisco_node_utils/bgp_neighbor.rb +425 -0
- data/lib/cisco_node_utils/bgp_neighbor_af.rb +709 -0
- data/lib/cisco_node_utils/cisco_cmn_utils.rb +59 -25
- data/lib/cisco_node_utils/command_reference.rb +72 -74
- data/lib/cisco_node_utils/command_reference_common.yaml +174 -9
- data/lib/cisco_node_utils/command_reference_common_bgp.yaml +535 -0
- data/lib/cisco_node_utils/command_reference_n7k.yaml +4 -0
- data/lib/cisco_node_utils/command_reference_n9k.yaml +0 -9
- data/lib/cisco_node_utils/configparser_lib.rb +152 -147
- data/lib/cisco_node_utils/dns_domain.rb +79 -0
- data/lib/cisco_node_utils/domain_name.rb +71 -0
- data/lib/cisco_node_utils/interface.rb +167 -161
- data/lib/cisco_node_utils/interface_ospf.rb +78 -81
- data/lib/cisco_node_utils/name_server.rb +64 -0
- data/lib/cisco_node_utils/node.rb +154 -198
- data/lib/cisco_node_utils/node_util.rb +61 -0
- data/lib/cisco_node_utils/ntp_config.rb +65 -0
- data/lib/cisco_node_utils/ntp_server.rb +76 -0
- data/lib/cisco_node_utils/platform.rb +174 -165
- data/lib/cisco_node_utils/radius_global.rb +146 -0
- data/lib/cisco_node_utils/radius_server.rb +295 -0
- data/lib/cisco_node_utils/router_ospf.rb +59 -63
- data/lib/cisco_node_utils/router_ospf_vrf.rb +226 -210
- data/lib/cisco_node_utils/snmpcommunity.rb +52 -58
- data/lib/cisco_node_utils/snmpgroup.rb +22 -23
- data/lib/cisco_node_utils/snmpserver.rb +99 -103
- data/lib/cisco_node_utils/snmpuser.rb +294 -274
- data/lib/cisco_node_utils/syslog_server.rb +92 -0
- data/lib/cisco_node_utils/syslog_settings.rb +69 -0
- data/lib/cisco_node_utils/tacacs_server.rb +137 -133
- data/lib/cisco_node_utils/tacacs_server_host.rb +84 -87
- data/lib/cisco_node_utils/version.rb +2 -1
- data/lib/cisco_node_utils/vlan.rb +28 -31
- data/lib/cisco_node_utils/vrf.rb +80 -0
- data/lib/cisco_node_utils/vtp.rb +100 -97
- data/lib/cisco_node_utils/yum.rb +15 -17
- data/tests/.rubocop.yml +15 -0
- data/tests/basetest.rb +81 -36
- data/tests/ciscotest.rb +38 -78
- data/{lib/cisco_node_utils → tests}/platform_info.rb +12 -8
- data/{lib/cisco_node_utils → tests}/platform_info.yaml +1 -1
- data/tests/test_bgp_af.rb +920 -0
- data/tests/test_bgp_neighbor.rb +403 -0
- data/tests/test_bgp_neighbor_af.rb +589 -0
- data/tests/test_command_config.rb +65 -62
- data/tests/test_command_reference.rb +31 -45
- data/tests/test_dns_domain.rb +113 -0
- data/tests/test_domain_name.rb +86 -0
- data/tests/test_interface.rb +424 -548
- data/tests/test_interface_ospf.rb +248 -432
- data/tests/test_interface_svi.rb +56 -79
- data/tests/test_interface_switchport.rb +196 -272
- data/tests/test_name_server.rb +85 -0
- data/tests/test_node.rb +7 -6
- data/tests/test_node_ext.rb +133 -186
- data/tests/test_ntp_config.rb +49 -0
- data/tests/test_ntp_server.rb +74 -0
- data/tests/test_platform.rb +58 -37
- data/tests/test_radius_global.rb +78 -0
- data/tests/test_radius_server.rb +185 -0
- data/tests/test_router_bgp.rb +838 -0
- data/tests/test_router_ospf.rb +49 -80
- data/tests/test_router_ospf_vrf.rb +274 -392
- data/tests/test_snmpcommunity.rb +128 -172
- data/tests/test_snmpgroup.rb +12 -14
- data/tests/test_snmpserver.rb +160 -189
- data/tests/test_snmpuser.rb +568 -717
- data/tests/test_syslog_server.rb +88 -0
- data/tests/test_syslog_settings.rb +54 -0
- data/tests/test_tacacs_server.rb +113 -148
- data/tests/test_tacacs_server_host.rb +108 -161
- data/tests/test_vlan.rb +63 -79
- data/tests/test_vrf.rb +92 -0
- data/tests/test_vtp.rb +108 -126
- data/tests/test_yum.rb +47 -41
- metadata +92 -56
- data/.rubocop_todo.yml +0 -293
- data/docs/.rubocop.yml +0 -13
- data/docs/template-feature.rb +0 -45
- data/docs/template-test_feature.rb +0 -51
- 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
|