beaker 1.8.2 → 1.9.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 +8 -8
- data/README.md +0 -3
- data/beaker.gemspec +2 -1
- data/lib/beaker/cli.rb +0 -1
- data/lib/beaker/dsl/helpers.rb +17 -0
- data/lib/beaker/dsl/install_utils.rb +85 -61
- data/lib/beaker/host_prebuilt_steps.rb +78 -4
- data/lib/beaker/hypervisor.rb +16 -6
- data/lib/beaker/hypervisor/blimper.rb +1 -0
- data/lib/beaker/hypervisor/google_compute.rb +152 -0
- data/lib/beaker/hypervisor/google_compute_helper.rb +577 -0
- data/lib/beaker/hypervisor/vagrant.rb +0 -10
- data/lib/beaker/hypervisor/vcloud.rb +18 -21
- data/lib/beaker/hypervisor/vcloud_pooled.rb +0 -1
- data/lib/beaker/options/parser.rb +1 -1
- data/lib/beaker/options/presets.rb +5 -1
- data/lib/beaker/platform.rb +26 -2
- data/lib/beaker/version.rb +1 -1
- data/spec/beaker/dsl/install_utils_spec.rb +2 -2
- data/spec/beaker/hypervisor/fusion_spec.rb +15 -0
- data/spec/beaker/hypervisor/vagrant_spec.rb +2 -2
- data/spec/beaker/options/parser_spec.rb +1 -1
- data/spec/helpers.rb +5 -1
- data/spec/mock_blimpy.rb +1 -1
- metadata +22 -6
@@ -42,16 +42,6 @@ module Beaker
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
-
def hack_etc_hosts hosts
|
46
|
-
etc_hosts = "127.0.0.1\tlocalhost localhost.localdomain\n"
|
47
|
-
hosts.each do |host|
|
48
|
-
etc_hosts += "#{host['ip'].to_s}\t#{host.name}\n"
|
49
|
-
end
|
50
|
-
hosts.each do |host|
|
51
|
-
set_etc_hosts(host, etc_hosts)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
45
|
def set_ssh_config host, user
|
56
46
|
f = Tempfile.new("#{host.name}")
|
57
47
|
ssh_config = Dir.chdir(@vagrant_path) do
|
@@ -1,8 +1,7 @@
|
|
1
1
|
require 'yaml' unless defined?(YAML)
|
2
2
|
|
3
|
-
module Beaker
|
3
|
+
module Beaker
|
4
4
|
class Vcloud < Beaker::Hypervisor
|
5
|
-
CHARMAP = [('a'..'z'),('0'..'9')].map{|r| r.to_a}.flatten
|
6
5
|
|
7
6
|
def initialize(vcloud_hosts, options)
|
8
7
|
@options = options
|
@@ -52,17 +51,15 @@ module Beaker
|
|
52
51
|
end
|
53
52
|
end
|
54
53
|
|
55
|
-
def generate_host_name
|
56
|
-
CHARMAP[rand(25)] + (0...14).map{CHARMAP[rand(CHARMAP.length)]}.join
|
57
|
-
end
|
58
|
-
|
59
54
|
def create_clone_spec host
|
60
55
|
# Add VM annotation
|
61
56
|
configSpec = RbVmomi::VIM.VirtualMachineConfigSpec(
|
62
57
|
:annotation =>
|
63
58
|
'Base template: ' + host['template'] + "\n" +
|
64
59
|
'Creation time: ' + Time.now.strftime("%Y-%m-%d %H:%M") + "\n\n" +
|
65
|
-
'CI build link: ' + ( ENV['BUILD_URL'] || 'Deployed independently of CI' )
|
60
|
+
'CI build link: ' + ( ENV['BUILD_URL'] || 'Deployed independently of CI' ) +
|
61
|
+
'department: ' + @options[:department] +
|
62
|
+
'project: ' + @options[:project]
|
66
63
|
)
|
67
64
|
|
68
65
|
# Are we using a customization spec?
|
@@ -95,44 +92,44 @@ module Beaker
|
|
95
92
|
connect_to_vsphere
|
96
93
|
begin
|
97
94
|
vsphere_vms = {}
|
98
|
-
|
95
|
+
|
99
96
|
try = 1
|
100
97
|
attempts = @options[:timeout].to_i / 5
|
101
|
-
|
98
|
+
|
102
99
|
start = Time.now
|
103
100
|
tasks = []
|
104
101
|
@hosts.each_with_index do |h, i|
|
105
102
|
# Generate a randomized hostname
|
106
103
|
h['vmhostname'] = generate_host_name
|
107
|
-
|
104
|
+
|
108
105
|
if h['template'] =~ /\//
|
109
106
|
templatefolders = h['template'].split('/')
|
110
107
|
h['template'] = templatefolders.pop
|
111
108
|
end
|
112
|
-
|
109
|
+
|
113
110
|
@logger.notify "Deploying #{h['vmhostname']} (#{h.name}) to #{@options['folder']} from template '#{h['template']}'"
|
114
|
-
|
111
|
+
|
115
112
|
vm = {}
|
116
|
-
|
113
|
+
|
117
114
|
if templatefolders
|
118
115
|
vm[h['template']] = @vsphere_helper.find_folder(templatefolders.join('/')).find(h['template'])
|
119
116
|
else
|
120
117
|
vm = @vsphere_helper.find_vms(h['template'])
|
121
118
|
end
|
122
|
-
|
119
|
+
|
123
120
|
if vm.length == 0
|
124
121
|
raise "Unable to find template '#{h['template']}'!"
|
125
122
|
end
|
126
|
-
|
123
|
+
|
127
124
|
spec = create_clone_spec(h)
|
128
|
-
|
125
|
+
|
129
126
|
# Deploy from specified template
|
130
127
|
tasks << vm[h['template']].CloneVM_Task( :folder => @vsphere_helper.find_folder(@options['folder']), :name => h['vmhostname'], :spec => spec )
|
131
128
|
end
|
132
129
|
try = (Time.now - start) / 5
|
133
130
|
@vsphere_helper.wait_for_tasks(tasks, try, attempts)
|
134
131
|
@logger.notify 'Spent %.2f seconds deploying VMs' % (Time.now - start)
|
135
|
-
|
132
|
+
|
136
133
|
try = (Time.now - start) / 5
|
137
134
|
duration = run_and_report_duration do
|
138
135
|
@hosts.each_with_index do |h, i|
|
@@ -140,7 +137,7 @@ module Beaker
|
|
140
137
|
end
|
141
138
|
end
|
142
139
|
@logger.notify "Spent %.2f seconds booting and waiting for vSphere registration" % duration
|
143
|
-
|
140
|
+
|
144
141
|
try = (Time.now - start) / 5
|
145
142
|
duration = run_and_report_duration do
|
146
143
|
@hosts.each_with_index do |h, i|
|
@@ -149,7 +146,7 @@ module Beaker
|
|
149
146
|
end
|
150
147
|
@logger.notify "Spent %.2f seconds waiting for DNS resolution" % duration
|
151
148
|
rescue => e
|
152
|
-
@vsphere_helper.close
|
149
|
+
@vsphere_helper.close
|
153
150
|
report_and_raise(@logger, e, "Vcloud.provision")
|
154
151
|
end
|
155
152
|
end
|
@@ -163,7 +160,7 @@ module Beaker
|
|
163
160
|
@logger.warn "Some hosts did not have vmhostname set correctly! This likely means VM provisioning was not successful"
|
164
161
|
end
|
165
162
|
vms = @vsphere_helper.find_vms vm_names
|
166
|
-
begin
|
163
|
+
begin
|
167
164
|
vm_names.each do |name|
|
168
165
|
unless vm = vms[name]
|
169
166
|
@logger.warn "Unable to cleanup #{name}, couldn't find VM #{name} in vSphere!"
|
@@ -178,7 +175,7 @@ module Beaker
|
|
178
175
|
@logger.notify "Spent %.2f seconds halting #{vm.name}" % duration
|
179
176
|
end
|
180
177
|
|
181
|
-
duration = run_and_report_duration do
|
178
|
+
duration = run_and_report_duration do
|
182
179
|
vm.Destroy_Task
|
183
180
|
end
|
184
181
|
@logger.notify "Spent %.2f seconds destroying #{vm.name}" % duration
|
@@ -5,7 +5,7 @@ module Beaker
|
|
5
5
|
#An Object that parses, merges and normalizes all supported Beaker options and arguments
|
6
6
|
class Parser
|
7
7
|
GITREPO = 'git://github.com/puppetlabs'
|
8
|
-
#These options can have the form of arg1,arg2 or [arg] or just arg,
|
8
|
+
#These options can have the form of arg1,arg2 or [arg] or just arg,
|
9
9
|
#should default to []
|
10
10
|
LONG_OPTS = [:helper, :load_path, :tests, :pre_suite, :post_suite, :install, :modules]
|
11
11
|
#These options expand out into an array of .rb files
|
@@ -20,7 +20,9 @@ module Beaker
|
|
20
20
|
:pe_dir => ENV['pe_dist_dir'],
|
21
21
|
:pe_version_file => ENV['pe_version_file'],
|
22
22
|
:pe_version_file_win => ENV['pe_version_file'],
|
23
|
-
:pe_ver => ENV['pe_ver']
|
23
|
+
:pe_ver => ENV['pe_ver'],
|
24
|
+
:project => ENV['BEAKER_project'],
|
25
|
+
:department => ENV['BEAKER_department'],
|
24
26
|
}.delete_if {|key, value| value.nil? or value.empty? })
|
25
27
|
end
|
26
28
|
|
@@ -30,6 +32,8 @@ module Beaker
|
|
30
32
|
def self.presets
|
31
33
|
h = Beaker::Options::OptionsHash.new
|
32
34
|
h.merge({
|
35
|
+
:project => 'Beaker',
|
36
|
+
:department => ENV['USER'] || ENV['USERNAME'] || 'unknown',
|
33
37
|
:log_level => 'verbose',
|
34
38
|
:trace_limit => 10,
|
35
39
|
:hosts_file => 'sample.cfg',
|
data/lib/beaker/platform.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
module Beaker
|
2
|
+
#This class create a Platform object inheriting from String. It supports all String methods while adding
|
3
|
+
#several platform-specific use cases.
|
2
4
|
class Platform < String
|
3
|
-
#
|
5
|
+
#Supported platforms
|
4
6
|
PLATFORMS = /^(centos|fedora|debian|oracle|redhat|scientific|sles|ubuntu|windows|solaris|aix|el)\-.+\-.+$/
|
5
|
-
|
7
|
+
#Platform version numbers vs. codenames conversion hash
|
6
8
|
PLATFORM_VERSION_CODES =
|
7
9
|
{ :debian => { "wheezy" => "7",
|
8
10
|
"squeeze" => "6",
|
@@ -15,6 +17,20 @@ module Beaker
|
|
15
17
|
},
|
16
18
|
}
|
17
19
|
|
20
|
+
#Creates the Platform object. Checks to ensure that the platform String provided meets the platform
|
21
|
+
#formatting rules. Platforms name must be of the format /^OSFAMILY-VERSION-ARCH.*$/ where OSFAMILY is one of:
|
22
|
+
# * centos
|
23
|
+
# * fedora
|
24
|
+
# * debian
|
25
|
+
# * oracle
|
26
|
+
# * redhat
|
27
|
+
# * scientific
|
28
|
+
# * sles
|
29
|
+
# * ubuntu
|
30
|
+
# * windows
|
31
|
+
# * solaris
|
32
|
+
# * aix
|
33
|
+
# * el
|
18
34
|
def initialize(name)
|
19
35
|
if name !~ PLATFORMS
|
20
36
|
raise ArgumentError, "Unsupported platform name #{name}"
|
@@ -22,6 +38,10 @@ module Beaker
|
|
22
38
|
super
|
23
39
|
end
|
24
40
|
|
41
|
+
# Returns the platform string with the platform version as a codename. If no conversion is
|
42
|
+
# necessary then the original, unchanged platform String is returned.
|
43
|
+
# @example Platform.new('debian-7-xxx').with_version_codename == 'debian-wheezy-xxx'
|
44
|
+
# @return [String] the platform string with the platform version represented as a codename
|
25
45
|
def with_version_codename
|
26
46
|
name, version, extra = self.split('-', 3)
|
27
47
|
PLATFORM_VERSION_CODES.each_key do |platform|
|
@@ -39,6 +59,10 @@ module Beaker
|
|
39
59
|
[name, version, extra].join('-')
|
40
60
|
end
|
41
61
|
|
62
|
+
# Returns the platform string with the platform version as a number. If no conversion is necessary
|
63
|
+
# then the original, unchanged platform String is returned.
|
64
|
+
# @example Platform.new('debian-wheezy-xxx').with_version_number == 'debian-7-xxx'
|
65
|
+
# @return [String] the platform string with the platform version represented as a number
|
42
66
|
def with_version_number
|
43
67
|
name, version, extra = self.split('-', 3)
|
44
68
|
PLATFORM_VERSION_CODES.each_key do |platform|
|
data/lib/beaker/version.rb
CHANGED
@@ -169,7 +169,7 @@ describe ClassMixedWithDSLInstallUtils do
|
|
169
169
|
path = unixhost['pe_dir']
|
170
170
|
filename = "#{ unixhost['dist'] }"
|
171
171
|
extension = '.tar'
|
172
|
-
subject.should_receive( :on ).with( unixhost, "cd #{ unixhost['working_dir'] }; curl
|
172
|
+
subject.should_receive( :on ).with( unixhost, "cd #{ unixhost['working_dir'] }; curl #{ path }/#{ filename }#{ extension } | tar -xvf -" ).once
|
173
173
|
subject.fetch_puppet( [unixhost], {} )
|
174
174
|
end
|
175
175
|
|
@@ -182,7 +182,7 @@ describe ClassMixedWithDSLInstallUtils do
|
|
182
182
|
path = unixhost['pe_dir']
|
183
183
|
filename = "#{ unixhost['dist'] }"
|
184
184
|
extension = '.tar.gz'
|
185
|
-
subject.should_receive( :on ).with( unixhost, "cd #{ unixhost['working_dir'] }; curl
|
185
|
+
subject.should_receive( :on ).with( unixhost, "cd #{ unixhost['working_dir'] }; curl #{ path }/#{ filename }#{ extension } | gunzip | tar -xvf -" ).once
|
186
186
|
subject.fetch_puppet( [unixhost], {} )
|
187
187
|
end
|
188
188
|
|
@@ -21,6 +21,21 @@ module Beaker
|
|
21
21
|
expect{ fusion.provision }.to raise_error
|
22
22
|
end
|
23
23
|
|
24
|
+
it 'raises an error if snapshots is nil' do
|
25
|
+
MockFissionVM.set_snapshots(nil)
|
26
|
+
expect{ fusion.provision }.to raise_error(/No snapshots available/)
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'raises an error if snapshots are empty' do
|
30
|
+
MockFissionVM.set_snapshots([])
|
31
|
+
expect{ fusion.provision }.to raise_error(/No snapshots available/)
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'host fails init with nil snapshot' do
|
35
|
+
@hosts[0][:snapshot] = nil
|
36
|
+
expect{ Beaker::Fusion.new( @hosts, make_opts) }.to raise_error(/specify a snapshot/)
|
37
|
+
end
|
38
|
+
|
24
39
|
end
|
25
40
|
|
26
41
|
end
|
@@ -38,7 +38,7 @@ module Beaker
|
|
38
38
|
|
39
39
|
generated_file = File.read( File.expand_path( File.join( path, "Vagrantfile") ) )
|
40
40
|
|
41
|
-
match = generated_file.match(/vb.customize \["modifyvm", :id, "--memory", "hello!"]/)
|
41
|
+
match = generated_file.match(/vb.customize \["modifyvm", :id, "--memory", "hello!"\]/)
|
42
42
|
|
43
43
|
expect( match ).to_not be nil
|
44
44
|
|
@@ -50,7 +50,7 @@ module Beaker
|
|
50
50
|
vagrant.should_receive( :set_etc_hosts ).with( host, "127.0.0.1\tlocalhost localhost.localdomain\nip.address.for.vm1\tvm1\nip.address.for.vm2\tvm2\nip.address.for.vm3\tvm3\n" ).once
|
51
51
|
end
|
52
52
|
|
53
|
-
vagrant.hack_etc_hosts( @hosts )
|
53
|
+
vagrant.hack_etc_hosts( @hosts, options )
|
54
54
|
|
55
55
|
end
|
56
56
|
|
@@ -133,7 +133,7 @@ module Beaker
|
|
133
133
|
it "can correctly combine arguments from different sources" do
|
134
134
|
FakeFS.deactivate!
|
135
135
|
args = ["-h", hosts_path, "--log-level", "debug", "--type", "git", "--install", "PUPPET/1.0,HIERA/hello"]
|
136
|
-
expect(parser.parse_args(args)).to be === {:log_level=>"debug", :trace_limit=>10, :hosts_file=>hosts_path, :options_file=>nil, :type=>"git", :provision=>true, :preserve_hosts=>'never', :root_keys=>false, :quiet=>false, :xml=>false, :color=>true, :dry_run=>false, :timeout=>300, :fail_mode=>'slow', :timesync=>false, :repo_proxy=>false, :add_el_extras=>false, :add_master_entry=>false, :consoleport=>443, :pe_dir=>"/opt/enterprise/dists", :pe_version_file=>"LATEST", :pe_version_file_win=>"LATEST-win", :dot_fog=>"#{home}/.fog", :help=>false, :ec2_yaml=>"config/image_templates/ec2.yaml", :ssh=>{:config=>false, :paranoid=>false, :timeout=>300, :auth_methods=>["publickey"], :port=>22, :forward_agent=>true, :keys=>["#{home}/.ssh/id_rsa"], :user_known_hosts_file=>"#{home}/.ssh/known_hosts"}, :install=>["git://github.com/puppetlabs/puppet.git#1.0", "git://github.com/puppetlabs/hiera.git#hello"], :HOSTS=>{:"pe-ubuntu-lucid"=>{:roles=>["agent", "dashboard", "database", "master"], :vmname=>"pe-ubuntu-lucid", :platform=>"ubuntu-10.04-i386", :snapshot=>"clean-w-keys", :hypervisor=>"fusion"}, :"pe-centos6"=>{:roles=>["agent"], :vmname=>"pe-centos6", :platform=>"el-6-i386", :hypervisor=>"fusion", :snapshot=>"clean-w-keys"}}, :nfs_server=>"none", :helper=>[], :load_path=>[], :tests=>[], :pre_suite=>[], :post_suite=>[], :modules=>[]}
|
136
|
+
expect(parser.parse_args(args)).to be === {:project=>"Beaker", :department=>"#{ENV['USER']}", :log_level=>"debug", :trace_limit=>10, :hosts_file=>hosts_path, :options_file=>nil, :type=>"git", :provision=>true, :preserve_hosts=>'never', :root_keys=>false, :quiet=>false, :xml=>false, :color=>true, :dry_run=>false, :timeout=>300, :fail_mode=>'slow', :timesync=>false, :repo_proxy=>false, :add_el_extras=>false, :add_master_entry=>false, :consoleport=>443, :pe_dir=>"/opt/enterprise/dists", :pe_version_file=>"LATEST", :pe_version_file_win=>"LATEST-win", :dot_fog=>"#{home}/.fog", :help=>false, :ec2_yaml=>"config/image_templates/ec2.yaml", :ssh=>{:config=>false, :paranoid=>false, :timeout=>300, :auth_methods=>["publickey"], :port=>22, :forward_agent=>true, :keys=>["#{home}/.ssh/id_rsa"], :user_known_hosts_file=>"#{home}/.ssh/known_hosts"}, :install=>["git://github.com/puppetlabs/puppet.git#1.0", "git://github.com/puppetlabs/hiera.git#hello"], :HOSTS=>{:"pe-ubuntu-lucid"=>{:roles=>["agent", "dashboard", "database", "master"], :vmname=>"pe-ubuntu-lucid", :platform=>"ubuntu-10.04-i386", :snapshot=>"clean-w-keys", :hypervisor=>"fusion"}, :"pe-centos6"=>{:roles=>["agent"], :vmname=>"pe-centos6", :platform=>"el-6-i386", :hypervisor=>"fusion", :snapshot=>"clean-w-keys"}}, :nfs_server=>"none", :helper=>[], :load_path=>[], :tests=>[], :pre_suite=>[], :post_suite=>[], :modules=>[]}
|
137
137
|
end
|
138
138
|
|
139
139
|
it "ensures that fail-mode is one of fast/slow" do
|
data/spec/helpers.rb
CHANGED
@@ -53,7 +53,11 @@ module HostHelpers
|
|
53
53
|
:pooling_api => 'http://vcloud.delivery.puppetlabs.net/',
|
54
54
|
:datastore => 'instance0',
|
55
55
|
:folder => 'Delivery/Quality Assurance/Staging/Dynamic',
|
56
|
-
:resourcepool => 'delivery/Quality Assurance/Staging/Dynamic'
|
56
|
+
:resourcepool => 'delivery/Quality Assurance/Staging/Dynamic',
|
57
|
+
:gce_project => 'beaker-compute',
|
58
|
+
:gce_keyfile => '/path/to/keyfile.p12',
|
59
|
+
:gce_password => 'notasecret',
|
60
|
+
:gce_email => '12345678910@developer.gserviceaccount.com' } )
|
57
61
|
end
|
58
62
|
|
59
63
|
def generate_result (name, opts )
|
data/spec/mock_blimpy.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: beaker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Puppetlabs
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
11
|
+
date: 2014-03-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -42,16 +42,16 @@ dependencies:
|
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ~>
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 10.1.0
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ~>
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 10.1.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: simplecov
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -206,6 +206,20 @@ dependencies:
|
|
206
206
|
- - ~>
|
207
207
|
- !ruby/object:Gem::Version
|
208
208
|
version: '0.4'
|
209
|
+
- !ruby/object:Gem::Dependency
|
210
|
+
name: google-api-client
|
211
|
+
requirement: !ruby/object:Gem::Requirement
|
212
|
+
requirements:
|
213
|
+
- - ~>
|
214
|
+
- !ruby/object:Gem::Version
|
215
|
+
version: 0.6.4
|
216
|
+
type: :runtime
|
217
|
+
prerelease: false
|
218
|
+
version_requirements: !ruby/object:Gem::Requirement
|
219
|
+
requirements:
|
220
|
+
- - ~>
|
221
|
+
- !ruby/object:Gem::Version
|
222
|
+
version: 0.6.4
|
209
223
|
- !ruby/object:Gem::Dependency
|
210
224
|
name: nokogiri
|
211
225
|
requirement: !ruby/object:Gem::Requirement
|
@@ -306,6 +320,8 @@ files:
|
|
306
320
|
- lib/beaker/hypervisor/aixer.rb
|
307
321
|
- lib/beaker/hypervisor/blimper.rb
|
308
322
|
- lib/beaker/hypervisor/fusion.rb
|
323
|
+
- lib/beaker/hypervisor/google_compute.rb
|
324
|
+
- lib/beaker/hypervisor/google_compute_helper.rb
|
309
325
|
- lib/beaker/hypervisor/solaris.rb
|
310
326
|
- lib/beaker/hypervisor/vagrant.rb
|
311
327
|
- lib/beaker/hypervisor/vcloud.rb
|