rbeapi 0.1.0 → 0.2.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.
Files changed (77) hide show
  1. data/.gitignore +5 -0
  2. data/.rubocop.yml +21 -0
  3. data/CHANGELOG.md +24 -0
  4. data/Gemfile +3 -1
  5. data/Guardfile +3 -3
  6. data/README.md +92 -17
  7. data/Rakefile +99 -4
  8. data/gems/README.rst +4 -0
  9. data/gems/inifile/.gitignore +2 -0
  10. data/gems/inifile/README.rst +5 -0
  11. data/gems/inifile/inifile.spec.tmpl +84 -0
  12. data/gems/net_http_unix/.gitignore +2 -0
  13. data/gems/net_http_unix/README.rst +5 -0
  14. data/gems/net_http_unix/net_http_unix.spec.tmpl +54 -0
  15. data/gems/netaddr/README.rst +5 -0
  16. data/gems/netaddr/netaddr.spec.tmpl +50 -0
  17. data/lib/rbeapi/api/aaa.rb +14 -17
  18. data/lib/rbeapi/api/acl.rb +276 -0
  19. data/lib/rbeapi/api/dns.rb +7 -4
  20. data/lib/rbeapi/api/interfaces.rb +239 -239
  21. data/lib/rbeapi/api/ipinterfaces.rb +5 -3
  22. data/lib/rbeapi/api/logging.rb +8 -5
  23. data/lib/rbeapi/api/mlag.rb +45 -127
  24. data/lib/rbeapi/api/ntp.rb +1 -4
  25. data/lib/rbeapi/api/ospf.rb +16 -13
  26. data/lib/rbeapi/api/prefixlists.rb +4 -4
  27. data/lib/rbeapi/api/radius.rb +34 -25
  28. data/lib/rbeapi/api/routemaps.rb +16 -10
  29. data/lib/rbeapi/api/snmp.rb +26 -13
  30. data/lib/rbeapi/api/staticroutes.rb +6 -5
  31. data/lib/rbeapi/api/stp.rb +77 -18
  32. data/lib/rbeapi/api/switchports.rb +20 -12
  33. data/lib/rbeapi/api/system.rb +6 -6
  34. data/lib/rbeapi/api/tacacs.rb +9 -6
  35. data/lib/rbeapi/api/varp.rb +15 -10
  36. data/lib/rbeapi/api/vlans.rb +5 -6
  37. data/lib/rbeapi/api.rb +56 -16
  38. data/lib/rbeapi/client.rb +85 -50
  39. data/lib/rbeapi/eapilib.rb +95 -56
  40. data/lib/rbeapi/netdev/snmp.rb +7 -16
  41. data/lib/rbeapi/utils.rb +3 -5
  42. data/lib/rbeapi/version.rb +1 -1
  43. data/rbeapi.gemspec +4 -2
  44. data/rbeapi.spec.tmpl +72 -0
  45. data/spec/support/fixtures.rb +6 -4
  46. data/spec/support/shared_examples_for_api_modules.rb +3 -18
  47. data/spec/system/api_acl_spec.rb +128 -0
  48. data/spec/system/api_ospf_interfaces_spec.rb +17 -14
  49. data/spec/system/api_ospf_spec.rb +8 -8
  50. data/spec/system/api_varp_interfaces_spec.rb +22 -13
  51. data/spec/system/api_varp_spec.rb +1 -4
  52. data/spec/system/rbeapi/api/interfaces_base_spec.rb +3 -4
  53. data/spec/system/rbeapi/api/interfaces_ethernet_spec.rb +13 -9
  54. data/spec/system/rbeapi/api/interfaces_portchannel_spec.rb +43 -26
  55. data/spec/system/rbeapi/api/interfaces_vxlan_spec.rb +7 -6
  56. data/spec/system/rbeapi/api/ipinterfaces_spec.rb +34 -21
  57. data/spec/system/rbeapi/api/mlag_interfaces_spec.rb +15 -38
  58. data/spec/system/rbeapi/api/mlag_spec.rb +26 -30
  59. data/spec/system/rbeapi/api/snmp_spec.rb +0 -3
  60. data/spec/system/rbeapi/api/stp_instances_spec.rb +20 -12
  61. data/spec/system/rbeapi/api/stp_interfaces_spec.rb +1 -3
  62. data/spec/system/rbeapi/api/switchports_spec.rb +14 -12
  63. data/spec/system/rbeapi/api/system_spec.rb +0 -3
  64. data/spec/system/rbeapi/api/vlans_spec.rb +19 -9
  65. data/spec/unit/rbeapi/api/acl/default_spec.rb +158 -0
  66. data/spec/unit/rbeapi/api/acl/fixture_acl_standard.text +22 -0
  67. data/spec/unit/rbeapi/api/interfaces/base_spec.rb +123 -0
  68. data/spec/unit/rbeapi/api/interfaces/ethernet_spec.rb +89 -0
  69. data/spec/unit/rbeapi/api/interfaces/fixture_interfaces.text +219 -0
  70. data/spec/unit/rbeapi/api/interfaces/portchannel_spec.rb +149 -0
  71. data/spec/unit/rbeapi/api/interfaces/vxlan_spec.rb +243 -0
  72. data/spec/unit/rbeapi/api/mlag/default_spec.rb +218 -0
  73. data/spec/unit/rbeapi/api/mlag/fixture_mlag.text +238 -0
  74. data/spec/unit/rbeapi/api/vlans/default_spec.rb +135 -0
  75. data/spec/unit/rbeapi/api/vlans/fixture_vlans.text +5 -0
  76. metadata +79 -4
  77. data/lib/rbeapi/api/radius.rb.old +0 -399
