beaker 1.21.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/.gitignore +1 -0
- data/.rspec +1 -0
- data/CONTRIBUTING.md +1 -0
- data/HISTORY.md +17288 -2
- data/Rakefile +6 -2
- data/beaker.gemspec +15 -19
- data/lib/beaker.rb +2 -5
- data/lib/beaker/answers.rb +2 -0
- data/lib/beaker/answers/version34.rb +37 -1
- data/lib/beaker/cli.rb +4 -0
- data/lib/beaker/command.rb +16 -84
- data/lib/beaker/command_factory.rb +13 -2
- data/lib/beaker/dsl/assertions.rb +25 -2
- data/lib/beaker/dsl/ezbake_utils.rb +2 -2
- data/lib/beaker/dsl/helpers.rb +66 -12
- data/lib/beaker/dsl/install_utils.rb +128 -66
- data/lib/beaker/dsl/wrappers.rb +41 -3
- data/lib/beaker/host.rb +42 -6
- data/lib/beaker/host/mac.rb +62 -0
- data/lib/beaker/host/mac/group.rb +96 -0
- data/lib/beaker/host/mac/user.rb +93 -0
- data/lib/beaker/host/unix/exec.rb +1 -1
- data/lib/beaker/host/unix/pkg.rb +11 -11
- data/lib/beaker/host/windows.rb +4 -4
- data/lib/beaker/host_prebuilt_steps.rb +194 -58
- data/lib/beaker/hypervisor.rb +16 -9
- data/lib/beaker/hypervisor/aws_sdk.rb +61 -17
- data/lib/beaker/hypervisor/docker.rb +14 -2
- data/lib/beaker/hypervisor/ec2_helper.rb +15 -3
- data/lib/beaker/hypervisor/vagrant.rb +22 -10
- data/lib/beaker/hypervisor/vagrant_libvirt.rb +11 -0
- data/lib/beaker/hypervisor/vagrant_virtualbox.rb +1 -1
- data/lib/beaker/hypervisor/vcloud_pooled.rb +8 -39
- data/lib/beaker/logger.rb +15 -9
- data/lib/beaker/network_manager.rb +2 -2
- data/lib/beaker/options/command_line_parser.rb +1 -1
- data/lib/beaker/options/parser.rb +1 -8
- data/lib/beaker/options/presets.rb +70 -45
- data/lib/beaker/perf.rb +3 -4
- data/lib/beaker/platform.rb +2 -1
- data/lib/beaker/result.rb +3 -9
- data/lib/beaker/ssh_connection.rb +2 -0
- data/lib/beaker/test_case.rb +2 -21
- data/lib/beaker/test_suite.rb +21 -25
- data/lib/beaker/version.rb +1 -1
- data/spec/beaker/answers_spec.rb +36 -0
- data/spec/beaker/cli_spec.rb +45 -45
- data/spec/beaker/command_spec.rb +25 -36
- data/spec/beaker/dsl/assertions_spec.rb +20 -27
- data/spec/beaker/dsl/ezbake_utils_spec.rb +5 -5
- data/spec/beaker/dsl/helpers_spec.rb +293 -208
- data/spec/beaker/dsl/install_utils_spec.rb +310 -189
- data/spec/beaker/dsl/outcomes_spec.rb +6 -6
- data/spec/beaker/dsl/roles_spec.rb +27 -18
- data/spec/beaker/dsl/structure_spec.rb +11 -11
- data/spec/beaker/dsl/wrappers_spec.rb +35 -11
- data/spec/beaker/host/mac/group_spec.rb +124 -0
- data/spec/beaker/host/mac/user_spec.rb +134 -0
- data/spec/beaker/host/unix/pkg_spec.rb +40 -24
- data/spec/beaker/host/windows/group_spec.rb +1 -1
- data/spec/beaker/host_prebuilt_steps_spec.rb +194 -68
- data/spec/beaker/host_spec.rb +145 -67
- data/spec/beaker/hypervisor/aixer_spec.rb +6 -6
- data/spec/beaker/hypervisor/aws_sdk_spec.rb +22 -7
- data/spec/beaker/hypervisor/docker_spec.rb +71 -50
- data/spec/beaker/hypervisor/ec2_helper_spec.rb +25 -4
- data/spec/beaker/hypervisor/fusion_spec.rb +2 -2
- data/spec/beaker/hypervisor/hypervisor_spec.rb +20 -27
- data/spec/beaker/hypervisor/hypervisor_spec.rb.orig +80 -0
- data/spec/beaker/hypervisor/solaris_spec.rb +8 -8
- data/spec/beaker/hypervisor/vagrant_fusion_spec.rb +6 -8
- data/spec/beaker/hypervisor/vagrant_libvirt_spec.rb +34 -0
- data/spec/beaker/hypervisor/vagrant_spec.rb +34 -33
- data/spec/beaker/hypervisor/vagrant_virtualbox_spec.rb +18 -8
- data/spec/beaker/hypervisor/vagrant_workstation_spec.rb +6 -8
- data/spec/beaker/hypervisor/vcloud_pooled_spec.rb +8 -8
- data/spec/beaker/hypervisor/vcloud_spec.rb +10 -10
- data/spec/beaker/hypervisor/vsphere_helper_spec.rb +8 -8
- data/spec/beaker/hypervisor/vsphere_spec.rb +1 -1
- data/spec/beaker/logger_spec.rb +45 -31
- data/spec/beaker/options/command_line_parser_spec.rb +10 -2
- data/spec/beaker/options/hosts_file_parser_spec.rb +9 -2
- data/spec/beaker/options/options_hash_spec.rb +2 -2
- data/spec/beaker/options/parser_spec.rb +2 -2
- data/spec/beaker/options/pe_version_scaper_spec.rb +6 -1
- data/spec/beaker/options/presets_spec.rb +11 -1
- data/spec/beaker/shared/error_handler_spec.rb +5 -5
- data/spec/beaker/shared/host_manager_spec.rb +3 -2
- data/spec/beaker/shared/repetition_spec.rb +18 -18
- data/spec/beaker/ssh_connection_spec.rb +33 -4
- data/spec/beaker/test_case_spec.rb +9 -9
- data/spec/beaker/test_suite_spec.rb +14 -14
- data/spec/helpers.rb +4 -4
- data/spec/matchers.rb +4 -4
- data/spec/mocks.rb +5 -1
- data/spec/spec_helper.rb +2 -8
- metadata +114 -80
- data/lib/beaker/hypervisor/blimper.rb +0 -108
- data/spec/beaker/hypervisor/blimper_spec.rb +0 -42
- data/spec/beaker/options/data/LATEST +0 -1
- data/spec/beaker/puppet_command_spec.rb +0 -161
- data/spec/mock_blimpy.rb +0 -48
@@ -1,108 +0,0 @@
|
|
1
|
-
require 'blimpy'
|
2
|
-
require 'yaml' unless defined?(YAML)
|
3
|
-
require 'beaker/hypervisor/ec2_helper'
|
4
|
-
|
5
|
-
module Beaker
|
6
|
-
class Blimper < Beaker::Hypervisor
|
7
|
-
|
8
|
-
def initialize(blimpy_hosts, options)
|
9
|
-
@options = options
|
10
|
-
@logger = options[:logger]
|
11
|
-
@hosts = blimpy_hosts
|
12
|
-
@blimpy = Blimpy
|
13
|
-
end
|
14
|
-
|
15
|
-
def provision
|
16
|
-
ami_spec= YAML.load_file(@options[:ec2_yaml])["AMI"]
|
17
|
-
|
18
|
-
fleet = @blimpy.fleet do |fleet|
|
19
|
-
@hosts.each do |host|
|
20
|
-
amitype = host['vmname'] || host['platform']
|
21
|
-
amisize = host['amisize'] || 'm1.small'
|
22
|
-
#use snapshot provided for this host
|
23
|
-
image_type = host['snapshot']
|
24
|
-
if not image_type
|
25
|
-
raise "No snapshot/image_type provided for blimpy provisioning"
|
26
|
-
end
|
27
|
-
ami = ami_spec[amitype]
|
28
|
-
fleet.add(:aws) do |ship|
|
29
|
-
ship.name = host.name
|
30
|
-
ship.ports = Beaker::EC2Helper.amiports(host['roles'])
|
31
|
-
ship.image_id = ami[:image][image_type.to_sym]
|
32
|
-
if not ship.image_id
|
33
|
-
raise "No image_id found for host #{ship.name} (#{amitype}:#{amisize}) using snapshot/image_type #{image_type}"
|
34
|
-
end
|
35
|
-
ship.flavor = amisize
|
36
|
-
ship.region = ami[:region]
|
37
|
-
ship.username = 'root'
|
38
|
-
ship.tags = {
|
39
|
-
:department => @options[:department],
|
40
|
-
:project => @options[:project],
|
41
|
-
:jenkins_build_url => @options[:jenkins_build_url],
|
42
|
-
}
|
43
|
-
end
|
44
|
-
@logger.debug "Added #{host.name} (#{amitype}:#{amisize}) using snapshot/image_type #{image_type} to blimpy fleet"
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
# Attempt to start the fleet, we wrap it with some error handling that
|
49
|
-
# deals with generic Fog errors and retrying in case these errors are
|
50
|
-
# transient.
|
51
|
-
fleet_retries = 0
|
52
|
-
begin
|
53
|
-
fleet.start
|
54
|
-
rescue Fog::Errors::Error, SystemCallError => ex
|
55
|
-
fleet_retries += 1
|
56
|
-
if fleet_retries <= 3
|
57
|
-
sleep_time = rand(10) + 10
|
58
|
-
@logger.notify("Calling fleet.destroy, sleeping #{sleep_time} seconds and retrying fleet.start due to exception #{ex.class.to_s} (#{ex.message}), retry attempt #{fleet_retries}.")
|
59
|
-
begin
|
60
|
-
timeout(30) do
|
61
|
-
fleet.destroy
|
62
|
-
end
|
63
|
-
rescue
|
64
|
-
end
|
65
|
-
sleep sleep_time
|
66
|
-
retry
|
67
|
-
else
|
68
|
-
@logger.error("Retried Fog #{fleet_retries} times, giving up and throwing the exception")
|
69
|
-
raise ex
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
# Configure our nodes to match the blimp fleet
|
74
|
-
# Also generate hosts entries for the fleet, since we're iterating
|
75
|
-
etc_hosts = "127.0.0.1\tlocalhost localhost.localdomain\n"
|
76
|
-
fleet.ships.each do |ship|
|
77
|
-
ship.wait_for_sshd
|
78
|
-
name = ship.name
|
79
|
-
host = @hosts.select { |host| host.name == name }[0]
|
80
|
-
host['ip'] = ship.dns
|
81
|
-
host.exec(Command.new("hostname #{name}"))
|
82
|
-
ip = get_ip(host)
|
83
|
-
domain = get_domain_name(host)
|
84
|
-
etc_hosts += "#{ip}\t#{name}\t#{name}.#{domain}\n"
|
85
|
-
end
|
86
|
-
|
87
|
-
# Send our hosts information to the nodes
|
88
|
-
@hosts.each do |host|
|
89
|
-
set_etc_hosts(host, etc_hosts)
|
90
|
-
end
|
91
|
-
|
92
|
-
end #revert_blimpy
|
93
|
-
|
94
|
-
def cleanup
|
95
|
-
fleet = @blimpy.fleet do |fleet|
|
96
|
-
@hosts.each do |host|
|
97
|
-
fleet.add(:aws) do |ship|
|
98
|
-
ship.name = host.name
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
@logger.notify "Destroying Blimpy boxes"
|
104
|
-
fleet.destroy
|
105
|
-
end
|
106
|
-
|
107
|
-
end
|
108
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'blimpy'
|
3
|
-
|
4
|
-
module Beaker
|
5
|
-
describe Blimper do
|
6
|
-
let( :blimper ) { Beaker::Blimper.new( @hosts, make_opts ) }
|
7
|
-
let( :amispec ) { { "centos-5-x86-64-west" => { :image => { :pe => "ami-sekrit1" }, :region => "us-west-2" },
|
8
|
-
"centos-6-x86-64-west" => { :image => { :pe => "ami-sekrit2" }, :region => "us-west-2" },
|
9
|
-
"centos-7-x86-64-west" => { :image => { :pe => "ami-sekrit3" }, :region => "us-west-2" } }}
|
10
|
-
|
11
|
-
before :each do
|
12
|
-
@hosts = make_hosts( { :snapshot => :pe })
|
13
|
-
@hosts[0][:platform] = "centos-5-x86-64-west"
|
14
|
-
@hosts[1][:platform] = "centos-6-x86-64-west"
|
15
|
-
@hosts[2][:platform] = "centos-7-x86-64-west"
|
16
|
-
blimper.instance_variable_set( :@blimpy, MockBlimpy )
|
17
|
-
end
|
18
|
-
|
19
|
-
it "can provision a set of hosts" do
|
20
|
-
YAML.stub( :load_file ).and_return( {"AMI" => amispec} )
|
21
|
-
blimper.stub( :get_ip ) do |host|
|
22
|
-
host['ip']
|
23
|
-
end
|
24
|
-
blimper.stub( :get_domain_name ).and_return( 'domain' )
|
25
|
-
blimper.stub( :sleep ).and_return( true )
|
26
|
-
|
27
|
-
@hosts.each do |host|
|
28
|
-
blimper.should_receive( :set_etc_hosts ).with( host, "127.0.0.1\tlocalhost localhost.localdomain\nvm1.my.ip\tvm1\tvm1.domain\nvm2.my.ip\tvm2\tvm2.domain\nvm3.my.ip\tvm3\tvm3.domain\n" )
|
29
|
-
end
|
30
|
-
|
31
|
-
blimper.provision
|
32
|
-
end
|
33
|
-
|
34
|
-
it "calls fleet.destroy on cleanup" do
|
35
|
-
MockFleet.any_instance.should_receive( :add ).with( :aws ).exactly( @hosts.length ).times
|
36
|
-
MockFleet.any_instance.should_receive( :destroy ).once
|
37
|
-
|
38
|
-
blimper.cleanup
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
42
|
-
end
|
@@ -1 +0,0 @@
|
|
1
|
-
3.0.0
|
@@ -1,161 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module Beaker
|
4
|
-
#most testing already covered in Command, just need to cover env variable handling
|
5
|
-
describe PuppetCommand do
|
6
|
-
let(:command) { @command || '/bin/ls' }
|
7
|
-
let(:args) { @args || Array.new }
|
8
|
-
let(:options) { @options || {} }
|
9
|
-
subject(:cmd) { PuppetCommand.new( command, args, options ) }
|
10
|
-
let(:host) { make_host( 'name', { :platform => @platform } ) }
|
11
|
-
|
12
|
-
let( :nix_path ) { %q[PATH="/usr/bin:/opt/puppet-git-repos/hiera/bin:${PATH}"] }
|
13
|
-
let( :nix_lib ) { %q[RUBYLIB="/opt/puppet-git-repos/hiera/lib:/opt/puppet-git-repos/hiera-puppet/lib:${RUBYLIB}"] }
|
14
|
-
|
15
|
-
it 'creates a Windows env for a Windows host' do
|
16
|
-
@platform = 'windows'
|
17
|
-
@command = 'agent'
|
18
|
-
@args = [ 'to', 'the', 'baz' ]
|
19
|
-
@options = { :foo => 'bar' }
|
20
|
-
|
21
|
-
expect( host ).to be_a_kind_of Windows::Host
|
22
|
-
expect( cmd.options ).to be == options
|
23
|
-
expect( cmd.args ).to be == [@args]
|
24
|
-
expect( cmd.command ).to be == "puppet " + @command
|
25
|
-
|
26
|
-
expect( cmd.args_string ).to be == 'to the baz'
|
27
|
-
expect( cmd.options_string ).to be == '--foo=bar'
|
28
|
-
|
29
|
-
win_path = %q[/opt/puppet-git-repos/hiera/bin:${PATH}]
|
30
|
-
win_lib = %q[`cygpath -w /opt/puppet-git-repos/hiera/lib`;`cygpath -w /opt/puppet-git-repos/hiera-puppet/lib`;${RUBYLIB}]
|
31
|
-
cmd_exe = %q[cmd.exe /c]
|
32
|
-
|
33
|
-
command_line = cmd.environment_string_for( host, cmd.environment )
|
34
|
-
expect( command_line ).to include( win_path )
|
35
|
-
expect( command_line ).to include( win_lib )
|
36
|
-
expect( command_line ).to include( cmd_exe )
|
37
|
-
end
|
38
|
-
|
39
|
-
it 'creates a Unix env for a Unix host' do
|
40
|
-
@platform = 'unix'
|
41
|
-
@command = 'agent'
|
42
|
-
@args = [ 'to', 'the', 'baz' ]
|
43
|
-
@options = { :foo => 'bar' }
|
44
|
-
|
45
|
-
expect( host ).to be_a_kind_of Unix::Host
|
46
|
-
expect( cmd.options ).to be == @options
|
47
|
-
expect( cmd.args ).to be == [@args]
|
48
|
-
expect( cmd.command ).to be == "puppet " + @command
|
49
|
-
|
50
|
-
expect( cmd.args_string ).to be == 'to the baz'
|
51
|
-
expect( cmd.options_string ).to be == '--foo=bar'
|
52
|
-
|
53
|
-
command_line = cmd.environment_string_for( host, cmd.environment )
|
54
|
-
expect( command_line ).to include( nix_path )
|
55
|
-
expect( command_line ).to include( nix_lib )
|
56
|
-
end
|
57
|
-
|
58
|
-
it 'creates an AIX env for an AIX host' do
|
59
|
-
@platform = 'aix'
|
60
|
-
@command = 'agent'
|
61
|
-
@args = [ 'to', 'the', 'baz' ]
|
62
|
-
@options = { :foo => 'bar' }
|
63
|
-
|
64
|
-
expect( host ).to be_a_kind_of Aix::Host
|
65
|
-
expect( cmd.options ).to be == @options
|
66
|
-
expect( cmd.args ).to be == [@args]
|
67
|
-
expect( cmd.command ).to be == "puppet " + @command
|
68
|
-
|
69
|
-
expect( cmd.args_string ).to be == 'to the baz'
|
70
|
-
expect( cmd.options_string ).to be == '--foo=bar'
|
71
|
-
|
72
|
-
command_line = cmd.environment_string_for( host, cmd.environment )
|
73
|
-
expect( command_line ).to include( nix_path )
|
74
|
-
expect( command_line ).to include( nix_lib )
|
75
|
-
end
|
76
|
-
|
77
|
-
it 'correctly adds additional ENV to default ENV' do
|
78
|
-
@platform = 'unix'
|
79
|
-
@command = 'agent'
|
80
|
-
@args = [ 'to', 'the', 'baz' ]
|
81
|
-
@options = { :foo => 'bar', 'ENV' => {'PATH' => '/STRING_ENV/bin'} }
|
82
|
-
|
83
|
-
expect( host ).to be_a_kind_of Unix::Host
|
84
|
-
expect( cmd.options ).to be == @options
|
85
|
-
expect( cmd.args ).to be == [@args]
|
86
|
-
expect( cmd.command ).to be == "puppet " + @command
|
87
|
-
|
88
|
-
expect( cmd.args_string ).to be == 'to the baz'
|
89
|
-
expect( cmd.options_string ).to be == '--foo=bar'
|
90
|
-
custom = %q[PATH="/STRING_ENV/bin"]
|
91
|
-
|
92
|
-
command_line = cmd.environment_string_for( host, cmd.environment )
|
93
|
-
expect( command_line ).to include( nix_path )
|
94
|
-
expect( command_line ).to include( nix_lib )
|
95
|
-
expect( command_line ).to include( custom )
|
96
|
-
end
|
97
|
-
|
98
|
-
it 'correctly adds additional :ENV to default ENV' do
|
99
|
-
@platform = 'unix'
|
100
|
-
@command = 'agent'
|
101
|
-
@args = [ 'to', 'the', 'baz' ]
|
102
|
-
@options = { :foo => 'bar', :ENV => {'PATH' => '/SYMBOL_ENV/bin'} }
|
103
|
-
|
104
|
-
expect( host ).to be_a_kind_of Unix::Host
|
105
|
-
expect( cmd.options ).to be == @options
|
106
|
-
expect( cmd.args ).to be == [@args]
|
107
|
-
expect( cmd.command ).to be == "puppet " + @command
|
108
|
-
|
109
|
-
expect( cmd.args_string ).to be == 'to the baz'
|
110
|
-
expect( cmd.options_string ).to be == '--foo=bar'
|
111
|
-
|
112
|
-
custom = %q[PATH="/SYMBOL_ENV/bin"]
|
113
|
-
command_line = cmd.environment_string_for( host, cmd.environment )
|
114
|
-
expect( command_line ).to include( nix_path )
|
115
|
-
expect( command_line ).to include( nix_lib )
|
116
|
-
expect( command_line ).to include( custom )
|
117
|
-
end
|
118
|
-
|
119
|
-
it 'correctly adds additional :environment to default ENV' do
|
120
|
-
@platform = 'unix'
|
121
|
-
@command = 'agent'
|
122
|
-
@args = [ 'to', 'the', 'baz' ]
|
123
|
-
@options = { :foo => 'bar', :environment => {'PATH' => '/SYMBOL_ENVIRONMENT/bin'} }
|
124
|
-
|
125
|
-
expect( host ).to be_a_kind_of Unix::Host
|
126
|
-
expect( cmd.options ).to be == @options
|
127
|
-
expect( cmd.args ).to be == [@args]
|
128
|
-
expect( cmd.command ).to be == "puppet " + @command
|
129
|
-
|
130
|
-
expect( cmd.args_string ).to be == 'to the baz'
|
131
|
-
expect( cmd.options_string ).to be == '--foo=bar'
|
132
|
-
|
133
|
-
custom = %q[PATH="/SYMBOL_ENVIRONMENT/bin"]
|
134
|
-
command_line = cmd.environment_string_for( host, cmd.environment )
|
135
|
-
expect( command_line ).to include( nix_path )
|
136
|
-
expect( command_line ).to include( nix_lib )
|
137
|
-
expect( command_line ).to include( custom )
|
138
|
-
end
|
139
|
-
|
140
|
-
it 'correctly adds additional environment to default ENV' do
|
141
|
-
@platform = 'unix'
|
142
|
-
@command = 'agent'
|
143
|
-
@args = [ 'to', 'the', 'baz' ]
|
144
|
-
@options = { :foo => 'bar', 'environment' => {'PATH' => '/STRING_ENVIRONMENT/bin'} }
|
145
|
-
|
146
|
-
expect( host ).to be_a_kind_of Unix::Host
|
147
|
-
expect( cmd.options ).to be == @options
|
148
|
-
expect( cmd.args ).to be == [@args]
|
149
|
-
expect( cmd.command ).to be == "puppet " + @command
|
150
|
-
|
151
|
-
expect( cmd.args_string ).to be == 'to the baz'
|
152
|
-
expect( cmd.options_string ).to be == '--foo=bar'
|
153
|
-
|
154
|
-
custom = %q[PATH="/STRING_ENVIRONMENT/bin"]
|
155
|
-
command_line = cmd.environment_string_for( host, cmd.environment )
|
156
|
-
expect( command_line ).to include( nix_path )
|
157
|
-
expect( command_line ).to include( nix_lib )
|
158
|
-
expect( command_line ).to include( custom )
|
159
|
-
end
|
160
|
-
end
|
161
|
-
end
|
data/spec/mock_blimpy.rb
DELETED
@@ -1,48 +0,0 @@
|
|
1
|
-
class MockShip
|
2
|
-
attr_accessor :name, :ports, :image_id, :flavor, :region, :username, :dns, :tags
|
3
|
-
|
4
|
-
def initialize
|
5
|
-
@dns = "my.ip.address"
|
6
|
-
end
|
7
|
-
|
8
|
-
def wait_for_sshd
|
9
|
-
@dns = "#{@name}.my.ip"
|
10
|
-
return true
|
11
|
-
end
|
12
|
-
|
13
|
-
end
|
14
|
-
|
15
|
-
class MockFleet
|
16
|
-
attr_accessor :ships
|
17
|
-
@@attempts = 0
|
18
|
-
|
19
|
-
def initialize
|
20
|
-
@ships = []
|
21
|
-
end
|
22
|
-
|
23
|
-
def add type
|
24
|
-
@ships << MockShip.new
|
25
|
-
yield(@ships[-1])
|
26
|
-
@ships[-1]
|
27
|
-
end
|
28
|
-
|
29
|
-
def start
|
30
|
-
if @@attempts < 1
|
31
|
-
@@attempts += 1
|
32
|
-
raise Fog::Errors::Error
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def destroy
|
37
|
-
end
|
38
|
-
|
39
|
-
end
|
40
|
-
|
41
|
-
class MockBlimpy
|
42
|
-
@@fleet = nil
|
43
|
-
def self.fleet
|
44
|
-
yield(@@fleet = MockFleet.new)
|
45
|
-
@@fleet
|
46
|
-
end
|
47
|
-
|
48
|
-
end
|