arista-eos 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.
Files changed (131) hide show
  1. data/.gitignore +41 -0
  2. data/.rubocop.yml +21 -0
  3. data/Gemfile +57 -0
  4. data/Guardfile +21 -0
  5. data/LICENSE +28 -0
  6. data/README.md +178 -0
  7. data/Rakefile +46 -0
  8. data/eos.gemspec +36 -0
  9. data/guide/.gitignore +2 -0
  10. data/guide/Makefile +177 -0
  11. data/guide/_static/arista_logo_jpg-11.jpg +0 -0
  12. data/guide/_static/favicon.ico +0 -0
  13. data/guide/conf.py +282 -0
  14. data/guide/cookbook.rst +135 -0
  15. data/guide/developing.rst +55 -0
  16. data/guide/faq.rst +30 -0
  17. data/guide/index.rst +25 -0
  18. data/guide/installation.rst +174 -0
  19. data/guide/license.rst +5 -0
  20. data/guide/overview.rst +35 -0
  21. data/guide/quickstart.rst +184 -0
  22. data/guide/release-notes-1.0.rst +37 -0
  23. data/guide/release-notes-1.1.rst +25 -0
  24. data/guide/release-notes.rst +10 -0
  25. data/guide/testing.rst +8 -0
  26. data/guide/troubleshooting.rst +26 -0
  27. data/guide/typedoc.rst +928 -0
  28. data/guide/types.rst +44 -0
  29. data/lib/eos.rb +8 -0
  30. data/lib/eos/version.rb +5 -0
  31. data/lib/puppet/provider/eos_acl_entry/default.rb +122 -0
  32. data/lib/puppet/provider/eos_command/default.rb +61 -0
  33. data/lib/puppet/provider/eos_ethernet/default.rb +96 -0
  34. data/lib/puppet/provider/eos_interface/default.rb +89 -0
  35. data/lib/puppet/provider/eos_ipinterface/default.rb +89 -0
  36. data/lib/puppet/provider/eos_mlag/default.rb +86 -0
  37. data/lib/puppet/provider/eos_mlag_interface/default.rb +90 -0
  38. data/lib/puppet/provider/eos_ntp_config/default.rb +68 -0
  39. data/lib/puppet/provider/eos_ntp_server/default.rb +69 -0
  40. data/lib/puppet/provider/eos_portchannel/default.rb +117 -0
  41. data/lib/puppet/provider/eos_snmp/default.rb +77 -0
  42. data/lib/puppet/provider/eos_stp_interface/default.rb +73 -0
  43. data/lib/puppet/provider/eos_switchport/default.rb +100 -0
  44. data/lib/puppet/provider/eos_system/default.rb +63 -0
  45. data/lib/puppet/provider/eos_vlan/default.rb +93 -0
  46. data/lib/puppet/provider/eos_vxlan/default.rb +104 -0
  47. data/lib/puppet/provider/eos_vxlan_vlan/default.rb +89 -0
  48. data/lib/puppet/provider/eos_vxlan_vtep/default.rb +70 -0
  49. data/lib/puppet/type/eos_acl_entry.rb +126 -0
  50. data/lib/puppet/type/eos_command.rb +75 -0
  51. data/lib/puppet/type/eos_ethernet.rb +101 -0
  52. data/lib/puppet/type/eos_interface.rb +79 -0
  53. data/lib/puppet/type/eos_ipinterface.rb +116 -0
  54. data/lib/puppet/type/eos_mlag.rb +133 -0
  55. data/lib/puppet/type/eos_mlag_interface.rb +85 -0
  56. data/lib/puppet/type/eos_ntp_config.rb +70 -0
  57. data/lib/puppet/type/eos_ntp_server.rb +52 -0
  58. data/lib/puppet/type/eos_portchannel.rb +189 -0
  59. data/lib/puppet/type/eos_snmp.rb +127 -0
  60. data/lib/puppet/type/eos_stp_interface.rb +94 -0
  61. data/lib/puppet/type/eos_switchport.rb +150 -0
  62. data/lib/puppet/type/eos_system.rb +69 -0
  63. data/lib/puppet/type/eos_vlan.rb +130 -0
  64. data/lib/puppet/type/eos_vxlan.rb +150 -0
  65. data/lib/puppet/type/eos_vxlan_vlan.rb +78 -0
  66. data/lib/puppet/type/eos_vxlan_vtep.rb +62 -0
  67. data/lib/puppet_x/eos/provider.rb +86 -0
  68. data/lib/puppet_x/eos/utils/helpers.rb +34 -0
  69. data/metadata.json +20 -0
  70. data/spec/fixtures/README +61 -0
  71. data/spec/fixtures/ethernet.json +9 -0
  72. data/spec/fixtures/fixture_stp.yaml +11 -0
  73. data/spec/fixtures/fixture_vxlan_get.yaml +11 -0
  74. data/spec/fixtures/ospf.json +13 -0
  75. data/spec/fixtures/snmp.json +6 -0
  76. data/spec/fixtures/varp.json +11 -0
  77. data/spec/spec_helper.rb +27 -0
  78. data/spec/support/fixtures.rb +74 -0
  79. data/spec/support/shared_examples_for_providers.rb +7 -0
  80. data/spec/support/shared_examples_for_types.rb +451 -0
  81. data/spec/unit/puppet/provider/eos_acl_entry/default_spec.rb +226 -0
  82. data/spec/unit/puppet/provider/eos_acl_entry/fixture_acl_entry.yaml +20 -0
  83. data/spec/unit/puppet/provider/eos_ethernet/default_spec.rb +226 -0
  84. data/spec/unit/puppet/provider/eos_ethernet/fixture_ethernet.yaml +8 -0
  85. data/spec/unit/puppet/provider/eos_interface/default_spec.rb +176 -0
  86. data/spec/unit/puppet/provider/eos_interface/fixture_interfaces.yaml +5 -0
  87. data/spec/unit/puppet/provider/eos_ipinterface/default_spec.rb +223 -0
  88. data/spec/unit/puppet/provider/eos_ipinterface/fixture_ipinterfaces.yaml +5 -0
  89. data/spec/unit/puppet/provider/eos_mlag/default_spec.rb +203 -0
  90. data/spec/unit/puppet/provider/eos_mlag/fixture_mlag.yaml +11 -0
  91. data/spec/unit/puppet/provider/eos_mlag_interface/default_spec.rb +177 -0
  92. data/spec/unit/puppet/provider/eos_mlag_interface/fixture_mlag.yaml +11 -0
  93. data/spec/unit/puppet/provider/eos_ntp_config/default_spec.rb +150 -0
  94. data/spec/unit/puppet/provider/eos_ntp_config/fixture_ntp.yaml +3 -0
  95. data/spec/unit/puppet/provider/eos_ntp_server/default_spec.rb +152 -0
  96. data/spec/unit/puppet/provider/eos_ntp_server/fixture_ntp.yaml +3 -0
  97. data/spec/unit/puppet/provider/eos_portchannel/default_spec.rb +271 -0
  98. data/spec/unit/puppet/provider/eos_portchannel/fixture_portchannels.yaml +10 -0
  99. data/spec/unit/puppet/provider/eos_snmp/default_spec.rb +193 -0
  100. data/spec/unit/puppet/provider/eos_snmp/fixture_snmp.yaml +6 -0
  101. data/spec/unit/puppet/provider/eos_stp_interface/default_spec.rb +138 -0
  102. data/spec/unit/puppet/provider/eos_switchport/default_spec.rb +250 -0
  103. data/spec/unit/puppet/provider/eos_switchport/fixture_switchports.yaml +7 -0
  104. data/spec/unit/puppet/provider/eos_system/default_spec.rb +129 -0
  105. data/spec/unit/puppet/provider/eos_system/fixture_system.yaml +2 -0
  106. data/spec/unit/puppet/provider/eos_vlan/default_spec.rb +228 -0
  107. data/spec/unit/puppet/provider/eos_vlan/fixture_vlans.yaml +6 -0
  108. data/spec/unit/puppet/provider/eos_vxlan/default_spec.rb +229 -0
  109. data/spec/unit/puppet/provider/eos_vxlan/fixture_vxlan.yaml +9 -0
  110. data/spec/unit/puppet/provider/eos_vxlan_vlan/default_spec.rb +148 -0
  111. data/spec/unit/puppet/provider/eos_vxlan_vtep/default_spec.rb +140 -0
  112. data/spec/unit/puppet/type/eos_acl_entry_spec.rb +103 -0
  113. data/spec/unit/puppet/type/eos_command_spec.rb +67 -0
  114. data/spec/unit/puppet/type/eos_ethernet_spec.rb +87 -0
  115. data/spec/unit/puppet/type/eos_interface_spec.rb +67 -0
  116. data/spec/unit/puppet/type/eos_ipinterface_spec.rb +84 -0
  117. data/spec/unit/puppet/type/eos_mlag_interface_spec.rb +62 -0
  118. data/spec/unit/puppet/type/eos_mlag_spec.rb +98 -0
  119. data/spec/unit/puppet/type/eos_ntp_config_spec.rb +58 -0
  120. data/spec/unit/puppet/type/eos_ntp_server_spec.rb +51 -0
  121. data/spec/unit/puppet/type/eos_portchannel_spec.rb +99 -0
  122. data/spec/unit/puppet/type/eos_snmp_spec.rb +87 -0
  123. data/spec/unit/puppet/type/eos_stp_interface_spec.rb +77 -0
  124. data/spec/unit/puppet/type/eos_switchport_spec.rb +88 -0
  125. data/spec/unit/puppet/type/eos_system_spec.rb +57 -0
  126. data/spec/unit/puppet/type/eos_vlan_spec.rb +86 -0
  127. data/spec/unit/puppet/type/eos_vxlan_spec.rb +100 -0
  128. data/spec/unit/puppet/type/eos_vxlan_vlan_spec.rb +73 -0
  129. data/spec/unit/puppet/type/eos_vxlan_vtep_spec.rb +52 -0
  130. data/tests/init.pp +12 -0
  131. metadata +437 -0