@@ -33,9 +33,7 @@
33
33
  require 'rbeapi/api'
34
34
 
35
35
  module Rbeapi
36
-
37
36
  module Netdev
38
-
39
37
  ##
40
38
  # The Netdev class is a straight port of the original PuppetX netdev
41
39
  # code that existed prior to rbeapi. This should be considered a legacy
@@ -65,8 +63,6 @@ module Rbeapi
65
63
  # parse_snmp_hosts parses the raw text from the `show snmp host`
66
64
  # command and returns an Array of resource hashes.
67
65
  #
68
- # rubocop:disable Metrics/MethodLength
69
- #
70
66
  # @param [String] text The text of the `show snmp host` output, e.g.
71
67
  # for three hosts:
72
68
  #
@@ -237,9 +233,6 @@ module Rbeapi
237
233
  # Group : sysops
238
234
  # ```
239
235
  #
240
- # rubocop:disable Metrics/CyclomaticComplexity
241
- # rubocop:disable Metrics/MethodLength
242
- #
243
236
  # @param [String] text The text to parse
244
237
  #
245
238
  # @api private
@@ -250,12 +243,12 @@ module Rbeapi
250
243
  user_s.scan(/^(\w+).*?: (.*)/).each_with_object({}) do |(h, v), m|
251
244
  key = SNMP_USER_PARAM[h.downcase.intern] || h.downcase.intern
252
245
  m[key] = case key
253
- when :privacy then /AES/.match(v) ? :aes128 : :des
254
- when :version then v.sub('v2c', 'v2').intern
255
- when :auth then v.downcase.intern
256
- when :roles then v.sub(/ \(.*?\)/, '')
257
- else v.downcase
258
- end
246
+ when :privacy then /AES/.match(v) ? :aes128 : :des
247
+ when :version then v.sub('v2c', 'v2').intern
248
+ when :auth then v.downcase.intern
249
+ when :roles then v.sub(/ \(.*?\)/, '')
250
+ else v.downcase
251
+ end
259
252
  end
260
253
  end
261
254
  end
@@ -275,8 +268,6 @@ module Rbeapi
275
268
  # snmp_user_set creates or updates an SNMP user account on the target
276
269
  # device.
277
270
  #
278
- # rubocop:disable Metrics/MethodLength
279
- #
280
271
  # @option opts [String] :name ('johndoe') The username
281
272
  #
282
273
  # @option opts [Array] :roles (['developers']) The group, as an Array,
@@ -305,7 +296,7 @@ module Rbeapi
305
296
  if opts[:password] && version == 'v3'
306
297
  privacy = opts[:privacy].to_s.scan(/aes|des/).first
307
298
  fail ArgumentError,
308
- 'privacy is required when managing passwords' unless privacy
299
+ 'privacy is required when managing passwords' unless privacy
309
300
  cmd += " auth #{opts[:auth] || 'sha'} #{opts[:password]} "\
310
301
  "priv #{privacy} #{opts[:password]}"
311
302
  end
data/lib/rbeapi/utils.rb CHANGED
@@ -36,7 +36,6 @@ module Rbeapi
36
36
  ##
37
37
  # Utils module
38
38
  module Utils
39
-
40
39
  ##
41
40
  # Iterates through a hash structure and converts all of the keys
42
41
  # to symbols.
@@ -46,9 +45,9 @@ module Rbeapi
46
45
  # @return [Hash] An updated hash structure with all keys converted to
47
46
  # symboles
48
47
  def self.transform_keys_to_symbols(value)
