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