rbeapi 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +5 -0
- data/.rubocop.yml +21 -0
- data/CHANGELOG.md +24 -0
- data/Gemfile +3 -1
- data/Guardfile +3 -3
- data/README.md +92 -17
- data/Rakefile +99 -4
- data/gems/README.rst +4 -0
- data/gems/inifile/.gitignore +2 -0
- data/gems/inifile/README.rst +5 -0
- data/gems/inifile/inifile.spec.tmpl +84 -0
- data/gems/net_http_unix/.gitignore +2 -0
- data/gems/net_http_unix/README.rst +5 -0
- data/gems/net_http_unix/net_http_unix.spec.tmpl +54 -0
- data/gems/netaddr/README.rst +5 -0
- data/gems/netaddr/netaddr.spec.tmpl +50 -0
- data/lib/rbeapi/api/aaa.rb +14 -17
- data/lib/rbeapi/api/acl.rb +276 -0
- data/lib/rbeapi/api/dns.rb +7 -4
- data/lib/rbeapi/api/interfaces.rb +239 -239
- data/lib/rbeapi/api/ipinterfaces.rb +5 -3
- data/lib/rbeapi/api/logging.rb +8 -5
- data/lib/rbeapi/api/mlag.rb +45 -127
- data/lib/rbeapi/api/ntp.rb +1 -4
- data/lib/rbeapi/api/ospf.rb +16 -13
- data/lib/rbeapi/api/prefixlists.rb +4 -4
- data/lib/rbeapi/api/radius.rb +34 -25
- data/lib/rbeapi/api/routemaps.rb +16 -10
- data/lib/rbeapi/api/snmp.rb +26 -13
- data/lib/rbeapi/api/staticroutes.rb +6 -5
- data/lib/rbeapi/api/stp.rb +77 -18
- data/lib/rbeapi/api/switchports.rb +20 -12
- data/lib/rbeapi/api/system.rb +6 -6
- data/lib/rbeapi/api/tacacs.rb +9 -6
- data/lib/rbeapi/api/varp.rb +15 -10
- data/lib/rbeapi/api/vlans.rb +5 -6
- data/lib/rbeapi/api.rb +56 -16
- data/lib/rbeapi/client.rb +85 -50
- data/lib/rbeapi/eapilib.rb +95 -56
- data/lib/rbeapi/netdev/snmp.rb +7 -16
- data/lib/rbeapi/utils.rb +3 -5
- data/lib/rbeapi/version.rb +1 -1
- data/rbeapi.gemspec +4 -2
- data/rbeapi.spec.tmpl +72 -0
- data/spec/support/fixtures.rb +6 -4
- data/spec/support/shared_examples_for_api_modules.rb +3 -18
- data/spec/system/api_acl_spec.rb +128 -0
- data/spec/system/api_ospf_interfaces_spec.rb +17 -14
- data/spec/system/api_ospf_spec.rb +8 -8
- data/spec/system/api_varp_interfaces_spec.rb +22 -13
- data/spec/system/api_varp_spec.rb +1 -4
- data/spec/system/rbeapi/api/interfaces_base_spec.rb +3 -4
- data/spec/system/rbeapi/api/interfaces_ethernet_spec.rb +13 -9
- data/spec/system/rbeapi/api/interfaces_portchannel_spec.rb +43 -26
- data/spec/system/rbeapi/api/interfaces_vxlan_spec.rb +7 -6
- data/spec/system/rbeapi/api/ipinterfaces_spec.rb +34 -21
- data/spec/system/rbeapi/api/mlag_interfaces_spec.rb +15 -38
- data/spec/system/rbeapi/api/mlag_spec.rb +26 -30
- data/spec/system/rbeapi/api/snmp_spec.rb +0 -3
- data/spec/system/rbeapi/api/stp_instances_spec.rb +20 -12
- data/spec/system/rbeapi/api/stp_interfaces_spec.rb +1 -3
- data/spec/system/rbeapi/api/switchports_spec.rb +14 -12
- data/spec/system/rbeapi/api/system_spec.rb +0 -3
- data/spec/system/rbeapi/api/vlans_spec.rb +19 -9
- data/spec/unit/rbeapi/api/acl/default_spec.rb +158 -0
- data/spec/unit/rbeapi/api/acl/fixture_acl_standard.text +22 -0
- data/spec/unit/rbeapi/api/interfaces/base_spec.rb +123 -0
- data/spec/unit/rbeapi/api/interfaces/ethernet_spec.rb +89 -0
- data/spec/unit/rbeapi/api/interfaces/fixture_interfaces.text +219 -0
- data/spec/unit/rbeapi/api/interfaces/portchannel_spec.rb +149 -0
- data/spec/unit/rbeapi/api/interfaces/vxlan_spec.rb +243 -0
- data/spec/unit/rbeapi/api/mlag/default_spec.rb +218 -0
- data/spec/unit/rbeapi/api/mlag/fixture_mlag.text +238 -0
- data/spec/unit/rbeapi/api/vlans/default_spec.rb +135 -0
- data/spec/unit/rbeapi/api/vlans/fixture_vlans.text +5 -0
- metadata +79 -4
- data/lib/rbeapi/api/radius.rb.old +0 -399
@@ -31,16 +31,17 @@
|
|
31
31
|
#
|
32
32
|
require 'rbeapi/api'
|
33
33
|
|
34
|
+
##
|
35
|
+
# Rbeapi toplevel namespace
|
34
36
|
module Rbeapi
|
35
|
-
|
37
|
+
##
|
38
|
+
# Rbeapi::Api
|
36
39
|
module Api
|
37
|
-
|
38
40
|
##
|
39
41
|
# The Staticroute class provides a configuration instance for working
|
40
42
|
# with static routes in EOS.
|
41
43
|
#
|
42
44
|
class Staticroute < Entity
|
43
|
-
|
44
45
|
##
|
45
46
|
# Returns the static routes configured on the node
|
46
47
|
#
|
@@ -57,14 +58,14 @@ module Rbeapi
|
|
57
58
|
# there are no static routes configured, this method will return
|
58
59
|
# an empty hash
|
59
60
|
def getall
|
60
|
-
regex =
|
61
|
+
regex = /
|
61
62
|
(?<=^ip\sroute\s)
|
62
63
|
([^\s]+)\s # captures network
|
63
64
|
([^\s$]+) # captures next hop
|
64
65
|
(?:\s\d+) # non-capture metric
|
65
66
|
(?:\stag\s\d+) # non-catpure route tag
|
66
67
|
[\s|$]{1}(?:name\s(.+))? # capture route name
|
67
|
-
|
68
|
+
/x
|
68
69
|
|
69
70
|
routes = config.scan(regex)
|
70
71
|
|
data/lib/rbeapi/api/stp.rb
CHANGED
@@ -31,17 +31,16 @@
|
|
31
31
|
#
|
32
32
|
|
33
33
|
##
|
34
|
-
#
|
34
|
+
# Rbeapi toplevel namespace
|
35
35
|
module Rbeapi
|
36
36
|
##
|
37
|
-
#
|
37
|
+
# Rbeapi::Api
|
38
38
|
module Api
|
39
39
|
##
|
40
40
|
# The Stp class provides a base class instance for working with
|
41
41
|
# the EOS spanning-tree configuration
|
42
42
|
#
|
43
43
|
class Stp < Entity
|
44
|
-
|
45
44
|
##
|
46
45
|
# get returns the current stp configuration parsed from the nodes
|
47
46
|
# current running configuration.
|
@@ -65,7 +64,6 @@ module Rbeapi
|
|
65
64
|
response
|
66
65
|
end
|
67
66
|
|
68
|
-
|
69
67
|
##
|
70
68
|
# parse_mode scans the nodes running configuration and extracts the
|
71
69
|
# value of the spanning-tree mode. The spanning tree mode is
|
@@ -135,8 +133,11 @@ module Rbeapi
|
|
135
133
|
when true
|
136
134
|
cmd = 'default spanning-tree mode'
|
137
135
|
when false
|
138
|
-
|
139
|
-
|
136
|
+
if value
|
137
|
+
cmd = "spanning-tree mode #{value}"
|
138
|
+
else
|
139
|
+
cmd = 'no spanning-tree mode'
|
140
|
+
end
|
140
141
|
end
|
141
142
|
configure cmd
|
142
143
|
end
|
@@ -147,7 +148,6 @@ module Rbeapi
|
|
147
148
|
# spanning-tree instances in EOS
|
148
149
|
#
|
149
150
|
class StpInstances < Entity
|
150
|
-
|
151
151
|
DEFAULT_STP_PRIORITY = '32768'
|
152
152
|
|
153
153
|
##
|
@@ -215,10 +215,7 @@ module Rbeapi
|
|
215
215
|
#
|
216
216
|
# @return [Hash<Symbol, Object>] resource hash attribute
|
217
217
|
def parse_priority(inst)
|
218
|
-
priority_re =
|
219
|
-
(?<=^spanning-tree\smst\s#{inst}\spriority\s)
|
220
|
-
(.+$)
|
221
|
-
}x
|
218
|
+
priority_re = /(?<=^spanning-tree\smst\s#{inst}\spriority\s)(.+$)/x
|
222
219
|
mdata = priority_re.match(config)
|
223
220
|
{ priority: mdata.nil? ? DEFAULT_STP_PRIORITY : mdata[1] }
|
224
221
|
end
|
@@ -252,8 +249,11 @@ module Rbeapi
|
|
252
249
|
when true
|
253
250
|
cmd = "default spanning-tree mst #{inst} priority"
|
254
251
|
when false
|
255
|
-
|
256
|
-
|
252
|
+
if value
|
253
|
+
cmd = "spanning-tree mst #{inst} priority #{value}"
|
254
|
+
else
|
255
|
+
cmd = "no spanning-tree mst #{inst} priority"
|
256
|
+
end
|
257
257
|
end
|
258
258
|
configure cmd
|
259
259
|
end
|
@@ -264,7 +264,6 @@ module Rbeapi
|
|
264
264
|
# spanning-tree insterfaces in EOS
|
265
265
|
#
|
266
266
|
class StpInterfaces < Entity
|
267
|
-
|
268
267
|
##
|
269
268
|
# get returns the configured stp interfaces from the nodes running
|
270
269
|
# configuration as a resource hash. If the specified interface is not
|
@@ -284,6 +283,7 @@ module Rbeapi
|
|
284
283
|
return nil if /no switchport$/ =~ config
|
285
284
|
response = {}
|
286
285
|
response.merge!(parse_portfast(config))
|
286
|
+
response.merge!(parse_portfast_type(config))
|
287
287
|
response.merge!(parse_bpduguard(config))
|
288
288
|
response
|
289
289
|
end
|
@@ -325,6 +325,26 @@ module Rbeapi
|
|
325
325
|
end
|
326
326
|
private :parse_portfast
|
327
327
|
|
328
|
+
##
|
329
|
+
# parse_portfast_type scans the supplied interface configuration block
|
330
|
+
# and parses the value stp portfast type. The value of portfast type
|
331
|
+
# is either not set which implies normal (default), edge, or network.
|
332
|
+
#
|
333
|
+
# @api private
|
334
|
+
#
|
335
|
+
# @return [Hash<Symbol, Object>] resource hash attribute
|
336
|
+
def parse_portfast_type(config)
|
337
|
+
if /spanning-tree portfast network/ =~ config
|
338
|
+
value = 'network'
|
339
|
+
elsif /no spanning-tree portfast/ =~ config
|
340
|
+
value = 'normal'
|
341
|
+
else
|
342
|
+
value = 'edge'
|
343
|
+
end
|
344
|
+
{ portfast_type: value }
|
345
|
+
end
|
346
|
+
private :parse_portfast_type
|
347
|
+
|
328
348
|
##
|
329
349
|
# parse_bpduguard scans the supplied interface configuration block and
|
330
350
|
# parses the value of stp bpduguard. The value of bpduguard is either
|
@@ -337,6 +357,7 @@ module Rbeapi
|
|
337
357
|
val = /spanning-tree bpduguard enable/ =~ config
|
338
358
|
{ bpduguard: !val.nil? }
|
339
359
|
end
|
360
|
+
private :parse_bpduguard
|
340
361
|
|
341
362
|
##
|
342
363
|
# Configures the interface portfast value
|
@@ -356,12 +377,47 @@ module Rbeapi
|
|
356
377
|
when true
|
357
378
|
cmds << 'default spanning-tree portfast'
|
358
379
|
when false
|
359
|
-
|
360
|
-
|
380
|
+
if value
|
381
|
+
cmds << 'spanning-tree portfast'
|
382
|
+
else
|
383
|
+
cmds << 'no spanning-tree portfast'
|
384
|
+
end
|
361
385
|
end
|
362
386
|
configure(cmds)
|
363
387
|
end
|
364
388
|
|
389
|
+
##
|
390
|
+
# Configures the interface portfast type value
|
391
|
+
#
|
392
|
+
# @param [String] name The name of the interface to configure
|
393
|
+
# @param [Hash] opts The configuration parameters for portfast type
|
394
|
+
# @option opts [String] :value The value to set portfast type to.
|
395
|
+
# @option opts [Boolean] :default The value should be set to default
|
396
|
+
#
|
397
|
+
# @return [Boolean] True if the commands succeed otherwise False
|
398
|
+
def set_portfast_type(name, opts = {})
|
399
|
+
value = opts[:value]
|
400
|
+
default = opts[:default] || false
|
401
|
+
|
402
|
+
cmds = ["interface #{name}"]
|
403
|
+
case default
|
404
|
+
when true
|
405
|
+
cmds << 'default spanning-tree portfast normal'
|
406
|
+
when false
|
407
|
+
cmds << "spanning-tree portfast #{value}"
|
408
|
+
end
|
409
|
+
configure(cmds)
|
410
|
+
end
|
411
|
+
|
412
|
+
##
|
413
|
+
# Configures the interface bpdu guard value
|
414
|
+
#
|
415
|
+
# @param [String] name The name of the interface to configure
|
416
|
+
# @param [Hash] opts The configuration parameters for bpduguard
|
417
|
+
# @option opts [Boolean] :value The value to set bpduguard
|
418
|
+
# @option opts [Boolean] :default The value should be set to default
|
419
|
+
#
|
420
|
+
# @return [Boolean] True if the commands succeed otherwise False
|
365
421
|
def set_bpduguard(name, opts = {})
|
366
422
|
value = opts[:value]
|
367
423
|
default = opts[:default] || false
|
@@ -371,8 +427,11 @@ module Rbeapi
|
|
371
427
|
when true
|
372
428
|
cmds << 'default spanning-tree bpduguard'
|
373
429
|
when false
|
374
|
-
|
375
|
-
|
430
|
+
if value
|
431
|
+
cmds << 'spanning-tree bpduguard enable'
|
432
|
+
else
|
433
|
+
cmds << 'spanning-tree bpduguard disable'
|
434
|
+
end
|
376
435
|
end
|
377
436
|
configure(cmds)
|
378
437
|
end
|
@@ -31,16 +31,17 @@
|
|
31
31
|
#
|
32
32
|
require 'rbeapi/api'
|
33
33
|
|
34
|
+
##
|
35
|
+
# Rbeapi toplevel namespace
|
34
36
|
module Rbeapi
|
35
37
|
##
|
36
|
-
#
|
38
|
+
# Api is module namesapce for working with the EOS command API
|
37
39
|
module Api
|
38
40
|
##
|
39
41
|
# The Switchport class provides a base class instance for working with
|
40
42
|
# logical layer-2 interfaces.
|
41
43
|
#
|
42
44
|
class Switchports < Entity
|
43
|
-
|
44
45
|
##
|
45
46
|
# Retrieves the properies for a logical switchport from the
|
46
47
|
# running-config using eAPI
|
@@ -162,8 +163,11 @@ module Rbeapi
|
|
162
163
|
when true
|
163
164
|
cmds << 'default switchport mode'
|
164
165
|
when false
|
165
|
-
|
166
|
-
|
166
|
+
if value.nil?
|
167
|
+
cmds << 'no switchport mode'
|
168
|
+
else
|
169
|
+
cmds << "switchport mode #{value}"
|
170
|
+
end
|
167
171
|
end
|
168
172
|
configure(cmds)
|
169
173
|
end
|
@@ -195,9 +199,7 @@ module Rbeapi
|
|
195
199
|
value = opts[:value]
|
196
200
|
default = opts[:default] || false
|
197
201
|
|
198
|
-
unless value.is_a?(Array)
|
199
|
-
raise ArgumentError, 'value must be an Array'
|
200
|
-
end
|
202
|
+
fail ArgumentError, 'value must be an Array' unless value.is_a?(Array)
|
201
203
|
|
202
204
|
value = value.map(&:inspect).join(',') if value
|
203
205
|
|
@@ -210,7 +212,7 @@ module Rbeapi
|
|
210
212
|
cmds << 'no switchport trunk allowed vlan'
|
211
213
|
else
|
212
214
|
cmds << 'switchport trunk allowed vlan none'
|
213
|
-
cmds << "switchport trunk allowed vlan
|
215
|
+
cmds << "switchport trunk allowed vlan #{value}"
|
214
216
|
end
|
215
217
|
end
|
216
218
|
configure(cmds)
|
@@ -236,8 +238,11 @@ module Rbeapi
|
|
236
238
|
when true
|
237
239
|
cmds << 'default switchport trunk native vlan'
|
238
240
|
when false
|
239
|
-
|
240
|
-
|
241
|
+
if value.nil?
|
242
|
+
cmds << 'no switchport trunk native vlan'
|
243
|
+
else
|
244
|
+
cmds << "switchport trunk native vlan #{value}"
|
245
|
+
end
|
241
246
|
end
|
242
247
|
configure(cmds)
|
243
248
|
end
|
@@ -262,8 +267,11 @@ module Rbeapi
|
|
262
267
|
when true
|
263
268
|
cmds << 'default switchport access vlan'
|
264
269
|
when false
|
265
|
-
|
266
|
-
|
270
|
+
if value.nil?
|
271
|
+
cmds << 'no switchport access vlan'
|
272
|
+
else
|
273
|
+
cmds << "switchport access vlan #{value}"
|
274
|
+
end
|
267
275
|
end
|
268
276
|
configure(cmds)
|
269
277
|
end
|
data/lib/rbeapi/api/system.rb
CHANGED
@@ -31,15 +31,16 @@
|
|
31
31
|
#
|
32
32
|
require 'rbeapi/api'
|
33
33
|
|
34
|
+
##
|
35
|
+
# Rbeapi toplevel namespace
|
34
36
|
module Rbeapi
|
35
|
-
|
37
|
+
##
|
38
|
+
# Rbeapi::Api
|
36
39
|
module Api
|
37
|
-
|
38
40
|
##
|
39
41
|
# The System class configures the node system services such as
|
40
42
|
# hostname and domain name
|
41
43
|
class System < Entity
|
42
|
-
|
43
44
|
##
|
44
45
|
# Returns the system settings
|
45
46
|
#
|
@@ -50,7 +51,7 @@ module Rbeapi
|
|
50
51
|
#
|
51
52
|
# @return [Hash] A Ruby hash objec that provides the system settings as
|
52
53
|
# key/value pairs.
|
53
|
-
def get
|
54
|
+
def get
|
54
55
|
response = {}
|
55
56
|
response.merge!(parse_hostname(config))
|
56
57
|
response
|
@@ -77,8 +78,7 @@ module Rbeapi
|
|
77
78
|
when true
|
78
79
|
cmds = ['default hostname']
|
79
80
|
when false
|
80
|
-
cmds = (value.nil? ? 'no hostname' :
|
81
|
-
"hostname #{value}")
|
81
|
+
cmds = (value.nil? ? 'no hostname' : "hostname #{value}")
|
82
82
|
end
|
83
83
|
configure(cmds)
|
84
84
|
end
|
data/lib/rbeapi/api/tacacs.rb
CHANGED
@@ -31,16 +31,16 @@
|
|
31
31
|
#
|
32
32
|
require 'rbeapi/api'
|
33
33
|
|
34
|
+
##
|
35
|
+
# Rbeapi toplevel namespace
|
34
36
|
module Rbeapi
|
35
37
|
##
|
36
|
-
#
|
38
|
+
# Api is module namesapce for working with the EOS command API
|
37
39
|
module Api
|
38
|
-
|
39
40
|
##
|
40
41
|
# Tacacs provides instance methods to retrieve and set tacacs configuration
|
41
42
|
# values.
|
42
43
|
class Tacacs < Entity
|
43
|
-
|
44
44
|
DEFAULT_KEY_FORMAT = 0
|
45
45
|
DEFAULT_KEY = nil
|
46
46
|
|
@@ -192,10 +192,13 @@ module Rbeapi
|
|
192
192
|
|
193
193
|
case default
|
194
194
|
when true
|
195
|
-
|
195
|
+
cmds = 'default tacacs-server timeout'
|
196
196
|
when false
|
197
|
-
|
198
|
-
|
197
|
+
if value
|
198
|
+
cmds = "tacacs-server timeout #{value}"
|
199
|
+
else
|
200
|
+
cmds = 'no tacacs-server timeout'
|
201
|
+
end
|
199
202
|
end
|
200
203
|
configure cmds
|
201
204
|
end
|
data/lib/rbeapi/api/varp.rb
CHANGED
@@ -31,15 +31,16 @@
|
|
31
31
|
#
|
32
32
|
require 'rbeapi/api'
|
33
33
|
|
34
|
+
##
|
35
|
+
# Rbeapi toplevel namespace
|
34
36
|
module Rbeapi
|
35
|
-
|
37
|
+
##
|
38
|
+
# Rbeapi::Api
|
36
39
|
module Api
|
37
|
-
|
38
40
|
##
|
39
41
|
# The Varp class provides an instance for working with the global
|
40
42
|
# VARP configuration of the node
|
41
43
|
class Varp < Entity
|
42
|
-
|
43
44
|
##
|
44
45
|
# Returns the global VARP configuration from the node
|
45
46
|
#
|
@@ -54,10 +55,8 @@ module Rbeapi
|
|
54
55
|
def get
|
55
56
|
response = {}
|
56
57
|
|
57
|
-
regex =
|
58
|
-
(
|
59
|
-
((?:[a-f0-9]{2}:){5}[a-f0-9]{2})$
|
60
|
-
}x
|
58
|
+
regex = /(?<=^ip\svirtual-router\smac-address\s)
|
59
|
+
((?:[a-f0-9]{2}:){5}[a-f0-9]{2})$/x
|
61
60
|
|
62
61
|
mdata = regex.match(config)
|
63
62
|
response['mac_address'] = mdata.nil? ? '' : mdata[1]
|
@@ -87,13 +86,19 @@ module Rbeapi
|
|
87
86
|
when true
|
88
87
|
cmds = ['default ip virtual-router mac-address']
|
89
88
|
when false
|
90
|
-
|
91
|
-
|
89
|
+
if value
|
90
|
+
cmds = "ip virtual-router mac-address #{value}"
|
91
|
+
else
|
92
|
+
cmds = 'no ip virtual-router mac-address'
|
93
|
+
end
|
92
94
|
end
|
93
95
|
configure(cmds)
|
94
96
|
end
|
95
97
|
end
|
96
98
|
|
99
|
+
##
|
100
|
+
# The VarpInterfaces class provides an instance for working with the global
|
101
|
+
# VARP interface configuration of the node
|
97
102
|
class VarpInterfaces < Entity
|
98
103
|
##
|
99
104
|
# Returns a single VARP interface configuration
|
@@ -165,7 +170,7 @@ module Rbeapi
|
|
165
170
|
return result unless result
|
166
171
|
end
|
167
172
|
end
|
168
|
-
|
173
|
+
true
|
169
174
|
end
|
170
175
|
|
171
176
|
def add_address(name, value)
|
data/lib/rbeapi/api/vlans.rb
CHANGED
@@ -31,12 +31,12 @@
|
|
31
31
|
#
|
32
32
|
require 'rbeapi/api'
|
33
33
|
|
34
|
+
##
|
35
|
+
# Rbeapi toplevel namespace
|
34
36
|
module Rbeapi
|
35
|
-
|
36
37
|
##
|
37
38
|
# Api is module namesapce for working with the EOS command API
|
38
39
|
module Api
|
39
|
-
|
40
40
|
##
|
41
41
|
# The Vlan class provides a class implementation for working with the
|
42
42
|
# collection of Vlans on the node. This class presents an abstraction
|
@@ -44,7 +44,6 @@ module Rbeapi
|
|
44
44
|
#
|
45
45
|
# @eos_version 4.13.7M
|
46
46
|
class Vlans < Entity
|
47
|
-
|
48
47
|
##
|
49
48
|
# get returns the specified vlan resource Hash that represents the
|
50
49
|
# nodes current vlan configuration.
|
@@ -106,7 +105,7 @@ module Rbeapi
|
|
106
105
|
#
|
107
106
|
# @return [Hash<Symbol, Object>] resource hash attribute
|
108
107
|
def parse_name(config)
|
109
|
-
mdata = /name (
|
108
|
+
mdata = /name ([^\s]+)$/.match(config)
|
110
109
|
{ name: mdata[1] }
|
111
110
|
end
|
112
111
|
private :parse_name
|
@@ -236,7 +235,7 @@ module Rbeapi
|
|
236
235
|
when true
|
237
236
|
cmds << 'default name'
|
238
237
|
when false
|
239
|
-
cmds << (value.nil? ?
|
238
|
+
cmds << (value.nil? ? 'no name' : "name #{value}")
|
240
239
|
end
|
241
240
|
configure(cmds)
|
242
241
|
end
|
@@ -278,7 +277,7 @@ module Rbeapi
|
|
278
277
|
default = opts[:default] || false
|
279
278
|
|
280
279
|
unless ['active', 'suspend', nil].include?(value)
|
281
|
-
|
280
|
+
fail ArgumentError, 'state must be active, suspend or nil'
|
282
281
|
end
|
283
282
|
|
284
283
|
cmds = ["vlan #{id}"]
|
data/lib/rbeapi/api.rb
CHANGED
@@ -31,20 +31,24 @@
|
|
31
31
|
#
|
32
32
|
require 'rbeapi/eapilib'
|
33
33
|
|
34
|
+
##
|
35
|
+
# Rbeapi toplevel namespace
|
34
36
|
module Rbeapi
|
35
|
-
|
37
|
+
##
|
38
|
+
# Rbeapi::Api
|
36
39
|
module Api
|
37
|
-
|
40
|
+
##
|
41
|
+
# The Entity class provides a base class implementation for building
|
42
|
+
# API modules. The Entity class is typcially not instantiated directly
|
43
|
+
# but serves as a super class with convenience methods used to
|
44
|
+
# work with the node.
|
38
45
|
class Entity
|
39
|
-
|
40
46
|
attr_reader :error
|
41
47
|
attr_reader :config
|
42
48
|
attr_reader :node
|
43
49
|
|
44
50
|
##
|
45
|
-
#
|
46
|
-
# object. It works in conjunction with the Node.api loader method
|
47
|
-
# to make it easy to load classes derived from Entity
|
51
|
+
# Construct the node.
|
48
52
|
#
|
49
53
|
# @param [Node] :node An instance of Rbeapi::Client::Node used to
|
50
54
|
# send and receive eAPI messages
|
@@ -61,7 +65,7 @@ module Rbeapi
|
|
61
65
|
# @param [Node] :node This should be an instance of Rbeapi::Client::Node
|
62
66
|
# that is used to send and receive eAPI messages
|
63
67
|
#
|
64
|
-
def initialize(node
|
68
|
+
def initialize(node)
|
65
69
|
@node = node
|
66
70
|
end
|
67
71
|
|
@@ -72,7 +76,7 @@ module Rbeapi
|
|
72
76
|
#
|
73
77
|
# @return [String] The current running-config from the node
|
74
78
|
def config
|
75
|
-
|
79
|
+
@node.running_config
|
76
80
|
end
|
77
81
|
|
78
82
|
##
|
@@ -82,7 +86,7 @@ module Rbeapi
|
|
82
86
|
# @return [Rbeapi::Eapilib::CommandError] An instance of CommandError
|
83
87
|
# that can be used to futher evaluate the root cause of an error
|
84
88
|
def error
|
85
|
-
|
89
|
+
@node.connection.error
|
86
90
|
end
|
87
91
|
|
88
92
|
##
|
@@ -105,7 +109,7 @@ module Rbeapi
|
|
105
109
|
return nil unless mdata
|
106
110
|
|
107
111
|
_, block_end = mdata.offset(0)
|
108
|
-
block_end
|
112
|
+
block_end -= block_start
|
109
113
|
|
110
114
|
config[block_start, block_end]
|
111
115
|
end
|
@@ -122,14 +126,50 @@ module Rbeapi
|
|
122
126
|
# returns False if there was an error issuing the commands on the
|
123
127
|
# node. Use error to further investigate the cause of any errors
|
124
128
|
def configure(commands)
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
129
|
+
@node.config(commands)
|
130
|
+
return true
|
131
|
+
rescue Rbeapi::Eapilib::CommandError, Rbeapi::Eapilib::ConnectionError
|
132
|
+
return false
|
133
|
+
end
|
134
|
+
|
135
|
+
##
|
136
|
+
# command_builder builds the correct version of a command based on the
|
137
|
+
# configuration options. If the value option is not provided then the
|
138
|
+
# no keyword is used to build the command. If the default value is
|
139
|
+
# provided and set to true, then the default keyword is used. If both
|
140
|
+
# options are provided, then the default option will take precedence.
|
141
|
+
#
|
142
|
+
# @return [String]
|
143
|
+
def command_builder(cmd, opts = {})
|
144
|
+
value = opts[:value]
|
145
|
+
default = opts.fetch(:default, false)
|
146
|
+
case default
|
147
|
+
when true then "default #{cmd}"
|
148
|
+
when false
|
149
|
+
case value
|
150
|
+
when nil, false then "no #{cmd}"
|
151
|
+
when true then cmd
|
152
|
+
else "#{cmd} #{value}"
|
153
|
+
end
|
130
154
|
end
|
131
155
|
end
|
156
|
+
|
157
|
+
##
|
158
|
+
# configure_interface sends the commands over eAPI to the desitnation
|
159
|
+
# node to configure a specific interface.
|
160
|
+
#
|
161
|
+
# @param [String] :name The interface name to apply the configuration
|
162
|
+
# to. The name value must be the full interface identifier
|
163
|
+
#
|
164
|
+
# @param [Array] :commands The list of commands to configure the
|
165
|
+
# interface
|
166
|
+
#
|
167
|
+
# @return [Boolean] Returns true if the commands complete successfully
|
168
|
+
def configure_interface(name, commands)
|
169
|
+
commands = [*commands]
|
170
|
+
commands.insert(0, "interface #{name}")
|
171
|
+
configure commands
|
172
|
+
end
|
132
173
|
end
|
133
174
|
end
|
134
175
|
end
|
135
|
-
|