beaker-vcloud 1.0.0 → 2.0.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.
- checksums.yaml +5 -5
- data/.github/dependabot.yml +17 -0
- data/.github/workflows/release.yml +32 -0
- data/.github/workflows/test.yml +58 -0
- data/.rubocop.yml +5 -0
- data/.rubocop_todo.yml +292 -0
- data/CHANGELOG.md +79 -0
- data/Gemfile +7 -19
- data/README.md +28 -2
- data/Rakefile +20 -116
- data/beaker-vcloud.gemspec +19 -31
- data/bin/beaker-vcloud +1 -3
- data/lib/beaker/hypervisor/vcloud.rb +79 -88
- data/lib/beaker-vcloud/version.rb +1 -1
- data/spec/beaker/hypervisor/vcloud_spec.rb +39 -49
- data/spec/mock_vsphere.rb +284 -0
- data/spec/mock_vsphere_helper.rb +167 -0
- data/spec/spec_helper.rb +28 -3
- metadata +58 -81
@@ -2,43 +2,41 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
module Beaker
|
4
4
|
describe Vcloud do
|
5
|
-
|
6
|
-
|
7
|
-
MockVsphereHelper.
|
8
|
-
|
9
|
-
stub_const(
|
10
|
-
|
11
|
-
json
|
12
|
-
allow( json ).to receive( :parse ) do |arg|
|
5
|
+
before do
|
6
|
+
MockVsphereHelper.set_config(fog_file_contents)
|
7
|
+
MockVsphereHelper.set_vms(make_hosts)
|
8
|
+
stub_const('VsphereHelper', MockVsphereHelper)
|
9
|
+
stub_const('Net', MockNet)
|
10
|
+
json = double('json')
|
11
|
+
allow(json).to receive(:parse) do |arg|
|
13
12
|
arg
|
14
13
|
end
|
15
|
-
stub_const(
|
16
|
-
allow(
|
17
|
-
allow_any_instance_of(
|
18
|
-
allow_any_instance_of(
|
14
|
+
stub_const('JSON', json)
|
15
|
+
allow(Socket).to receive(:getaddrinfo).and_return(true)
|
16
|
+
allow_any_instance_of(Beaker::Shared).to receive(:get_fog_credentials).and_return(fog_file_contents)
|
17
|
+
allow_any_instance_of(VsphereHelper).to receive(:new).and_return(MockVsphereHelper)
|
19
18
|
end
|
20
19
|
|
21
|
-
describe
|
22
|
-
|
20
|
+
describe '#provision' do
|
23
21
|
it 'warns about deprecated behavior if pooling_api is provided' do
|
24
22
|
opts = make_opts
|
25
23
|
opts[:pooling_api] = 'testpool'
|
26
|
-
expect(
|
27
|
-
expect{ Beaker::Vcloud.new(
|
24
|
+
expect(opts[:logger]).to receive(:warn).once
|
25
|
+
expect { Beaker::Vcloud.new(make_hosts, opts) }.to raise_error(/datacenter/)
|
28
26
|
end
|
29
27
|
|
30
28
|
it 'does not instantiate vmpooler if pooling_api is provided' do
|
31
29
|
opts = make_opts
|
32
30
|
opts[:pooling_api] = 'testpool'
|
33
|
-
expect{ Beaker::Vcloud.new(
|
31
|
+
expect { Beaker::Vcloud.new(make_hosts, opts) }.to raise_error(/datacenter/)
|
34
32
|
end
|
35
33
|
|
36
34
|
it 'ignores pooling_api and instantiates self' do
|
37
35
|
opts = make_opts
|
38
36
|
opts[:pooling_api] = 'testpool'
|
39
37
|
opts[:datacenter] = 'testdatacenter'
|
40
|
-
hypervisor = Beaker::Vcloud.new(
|
41
|
-
expect(
|
38
|
+
hypervisor = Beaker::Vcloud.new(make_hosts, opts)
|
39
|
+
expect(hypervisor.class).to be Beaker::Vcloud
|
42
40
|
end
|
43
41
|
|
44
42
|
it 'provisions hosts and add them to the pool' do
|
@@ -48,18 +46,17 @@ module Beaker
|
|
48
46
|
opts[:pooling_api] = nil
|
49
47
|
opts[:datacenter] = 'testdc'
|
50
48
|
|
51
|
-
vcloud = Beaker::Vcloud.new(
|
52
|
-
allow(
|
53
|
-
allow(
|
49
|
+
vcloud = Beaker::Vcloud.new(make_hosts, opts)
|
50
|
+
allow(vcloud).to receive(:require).and_return(true)
|
51
|
+
allow(vcloud).to receive(:sleep).and_return(true)
|
54
52
|
vcloud.provision
|
55
53
|
|
56
|
-
hosts = vcloud.instance_variable_get(
|
57
|
-
hosts.each do |
|
54
|
+
hosts = vcloud.instance_variable_get(:@hosts)
|
55
|
+
hosts.each do |host|
|
58
56
|
name = host['vmhostname']
|
59
|
-
vm = MockVsphereHelper.find_vm(
|
60
|
-
expect(
|
57
|
+
vm = MockVsphereHelper.find_vm(name)
|
58
|
+
expect(vm.toolsRunningStatus).to be === 'guestToolsRunning'
|
61
59
|
end
|
62
|
-
|
63
60
|
end
|
64
61
|
|
65
62
|
it 'does not run enable_root on cygwin hosts' do
|
@@ -71,44 +68,37 @@ module Beaker
|
|
71
68
|
|
72
69
|
hosts = make_hosts
|
73
70
|
hosts.each do |host|
|
74
|
-
allow(
|
71
|
+
allow(host).to receive(:is_cygwin?).and_return(true)
|
75
72
|
end
|
76
|
-
vcloud = Beaker::Vcloud.new(
|
77
|
-
allow(
|
78
|
-
allow(
|
79
|
-
expect(
|
73
|
+
vcloud = Beaker::Vcloud.new(hosts, opts)
|
74
|
+
allow(vcloud).to receive(:require).and_return(true)
|
75
|
+
allow(vcloud).to receive(:sleep).and_return(true)
|
76
|
+
expect(vcloud).not_to receive(:enable_root)
|
80
77
|
vcloud.provision
|
81
|
-
|
82
78
|
end
|
83
|
-
|
84
79
|
end
|
85
80
|
|
86
|
-
describe
|
87
|
-
|
88
|
-
it "cleans up hosts not in the pool" do
|
81
|
+
describe '#cleanup' do
|
82
|
+
it 'cleans up hosts not in the pool' do
|
89
83
|
MockVsphereHelper.powerOn
|
90
84
|
|
91
85
|
opts = make_opts
|
92
86
|
opts[:pooling_api] = nil
|
93
87
|
opts[:datacenter] = 'testdc'
|
94
88
|
|
95
|
-
vcloud = Beaker::Vcloud.new(
|
96
|
-
allow(
|
97
|
-
allow(
|
89
|
+
vcloud = Beaker::Vcloud.new(make_hosts, opts)
|
90
|
+
allow(vcloud).to receive(:require).and_return(true)
|
91
|
+
allow(vcloud).to receive(:sleep).and_return(true)
|
98
92
|
vcloud.provision
|
99
93
|
vcloud.cleanup
|
100
94
|
|
101
|
-
hosts = vcloud.instance_variable_get(
|
102
|
-
vm_names = hosts.map {|h| h['vmhostname'] }.compact
|
103
|
-
vm_names.each do |
|
104
|
-
vm = MockVsphereHelper.find_vm(
|
105
|
-
expect(
|
95
|
+
hosts = vcloud.instance_variable_get(:@hosts)
|
96
|
+
vm_names = hosts.map { |h| h['vmhostname'] }.compact
|
97
|
+
vm_names.each do |name|
|
98
|
+
vm = MockVsphereHelper.find_vm(name)
|
99
|
+
expect(vm.runtime.powerState).to be === 'poweredOff'
|
106
100
|
end
|
107
|
-
|
108
101
|
end
|
109
|
-
|
110
102
|
end
|
111
|
-
|
112
103
|
end
|
113
|
-
|
114
104
|
end
|
@@ -0,0 +1,284 @@
|
|
1
|
+
class MockRbVmomiSnapshot
|
2
|
+
attr_accessor :name, :rootSnapshotList, :childSnapshotList
|
3
|
+
|
4
|
+
def initialize
|
5
|
+
@name = nil
|
6
|
+
@rootSnapshotList = []
|
7
|
+
@childSnapshotList = []
|
8
|
+
end
|
9
|
+
|
10
|
+
def print_nested_array(arg)
|
11
|
+
str = '[ '
|
12
|
+
arg.each do |arry|
|
13
|
+
if arry.is_a?(Array)
|
14
|
+
str += print_nested_array(arry)
|
15
|
+
elsif arry.is_a?(MockRbVmomiSnapshot)
|
16
|
+
str += arry.to_s + ', '
|
17
|
+
end
|
18
|
+
end
|
19
|
+
str + ' ]'
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_s
|
23
|
+
"Snapshot(name: #{@name}, rootSnapshotlist: #{print_nested_array(@rootSnapshotList)}, childSnapshotList: #{print_nested_array(@childSnapshotList)})"
|
24
|
+
end
|
25
|
+
|
26
|
+
def snapshot
|
27
|
+
self
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
class MockRbVmomiVM
|
32
|
+
attr_accessor :snapshot, :name, :state
|
33
|
+
|
34
|
+
def info
|
35
|
+
self
|
36
|
+
end
|
37
|
+
|
38
|
+
def process_snaphash(snaphash)
|
39
|
+
shotlist = []
|
40
|
+
snaphash.each do |name, subsnaps|
|
41
|
+
new_snap = MockRbVmomiSnapshot.new
|
42
|
+
new_snap.name = name
|
43
|
+
new_snap.childSnapshotList = process_snaphash(subsnaps) if subsnaps.is_a?(Hash)
|
44
|
+
shotlist << new_snap
|
45
|
+
end
|
46
|
+
shotlist
|
47
|
+
end
|
48
|
+
|
49
|
+
def get_snapshot(name, snaplist = @snapshot.rootSnapshotList)
|
50
|
+
snapshot = nil
|
51
|
+
snaplist.each do |snap|
|
52
|
+
if snap.is_a?(Array)
|
53
|
+
snapshot = get_snapshot(snap, name)
|
54
|
+
elsif snap.name == name
|
55
|
+
snapshot = snap.snapshot
|
56
|
+
end
|
57
|
+
end
|
58
|
+
snapshot
|
59
|
+
end
|
60
|
+
|
61
|
+
def initialize(name, snaphash)
|
62
|
+
@name = name
|
63
|
+
@snapshot = MockRbVmomiSnapshot.new
|
64
|
+
@snapshot.name = name
|
65
|
+
@snapshot.rootSnapshotList = process_snaphash(snaphash)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
class MockRbVmomiConnection
|
70
|
+
class CustomizationSpecManager
|
71
|
+
class CustomizationSpec
|
72
|
+
def spec
|
73
|
+
true
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def initialize
|
78
|
+
@customizationspec = CustomizationSpec.new
|
79
|
+
end
|
80
|
+
|
81
|
+
def GetCustomizationSpec(_arg)
|
82
|
+
@customizationspec
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
class PropertyCollector
|
87
|
+
class Result
|
88
|
+
def initialize(name, object)
|
89
|
+
@name = name
|
90
|
+
@object = object
|
91
|
+
end
|
92
|
+
|
93
|
+
def val
|
94
|
+
@name
|
95
|
+
end
|
96
|
+
|
97
|
+
def obj
|
98
|
+
@object
|
99
|
+
end
|
100
|
+
|
101
|
+
def propSet
|
102
|
+
[self]
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
class ResultContainer
|
107
|
+
attr_accessor :token
|
108
|
+
|
109
|
+
def initialize
|
110
|
+
@results = []
|
111
|
+
end
|
112
|
+
|
113
|
+
def objects
|
114
|
+
@results
|
115
|
+
end
|
116
|
+
|
117
|
+
def add_object(obj)
|
118
|
+
@results << obj
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def initialize
|
123
|
+
@results = ResultContainer.new
|
124
|
+
end
|
125
|
+
|
126
|
+
def RetrievePropertiesEx(_hash)
|
127
|
+
@results.token = true
|
128
|
+
@results
|
129
|
+
end
|
130
|
+
|
131
|
+
def ContinueRetrievePropertiesEx(_token)
|
132
|
+
@results.token = false
|
133
|
+
@results
|
134
|
+
end
|
135
|
+
|
136
|
+
def add_result(name, object)
|
137
|
+
@results.add_object(Result.new(name, object))
|
138
|
+
end
|
139
|
+
|
140
|
+
def WaitForUpdates(_arg)
|
141
|
+
result = OpenStruct.new
|
142
|
+
result.version = 'version'
|
143
|
+
result
|
144
|
+
end
|
145
|
+
|
146
|
+
def CreateFilter(_arg)
|
147
|
+
filter = OpenStruct.new
|
148
|
+
filter.DestroyPropertyFilter = true
|
149
|
+
filter
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
class ServiceInstance
|
154
|
+
class Datacenter
|
155
|
+
attr_accessor :vmFolder, :hostFolder
|
156
|
+
|
157
|
+
def initialize
|
158
|
+
@vmFolder = MockRbVmomi::VIM::Folder.new
|
159
|
+
@vmFolder.name = '/root'
|
160
|
+
end
|
161
|
+
|
162
|
+
def find_datastore(_arg)
|
163
|
+
true
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
def initialize
|
168
|
+
@datacenter = Datacenter.new
|
169
|
+
end
|
170
|
+
|
171
|
+
def find_datacenter(_dc)
|
172
|
+
@datacenter
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
class ServiceManager
|
177
|
+
class ViewManager
|
178
|
+
def CreateContainerView(hash)
|
179
|
+
@view = hash
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
def initialize
|
184
|
+
@customizationspecmanager = CustomizationSpecManager.new
|
185
|
+
@viewmanager = ViewManager.new
|
186
|
+
end
|
187
|
+
|
188
|
+
def customizationSpecManager
|
189
|
+
@customizationspecmanager
|
190
|
+
end
|
191
|
+
|
192
|
+
def viewManager
|
193
|
+
@viewmanager
|
194
|
+
end
|
195
|
+
|
196
|
+
def rootFolder
|
197
|
+
'/root'
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
def initialize(opts)
|
202
|
+
@host = opts[:host]
|
203
|
+
@user = opts[:user]
|
204
|
+
@password = opts[:password]
|
205
|
+
@insecure = opts[:insecure]
|
206
|
+
@serviceinstance = ServiceInstance.new
|
207
|
+
@servicemanager = ServiceManager.new
|
208
|
+
@propertycollector = PropertyCollector.new
|
209
|
+
end
|
210
|
+
|
211
|
+
def serviceInstance
|
212
|
+
@serviceinstance
|
213
|
+
end
|
214
|
+
|
215
|
+
def serviceContent
|
216
|
+
@servicemanager
|
217
|
+
end
|
218
|
+
|
219
|
+
def propertyCollector
|
220
|
+
@propertycollector
|
221
|
+
end
|
222
|
+
|
223
|
+
def set_info(vms)
|
224
|
+
vms.each do |vm|
|
225
|
+
@propertycollector.add_result(vm.name, vm)
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
class MockRbVmomi
|
231
|
+
class VIM
|
232
|
+
class Folder
|
233
|
+
attr_accessor :name
|
234
|
+
|
235
|
+
def find
|
236
|
+
self
|
237
|
+
end
|
238
|
+
|
239
|
+
def childEntity
|
240
|
+
self
|
241
|
+
end
|
242
|
+
|
243
|
+
def resourcePool
|
244
|
+
self
|
245
|
+
end
|
246
|
+
|
247
|
+
def traverse(_path, _type = Object, _create = false)
|
248
|
+
self
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
class ResourcePool
|
253
|
+
attr_accessor :name
|
254
|
+
|
255
|
+
def find
|
256
|
+
self
|
257
|
+
end
|
258
|
+
|
259
|
+
def resourcePool
|
260
|
+
self
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
class ClusterComputeResource
|
265
|
+
attr_accessor :name
|
266
|
+
|
267
|
+
def find
|
268
|
+
self
|
269
|
+
end
|
270
|
+
|
271
|
+
def resourcePool
|
272
|
+
self
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
276
|
+
class TraversalSpec
|
277
|
+
def initialize(hash); end
|
278
|
+
end
|
279
|
+
|
280
|
+
def self.connect(opts)
|
281
|
+
MockRbVmomiConnection.new(opts)
|
282
|
+
end
|
283
|
+
end
|
284
|
+
end
|
@@ -0,0 +1,167 @@
|
|
1
|
+
class MockVsphereSnapshot
|
2
|
+
attr_accessor :name
|
3
|
+
|
4
|
+
def RevertToSnapshot_Task
|
5
|
+
self
|
6
|
+
end
|
7
|
+
|
8
|
+
def wait_for_completion
|
9
|
+
true
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class MockVsphereVM
|
14
|
+
attr_accessor :name, :powerState, :snapshot, :template, :toolsRunningStatus
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
@powerState = 'poweredOff'
|
18
|
+
@toolsRunningStatus = 'guestToolsStopped'
|
19
|
+
@first = true
|
20
|
+
end
|
21
|
+
|
22
|
+
def runtime
|
23
|
+
self
|
24
|
+
end
|
25
|
+
|
26
|
+
attr_reader :powerState
|
27
|
+
|
28
|
+
def toolsRunningStatus
|
29
|
+
prev = @toolsRunningStatus
|
30
|
+
@toolsRunningStatus = 'guestToolsRunning'
|
31
|
+
prev
|
32
|
+
end
|
33
|
+
|
34
|
+
def PowerOnVM_Task
|
35
|
+
@powerState = 'poweredOn'
|
36
|
+
self
|
37
|
+
end
|
38
|
+
|
39
|
+
def PowerOffVM_Task
|
40
|
+
@powerState = 'poweredOff'
|
41
|
+
self
|
42
|
+
end
|
43
|
+
|
44
|
+
def summary
|
45
|
+
self
|
46
|
+
end
|
47
|
+
|
48
|
+
def guest
|
49
|
+
self
|
50
|
+
end
|
51
|
+
|
52
|
+
def ipAddress
|
53
|
+
@toolsRunningStatus = 'guestToolsRunning'
|
54
|
+
"#{@name}.ip.address"
|
55
|
+
end
|
56
|
+
|
57
|
+
def CloneVM_Task(opts)
|
58
|
+
clone = MockVsphereVM.new
|
59
|
+
clone.name = opts[:name]
|
60
|
+
clone.snapshot = snapshot
|
61
|
+
clone.template = template
|
62
|
+
clone.PowerOnVM_Task
|
63
|
+
MockVsphereHelper.add_vm(opts[:name], clone)
|
64
|
+
clone
|
65
|
+
end
|
66
|
+
|
67
|
+
def wait_for_completion
|
68
|
+
true
|
69
|
+
end
|
70
|
+
|
71
|
+
def Destroy_Task
|
72
|
+
true
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
class MockVsphereHelper
|
77
|
+
@@fog_file = {}
|
78
|
+
@@vms = {}
|
79
|
+
|
80
|
+
def initialize(arg); end
|
81
|
+
|
82
|
+
def self.add_vm(name, vm)
|
83
|
+
@@vms[name] = vm
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.set_config(conf)
|
87
|
+
@@fog_file = conf
|
88
|
+
end
|
89
|
+
|
90
|
+
def self.powerOn
|
91
|
+
@@vms.each do |_name, vm|
|
92
|
+
vm.powerState = 'poweredOn'
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def self.powerOff
|
97
|
+
@@vms.each do |_name, vm|
|
98
|
+
vm.powerState = 'poweredOff'
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def self.set_vms(hosts)
|
103
|
+
@@vms = {}
|
104
|
+
hosts.each do |host|
|
105
|
+
vm = MockVsphereVM.new
|
106
|
+
vm.name = host.name
|
107
|
+
vm.snapshot = MockVsphereSnapshot.new
|
108
|
+
vm.snapshot.name = host[:snapshot]
|
109
|
+
@@vms[host.name] = vm
|
110
|
+
template = MockVsphereVM.new
|
111
|
+
template.name = host[:template]
|
112
|
+
template.snapshot = MockVsphereSnapshot.new
|
113
|
+
template.snapshot.name = host[:snapshot]
|
114
|
+
@@vms[host[:template]] = template
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def self.load_config(_file)
|
119
|
+
@@fog_file
|
120
|
+
end
|
121
|
+
|
122
|
+
def find_vms(keys)
|
123
|
+
found = {}
|
124
|
+
keys = ([] << keys)
|
125
|
+
keys.flatten!
|
126
|
+
keys.each do |key|
|
127
|
+
found[key] = @@vms[key] if @@vms.has_key?(key)
|
128
|
+
end
|
129
|
+
found
|
130
|
+
end
|
131
|
+
|
132
|
+
def self.find_vm(key)
|
133
|
+
return unless @@vms.has_key?(key)
|
134
|
+
|
135
|
+
@@vms[key]
|
136
|
+
end
|
137
|
+
|
138
|
+
def find_snapshot(vm, snap)
|
139
|
+
return unless @@vms[vm.name].snapshot.name == snap
|
140
|
+
|
141
|
+
@@vms[vm.name].snapshot
|
142
|
+
end
|
143
|
+
|
144
|
+
def find_customization(_template)
|
145
|
+
nil
|
146
|
+
end
|
147
|
+
|
148
|
+
def find_datastore(_dc, datastore)
|
149
|
+
datastore
|
150
|
+
end
|
151
|
+
|
152
|
+
def find_pool(_dc, pool)
|
153
|
+
pool
|
154
|
+
end
|
155
|
+
|
156
|
+
def find_folder(_dc, folder)
|
157
|
+
folder
|
158
|
+
end
|
159
|
+
|
160
|
+
def wait_for_tasks(_tasks, _try, _attempts)
|
161
|
+
true
|
162
|
+
end
|
163
|
+
|
164
|
+
def close
|
165
|
+
true
|
166
|
+
end
|
167
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,7 +1,32 @@
|
|
1
|
-
require 'simplecov'
|
2
|
-
require 'rspec/its'
|
3
1
|
require 'beaker'
|
4
|
-
require '
|
2
|
+
require 'mock_vsphere'
|
3
|
+
require 'mock_vsphere_helper'
|
4
|
+
|
5
|
+
begin
|
6
|
+
require 'simplecov'
|
7
|
+
require 'simplecov-console'
|
8
|
+
require 'codecov'
|
9
|
+
rescue LoadError
|
10
|
+
# Do nothing if no required gem installed
|
11
|
+
else
|
12
|
+
SimpleCov.start do
|
13
|
+
track_files 'lib/**/*.rb'
|
14
|
+
|
15
|
+
add_filter '/spec'
|
16
|
+
# do not track vendored files
|
17
|
+
add_filter '/vendor'
|
18
|
+
add_filter '/.vendor'
|
19
|
+
|
20
|
+
enable_coverage :branch
|
21
|
+
end
|
22
|
+
|
23
|
+
SimpleCov.formatters = [
|
24
|
+
SimpleCov::Formatter::Console,
|
25
|
+
SimpleCov::Formatter::Codecov,
|
26
|
+
]
|
27
|
+
end
|
28
|
+
|
29
|
+
Dir['./lib/beaker/hypervisor/*.rb'].sort.each { |file| require file }
|
5
30
|
|
6
31
|
# setup & require beaker's spec_helper.rb
|
7
32
|
beaker_gem_spec = Gem::Specification.find_by_name('beaker')
|