rbeapi 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/CHANGELOG.md +20 -0
- data/Gemfile +1 -1
- data/README.md +11 -11
- data/Rakefile +19 -0
- data/guide/Makefile +177 -0
- data/guide/_static/arista_logo_11-trans-w.png +0 -0
- data/guide/_static/arista_logo_jpg-11.jpg +0 -0
- data/guide/_static/favicon.ico +0 -0
- data/guide/conf.py +279 -0
- data/guide/cookbook.rst +4 -0
- data/guide/developing.rst +4 -0
- data/guide/faq.rst +4 -0
- data/guide/index.rst +23 -0
- data/guide/installation.rst +4 -0
- data/guide/license.rst +5 -0
- data/guide/overview.rst +20 -0
- data/guide/quickstart.rst +4 -0
- data/guide/release-notes-0.5.0.rst +60 -0
- data/guide/release-notes.rst +6 -0
- data/guide/testing.rst +4 -0
- data/guide/troubleshooting.rst +1 -0
- data/lib/rbeapi/api/aaa.rb +54 -18
- data/lib/rbeapi/api/acl.rb +60 -2
- data/lib/rbeapi/api/bgp.rb +81 -0
- data/lib/rbeapi/api/dns.rb +48 -2
- data/lib/rbeapi/api/interfaces.rb +97 -32
- data/lib/rbeapi/api/ipinterfaces.rb +13 -2
- data/lib/rbeapi/api/logging.rb +11 -2
- data/lib/rbeapi/api/mlag.rb +20 -10
- data/lib/rbeapi/api/ntp.rb +4 -3
- data/lib/rbeapi/api/ospf.rb +102 -10
- data/lib/rbeapi/api/prefixlists.rb +47 -4
- data/lib/rbeapi/api/radius.rb +9 -9
- data/lib/rbeapi/api/routemaps.rb +7 -5
- data/lib/rbeapi/api/snmp.rb +13 -4
- data/lib/rbeapi/api/staticroutes.rb +1 -1
- data/lib/rbeapi/api/stp.rb +39 -14
- data/lib/rbeapi/api/switchports.rb +126 -2
- data/lib/rbeapi/api/system.rb +24 -3
- data/lib/rbeapi/api/tacacs.rb +9 -10
- data/lib/rbeapi/api/users.rb +12 -3
- data/lib/rbeapi/api/varp.rb +40 -8
- data/lib/rbeapi/api/vlans.rb +15 -5
- data/lib/rbeapi/client.rb +19 -11
- data/lib/rbeapi/eapilib.rb +8 -0
- data/lib/rbeapi/utils.rb +10 -0
- data/lib/rbeapi/version.rb +1 -1
- data/spec/fixtures/eapi.conf.yaml +6 -0
- data/spec/fixtures/empty.conf +0 -0
- data/spec/fixtures/env_path.conf +5 -0
- data/spec/fixtures/test.conf +39 -0
- data/spec/fixtures/wildcard.conf +43 -0
- data/spec/system/rbeapi/api/aaa_groups_spec.rb +122 -0
- data/spec/system/rbeapi/api/aaa_spec.rb +90 -0
- data/spec/system/{api_acl_spec.rb → rbeapi/api/acl_spec.rb} +0 -0
- data/spec/system/rbeapi/api/bgp_neighbors_spec.rb +354 -0
- data/spec/system/rbeapi/api/bgp_spec.rb +275 -0
- data/spec/system/rbeapi/api/dns_spec.rb +17 -1
- data/spec/system/rbeapi/api/interfaces_base_spec.rb +46 -5
- data/spec/system/rbeapi/api/interfaces_ethernet_spec.rb +14 -0
- data/spec/system/rbeapi/api/interfaces_portchannel_spec.rb +68 -0
- data/spec/system/rbeapi/api/interfaces_vxlan_spec.rb +0 -1
- data/spec/system/{api_ospf_interfaces_spec.rb → rbeapi/api/ospf_interfaces_spec.rb} +3 -2
- data/spec/system/{api_ospf_spec.rb → rbeapi/api/ospf_spec.rb} +11 -2
- data/spec/system/rbeapi/api/routemaps_spec.rb +3 -4
- data/spec/system/rbeapi/api/snmp_spec.rb +65 -0
- data/spec/system/rbeapi/api/staticroutes_spec.rb +177 -0
- data/spec/system/rbeapi/api/stp_instances_spec.rb +20 -0
- data/spec/system/rbeapi/api/stp_interfaces_spec.rb +7 -0
- data/spec/system/rbeapi/api/switchports_spec.rb +86 -16
- data/spec/system/rbeapi/api/users_spec.rb +324 -0
- data/spec/system/rbeapi/api/varp_interfaces_spec.rb +34 -0
- data/spec/system/rbeapi/api/vrrp_spec.rb +707 -0
- data/spec/system/rbeapi/client_spec.rb +367 -0
- data/spec/unit/rbeapi/api/aaa/aaa_groups_spec.rb +111 -0
- data/spec/unit/rbeapi/api/aaa/aaa_spec.rb +77 -0
- data/spec/unit/rbeapi/api/aaa/fixture_aaa.text +3 -0
- data/spec/unit/rbeapi/api/switchports/default_spec.rb +249 -0
- data/spec/unit/rbeapi/api/switchports/fixture_switchports.text +284 -0
- data/spec/unit/rbeapi/api/users/default_spec.rb +1 -1
- data/spec/unit/rbeapi/client_spec.rb +211 -0
- metadata +65 -10
data/lib/rbeapi/api/dns.rb
CHANGED
@@ -35,13 +35,13 @@ require 'rbeapi/api'
|
|
35
35
|
# Rbeapi toplevel namespace
|
36
36
|
module Rbeapi
|
37
37
|
##
|
38
|
-
#
|
38
|
+
# Api is module namespace for working with the EOS command API
|
39
39
|
module Api
|
40
40
|
##
|
41
41
|
# The Dns class manages DNS settings on an EOS node.
|
42
42
|
class Dns < Entity
|
43
43
|
##
|
44
|
-
#
|
44
|
+
# get returns the DNS resource
|
45
45
|
#
|
46
46
|
# @example
|
47
47
|
# {
|
@@ -60,21 +60,43 @@ module Rbeapi
|
|
60
60
|
response
|
61
61
|
end
|
62
62
|
|
63
|
+
##
|
64
|
+
# parse_domain_name parses the domain-name from config
|
65
|
+
#
|
66
|
+
# @api private
|
67
|
+
#
|
68
|
+
# @return [Hash<Symbol, Object>] resource hash attribute
|
63
69
|
def parse_domain_name
|
64
70
|
mdata = /ip domain-name ([\w.]+)/.match(config)
|
65
71
|
{ domain_name: mdata.nil? ? '' : mdata[1] }
|
66
72
|
end
|
73
|
+
private :parse_domain_name
|
67
74
|
|
75
|
+
##
|
76
|
+
# parse_name_servers parses the name-server values from
|
77
|
+
# config
|
78
|
+
#
|
79
|
+
# @api private
|
80
|
+
#
|
81
|
+
# @return [Hash<Symbol, Array>] resource hash attribute
|
68
82
|
def parse_name_servers
|
69
83
|
servers = config.scan(/(?:ip name-server vrf )(?:\w+)\s(.+)/)
|
70
84
|
values = servers.each_with_object([]) { |srv, arry| arry << srv.first }
|
71
85
|
{ name_servers: values }
|
72
86
|
end
|
87
|
+
private :parse_name_servers
|
73
88
|
|
89
|
+
##
|
90
|
+
# parse_domain_list parses the domain-list from config
|
91
|
+
#
|
92
|
+
# @api private
|
93
|
+
#
|
94
|
+
# @return [Hash<Symbol, Object>] resource hash attribute
|
74
95
|
def parse_domain_list
|
75
96
|
search = config.scan(/(?<=^ip\sdomain-list\s).+$/)
|
76
97
|
{ domain_list: search }
|
77
98
|
end
|
99
|
+
private :parse_domain_list
|
78
100
|
|
79
101
|
##
|
80
102
|
# Configure the domain-name value in the running-config
|
@@ -135,10 +157,22 @@ module Rbeapi
|
|
135
157
|
configure cmds
|
136
158
|
end
|
137
159
|
|
160
|
+
##
|
161
|
+
# add_name_server adds an ip name-server.
|
162
|
+
#
|
163
|
+
# @param [String] :server The name of the ip name-server to create
|
164
|
+
#
|
165
|
+
# @return [Boolean] returns true if the command completed successfully
|
138
166
|
def add_name_server(server)
|
139
167
|
configure "ip name-server #{server}"
|
140
168
|
end
|
141
169
|
|
170
|
+
##
|
171
|
+
# remove_name_server removes the specified ip name-server.
|
172
|
+
#
|
173
|
+
# @param [String] :server The name of the ip name-server to remove
|
174
|
+
#
|
175
|
+
# @return [Boolean] returns true if the command completed successfully
|
142
176
|
def remove_name_server(server)
|
143
177
|
configure "no ip name-server #{server}"
|
144
178
|
end
|
@@ -190,10 +224,22 @@ module Rbeapi
|
|
190
224
|
configure cmds
|
191
225
|
end
|
192
226
|
|
227
|
+
##
|
228
|
+
# add_domain_list adds an ip domain-list.
|
229
|
+
#
|
230
|
+
# @param [String] :name The name of the ip domain-list to add
|
231
|
+
#
|
232
|
+
# @return [Boolean] returns true if the command completed successfully
|
193
233
|
def add_domain_list(name)
|
194
234
|
configure "ip domain-list #{name}"
|
195
235
|
end
|
196
236
|
|
237
|
+
##
|
238
|
+
# remove_domain_list removes a specified ip domain-list.
|
239
|
+
#
|
240
|
+
# @param [String] :name The name of the ip domain-list to remove
|
241
|
+
#
|
242
|
+
# @return [Boolean] returns true if the command completed successfully
|
197
243
|
def remove_domain_list(name)
|
198
244
|
configure "no ip domain-list #{name}"
|
199
245
|
end
|
@@ -36,7 +36,7 @@ require 'rbeapi/utils'
|
|
36
36
|
# Rbeapi toplevel namespace
|
37
37
|
module Rbeapi
|
38
38
|
##
|
39
|
-
# Api module namespace
|
39
|
+
# Api is module namespace for working with the EOS command API
|
40
40
|
module Api
|
41
41
|
##
|
42
42
|
# The Interfaces class manages all physical and logical interfaces on an
|
@@ -47,10 +47,52 @@ module Rbeapi
|
|
47
47
|
@instances = {}
|
48
48
|
end
|
49
49
|
|
50
|
+
##
|
51
|
+
# get returns a hash of interface configurations for the given name
|
52
|
+
#
|
53
|
+
# @example
|
54
|
+
# {
|
55
|
+
# name: <string>,
|
56
|
+
# type: <string>,
|
57
|
+
# description: <string>,
|
58
|
+
# shutdown: <boolean>
|
59
|
+
# }
|
60
|
+
#
|
61
|
+
# @param [String] :name The interface name to return a resource for from
|
62
|
+
# the nodes configuration
|
63
|
+
#
|
64
|
+
# @return [nil, Hash<Symbol, Object>] Returns the interface resource as a
|
65
|
+
# Hash. If the specified name is not found in the nodes current
|
66
|
+
# configuration a nil object is returned
|
50
67
|
def get(name)
|
51
68
|
get_instance(name).get(name)
|
52
69
|
end
|
53
70
|
|
71
|
+
##
|
72
|
+
# getall returns a hash of interface configurations
|
73
|
+
#
|
74
|
+
# @example
|
75
|
+
# {
|
76
|
+
# <name>: {
|
77
|
+
# name: <string>,
|
78
|
+
# type: <string>,
|
79
|
+
# description: <string>,
|
80
|
+
# shutdown: <boolean>,
|
81
|
+
# ...
|
82
|
+
# },
|
83
|
+
# <name>: {
|
84
|
+
# name: <string>,
|
85
|
+
# type: <string>,
|
86
|
+
# description: <string>,
|
87
|
+
# shutdown: <boolean>,
|
88
|
+
# ...
|
89
|
+
# },
|
90
|
+
# ...
|
91
|
+
# }
|
92
|
+
#
|
93
|
+
# @return [Hash<Symbol, Object>] Returns the interface resources as a
|
94
|
+
# Hash. If none exist in the nodes current
|
95
|
+
# configuration an empty hash is returned
|
54
96
|
def getall
|
55
97
|
interfaces = config.scan(/(?<=^interface\s).+$/)
|
56
98
|
|
@@ -60,6 +102,13 @@ module Rbeapi
|
|
60
102
|
end
|
61
103
|
end
|
62
104
|
|
105
|
+
##
|
106
|
+
# get_instance returns an interface instance for the given name
|
107
|
+
#
|
108
|
+
# @param [String] :name The interface name to return an instance for
|
109
|
+
#
|
110
|
+
# @return [Object] Returns the interface instance as an
|
111
|
+
# Object.
|
63
112
|
def get_instance(name)
|
64
113
|
name = name[0, 2].upcase
|
65
114
|
case name
|
@@ -287,20 +336,18 @@ module Rbeapi
|
|
287
336
|
# get returns the specified Ethernet interface resource hash that
|
288
337
|
# represents the interface's current configuration in the node.
|
289
338
|
#
|
290
|
-
#
|
291
|
-
#
|
292
|
-
#
|
293
|
-
#
|
294
|
-
#
|
295
|
-
#
|
296
|
-
#
|
297
|
-
#
|
298
|
-
#
|
299
|
-
#
|
300
|
-
#
|
301
|
-
#
|
302
|
-
# * flowconrol_receive (string): the interface flowcontrol receive
|
303
|
-
# value. Valid values are 'on' or 'off'
|
339
|
+
# @example
|
340
|
+
# {
|
341
|
+
# name: <string>,
|
342
|
+
# type: <string>,
|
343
|
+
# description: <string>,
|
344
|
+
# shutdown: <boolean>,
|
345
|
+
# speed: <string>,
|
346
|
+
# forced: <boolean>,
|
347
|
+
# sflow: <boolean>,
|
348
|
+
# flowcontrol_send: <string>,
|
349
|
+
# flowcontrol_receive: <string>
|
350
|
+
# }
|
304
351
|
#
|
305
352
|
# @param [String] :name The interface name to return a resource hash
|
306
353
|
# for from the node's running configuration
|
@@ -319,7 +366,6 @@ module Rbeapi
|
|
319
366
|
response.merge!(parse_sflow(config))
|
320
367
|
response.merge!(parse_flowcontrol_send(config))
|
321
368
|
response.merge!(parse_flowcontrol_receive(config))
|
322
|
-
|
323
369
|
response
|
324
370
|
end
|
325
371
|
|
@@ -773,24 +819,41 @@ module Rbeapi
|
|
773
819
|
# @param [Array] :members The array of physical interface members to add
|
774
820
|
# to the port-channel logical interface.
|
775
821
|
#
|
822
|
+
# @param [str] :mode The LACP mode to configure the member interfaces to.
|
823
|
+
# Valid values are 'on, 'passive', 'active'. When there are
|
824
|
+
# existing channel-group members and their lacp mode differs
|
825
|
+
# from this attribute, all of those members will be removed and
|
826
|
+
# then re-added using the specified lacp mode. If this attribute
|
827
|
+
# is omitted, the existing lacp mode will be used for new
|
828
|
+
# member additions.
|
829
|
+
#
|
776
830
|
# @return [Boolean] returns true if the command completed successfully
|
777
|
-
def set_members(name, members)
|
831
|
+
def set_members(name, members, mode = nil)
|
778
832
|
current_members = Set.new parse_members(name)[:members]
|
779
833
|
members = Set.new members
|
780
834
|
|
835
|
+
lacp_mode = parse_lacp_mode(name)[:lacp_mode]
|
836
|
+
if mode && mode != lacp_mode
|
837
|
+
lacp_mode = mode
|
838
|
+
set_lacp_mode(name, lacp_mode)
|
839
|
+
end
|
840
|
+
|
841
|
+
cmds = []
|
842
|
+
grpid = /(\d+)/.match(name)[0]
|
843
|
+
|
781
844
|
# remove members from the current port-channel interface
|
782
845
|
current_members.difference(members).each do |intf|
|
783
|
-
|
784
|
-
|
846
|
+
cmds << "interface #{intf}"
|
847
|
+
cmds << "no channel-group #{grpid}"
|
785
848
|
end
|
786
849
|
|
787
850
|
# add new member interfaces to the port-channel
|
788
851
|
members.difference(current_members).each do |intf|
|
789
|
-
|
790
|
-
|
852
|
+
cmds << "interface #{intf}"
|
853
|
+
cmds << "channel-group #{grpid} mode #{lacp_mode}"
|
791
854
|
end
|
792
855
|
|
793
|
-
|
856
|
+
configure(cmds)
|
794
857
|
end
|
795
858
|
|
796
859
|
##
|
@@ -938,16 +1001,18 @@ module Rbeapi
|
|
938
1001
|
# BaseInterface get method and adds the Vxlan specific attributes to
|
939
1002
|
# the hash
|
940
1003
|
#
|
941
|
-
#
|
942
|
-
#
|
943
|
-
#
|
944
|
-
#
|
945
|
-
#
|
946
|
-
#
|
947
|
-
#
|
948
|
-
#
|
949
|
-
#
|
950
|
-
#
|
1004
|
+
# @example
|
1005
|
+
# {
|
1006
|
+
# name: <string>,
|
1007
|
+
# type: <string>,
|
1008
|
+
# description: <string>,
|
1009
|
+
# shutdown: <boolean>,
|
1010
|
+
# source_interface: <string>,
|
1011
|
+
# multicast_group: <string>,
|
1012
|
+
# udp_port: <fixnum>,
|
1013
|
+
# flood_list: <array>,
|
1014
|
+
# vlans: <hash>
|
1015
|
+
# }
|
951
1016
|
#
|
952
1017
|
# @param [String] :name The interface name to return from the nodes
|
953
1018
|
# configuration. This optional parameter defaults to Vxlan1
|
@@ -35,7 +35,7 @@ require 'rbeapi/api'
|
|
35
35
|
# Rbeapi toplevel namespace
|
36
36
|
module Rbeapi
|
37
37
|
##
|
38
|
-
#
|
38
|
+
# Api is module namespace for working with the EOS command API
|
39
39
|
module Api
|
40
40
|
#
|
41
41
|
# The Ipinterface class provides an instance for managing logical
|
@@ -79,7 +79,17 @@ module Rbeapi
|
|
79
79
|
#
|
80
80
|
# @example
|
81
81
|
# {
|
82
|
-
# <name>: {
|
82
|
+
# <name>: {
|
83
|
+
# address: <string>
|
84
|
+
# mtu: <string>
|
85
|
+
# helper_addresses: array<strings>
|
86
|
+
# },
|
87
|
+
# <name>: {
|
88
|
+
# address: <string>
|
89
|
+
# mtu: <string>
|
90
|
+
# helper_addresses: array<strings>
|
91
|
+
# },
|
92
|
+
# ...
|
83
93
|
# }
|
84
94
|
#
|
85
95
|
# @see get Ipaddress resource example
|
@@ -103,6 +113,7 @@ module Rbeapi
|
|
103
113
|
# ipaddress resource hash.
|
104
114
|
#
|
105
115
|
# @api private
|
116
|
+
#
|
106
117
|
# @param [String] :config The IP interface configuration block returned
|
107
118
|
# from the node's running configuration
|
108
119
|
#
|
data/lib/rbeapi/api/logging.rb
CHANGED
@@ -35,7 +35,7 @@ require 'rbeapi/api'
|
|
35
35
|
# Rbeapi toplevel namespace
|
36
36
|
module Rbeapi
|
37
37
|
##
|
38
|
-
#
|
38
|
+
# Api is module namespace for working with the EOS command API
|
39
39
|
module Api
|
40
40
|
##
|
41
41
|
# The Logging class manages logging settings on an EOS node.
|
@@ -46,7 +46,7 @@ module Rbeapi
|
|
46
46
|
#
|
47
47
|
# @example
|
48
48
|
# {
|
49
|
-
# enable: [true, false]
|
49
|
+
# enable: [true, false],
|
50
50
|
# hosts: array<strings>
|
51
51
|
# }
|
52
52
|
#
|
@@ -65,6 +65,10 @@ module Rbeapi
|
|
65
65
|
# command is expected to always be in the node's configuration. This
|
66
66
|
# methods return value is intended to be merged into the logging resource
|
67
67
|
# hash.
|
68
|
+
#
|
69
|
+
# @api private
|
70
|
+
#
|
71
|
+
# @return [Hash<Symbol, Object>] resource hash attribute
|
68
72
|
def parse_enable
|
69
73
|
value = /no logging on/ !~ config
|
70
74
|
{ enable: value }
|
@@ -76,10 +80,15 @@ module Rbeapi
|
|
76
80
|
# logging hosts are configured, then the value for hosts will be an empty
|
77
81
|
# array. The return value is intended to be merged into the logging
|
78
82
|
# resource hash
|
83
|
+
#
|
84
|
+
# @api private
|
85
|
+
#
|
86
|
+
# @return [Hash<Symbol, Object>] resource hash attribute
|
79
87
|
def parse_hosts
|
80
88
|
hosts = config.scan(/(?<=^logging\shost\s)[^\s]+/)
|
81
89
|
{ hosts: hosts }
|
82
90
|
end
|
91
|
+
private :parse_hosts
|
83
92
|
|
84
93
|
##
|
85
94
|
# set_enable configures the global logging instance on the node as either
|
data/lib/rbeapi/api/mlag.rb
CHANGED
@@ -35,7 +35,7 @@ require 'rbeapi/api'
|
|
35
35
|
# Rbeapi toplevel namespace
|
36
36
|
module Rbeapi
|
37
37
|
##
|
38
|
-
#
|
38
|
+
# Api is module namespace for working with the EOS command API
|
39
39
|
module Api
|
40
40
|
##
|
41
41
|
# The Mlag class provides a configuration instance for working with
|
@@ -50,15 +50,25 @@ module Rbeapi
|
|
50
50
|
# get scans the current nodes configuration and returns the values as
|
51
51
|
# a Hash describing the current state.
|
52
52
|
#
|
53
|
-
#
|
54
|
-
#
|
55
|
-
#
|
56
|
-
#
|
57
|
-
#
|
58
|
-
#
|
59
|
-
#
|
60
|
-
#
|
61
|
-
#
|
53
|
+
# @example
|
54
|
+
# {
|
55
|
+
# global: {
|
56
|
+
# domain_id: <string>,
|
57
|
+
# local_interface: <string>,
|
58
|
+
# peer_address: <string>,
|
59
|
+
# peer_link: <string>,
|
60
|
+
# shutdown: <boolean>
|
61
|
+
# },
|
62
|
+
# interfaces: {
|
63
|
+
# <name>: {
|
64
|
+
# mlag_id: <fixnum>
|
65
|
+
# },
|
66
|
+
# <name>: {
|
67
|
+
# mlag_id: <fixnum>
|
68
|
+
# },
|
69
|
+
# ...
|
70
|
+
# }
|
71
|
+
# }
|
62
72
|
#
|
63
73
|
# @see parse_interfaces
|
64
74
|
#
|
data/lib/rbeapi/api/ntp.rb
CHANGED
@@ -32,10 +32,10 @@
|
|
32
32
|
require 'rbeapi/api'
|
33
33
|
|
34
34
|
##
|
35
|
-
#
|
35
|
+
# Rbeapi toplevel namespace
|
36
36
|
module Rbeapi
|
37
37
|
##
|
38
|
-
# Api is module
|
38
|
+
# Api is module namespace for working with the EOS command API
|
39
39
|
module Api
|
40
40
|
##
|
41
41
|
# The Ntp class provides an instance for working with the nodes
|
@@ -48,7 +48,7 @@ module Rbeapi
|
|
48
48
|
#
|
49
49
|
# @example
|
50
50
|
# {
|
51
|
-
# source_interface: <string
|
51
|
+
# source_interface: <string>,
|
52
52
|
# servers: {
|
53
53
|
# prefer: [true, false]
|
54
54
|
# }
|
@@ -95,6 +95,7 @@ module Rbeapi
|
|
95
95
|
end
|
96
96
|
{ servers: values }
|
97
97
|
end
|
98
|
+
private :parse_servers
|
98
99
|
|
99
100
|
##
|
100
101
|
# set_source_interface configures the ntp source value in the nodes
|