rbeapi 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +16 -0
- data/Gemfile +3 -1
- data/Guardfile +2 -2
- data/README.md +35 -24
- data/Rakefile +48 -18
- data/gems/inifile/inifile.spec.tmpl +50 -14
- data/gems/net_http_unix/net_http_unix.spec.tmpl +48 -15
- data/gems/netaddr/netaddr.spec.tmpl +47 -14
- data/lib/rbeapi/api/bgp.rb +100 -4
- data/lib/rbeapi/api/interfaces.rb +4 -5
- data/lib/rbeapi/api/radius.rb +1 -1
- data/lib/rbeapi/api/routemaps.rb +405 -37
- data/lib/rbeapi/api/system.rb +21 -0
- data/lib/rbeapi/api/users.rb +361 -0
- data/lib/rbeapi/api/varp.rb +50 -22
- data/lib/rbeapi/api/vrrp.rb +1072 -0
- data/lib/rbeapi/client.rb +12 -4
- data/lib/rbeapi/eapilib.rb +1 -1
- data/lib/rbeapi/version.rb +1 -1
- data/rbeapi.spec.tmpl +57 -25
- data/spec/system/rbeapi/api/dns_spec.rb +2 -2
- data/spec/system/rbeapi/api/routemaps_spec.rb +344 -0
- data/spec/system/rbeapi/api/switchports_spec.rb +1 -1
- data/spec/system/rbeapi/api/system_spec.rb +44 -4
- data/spec/system/{api_varp_interfaces_spec.rb → rbeapi/api/varp_interfaces_spec.rb} +25 -16
- data/spec/system/rbeapi/api/varp_spec.rb +76 -0
- data/spec/unit/rbeapi/api/bgp/bgp_neighbors_spec.rb +2 -0
- data/spec/unit/rbeapi/api/bgp/bgp_spec.rb +54 -1
- data/spec/unit/rbeapi/api/interfaces/portchannel_spec.rb +1 -1
- data/spec/unit/rbeapi/api/routemaps/default_spec.rb +370 -0
- data/spec/unit/rbeapi/api/routemaps/fixture_routemaps.text +27 -0
- data/spec/unit/rbeapi/api/system/default_spec.rb +102 -0
- data/spec/unit/rbeapi/api/system/fixture_system.text +2 -0
- data/spec/unit/rbeapi/api/users/default_spec.rb +280 -0
- data/spec/unit/rbeapi/api/users/fixture_users.text +4 -0
- data/spec/unit/rbeapi/api/vrrp/default_spec.rb +582 -0
- data/spec/unit/rbeapi/api/vrrp/fixture_vrrp.text +186 -0
- metadata +28 -8
- data/spec/system/api_varp_spec.rb +0 -41
@@ -0,0 +1,361 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2015, Arista Networks, Inc.
|
3
|
+
# All rights reserved.
|
4
|
+
#
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
6
|
+
# modification, are permitted provided that the following conditions are
|
7
|
+
# met:
|
8
|
+
#
|
9
|
+
# Redistributions of source code must retain the above copyright notice,
|
10
|
+
# this list of conditions and the following disclaimer.
|
11
|
+
#
|
12
|
+
# Redistributions in binary form must reproduce the above copyright
|
13
|
+
# notice, this list of conditions and the following disclaimer in the
|
14
|
+
# documentation and/or other materials provided with the distribution.
|
15
|
+
#
|
16
|
+
# Neither the name of Arista Networks nor the names of its
|
17
|
+
# contributors may be used to endorse or promote products derived from
|
18
|
+
# this software without specific prior written permission.
|
19
|
+
#
|
20
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
21
|
+
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
22
|
+
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
23
|
+
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARISTA NETWORKS
|
24
|
+
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
25
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
26
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
27
|
+
# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
28
|
+
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
29
|
+
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
30
|
+
# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
31
|
+
#
|
32
|
+
require 'rbeapi/api'
|
33
|
+
|
34
|
+
##
|
35
|
+
# Rbeapi toplevel namespace
|
36
|
+
module Rbeapi
|
37
|
+
##
|
38
|
+
# Api is module namesapce for working with the EOS command API
|
39
|
+
module Api
|
40
|
+
##
|
41
|
+
# The Users class provides configuration of local user resources for
|
42
|
+
# an EOS node.
|
43
|
+
class Users < Entity
|
44
|
+
def initialize(node)
|
45
|
+
super(node)
|
46
|
+
# The regex used here parses the running configuration to find all
|
47
|
+
# username entries. There is extra logic in the regular expression
|
48
|
+
# to store the username as 'user' and then creates a back reference
|
49
|
+
# to find a following configuration line that might contain the
|
50
|
+
# users sshkey.
|
51
|
+
@users_re = Regexp.new(/^username\s+(?<user>[^\s]+)\s+
|
52
|
+
privilege\s+(?<priv>\d+)
|
53
|
+
(\s+role\s+(?<role>\S+))?
|
54
|
+
(?:\s+(?<nopassword>(nopassword)))?
|
55
|
+
(\s+secret\s+(?<encryption>0|5|7|sha512)\s+
|
56
|
+
(?<secret>\S+))?.*$\n
|
57
|
+
(username\s+\k<user>\s+
|
58
|
+
sshkey\s+(?<sshkey>.*)$)?/x)
|
59
|
+
|
60
|
+
@encryption_map = { 'cleartext' => '0',
|
61
|
+
'md5' => '5',
|
62
|
+
'sha512' => 'sha512' }
|
63
|
+
end
|
64
|
+
|
65
|
+
##
|
66
|
+
# get returns the local user configuration
|
67
|
+
#
|
68
|
+
# @example
|
69
|
+
# {
|
70
|
+
# name: <string>,
|
71
|
+
# privilege: <integer>,
|
72
|
+
# role: <string>,
|
73
|
+
# nopassword: <boolean>,
|
74
|
+
# encryption: <'cleartext', 'md5', 'sha512'>
|
75
|
+
# secret: <string>,
|
76
|
+
# sshkey: <string>
|
77
|
+
# }
|
78
|
+
#
|
79
|
+
# @param [String] name The user name to return a resource for from the
|
80
|
+
# nodes configuration
|
81
|
+
#
|
82
|
+
# @return [nil, Hash<Symbol, Object>] Returns the user resource as a
|
83
|
+
# Hash. If the specified user name is not found in the nodes current
|
84
|
+
# configuration a nil object is returned
|
85
|
+
def get(name)
|
86
|
+
# The regex used here parses the running configuration to find one
|
87
|
+
# username entry.
|
88
|
+
user_re = Regexp.new(/^username\s+(?<user>#{name})\s+
|
89
|
+
privilege\s+(?<priv>\d+)
|
90
|
+
(\s+role\s+(?<role>\S+))?
|
91
|
+
(?:\s+(?<nopassword>(nopassword)))?
|
92
|
+
(\s+secret\s+(?<encryption>0|5|7|sha512)\s+
|
93
|
+
(?<secret>\S+))?.*$\n
|
94
|
+
(username\s+#{name}\s+
|
95
|
+
sshkey\s+(?<sshkey>.*)$)?/x)
|
96
|
+
user = config.scan(user_re)
|
97
|
+
return nil unless user
|
98
|
+
parse_user_entry(user[0])
|
99
|
+
end
|
100
|
+
|
101
|
+
##
|
102
|
+
# getall returns a collection of user resource hashes from the nodes
|
103
|
+
# running configuration. The user resource collection hash is keyed
|
104
|
+
# by the unique user name.
|
105
|
+
#
|
106
|
+
# @example
|
107
|
+
# [
|
108
|
+
# <username>: {
|
109
|
+
# name: <string>,
|
110
|
+
# privilege: <integer>,
|
111
|
+
# role: <string>,
|
112
|
+
# nopassword: <boolean>,
|
113
|
+
# encryption: <'cleartext', 'md5', 'sha512'>
|
114
|
+
# secret: <string>,
|
115
|
+
# sshkey: <string>
|
116
|
+
# },
|
117
|
+
# ...
|
118
|
+
# ]
|
119
|
+
#
|
120
|
+
# @return [Hash<Symbol, Object>] returns a hash that represents the
|
121
|
+
# entire user collection from the nodes running configuration. If
|
122
|
+
# there are no user names configured, this method will return an empty
|
123
|
+
# hash.
|
124
|
+
def getall
|
125
|
+
entries = config.scan(@users_re)
|
126
|
+
response = {}
|
127
|
+
entries.each do |user|
|
128
|
+
response[user[0]] = parse_user_entry(user)
|
129
|
+
end
|
130
|
+
response
|
131
|
+
end
|
132
|
+
|
133
|
+
##
|
134
|
+
# parse_user_entry maps the tokens find to the hash entries.
|
135
|
+
#
|
136
|
+
# @api private
|
137
|
+
#
|
138
|
+
# @param [Array] :user An array of values returned from the regular
|
139
|
+
# expression scan of the nodes configuration.
|
140
|
+
#
|
141
|
+
# @return [Hash<Symbol, Object>] resource hash attribute
|
142
|
+
def parse_user_entry(user)
|
143
|
+
hsh = {}
|
144
|
+
hsh[:name] = user[0]
|
145
|
+
hsh[:privilege] = user[1].to_i
|
146
|
+
hsh[:role] = user[2]
|
147
|
+
hsh[:nopassword] = user[3] ? true : false
|
148
|
+
# Map the encryption value if set, if there is no mapping then
|
149
|
+
# just return the value.
|
150
|
+
if user[4]
|
151
|
+
@encryption_map.each do |key, value|
|
152
|
+
if value == user[4]
|
153
|
+
user[4] = key
|
154
|
+
break
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
hsh[:encryption] = user[4]
|
159
|
+
hsh[:secret] = user[5]
|
160
|
+
hsh[:sshkey] = user[6]
|
161
|
+
hsh
|
162
|
+
end
|
163
|
+
private :parse_user_entry
|
164
|
+
|
165
|
+
##
|
166
|
+
# create will create a new user name resource in the nodes current
|
167
|
+
# configuration with the specified user name. Creating users require
|
168
|
+
# either a secret (password) or the nopassword keyword to be specified.
|
169
|
+
# Optional parameters can be passed in to initialize user name specific
|
170
|
+
# settings.
|
171
|
+
#
|
172
|
+
# @eos_version 4.13.7M
|
173
|
+
#
|
174
|
+
# @commands
|
175
|
+
# username <name> nopassword privilege <value> role <value>
|
176
|
+
# username <name> secret [0,5,sha512] <secret> ...
|
177
|
+
#
|
178
|
+
# @param [String] :name The name of the user to create
|
179
|
+
#
|
180
|
+
# @param [hash] :opts Optional keyword arguments
|
181
|
+
#
|
182
|
+
# @option :opts [Boolean] :nopassword Configures the user to be able to
|
183
|
+
# authenticate without a password challenge
|
184
|
+
#
|
185
|
+
# @option :opts [String] :secret The secret (password) to assign to this
|
186
|
+
# user
|
187
|
+
#
|
188
|
+
# @option :opts [String] :encryption Specifies how the secret is encoded.
|
189
|
+
# Valid values are "cleartext", "md5", "sha512". The default is
|
190
|
+
# "cleartext"
|
191
|
+
#
|
192
|
+
# @option :opts [String] :privilege The privilege value to assign to
|
193
|
+
# the user
|
194
|
+
#
|
195
|
+
# @option :opts [String] :role The role value to assign to the user
|
196
|
+
#
|
197
|
+
# @option :opts [String] :sshkey The sshkey value to assign to the user
|
198
|
+
#
|
199
|
+
# @return [Boolean] returns true if the command completed successfully
|
200
|
+
def create(name, opts = {})
|
201
|
+
cmd = "username #{name}"
|
202
|
+
cmd << " privilege #{opts[:privilege]}" if opts[:privilege]
|
203
|
+
cmd << " role #{opts[:role]}" if opts[:role]
|
204
|
+
if opts[:nopassword] == :true
|
205
|
+
cmd << ' nopassword'
|
206
|
+
else
|
207
|
+
# Map the encryption value if set, if there is no mapping then
|
208
|
+
# just return the value.
|
209
|
+
enc = opts.fetch(:encryption, 'cleartext')
|
210
|
+
unless @encryption_map[enc]
|
211
|
+
fail ArgumentError, "invalid encryption value: #{enc}"
|
212
|
+
end
|
213
|
+
enc = @encryption_map[enc]
|
214
|
+
|
215
|
+
unless opts[:secret]
|
216
|
+
fail ArgumentError,
|
217
|
+
'secret must be specified if nopassword is false'
|
218
|
+
end
|
219
|
+
cmd << " secret #{enc} #{opts[:secret]}"
|
220
|
+
end
|
221
|
+
cmds = [cmd]
|
222
|
+
cmds << "username #{name} sshkey #{opts[:sshkey]}" if opts[:sshkey]
|
223
|
+
configure(cmds)
|
224
|
+
end
|
225
|
+
|
226
|
+
##
|
227
|
+
# delete will delete an existing user name from the nodes current
|
228
|
+
# running configuration. If the delete method is called and the user
|
229
|
+
# name does not exist, this method will succeed.
|
230
|
+
#
|
231
|
+
# @eos_version 4.13.7M
|
232
|
+
#
|
233
|
+
# @commands
|
234
|
+
# no username <name>
|
235
|
+
#
|
236
|
+
# @param [String] :name The user name to delete from the node.
|
237
|
+
#
|
238
|
+
# @return [Boolean] returns true if the command completed successfully
|
239
|
+
def delete(name)
|
240
|
+
configure("no username #{name}")
|
241
|
+
end
|
242
|
+
|
243
|
+
##
|
244
|
+
# default will configure the user name using the default keyword. This
|
245
|
+
# command has the same effect as deleting the user name from the nodes
|
246
|
+
# running configuration.
|
247
|
+
#
|
248
|
+
# @eos_version 4.13.7M
|
249
|
+
#
|
250
|
+
# @commands
|
251
|
+
# default username <name>
|
252
|
+
#
|
253
|
+
# @param [String] :name The user name to default in the nodes
|
254
|
+
# configuration.
|
255
|
+
#
|
256
|
+
# @return [Boolean] returns true if the command complete successfully
|
257
|
+
def default(name)
|
258
|
+
configure("default username #{name}")
|
259
|
+
end
|
260
|
+
|
261
|
+
##
|
262
|
+
# set_privilege configures the user privilege value for the specified user
|
263
|
+
# name in the nodes running configuration. If enable is false in the
|
264
|
+
# opts keyword Hash then the name value is negated using the no
|
265
|
+
# keyword. If the default keyword is set to true, then the privilege value
|
266
|
+
# is defaulted using the default keyword. The default keyword takes
|
267
|
+
# precedence over the enable keyword
|
268
|
+
#
|
269
|
+
# @eos_version 4.13.7M
|
270
|
+
#
|
271
|
+
# @commands
|
272
|
+
# username <name> privilege <value>
|
273
|
+
# no username <name> privilege <value>
|
274
|
+
# default username <name> privilege <value>
|
275
|
+
#
|
276
|
+
# @param [String] :name The user name to default in the nodes
|
277
|
+
# configuration.
|
278
|
+
#
|
279
|
+
# @param [Hash] :opts Optional keyword arguments
|
280
|
+
#
|
281
|
+
# @option :opts [String] :value The privilege value to assign to the user
|
282
|
+
#
|
283
|
+
# @option :opts [Boolean] :enable If false then the command is
|
284
|
+
# negated. Default is true.
|
285
|
+
#
|
286
|
+
# @option :opts [Boolean] :default Configure the user privilege value
|
287
|
+
# using the default keyword
|
288
|
+
#
|
289
|
+
# @return [Boolean] returns true if the command completed successfully
|
290
|
+
def set_privilege(name, opts = {})
|
291
|
+
configure(command_builder("username #{name} privilege", opts))
|
292
|
+
end
|
293
|
+
|
294
|
+
##
|
295
|
+
# set_role configures the user role value for the specified user
|
296
|
+
# name in the nodes running configuration. If enable is false in the
|
297
|
+
# opts keyword Hash then the name value is negated using the no
|
298
|
+
# keyword. If the default keyword is set to true, then the role value
|
299
|
+
# is defaulted using the default keyword. The default keyword takes
|
300
|
+
# precedence over the enable keyword
|
301
|
+
#
|
302
|
+
# @eos_version 4.13.7M
|
303
|
+
#
|
304
|
+
# @commands
|
305
|
+
# username <name> role <value>
|
306
|
+
# no username <name> role <value>
|
307
|
+
# default username <name> role <value>
|
308
|
+
#
|
309
|
+
# @param [String] :name The user name to default in the nodes
|
310
|
+
# configuration.
|
311
|
+
#
|
312
|
+
# @param [Hash] :opts Optional keyword arguments
|
313
|
+
#
|
314
|
+
# @option :opts [String] :value The role value to assign to the user
|
315
|
+
#
|
316
|
+
# @option :opts [Boolean] :enable If false then the command is
|
317
|
+
# negated. Default is true.
|
318
|
+
#
|
319
|
+
# @option :opts [Boolean] :default Configure the user role value
|
320
|
+
# using the default keyword
|
321
|
+
#
|
322
|
+
# @return [Boolean] returns true if the command completed successfully
|
323
|
+
def set_role(name, opts = {})
|
324
|
+
configure(command_builder("username #{name} role", opts))
|
325
|
+
end
|
326
|
+
|
327
|
+
##
|
328
|
+
# set_sshkey configures the user sshkey value for the specified user
|
329
|
+
# name in the nodes running configuration. If enable is false in the
|
330
|
+
# opts keyword Hash then the name value is negated using the no
|
331
|
+
# keyword. If the default keyword is set to true, then the sshkey value
|
332
|
+
# is defaulted using the default keyword. The default keyword takes
|
333
|
+
# precedence over the enable keyword
|
334
|
+
#
|
335
|
+
# @eos_version 4.13.7M
|
336
|
+
#
|
337
|
+
# @commands
|
338
|
+
# username <name> sshkey <value>
|
339
|
+
# no username <name> sshkey <value>
|
340
|
+
# default username <name> sshkey <value>
|
341
|
+
#
|
342
|
+
# @param [String] :name The user name to default in the nodes
|
343
|
+
# configuration.
|
344
|
+
#
|
345
|
+
# @param [Hash] :opts Optional keyword arguments
|
346
|
+
#
|
347
|
+
# @option :opts [String] :value The sshkey value to assign to the user
|
348
|
+
#
|
349
|
+
# @option :opts [Boolean] :enable If false then the command is
|
350
|
+
# negated. Default is true.
|
351
|
+
#
|
352
|
+
# @option :opts [Boolean] :default Configure the user sshkey value
|
353
|
+
# using the default keyword
|
354
|
+
#
|
355
|
+
# @return [Boolean] returns true if the command completed successfully
|
356
|
+
def set_sshkey(name, opts = {})
|
357
|
+
configure(command_builder("username #{name} sshkey", opts))
|
358
|
+
end
|
359
|
+
end
|
360
|
+
end
|
361
|
+
end
|
data/lib/rbeapi/api/varp.rb
CHANGED
@@ -54,15 +54,19 @@ module Rbeapi
|
|
54
54
|
# key / value pairs.
|
55
55
|
def get
|
56
56
|
response = {}
|
57
|
+
response.merge!(parse_mac_address(config))
|
58
|
+
response[:interfaces] = interfaces.getall
|
59
|
+
response
|
60
|
+
end
|
57
61
|
|
58
|
-
|
59
|
-
|
60
|
-
|
62
|
+
def parse_mac_address(config)
|
63
|
+
# ip virtual-router mac-address value will always
|
64
|
+
# be stored in aa:bb:cc:dd:ee:ff format
|
65
|
+
regex = /mac-address ((?:[a-f0-9]{2}:){5}[a-f0-9]{2})$/
|
61
66
|
mdata = regex.match(config)
|
62
|
-
|
63
|
-
response['interfaces'] = interfaces.getall
|
64
|
-
response
|
67
|
+
{ mac_address: mdata.nil? ? '' : mdata[1] }
|
65
68
|
end
|
69
|
+
private :parse_mac_address
|
66
70
|
|
67
71
|
def interfaces
|
68
72
|
return @interfaces if @interfaces
|
@@ -95,7 +99,6 @@ module Rbeapi
|
|
95
99
|
#
|
96
100
|
# Example
|
97
101
|
# {
|
98
|
-
# "name": <string>,
|
99
102
|
# "addresses": array<string>
|
100
103
|
# }
|
101
104
|
#
|
@@ -108,8 +111,8 @@ module Rbeapi
|
|
108
111
|
def get(name)
|
109
112
|
config = get_block("^interface #{name}")
|
110
113
|
return nil unless config
|
111
|
-
|
112
|
-
|
114
|
+
response = parse_addresses(config)
|
115
|
+
response
|
113
116
|
end
|
114
117
|
|
115
118
|
##
|
@@ -118,8 +121,8 @@ module Rbeapi
|
|
118
121
|
#
|
119
122
|
# Example
|
120
123
|
# {
|
121
|
-
#
|
122
|
-
#
|
124
|
+
# "name": {...},
|
125
|
+
# "name": {...}
|
123
126
|
# }
|
124
127
|
#
|
125
128
|
# @return [nil, Hash<String, String>] A Ruby hash that represents the
|
@@ -127,12 +130,20 @@ module Rbeapi
|
|
127
130
|
# interfaces are configured.
|
128
131
|
def getall
|
129
132
|
interfaces = config.scan(/(?<=^interface\s)(Vl.+)$/)
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
+
return nil unless interfaces
|
134
|
+
|
135
|
+
interfaces.each_with_object({}) do |name, resp|
|
136
|
+
data = get(name[0])
|
137
|
+
resp[name.first] = data if data
|
133
138
|
end
|
134
139
|
end
|
135
140
|
|
141
|
+
def parse_addresses(config)
|
142
|
+
addrs = config.scan(/(?<=\s{3}ip\svirtual-router\saddress\s).+$/)
|
143
|
+
{ addresses: addrs }
|
144
|
+
end
|
145
|
+
private :parse_addresses
|
146
|
+
|
136
147
|
##
|
137
148
|
# The set_addresses method assigns one or more virtual IPv4 address
|
138
149
|
# to the specified VLAN interface. All existing addresses are
|
@@ -153,29 +164,46 @@ module Rbeapi
|
|
153
164
|
value = opts[:value]
|
154
165
|
enable = opts.fetch(:enable, true)
|
155
166
|
default = opts[:default] || false
|
167
|
+
cmds = ["interface #{name}"]
|
156
168
|
|
157
169
|
case default
|
158
170
|
when true
|
159
|
-
|
171
|
+
cmds << 'default ip virtual-router address'
|
160
172
|
when false
|
161
|
-
|
162
|
-
result = remove_address(name, addr)
|
163
|
-
return result unless result
|
164
|
-
end
|
173
|
+
cmds << 'no ip virtual-router address'
|
165
174
|
if enable
|
175
|
+
fail ArgumentError,
|
176
|
+
'no values for addresses provided' unless value
|
166
177
|
value.each do |addr|
|
167
|
-
|
168
|
-
return result unless result
|
178
|
+
cmds << "ip virtual-router address #{addr}"
|
169
179
|
end
|
170
180
|
end
|
171
181
|
end
|
172
|
-
|
182
|
+
configure(cmds)
|
173
183
|
end
|
174
184
|
|
185
|
+
##
|
186
|
+
# The add_address method assigns one virtual IPv4 address
|
187
|
+
#
|
188
|
+
# @param [String] :name The name of the interface. The
|
189
|
+
# name argument must be the full interface name. Valid interfaces
|
190
|
+
# are restricted to VLAN interfaces
|
191
|
+
# @param [string] :address The virtual router address to add
|
192
|
+
#
|
193
|
+
# @return [Boolean] True if the commands succeeds otherwise False
|
175
194
|
def add_address(name, value)
|
176
195
|
configure(["interface #{name}", "ip virtual-router address #{value}"])
|
177
196
|
end
|
178
197
|
|
198
|
+
##
|
199
|
+
# The remove_address method removes one virtual IPv4 address
|
200
|
+
#
|
201
|
+
# @param [String] :name The name of the interface. The
|
202
|
+
# name argument must be the full interface name. Valid interfaces
|
203
|
+
# are restricted to VLAN interfaces
|
204
|
+
# @param [string] :address The virtual router address to remove
|
205
|
+
#
|
206
|
+
# @return [Boolean] True if the commands succeeds otherwise False
|
179
207
|
def remove_address(name, value)
|
180
208
|
configure(["interface #{name}",
|
181
209
|
"no ip virtual-router address #{value}"])
|