@@ -0,0 +1,226 @@
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 'spec_helper'
33
+
34
+ include FixtureHelpers
35
+
36
+ describe Puppet::Type.type(:eos_acl_entry).provider(:eos) do
37
+ # Puppet RAL memoized methods
38
+ let(:resource) do
39
+ resource_hash = {
40
+ name: 'test1:10',
41
+ ensure: :present,
42
+ acltype: :standard,
43
+ action: :permit,
44
+ srcaddr: '1.2.3.0',
45
+ srcprefixlen: 8,
46
+ log: :true,
47
+ provider: described_class.name
48
+ }
49
+ Puppet::Type.type(:eos_acl_entry).new(resource_hash)
50
+ end
51
+
52
+ let(:provider) { resource.provider }
53
+
54
+ let(:api) { double('acl_entry') }
55
+
56
+ def acl_entry
57
+ acl_entry = Fixtures[:acl_entry]
58
+ return acl_entry if acl_entry
59
+ fixture('acl_entry', dir: File.dirname(__FILE__))
60
+ end
61
+
62
+ before :each do
63
+ allow(described_class.node).to receive(:api).with('acl').and_return(api)
64
+ allow(provider.node).to receive(:api).with('acl').and_return(api)
65
+ end
66
+
67
+ context 'class methods' do
68
+ before { allow(api).to receive(:getall).and_return(acl_entry) }
69
+
70
+ describe '.instances' do
71
+ subject { described_class.instances }
72
+
73
+ it { is_expected.to be_an Array }
74
+
75
+ it 'has four entries' do
76
+ expect(subject.size).to eq 4
77
+ end
78
+
79
+ it 'has an instance for test1 and test2 entries' do
80
+ %w(test1:10 test1:20 test2:10 test2:20 ).each do |name|
81
+ instance = subject.find { |p| p.name == name }
82
+ expect(instance).to be_a described_class
83
+ end
84
+ end
85
+
86
+ context 'eos_acl_entry { test1:10 }' do
87
+ subject { described_class.instances.find { |p| p.name == 'test1:10' } }
88
+
89
+ include_examples 'provider resource methods',
90
+ acltype: :standard,
91
+ action: :permit,
92
+ srcaddr: 'host 1.2.3.4',
93
+ srcprefixlen: :absent,
94
+ log: :true
95
+ end
96
+ end
97
+
98
+ describe '.prefetch' do
99
+ let :resources do
100
+ {
101
+ 'test1:10' => Puppet::Type.type(:eos_acl_entry).new(name: 'test1:10'),
102
+ 'test2:10' => Puppet::Type.type(:eos_acl_entry).new(name: 'test2:10'),
103
+ 'test3:10' => Puppet::Type.type(:eos_acl_entry).new(name: 'test3:10')
104
+ }
105
+ end
106
+
107
+ subject { described_class.prefetch(resources) }
108
+
109
+ it 'resource providers are absent prior to calling .prefetch' do
110
+ resources.values.each do |rsrc|
111
+ expect(rsrc.provider.acltype).to eq(:absent)
112
+ expect(rsrc.provider.action).to eq(:absent)
113
+ expect(rsrc.provider.srcaddr).to eq(:absent)
114
+ expect(rsrc.provider.srcprefixlen).to eq(:absent)
115
+ expect(rsrc.provider.log).to eq(:absent)
116
+ end
117
+ end
118
+
119
+ it 'sets the provider instance of the managed resource test1' do
120
+ subject
121
+ expect(resources['test1:10'].provider.acltype).to eq(:standard)
122
+ expect(resources['test1:10'].provider.action).to eq(:permit)
123
+ expect(resources['test1:10'].provider.srcaddr).to eq('host 1.2.3.4')
124
+ expect(resources['test1:10'].provider.srcprefixlen).to be_truthy
125
+ expect(resources['test1:10'].provider.log).to be_truthy
126
+ end
127
+
128
+ it 'sets the provider instance of the managed resource test2' do
129
+ subject
130
+ expect(resources['test2:10'].provider.acltype).to eq(:standard)
131
+ expect(resources['test2:10'].provider.action).to eq(:deny)
132
+ expect(resources['test2:10'].provider.srcaddr).to eq('1.2.3.0')
133
+ expect(resources['test2:10'].provider.srcprefixlen).to eq(8)
134
+ expect(resources['test2:10'].provider.log).to eq(:false)
135
+ end
136
+
137
+ it 'does not set the provider instance of the unmanaged resource' do
138
+ subject
139
+ expect(resources['test3:10'].provider.acltype).to eq(:absent)
140
+ expect(resources['test3:10'].provider.action).to eq(:absent)
141
+ expect(resources['test3:10'].provider.srcaddr).to eq(:absent)
142
+ expect(resources['test3:10'].provider.srcprefixlen).to eq(:absent)
143
+ expect(resources['test3:10'].provider.log).to eq(:absent)
144
+ end
145
+ end
146
+ end
147
+
148
+ context 'resource (instance) methods' do
149
+ describe '#exists?' do
150
+ subject { provider.exists? }
151
+
152
+ context 'when the resource does not exist on the system' do
153
+ it { is_expected.to be_falsey }
154
+ end
155
+
156
+ context 'when the resource exists on the system' do
157
+ let(:provider) do
158
+ allow(api).to receive(:getall).and_return(acl_entry)
159
+ described_class.instances.first
160
+ end
161
+ it { is_expected.to be_truthy }
162
+ end
163
+ end
164
+
165
+ describe '#create' do
166
+ before do
167
+ update_values = resource.to_hash
168
+ update_values[:seqno] = 10
169
+ expect(api).to receive(:update_entry).with('test1', update_values)
170
+ allow(api).to receive_messages(
171
+ acltype: true,
172
+ action: true,
173
+ srcaddr: true,
174
+ srcprefixlen: true,
175
+ log: true
176
+ )
177
+ end
178
+
179
+ it 'sets ensure on the resource' do
180
+ provider.create
181
+ provider.flush
182
+ expect(provider.ensure).to eq(:present)
183
+ end
184
+
185
+ it 'sets acltype on the resource' do
186
+ provider.create
187
+ provider.flush
188
+ expect(provider.acltype).to eq(:standard)
189
+ end
190
+
191
+ it 'sets action on the resource' do
192
+ provider.create
193
+ provider.flush
194
+ expect(provider.action).to eq(:permit)
195
+ end
196
+
197
+ it 'sets srcaddr on the resource' do
198
+ provider.create
199
+ provider.flush
200
+ expect(provider.srcaddr).to eq('1.2.3.0')
201
+ end
202
+
203
+ it 'sets srcprefixlen on the resource' do
204
+ provider.create
205
+ provider.flush
206
+ expect(provider.srcprefixlen).to eq(8)
207
+ end
208
+
209
+ it 'sets log on the resource' do
210
+ provider.create
211
+ provider.flush
212
+ expect(provider.log).to eq(:true)
213
+ end
214
+ end
215
+
216
+ describe '#destroy' do
217
+ it 'sets ensure to :absent' do
218
+ resource[:ensure] = :absent
219
+ expect(api).to receive(:remove_entry).with('test1', 10)
220
+ provider.destroy
221
+ provider.flush
222
+ expect(provider.ensure).to eq(:absent)
223
+ end
224
+ end
225
+ end
226
+ end
@@ -0,0 +1,20 @@
1
+ ---
2
+ 'test1':
3
+ 10: { !ruby/sym acltype: 'standard',
4
+ !ruby/sym action: 'permit',
5
+ !ruby/sym srcaddr: 'host 1.2.3.4',
6
+ !ruby/sym log: true
7
+ }
8
+ 20: { !ruby/sym acltype: 'standard',
9
+ !ruby/sym srcaddr: '11.12.0.0',
10
+ !ruby/sym srcprefixlen: '255.255.0.0'
11
+ }
12
+ 'test2':
13
+ 10: { !ruby/sym acltype: 'standard',
14
+ !ruby/sym action: 'deny',
15
+ !ruby/sym srcaddr: '1.2.3.0',
16
+ !ruby/sym srcprefixlen: 8
17
+ }
18
+ 20: { !ruby/sym acltype: 'standard',
19
+ !ruby/sym srcaddr: 'any'
20
+ }
@@ -0,0 +1,226 @@
1
+ #
2
+ # Copyright (c) 2014, 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 'spec_helper'
33
+
34
+ include FixtureHelpers
35
+
36
+ describe Puppet::Type.type(:eos_ethernet).provider(:eos) do
37
+ # Puppet RAL memoized methods
38
+ let(:resource) do
39
+ resource_hash = {
40
+ name: 'Ethernet1',
41
+ description: 'test interface',
42
+ enable: :true,
43
+ flowcontrol_send: :on,
44
+ flowcontrol_receive: :on,
45
+ provider: described_class.name
46
+ }
47
+ Puppet::Type.type(:eos_ethernet).new(resource_hash)
48
+ end
49
+
50
+ let(:provider) { resource.provider }
51
+
52
+ let(:api) { double('interfaces') }
53
+
54
+ def ethernet
55
+ ethernet = Fixtures[:ethernet]
56
+ return ethernet if ethernet
57
+ fixture('ethernet', dir: File.dirname(__FILE__))
58
+ end
59
+
60
+ before :each do
61
+ allow(described_class.node).to receive(:api).with('interfaces')
62
+ .and_return(api)
63
+
64
+ allow(provider.node).to receive(:api).with('interfaces').and_return(api)
65
+ end
66
+
67
+ context 'class methods' do
68
+ before { allow(api).to receive(:getall).and_return(ethernet) }
69
+
70
+ describe '.instances' do
71
+ subject { described_class.instances }
72
+
73
+ it { is_expected.to be_an Array }
74
+
75
+ it 'has one entry' do
76
+ expect(subject.size).to eq(1)
77
+ end
78
+
79
+ it 'has an instance for interface Ethernet1' do
80
+ instance = subject.find { |p| p.name == 'Ethernet1' }
81
+ expect(instance).to be_a described_class
82
+ end
83
+
84
+ context 'eos_ethernet { Ethernet1: }' do
85
+ subject { described_class.instances.find { |p| p.name == 'Ethernet1' } }
86
+
87
+ include_examples 'provider resource methods',
88
+ name: 'Ethernet1',
89
+ description: 'test interface',
90
+ enable: :true,
91
+ flowcontrol_send: :on,
92
+ flowcontrol_receive: :on
93
+ end
94
+ end
95
+
96
+ describe '.prefetch' do
97
+ let :resources do
98
+ {
99
+ 'Ethernet1' => Puppet::Type.type(:eos_ethernet)
100
+ .new(name: 'Ethernet1'),
101
+ 'Ethernet2' => Puppet::Type.type(:eos_ethernet)
102
+ .new(name: 'Ethernet2')
103
+ }
104
+ end
105
+ subject { described_class.prefetch(resources) }
106
+
107
+ it 'resource providers are absent prior to calling .prefetch' do
108
+ resources.values.each do |rsrc|
109
+ expect(rsrc.provider.description).to eq(:absent)
110
+ expect(rsrc.provider.enable).to eq(:absent)
111
+ expect(rsrc.provider.flowcontrol_send).to eq(:absent)
112
+ expect(rsrc.provider.flowcontrol_receive).to eq(:absent)
113
+ end
114
+ end
115
+
116
+ it 'sets the provider instance of the managed resource' do
117
+ subject
118
+ expect(resources['Ethernet1'].provider.description).to \
119
+ eq('test interface')
120
+ expect(resources['Ethernet1'].provider.enable).to eq :true
121
+ expect(resources['Ethernet1'].provider.flowcontrol_send).to eq(:on)
122
+ expect(resources['Ethernet1'].provider.flowcontrol_receive).to eq(:on)
123
+ end
124
+
125
+ it 'does not set the provider instance of the unmanaged resource' do
126
+ subject
127
+ expect(resources['Ethernet2'].provider.description).to eq(:absent)
128
+ expect(resources['Ethernet2'].provider.enable).to eq(:absent)
129
+ expect(resources['Ethernet2'].provider.flowcontrol_send).to eq(:absent)
130
+ expect(resources['Ethernet2'].provider.flowcontrol_receive).to \
131
+ eq(:absent)
132
+ end
133
+ end
134
+ end
135
+
136
+ context 'resource (instance) methods' do
137
+ describe '#create' do
138
+ let(:name) { 'Ethernet1' }
139
+
140
+ before do
141
+ expect(api).to receive(:create).with(resource[:name])
142
+ allow(api).to receive_messages(
143
+ set_shutdown: true,
144
+ set_description: true,
145
+ set_flowcontrol_send: true,
146
+ set_flowcontrol_receive: true
147
+ )
148
+ end
149
+
150
+ it 'sets enable on the resource' do
151
+ provider.create
152
+ expect(provider.enable).to be_truthy
153
+ end
154
+
155
+ it 'sets description on the resource' do
156
+ provider.create
157
+ expect(provider.description).to eq('test interface')
158
+ end
159
+
160
+ it 'sets flowcontrol_send on the resource' do
161
+ provider.create
162
+ expect(provider.flowcontrol_send).to eq(:on)
163
+ end
164
+
165
+ it 'sets flowcontrol_receive on the resource' do
166
+ provider.create
167
+ expect(provider.flowcontrol_receive).to eq(:on)
168
+ end
169
+ end
170
+
171
+ describe '#destroy' do
172
+ it 'sets ensure to :absent' do
173
+ expect(api).to receive(:delete).with(resource[:name])
174
+ provider.destroy
175
+ end
176
+ end
177
+
178
+ describe '#description=(value)' do
179
+ it 'updates description in the provider' do
180
+ expect(api).to receive(:set_description)
181
+ .with(resource[:name], value: 'foo')
182
+ provider.description = 'foo'
183
+ expect(provider.description).to eq('foo')
184
+ end
185
+ end
186
+
187
+ describe '#enable=(value)' do
188
+ %w(true false).each do |val|
189
+ let(:value) { !val }
190
+ let(:name) { 'Ethernet1' }
191
+
192
+ it 'updates enable in the provider' do
193
+ expect(api).to receive(:set_shutdown).with(name, value: !val)
194
+ provider.enable = val
195
+ expect(provider.enable).to eq(val)
196
+ end
197
+ end
198
+ end
199
+
200
+ describe '#flowcontrol_send=(value)' do
201
+ let(:name) { 'Ethernet1' }
202
+
203
+ %w(:on :off).each do |val|
204
+ it 'updates flowcontrol_send on the provider' do
205
+ expect(api).to receive(:set_flowcontrol_send)
206
+ .with(name, value: val.to_s)
207
+ provider.flowcontrol_send = val
208
+ expect(provider.flowcontrol_send).to eq(val)
209
+ end
210
+ end
211
+ end
212
+
213
+ describe '#flowcontrol_receive=(value)' do
214
+ let(:name) { 'Ethernet1' }
215
+
216
+ %w(:on :off).each do |val|
217
+ it 'updates flowcontrol_receive on the provider' do
218
+ expect(api).to receive(:set_flowcontrol_receive)
219
+ .with(name, value: val.to_s)
220
+ provider.flowcontrol_receive = val
221
+ expect(provider.flowcontrol_receive).to eq(val)
222
+ end
223
+ end
224
+ end
225
+ end
226
+ end