49
- return value if not value.kind_of?(Hash)
50
- hash = value.inject({}) do |hsh, (k,v)|
51
- hsh[k.to_sym] = self.transform_keys_to_symbols(v)
48
+ return value unless value.is_a?(Hash)
49
+ hash = value.each_with_object({}) do |(k, v), hsh|
50
+ hsh[k.to_sym] = transform_keys_to_symbols(v)
52
51
  hsh
53
52
  end
54
53
  hash
@@ -67,4 +66,3 @@ module Rbeapi
67
66
  end
68
67
  end
69
68
  end
70
-
@@ -33,5 +33,5 @@
33
33
  # #
34
34
  # Rbeapi toplevel namespace
35
35
  module Rbeapi
36
- VERSION = '0.1.0'
36
+ VERSION = '0.2.0'
37
37
  end
data/rbeapi.gemspec CHANGED
@@ -19,8 +19,10 @@ Gem::Specification.new do |spec|
19
19
  spec.test_files = spec.files.grep(/^(test|spec|features)\//)
20
20
  spec.require_paths = ['lib']
21
21
 
22
- spec.add_dependency 'net_http_unix'
23
- spec.add_dependency 'inifile'
22
+ spec.add_runtime_dependency 'inifile'
23
+ spec.add_runtime_dependency 'json'
24
+ spec.add_runtime_dependency 'net_http_unix'
25
+ spec.add_runtime_dependency 'netaddr'
24
26
 
25
27
  spec.add_development_dependency 'bundler', '~> 1.3'
26
28
  spec.add_development_dependency 'yard'
data/rbeapi.spec.tmpl ADDED
@@ -0,0 +1,72 @@
1
+ # -*- rpm-spec -*-
2
+ %global gem_name rbeapi
3
+
4
+ Name: %{?enterprise:pe-}rubygem-%{gem_name}
5
+ Version: REPLACEME
6
+ Release: 1.eos4
7
+ Summary: Arista eAPI Ruby Library for the EOS command API
8
+
9
+ Group: Development/Languages
10
+ License: New BSD
11
+ URL: https://github.com/arista-eosplus/rbeapi
12
+ Source0: %{gem_name}-%{version}.gem
13
+
14
+ %if 0%{?enterprise:1} == 1
15
+ # Use these settings for Puppet Enterprise
16
+ %global gem /opt/puppet/bin/gem
17
+ Requires: pe-rubygems
18
+ Requires: pe-ruby
19
+ Requires: pe-rubygem(net-http-unix)
20
+ Requires: pe-rubygem(inifile)
21
+ Provides: pe-rubygem(%{gem_name}) = %{version}
22
+ Provides: pe-rubygem-%{gem_name} = %{version}
23
+ %else
24
+ # Use these settings for all other installs
25
+ %global gem gem
26
+ Requires: ruby(abi) = %{rubyabi}
27
+ Provides: ruby(%{gem_name}) = %{version}-%{release}
28
+ %endif
29
+
30
+
31
+ BuildArch: noarch
32
+
33
+ %description
34
+ The Ruby Cliet for eAPI provides a native Ruby implementation for programming
35
+ Arista EOS network devices using Ruby. The Ruby client provides the ability
36
+ to build native applications in Ruby that can communicate with EOS either
37
+ locally via Unix domain sockets (on-box) or remotely over a HTTP/S transport
38
+ (off-box). It uses a standard INI-style configuration file to specify one or
39
+ more connection profiles.
40
+
41
+ The rbeapi implementation also provides an API layer for building native Ruby
42
+ objects that allow for configuration and state extraction of EOS nodes. The API
43
+ layer provides a consistent implementation for working with EOS configuration
44
+ resources. The implementation of the API layer is highly extensible and can be
45
+ used as a foundation for building custom data models.
46
+
47
+ The library is freely provided to the open source community for building robust
48
+ applications using Arista EOS eAPI. Support is provided as best effort through
49
+ Github iusses.
50
+
51
+ %prep
52
+ %setup -q -D -T -n .
53
+
54
+ %install
55
+ mkdir -p %{buildroot}
56
+ install %{SOURCE0} %{buildroot}/
57
+
58
+ %files
59
+ /%{gem_name}-%{version}.gem
60
+
61
+ %post
62
+ %{gem} install --local /%{gem_name}-%{version}.gem > /dev/null 2>&1
63
+
64
+ %preun
65
+ %{gem} uninstall %{gem_name} --version '= %{version}' > /dev/null 2>&1
66
+
67
+ %changelog
68
+ * Tue May 21 2015 Jere Julian - 0.1.0-2
69
+ - Ubuntu requires we manually create the buildroot
70
+
71
+ * Tue Mar 17 2015 Jere Julian - 0.1.0-1
72
+ - Initial package
@@ -52,8 +52,7 @@ module FixtureHelpers
52
52
  # `spec/fixtures/fixture_foo.json` will be loaded and returned. This method
53
53
  # is memoized across the life of the process.
54
54
  #
55
- # rubocop:disable Metrics/CyclomaticComplexity, Metrics/MethodLength,
56
- # rubocop:disable Metrics/PerceivedComplexity
55
+ # rubocop:disable Metrics/MethodLength,
57
56
  #
58
57
  # @param [Symbol] key The fixture name without the `fixture_` prefix or
59
58
  # `.json` suffix.
@@ -73,11 +72,13 @@ module FixtureHelpers
73
72
 
74
73
  yaml = Pathname.new(File.join(dir, "fixture_#{key}.yaml"))
75
74
  json = Pathname.new(File.join(dir, "fixture_#{key}.json"))
75
+ text = Pathname.new(File.join(dir, "fixture_#{key}.text"))
76
76
 
77
77
  data = if yaml.exist?; then YAML.load(File.read(yaml))
78
78
  elsif json.exist?; then JSON.load(File.read(json))
79
- else fail "could not load YAML or JSON fixture #{key} "\
80
- "tried:\n #{yaml}\n #{json}"
79
+ elsif text.exist?; then File.read(text)
80
+ else fail "could not load YAML, JSON or TEXT fixture #{key} "\
81
+ "tried:\n #{yaml}\n #{json} #{text}"
81
82
  end
82
83
 
83
84
  Fixtures[key] = data
@@ -86,6 +87,7 @@ module FixtureHelpers
86
87
  when :ruby then data
87
88
  when :json then JSON.pretty_generate(data)
88
89
  when :yaml then YAML.dump(data)
90
+ when :text then data
89
91
  else fail ArgumentError, "unknown format #{opts[:format].inspect}"
90
92
  end
91
93
  end
@@ -1,11 +1,10 @@
1
1
  RSpec.shared_examples 'a configurable entity' do |opts|
2
-
3
2
  before(:each) do
4
3
  allow(subject.node).to receive(:config)
5
4
  end
6
5
 
7
6
  applies_to = opts.fetch(:applies_to, [])
8
- if applies_to.include?(opts[:args[0,2]]) or applies_to.empty?
7
+ if applies_to.include?(opts[:args[0, 2]]) || applies_to.empty?
9
8
  context 'with node#config' do
10
9
  [:create, :delete, :default].each do |action|
11
10
  it "calls #{action} using #{opts[:args]}" do
@@ -18,13 +17,12 @@ RSpec.shared_examples 'a configurable entity' do |opts|
18
17
  end
19
18
 
20
19
  RSpec.shared_examples 'a tristate attr' do |opts|
21
-
22
20
  before(:each) do
23
21
  allow(subject.node).to receive(:config)
24
22
  end
25
23
 
26
24
  applies_to = opts.fetch(:applies_to, [])
27
- if applies_to.include?(opts[:args[0,2]]) or applies_to.empty?
25
+ if applies_to.include?(opts[:args[0, 2]]) || applies_to.empty?
28
26
  context 'with node#config' do
29
27
  it "configures with #{opts[:name]}" do
30
28
  expect(subject.node).to receive(:config).with(opts[:config])
@@ -36,7 +34,7 @@ RSpec.shared_examples 'a tristate attr' do |opts|
36
34
  subject.send(opts[:name], *opts[:args])
37
35
  end
38
36
 
39
- it "defaults" do
37
+ it 'defaults' do
40
38
  expect(subject.node).to receive(:config).with(opts[:default])
41
39
  subject.send(opts[:name], *opts[:args], default: true)
42
40
  end
@@ -45,7 +43,6 @@ RSpec.shared_examples 'a tristate attr' do |opts|
45
43
  end
46
44
 
47
45
  RSpec.shared_examples 'a settable attr' do |opts|
48
-
49
46
  before(:each) do
50
47
  allow(subject.node).to receive(:config)
51
48
  end
@@ -59,7 +56,6 @@ RSpec.shared_examples 'a settable attr' do |opts|
59
56
  end
60
57
 
61
58
  RSpec.shared_examples 'a creatable entity' do |args, setup, block|
62
-
63
59
  before(:each) do
64
60
  subject.node.config(setup)
65
61
  end
@@ -74,7 +70,6 @@ RSpec.shared_examples 'a creatable entity' do |args, setup, block|
74
70
  end
75
71
 
76
72
  RSpec.shared_examples 'a deletable entity' do |args, setup, block|
77
-
78
73
  before(:each) do
79
74
  subject.node.config(setup)
80
75
  end
@@ -89,7 +84,6 @@ RSpec.shared_examples 'a deletable entity' do |args, setup, block|
89
84
  end
90
85
 
91
86
  RSpec.shared_examples 'a configurable attr' do |opts|
92
-
93
87
  before(:each) do
94
88
  subject.node.config(opts[:setup])
95
89
  end
@@ -104,21 +98,12 @@ RSpec.shared_examples 'a configurable attr' do |opts|
104
98
  end
105
99
 
106
100
  RSpec.shared_examples 'single entity' do |opts|
107
-
108
101
  describe 'match entity attributes from node' do
109
102
  let(:entity) { subject.get(opts[:args]) }
110
103
  opts[:entity].each do |key, value|
111
104
  it "has #{key} with #{value}" do
112
- binding.pry
113
105
  expect(entity[key]).to eq(value)
114
106
  end
115
107
  end
116
108
  end
117
109
  end
118
-
119
-
120
-
121
-
122
-
123
-
124
-
@@ -0,0 +1,128 @@
1
+ require 'spec_helper'
2
+
3
+ require 'rbeapi/client'
4
+ require 'rbeapi/api/acl'
5
+
6
+ describe Rbeapi::Api::Acl do
7
+ subject { described_class.new(node) }
8
+
9
+ let(:config) { Rbeapi::Client::Config.new(filename: get_fixture('dut.conf')) }
10
+ let(:node) { Rbeapi::Client.connect_to('dut') }
11
+
12
+ before do
13
+ node.config(['no ip access-list standard test1',
14
+ 'ip access-list standard test1',
15
+ 'permit host 1.2.3.4 log',
16
+ 'permit 1.2.3.4 255.255.0.0 log',
17
+ 'deny any',
18
+ 'permit 5.6.7.0/24',
19
+ 'permit 9.10.11.0 255.255.255.0 log',
20
+ 'exit'])
21
+ node.config(['no ip access-list standard test2',
22
+ 'ip access-list standard test2',
23
+ 'deny 16.0.0.0/8',
24
+ 'exit'])
25
+ end
26
+
27
+ let(:test1_entries) do
28
+ { '10' => { seqno: '10', action: 'permit', srcaddr: '1.2.3.4',
29
+ srcprefixlen: '255.255.255.255', log: 'log' },
30
+ '20' => { seqno: '20', action: 'permit', srcaddr: '1.2.3.4',
31
+ srcprefixlen: '255.255.0.0', log: 'log' },
32
+ '30' => { seqno: '30', action: 'deny', srcaddr: '0.0.0.0',
33
+ srcprefixlen: '255.255.255.255', log: nil },
34
+ '40' => { seqno: '40', action: 'permit', srcaddr: '5.6.7.0',
35
+ srcprefixlen: '24', log: nil },
36
+ '50' => { seqno: '50', action: 'permit', srcaddr: '9.10.11.0',
37
+ srcprefixlen: '255.255.255.0', log: 'log' }
38
+ }
39
+ end
40
+
41
+ let(:test2_entries) do
42
+ { '10' => { seqno: '10', action: 'deny', srcaddr: '16.0.0.0',
43
+ srcprefixlen: '8', log: nil }
44
+ }
45
+ end
46
+
47
+ describe '#get' do
48
+ it 'returns the test ACL entries' do
49
+ expect(subject.get('test1')).to eq(test1_entries)
50
+ expect(subject.get('test2')).to eq(test2_entries)
51
+ end
52
+ end
53
+
54
+ describe '#getall' do
55
+ let(:collection) { subject.getall }
56
+
57
+ it 'includes test1 and test2 ACLs' do
58
+ expect(collection).to include('test1')
59
+ expect(collection).to include('test2')
60
+ end
61
+
62
+ it 'is a kind of hash' do
63
+ expect(collection).to be_a_kind_of(Hash)
64
+ end
65
+ end
66
+
67
+ describe '#create' do
68
+ before { node.config('no ip access-list standard abc') }
69
+
70
+ it 'creates a new ACL resource' do
71
+ expect(subject.get('abc')).to be_nil
72
+ expect(subject.create('abc')).to be_truthy
73
+ expect(subject.get('abc')).not_to be_nil
74
+ end
75
+ end
76
+
77
+ describe '#delete' do
78
+ it 'deletes the abc ACL resource' do
79
+ expect(subject.get('abc')).not_to be_nil
80
+ expect(subject.delete('abc')).to be_truthy
81
+ expect(subject.get('abc')).to be_nil
82
+ end
83
+ end
84
+
85
+ describe '#default' do
86
+ before { node.config('ip access-list standard xyz') }
87
+
88
+ it 'sets ACL xyz to default value' do
89
+ expect(subject.get('xyz')).to be_truthy
90
+ expect(subject.default('xyz')).to be_truthy
91
+ expect(subject.get('xyz')).to be_nil
92
+ end
93
+ end
94
+
95
+ describe '#update_entry' do
96
+ let(:update_entry) do
97
+ { seqno: '50', action: 'deny', srcaddr: '100.0.0.0',
98
+ srcprefixlen: '8', log: nil }
99
+ end
100
+
101
+ it 'Change entry 50 to values in update_entry' do
102
+ expect(subject.get('test1')['50'][:action]).to eq('permit')
103
+ expect(subject.update_entry('test1', update_entry)).to be_truthy
104
+ expect(subject.get('test1')['50']).to eq(update_entry)
105
+ end
106
+ end
107
+
108
+ describe '#add_entry' do
109
+ let(:new_entry) do
110
+ { seqno: '60', action: 'deny', srcaddr: '1.2.3.0',
111
+ srcprefixlen: '24', log: 'log' }
112
+ end
113
+
114
+ it 'Add entry 60 to the test1 ACL' do
115
+ expect(subject.get('test1')['60']).to be_nil
116
+ expect(subject.add_entry('test1', new_entry)).to be_truthy
117
+ expect(subject.get('test1')['60']).to eq(new_entry)
118
+ end
119
+ end
120
+
121
+ describe '#remove_entry' do
122
+ it 'Remove entry 30 from the test1 ACL' do
123
+ expect(subject.get('test1')['30']).to be_truthy
124
+ expect(subject.remove_entry('test1', '30')).to be_truthy
125
+ expect(subject.get('test1')['30']).to be_nil
126
+ end
127
+ end
128
+ end
@@ -7,13 +7,14 @@ describe Rbeapi::Api::OspfInterfaces do
7
7
  subject { described_class.new(node) }
8
8
 
9
9
  let(:config) { Rbeapi::Client::Config.new(filename: get_fixture('dut.conf')) }
10
- let(:node) { Rbeapi::Client.connect_to('veos02') }
10
+ let(:node) { Rbeapi::Client.connect_to('dut') }
11
11
 
12
12
  describe '#get' do
13
-
14
- before { node.config(['default interface Ethernet1', 'interface Ethernet1',
15
- 'no switchport', 'ip address 99.99.99.99/24',
16
- 'default interface Ethernet2']) }
13
+ before do
14
+ node.config(['default interface Ethernet1', 'interface Ethernet1',
15
+ 'no switchport', 'ip address 88.99.99.99/24', 'exit',
16
+ 'default interface Ethernet2'])
17
+ end
17
18
 
18
19
  it 'returns an ospf interface resource instance' do
19
20
  expect(subject.get('Ethernet1')).not_to be_nil
@@ -25,10 +26,11 @@ describe Rbeapi::Api::OspfInterfaces do
25
26
  end
26
27
 
27
28
  describe '#getall' do
28
-
29
- before { node.config(['default interface Ethernet1', 'interface Ethernet1',
30
- 'no switchport', 'ip address 99.99.99.99/24',
31
- 'default interface Ethernet2']) }
29
+ before do
30
+ node.config(['default interface Ethernet1', 'interface Ethernet1',
31
+ 'no switchport', 'ip address 88.99.99.99/24', 'exit',
32
+ 'default interface Ethernet2'])
33
+ end
32
34
 
33
35
  it 'returns the ospf resource collection' do
34
36
  expect(subject.getall).to be_a_kind_of(Hash)
@@ -41,17 +43,18 @@ describe Rbeapi::Api::OspfInterfaces do
41
43
  it 'does not include an instance of Ethernet2' do
42
44
  expect(subject.getall).not_to include('Ethernet2')
43
45
  end
44
-
45
46
  end
46
47
 
47
48
  describe '#set_network_type' do
48
-
49
- before { node.config(['default interface Ethernet1', 'interface Ethernet1',
50
- 'no switchport', 'ip address 99.99.99.99/24']) }
49
+ before do
50
+ node.config(['default interface Ethernet1', 'interface Ethernet1',
51
+ 'no switchport', 'ip address 88.99.99.99/24', 'exit'])
52
+ end
51
53
 
52
54
  it 'configures the ospf interface type to point-to-point' do
53
55
  expect(subject.get('Ethernet1')['network_type']).to eq('broadcast')
54
- expect(subject.set_network_type('Ethernet1', value: 'point-to-point')).to be_truthy
56
+ expect(subject.set_network_type('Ethernet1', value: 'point-to-point'))
57
+ .to be_truthy
55
58
  expect(subject.get('Ethernet1')['network_type']).to eq('point-to-point')
56
59
  end
57
60
  end
@@ -7,10 +7,9 @@ describe Rbeapi::Api::Ospf do
7
7
  subject { described_class.new(node) }
8
8
 
9
9
  let(:config) { Rbeapi::Client::Config.new(filename: get_fixture('dut.conf')) }
10
- let(:node) { Rbeapi::Client.connect_to('veos02') }
10
+ let(:node) { Rbeapi::Client.connect_to('dut') }
11
11
 
12
12
  describe '#get' do
13
-
14
13
  before { node.config(['no router ospf 1', 'router ospf 1']) }
15
14
 
16
15
  let(:entity) do
@@ -23,7 +22,6 @@ describe Rbeapi::Api::Ospf do
23
22
  end
24
23
 
25
24
  describe '#getall' do
26
-
27
25
  before { node.config(['no router ospf 1', 'router ospf 1']) }
28
26
 
29
27
  let(:collection) { subject.getall }
@@ -39,7 +37,6 @@ describe Rbeapi::Api::Ospf do
39
37
  it 'is a kind of hash' do
40
38
  expect(collection).to be_a_kind_of(Hash)
41
39
  end
42
-
43
40
  end
44
41
 
45
42
  describe '#interfaces' do
@@ -83,17 +80,21 @@ describe Rbeapi::Api::Ospf do
83
80
 
84
81
  it 'adds the network with area to the ospf process' do
85
82
  expect(subject.get('1')['areas']).to be_empty
86
- expect(subject.add_network('1', '192.168.10.0/24', '0.0.0.0')).to be_truthy
83
+ expect(subject.add_network('1', '192.168.10.0/24', '0.0.0.0'))
84
+ .to be_truthy
87
85
  expect(subject.get('1')['areas']['0.0.0.0']).to include('192.168.10.0/24')
88
86
  end
89
87
  end
90
88
 
91
89
  describe '#remove_network' do
92
- before { node.config(['router ospf 1', 'network 192.168.10.10/24 area 0.0.0.0']) }
90
+ before do
91
+ node.config(['router ospf 1', 'network 192.168.10.10/24 area 0.0.0.0'])
92
+ end
93
93
 
94
94
  it 'removes the network with area to the ospf process' do
95
95
  expect(subject.get('1')['areas']['0.0.0.0']).to include('192.168.10.0/24')
96
- expect(subject.remove_network('1', '192.168.10.0/24', '0.0.0.0')).to be_truthy
96
+ expect(subject.remove_network('1', '192.168.10.0/24', '0.0.0.0'))
97
+ .to be_truthy
97
98
  expect(subject.get('1')['areas']).to be_empty
98
99
  end
99
100
  end
@@ -107,5 +108,4 @@ describe Rbeapi::Api::Ospf do
107
108
  expect(subject.get('1')['redistribute']).to include('static')
108
109
  end
109
110
  end
110
-
111
111
  end
@@ -7,12 +7,15 @@ describe Rbeapi::Api::VarpInterfaces do
7
7
  subject { described_class.new(node) }
8
8
 
9
9
  let(:config) { Rbeapi::Client::Config.new(filename: get_fixture('dut.conf')) }
10
- let(:node) { Rbeapi::Client.connect_to('veos02') }
10
+ let(:node) { Rbeapi::Client.connect_to('dut') }
11
11
 
12
12
  describe '#get' do
13
- before { node.config(['ip virtual-router mac-address aabb.ccdd.eeff',
14
- 'interface vlan 100', 'ip address 99.99.99.99/24',
15
- 'ip virtual-router address 99.99.99.98']) }
13
+ before do
14
+ node.config(['ip virtual-router mac-address aabb.ccdd.eeff',
15
+ 'default interface vlan 100', 'interface vlan 100',
16
+ 'ip address 99.99.99.99/24',
17
+ 'ip virtual-router address 99.99.99.98', 'exit'])
18
+ end
16
19
 
17
20
  it 'returns an instance for vlan 100' do
18
21
  expect(subject.get('Vlan100')).not_to be_nil
@@ -24,9 +27,12 @@ describe Rbeapi::Api::VarpInterfaces do
24
27
  end
25
28
 
26
29
  describe '#getall' do
27
- before { node.config(['ip virtual-router mac-address aabb.ccdd.eeff',
28
- 'interface vlan 100', 'ip address 99.99.99.99/24',
29
- 'ip virtual-router address 99.99.99.98']) }
30
+ before do
31
+ node.config(['ip virtual-router mac-address aabb.ccdd.eeff',
32
+ 'default interface vlan 100', 'interface vlan 100',
33
+ 'ip address 99.99.99.99/24',
34
+ 'ip virtual-router address 99.99.99.98', 'exit'])
35
+ end
30
36
 
31
37
  it 'returns a collection that includes vlan 100' do
32
38
  expect(subject.getall).to include('Vlan100')
@@ -38,13 +44,16 @@ describe Rbeapi::Api::VarpInterfaces do
38
44
  end
39
45
 
40
46
  describe '#set_addresses' do
41
- before { node.config(['ip virtual-router mac-address aabb.ccdd.eeff',
42
- 'no interface vlan 100', 'interface vlan 100',
43
- 'ip address 99.99.99.99/24']) }
47
+ before do
48
+ node.config(['ip virtual-router mac-address aabb.ccdd.eeff',
49
+ 'default interface vlan 100', 'interface vlan 100',
50
+ 'ip address 99.99.99.99/24', 'exit'])
51
+ end
44
52
 
45
53
  it 'adds new address to the list of addresses' do
46
54
  expect(subject.get('Vlan100')['addresses']).not_to include('99.99.99.98')
47
- expect(subject.set_addresses('Vlan100', value: ['99.99.99.98'])).to be_truthy
55
+ expect(subject.set_addresses('Vlan100', value: ['99.99.99.98']))
56
+ .to be_truthy
48
57
  expect(subject.get('Vlan100')['addresses']).to include('99.99.99.98')
49
58
  end
50
59
 
@@ -52,9 +61,9 @@ describe Rbeapi::Api::VarpInterfaces do
52
61
  node.config(['interface vlan 100', 'ip address 99.99.99.99/24',
53
62
  'ip virtual-router address 99.99.99.98'])
54
63
  expect(subject.get('Vlan100')['addresses']).to include('99.99.99.98')
55
- expect(subject.set_addresses('Vlan100', value: ['99.99.99.97'])).to be_truthy
64
+ expect(subject.set_addresses('Vlan100', value: ['99.99.99.97']))
65
+ .to be_truthy
56
66
  expect(subject.get('Vlan100')['addresses']).not_to include('99.99.99.98')
57
67
  end
58
-
59
68
  end
60
69
  end
@@ -7,10 +7,9 @@ describe Rbeapi::Api::Varp do
7
7
  subject { described_class.new(node) }
8
8
 
9
9
  let(:config) { Rbeapi::Client::Config.new(filename: get_fixture('dut.conf')) }
10
- let(:node) { Rbeapi::Client.connect_to('veos02') }
10
+ let(:node) { Rbeapi::Client.connect_to('dut') }
11
11
 
12
12
  describe '#get' do
13
-
14
13
  it 'returns a varp resource instance' do
15
14
  expect(subject.get).to be_a_kind_of(Hash)
16
15
  end
@@ -38,7 +37,5 @@ describe Rbeapi::Api::Varp do
38
37
  expect(subject.set_mac_address(value: 'aa:bb:cc:dd:ee:ff')).to be_truthy
39
38
  expect(subject.get['mac_address']).to eq('aa:bb:cc:dd:ee:ff')
40
39
  end
41
-
42
40
  end
43
-
44
41
  end
@@ -12,7 +12,6 @@ describe Rbeapi::Api::Interfaces do
12
12
  end
13
13
 
14
14
  describe '#get' do
15
-
16
15
  let(:entity) do
17
16
  { name: 'Loopback0', type: 'generic', description: '', shutdown: false }
18
17
  end
@@ -34,7 +33,7 @@ describe Rbeapi::Api::Interfaces do
34
33
  it 'returns a hash collection' do
35
34
  expect(subject.getall).to be_a_kind_of(Hash)
36
35
  end
37
- end
36
+ end
38
37
 
39
38
  describe '#create' do
40
39
  before { node.config('no interface Loopback0') }
@@ -70,7 +69,8 @@ describe Rbeapi::Api::Interfaces do
70
69
  it 'sets the description value on the interface' do
71
70
  node.config(['interface Loopback0', 'no description'])
72
71
  expect(subject.get('Loopback0')[:description]).to be_empty
73
- expect(subject.set_description('Loopback0', value: 'foo bar')).to be_truthy
72
+ expect(subject.set_description('Loopback0', value: 'foo bar'))
73
+ .to be_truthy
74
74
  expect(subject.get('Loopback0')[:description]).to eq('foo bar')
75
75
  end
76
76
  end
@@ -91,4 +91,3 @@ describe Rbeapi::Api::Interfaces do
91
91
  end
92
92
  end
93
93
  end
94
-