boxgrinder-build 0.9.3 → 0.9.4
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +12 -0
- data/Manifest +6 -5
- data/README.md +1 -1
- data/Rakefile +13 -20
- data/boxgrinder-build.gemspec +7 -10
- data/lib/boxgrinder-build/helpers/aws-helper.rb +81 -0
- data/lib/boxgrinder-build/helpers/ec2-helper.rb +182 -0
- data/lib/boxgrinder-build/helpers/guestfs-helper.rb +5 -1
- data/lib/boxgrinder-build/helpers/s3-helper.rb +124 -0
- data/lib/boxgrinder-build/plugins/delivery/ebs/ebs-plugin.rb +95 -299
- data/lib/boxgrinder-build/plugins/delivery/elastichosts/elastichosts-plugin.rb +2 -1
- data/lib/boxgrinder-build/plugins/delivery/s3/s3-plugin.rb +67 -133
- data/lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb +15 -14
- data/rubygem-boxgrinder-build.spec +23 -28
- data/spec/appliance-spec.rb +1 -0
- data/spec/helpers/augeas-helper-spec.rb +1 -0
- data/spec/helpers/ec2-helper-spec.rb +260 -0
- data/spec/helpers/guestfs-helper-spec.rb +34 -7
- data/spec/helpers/image-helper-spec.rb +1 -0
- data/spec/helpers/linux-helper-spec.rb +1 -0
- data/spec/helpers/package-helper-spec.rb +1 -0
- data/spec/helpers/plugin-helper-spec.rb +1 -0
- data/spec/helpers/s3-helper-spec.rb +168 -0
- data/spec/managers/plugin-manager-spec.rb +1 -0
- data/spec/plugins/base-plugin-spec.rb +1 -1
- data/spec/plugins/delivery/ebs/ebs-plugin-spec.rb +115 -204
- data/spec/plugins/delivery/elastichosts/elastichosts-plugin-spec.rb +5 -4
- data/spec/plugins/delivery/local/local-plugin-spec.rb +1 -0
- data/spec/plugins/delivery/s3/s3-plugin-spec.rb +143 -134
- data/spec/plugins/delivery/sftp/sftp-plugin-spec.rb +1 -0
- data/spec/plugins/os/centos/centos-plugin-spec.rb +1 -0
- data/spec/plugins/os/fedora/fedora-plugin-spec.rb +1 -0
- data/spec/plugins/os/rhel/rhel-plugin-spec.rb +1 -0
- data/spec/plugins/os/rpm-based/kickstart-spec.rb +5 -1
- data/spec/plugins/os/rpm-based/rpm-based-os-plugin-spec.rb +9 -7
- data/spec/plugins/os/rpm-based/rpm-dependency-validator-spec.rb +1 -0
- data/spec/plugins/os/sl/sl-plugin-spec.rb +1 -0
- data/spec/plugins/platform/ec2/ec2-plugin-spec.rb +1 -0
- data/spec/plugins/platform/virtualbox/virtualbox-plugin-spec.rb +1 -0
- data/spec/plugins/platform/vmware/vmware-plugin-spec.rb +1 -0
- metadata +17 -23
@@ -17,6 +17,7 @@
|
|
17
17
|
# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
|
18
18
|
|
19
19
|
require 'rubygems'
|
20
|
+
require 'rspec'
|
20
21
|
require 'boxgrinder-build/plugins/base-plugin'
|
21
22
|
require 'boxgrinder-core/helpers/log-helper'
|
22
23
|
require 'yaml'
|
@@ -99,7 +100,6 @@ module BoxGrinder
|
|
99
100
|
|
100
101
|
File.should_receive(:exists?).once.with(any_args()).and_return(true)
|
101
102
|
File.should_receive(:exists?).once.with(any_args()).and_return(false)
|
102
|
-
File.should_not_receive(:exists?)
|
103
103
|
|
104
104
|
@plugin.deliverables_exists?.should == false
|
105
105
|
end
|
@@ -16,11 +16,12 @@
|
|
16
16
|
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
17
17
|
# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
|
18
18
|
|
19
|
+
require 'boxgrinder-build/plugins/delivery/ebs/ebs-plugin'
|
19
20
|
require 'rubygems'
|
21
|
+
require 'rspec'
|
20
22
|
require 'ostruct'
|
21
23
|
require 'logger'
|
22
|
-
require '
|
23
|
-
require 'hashery/opencascade'
|
24
|
+
require 'set'
|
24
25
|
|
25
26
|
module BoxGrinder
|
26
27
|
|
@@ -37,7 +38,7 @@ module BoxGrinder
|
|
37
38
|
@config = Config.new('plugins' => { 'ebs' => {
|
38
39
|
'access_key' => 'access_key',
|
39
40
|
'secret_access_key' => 'secret_access_key',
|
40
|
-
'account_number' => '
|
41
|
+
'account_number' => '000000000000'
|
41
42
|
}})
|
42
43
|
|
43
44
|
@appliance_config = mock('ApplianceConfig')
|
@@ -58,7 +59,21 @@ module BoxGrinder
|
|
58
59
|
:log => LogHelper.new(:level => :trace, :type => :stdout)
|
59
60
|
)
|
60
61
|
|
62
|
+
#Set convenient dummies
|
63
|
+
AWS.config({:access_key_id => '', :secret_access_key => ''})
|
64
|
+
@ec2 = AWS::EC2.new
|
65
|
+
@s3 = AWS::S3.new
|
66
|
+
@s3helper = S3Helper.new(@ec2, @s3)
|
67
|
+
@ec2helper = EC2Helper.new(@ec2)
|
68
|
+
|
69
|
+
@plugin.instance_variable_set(:@ec2, @ec2)
|
70
|
+
@plugin.instance_variable_set(:@s3, @s3)
|
71
|
+
@plugin.instance_variable_set(:@ec2helper, @ec2helper)
|
72
|
+
@plugin.instance_variable_set(:@s3helper, @s3helper)
|
73
|
+
|
61
74
|
@plugin_config = @config.plugins['ebs']
|
75
|
+
|
76
|
+
@plugin.instance_variable_set(:@plugin_config, @plugin_config)
|
62
77
|
end
|
63
78
|
|
64
79
|
it "should register all operating systems with specific versions" do
|
@@ -69,288 +84,184 @@ module BoxGrinder
|
|
69
84
|
supported_oses = @plugin.instance_variable_get(:@supported_oses)
|
70
85
|
|
71
86
|
supported_oses.size.should == 3
|
72
|
-
supported_oses.keys.
|
87
|
+
Set.new(supported_oses.keys).should == Set.new(['fedora', 'rhel', 'centos'])
|
73
88
|
supported_oses['rhel'].should == ['6']
|
74
89
|
supported_oses['fedora'].should == ['13', '14', '15']
|
75
90
|
supported_oses['centos'].should == ['5']
|
76
91
|
end
|
77
|
-
|
78
|
-
describe ".after_init" do
|
79
|
-
it "should set the region" do
|
80
|
-
prepare_plugin do |plugin|
|
81
|
-
plugin.instance_variable_set(:@current_availability_zone, 'us-east-1a')
|
82
|
-
end
|
83
|
-
|
84
|
-
@plugin.instance_variable_get(:@region).should == 'us-east-1'
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
describe '.ami_info' do
|
89
|
-
|
90
|
-
it "should check if image is already registered and return false if there are no images registered for this account" do
|
91
|
-
prepare_plugin { |plugin| plugin.stub!(:after_init) }
|
92
|
-
|
93
|
-
plugin_config = mock('PluginConfig')
|
94
|
-
plugin_config.should_receive(:[]).with('account_number').and_return('0000-0000-0000')
|
95
|
-
|
96
|
-
@plugin.instance_variable_set(:@plugin_config, plugin_config)
|
97
|
-
|
98
|
-
ec2 = mock('EC2')
|
99
|
-
ec2.should_receive(:describe_images).with(:owner_id => '000000000000')
|
100
|
-
|
101
|
-
@plugin.instance_variable_set(:@ec2, ec2)
|
102
|
-
|
103
|
-
@plugin.ami_info('aname').should == false
|
104
|
-
end
|
105
|
-
|
106
|
-
it "should check if image is already registered and return false if there are no images with name aname_new" do
|
107
|
-
prepare_plugin { |plugin| plugin.stub!(:after_init) }
|
108
|
-
|
109
|
-
plugin_config = mock('PluginConfig')
|
110
|
-
plugin_config.should_receive(:[]).with('account_number').and_return('0000-0000-0000')
|
111
|
-
|
112
|
-
@plugin.instance_variable_set(:@plugin_config, plugin_config)
|
113
|
-
|
114
|
-
ec2 = mock('EC2')
|
115
|
-
ec2.should_receive(:describe_images).with(:owner_id => '000000000000').and_return({'imagesSet' => {'item' => [{'name' => 'abc', 'imageId' => '1'}, {'name' => 'aname', 'imageId' => '2'}]}})
|
116
|
-
|
117
|
-
@plugin.instance_variable_set(:@ec2, ec2)
|
118
|
-
|
119
|
-
@plugin.ami_info('aname_new').should == false
|
120
|
-
end
|
121
|
-
|
122
|
-
it "should return valid AMI information map for a single matching image when a valid imageId exists" do
|
123
|
-
prepare_plugin { |plugin| plugin.stub!(:after_init) }
|
124
|
-
|
125
|
-
plugin_config = mock('PluginConfig')
|
126
|
-
plugin_config.should_receive(:[]).with('account_number').and_return('0000-0000-0000')
|
127
|
-
|
128
|
-
@plugin.instance_variable_set(:@plugin_config, plugin_config)
|
129
|
-
|
130
|
-
ec2 = mock('EC2')
|
131
|
-
ec2.should_receive(:describe_images).with(:owner_id => '000000000000').and_return({'imagesSet' => {'item' => [{'name' => 'abc', 'imageId' => '1'}, {'name' => 'aname', 'imageId' => '2'}]}})
|
132
|
-
|
133
|
-
@plugin.instance_variable_set(:@ec2, ec2)
|
134
|
-
|
135
|
-
@plugin.ami_info('aname').should == {'name' => 'aname', 'imageId' => '2'}
|
136
|
-
end
|
137
|
-
|
138
|
-
end
|
139
|
-
|
140
|
-
describe '.already_registered?' do
|
141
|
-
|
142
|
-
it "should check if image is already registered and return true image is registered" do
|
143
|
-
prepare_plugin { |plugin| plugin.stub!(:after_init) }
|
144
|
-
|
145
|
-
plugin_config = mock('PluginConfig')
|
146
|
-
plugin_config.should_receive(:[]).with('account_number').and_return('0000-0000-0000')
|
147
|
-
|
148
|
-
@plugin.instance_variable_set(:@plugin_config, plugin_config)
|
149
|
-
|
150
|
-
ec2 = mock('EC2')
|
151
|
-
ec2.should_receive(:describe_images).with(:owner_id => '000000000000').and_return({'imagesSet' => {'item' => [{'name' => 'abc', 'imageId' => '1'}, {'name' => 'aname', 'imageId' => '2'}]}})
|
152
|
-
|
153
|
-
@plugin.instance_variable_set(:@ec2, ec2)
|
154
|
-
|
155
|
-
@plugin.already_registered?('aname').should == '2'
|
156
|
-
end
|
157
|
-
|
158
|
-
end
|
159
|
-
|
92
|
+
#
|
160
93
|
it "should adjust fstab" do
|
161
94
|
prepare_plugin { |plugin| plugin.stub!(:after_init) }
|
162
95
|
|
163
96
|
guestfs = mock('GuestFS')
|
164
|
-
|
165
97
|
guestfs.should_receive(:sh).with("cat /etc/fstab | grep -v '/mnt' | grep -v '/data' | grep -v 'swap' > /etc/fstab.new")
|
166
98
|
guestfs.should_receive(:mv).with("/etc/fstab.new", "/etc/fstab")
|
167
99
|
|
168
100
|
@plugin.adjust_fstab(guestfs)
|
169
101
|
end
|
102
|
+
#
|
170
103
|
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
File.should_receive(:exists?).with("/dev/sdf").and_return(false)
|
175
|
-
File.should_receive(:exists?).with("/dev/xvdf").and_return(false)
|
104
|
+
describe '.free_device_suffix' do
|
105
|
+
it "should get a new free device" do
|
106
|
+
prepare_plugin { |plugin| plugin.stub!(:after_init) }
|
176
107
|
|
177
|
-
|
178
|
-
|
108
|
+
File.should_receive(:exists?).with("/dev/sdf").and_return(false)
|
109
|
+
File.should_receive(:exists?).with("/dev/xvdf").and_return(false)
|
179
110
|
|
180
|
-
|
181
|
-
|
111
|
+
@plugin.free_device_suffix.should == "f"
|
112
|
+
end
|
113
|
+
#
|
114
|
+
it "should get a new free device next in order" do
|
115
|
+
prepare_plugin { |plugin| plugin.stub!(:after_init) }
|
182
116
|
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
117
|
+
File.should_receive(:exists?).with("/dev/sdf").and_return(false)
|
118
|
+
File.should_receive(:exists?).with("/dev/xvdf").and_return(true)
|
119
|
+
File.should_receive(:exists?).with("/dev/sdg").and_return(false)
|
120
|
+
File.should_receive(:exists?).with("/dev/xvdg").and_return(false)
|
187
121
|
|
188
|
-
|
122
|
+
@plugin.free_device_suffix.should == "g"
|
123
|
+
end
|
189
124
|
end
|
190
|
-
|
125
|
+
#
|
191
126
|
describe ".valid_platform?" do
|
192
127
|
it "should return true if on EC2" do
|
193
128
|
prepare_plugin do |plugin|
|
194
129
|
plugin.stub!(:after_init)
|
195
|
-
plugin.
|
196
|
-
|
130
|
+
@plugin.instance_variable_set(:@ec2_endpoints, EC2Helper::endpoints)
|
131
|
+
EC2Helper::stub!(:current_availability_zone).and_return('eu-west-1a')
|
132
|
+
EC2Helper::stub!(:availability_zone_to_region).with('eu-west-1a').and_return('eu-west-1')
|
197
133
|
end
|
198
134
|
@plugin.valid_platform?.should == true
|
199
135
|
end
|
200
|
-
|
136
|
+
#
|
201
137
|
it "should return false if NOT on EC2" do
|
202
138
|
prepare_plugin do |plugin|
|
203
139
|
plugin.stub!(:after_init)
|
204
|
-
plugin.
|
140
|
+
@plugin.instance_variable_set(:@ec2_endpoints, EC2Helper::endpoints)
|
141
|
+
EC2Helper::stub!(:current_availability_zone).and_raise(Timeout::Error)
|
205
142
|
end
|
206
143
|
@plugin.valid_platform?.should == false
|
207
144
|
end
|
208
|
-
|
209
|
-
it "should return false if the EC2 zone returned is not supported" do
|
210
|
-
prepare_plugin do |plugin|
|
211
|
-
plugin.stub!(:after_init)
|
212
|
-
plugin.stub!(:get_ec2_availability_zone).and_return("moon-west-7a")
|
213
|
-
plugin.stub!(:availability_zone_to_region).and_return("moon-west-7")
|
214
|
-
end
|
215
|
-
@plugin.valid_platform?.should == false
|
216
|
-
end
|
217
|
-
|
145
|
+
#
|
218
146
|
end
|
219
|
-
|
147
|
+
#
|
220
148
|
describe ".ebs_appliance_name" do
|
221
149
|
it "should return basic appliance name" do
|
222
150
|
prepare_plugin { |plugin| plugin.stub!(:after_init) }
|
223
151
|
@plugin.ebs_appliance_name.should == "appliance_name/fedora/14/1.0/x86_64"
|
224
152
|
end
|
225
|
-
|
153
|
+
#
|
226
154
|
it "should always return basic appliance name when overwrite is enabled, but snapshot is disabled" do
|
227
155
|
prepare_plugin { |plugin| plugin.stub!(:after_init) }
|
228
156
|
@plugin_config.merge!('overwrite' => true, 'snapshot' => false)
|
229
157
|
@plugin.ebs_appliance_name.should == "appliance_name/fedora/14/1.0/x86_64"
|
230
158
|
end
|
231
|
-
|
159
|
+
#
|
232
160
|
it "should still return a valid _initial_ snapshot appliance name, even if overwrite and snapshot are enabled on first ever run" do
|
233
161
|
prepare_plugin { |plugin| plugin.stub!(:after_init) }
|
234
|
-
|
235
162
|
@plugin_config.merge!('overwrite' => true, 'snapshot' => true)
|
236
163
|
|
237
|
-
|
238
|
-
ec2.should_receive(:describe_images).once.with(:owner_id => '000000000000').and_return(nil)#should be nothing
|
239
|
-
|
240
|
-
@plugin.instance_variable_set(:@ec2, ec2)
|
241
|
-
|
164
|
+
@ec2helper.should_receive(:already_registered?).with("appliance_name/fedora/14/1.0-SNAPSHOT-1/x86_64")
|
242
165
|
@plugin.ebs_appliance_name.should == "appliance_name/fedora/14/1.0-SNAPSHOT-1/x86_64"
|
243
166
|
end
|
244
|
-
|
167
|
+
#
|
245
168
|
it "should return 2nd snapshot of appliance" do
|
246
169
|
prepare_plugin { |plugin| plugin.stub!(:after_init) }
|
247
170
|
|
248
171
|
@plugin_config.merge!('snapshot' => true)
|
249
172
|
|
250
|
-
|
251
|
-
|
252
|
-
{'imageId' => '1', 'name' => 'appliance_name/fedora/14/1.0/x86_64'},
|
253
|
-
{'imageId' => '2', 'name' => 'appliance_name/fedora/14/1.0-SNAPSHOT-1/x86_64'}
|
254
|
-
]}})
|
255
|
-
|
256
|
-
@plugin.instance_variable_set(:@ec2, ec2)
|
173
|
+
@ec2helper.should_receive(:already_registered?).with("appliance_name/fedora/14/1.0-SNAPSHOT-1/x86_64").and_return(true)
|
174
|
+
@ec2helper.should_receive(:already_registered?).with("appliance_name/fedora/14/1.0-SNAPSHOT-2/x86_64").and_return(false)
|
257
175
|
|
258
176
|
@plugin.ebs_appliance_name.should == "appliance_name/fedora/14/1.0-SNAPSHOT-2/x86_64"
|
259
177
|
end
|
260
|
-
|
178
|
+
#
|
261
179
|
it "should return the last snapshot name again when OVERWRITE is enabled" do
|
262
180
|
prepare_plugin { |plugin| plugin.stub!(:after_init) }
|
263
181
|
|
264
182
|
@plugin_config.merge!('snapshot' => true, 'overwrite' => true)
|
265
183
|
|
266
|
-
|
267
|
-
|
268
|
-
{'imageId' => '1', 'name' => 'appliance_name/fedora/14/1.0/x86_64'},
|
269
|
-
{'imageId' => '2', 'name' => 'appliance_name/fedora/14/1.0-SNAPSHOT-1/x86_64'}
|
270
|
-
]}})
|
271
|
-
|
272
|
-
@plugin.instance_variable_set(:@ec2, ec2)
|
184
|
+
@ec2helper.should_receive(:already_registered?).with("appliance_name/fedora/14/1.0-SNAPSHOT-1/x86_64").and_return(true)
|
185
|
+
@ec2helper.should_receive(:already_registered?).with("appliance_name/fedora/14/1.0-SNAPSHOT-2/x86_64").and_return(false)
|
273
186
|
|
274
187
|
@plugin.ebs_appliance_name.should == "appliance_name/fedora/14/1.0-SNAPSHOT-1/x86_64"
|
275
188
|
end
|
276
|
-
|
189
|
+
#
|
277
190
|
end
|
278
|
-
|
191
|
+
#
|
279
192
|
describe ".stomp_ebs" do
|
280
|
-
|
281
193
|
before(:each) do
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
@
|
286
|
-
@
|
287
|
-
@
|
194
|
+
prepare_plugin
|
195
|
+
|
196
|
+
@ami = mock(AWS::EC2::Image)
|
197
|
+
@ami.stub!(:id).and_return('ami-bratwurst')
|
198
|
+
@ami.stub!(:deregister)
|
199
|
+
@ami.stub!(:block_device_mappings).and_return({'/dev/sda1' => OpenStruct.new(
|
200
|
+
{'snapshot_id' => 'snap-hambiscuit', 'volume_size' => 2})}
|
201
|
+
)
|
202
|
+
@ami.stub!(:root_device_name).and_return('/dev/sda1')
|
203
|
+
instance_1 = mock(AWS::EC2::Instance)
|
204
|
+
instance_2 = mock(AWS::EC2::Instance)
|
205
|
+
instance_1.stub!(:id).and_return('i-cake')
|
206
|
+
instance_1.stub!(:status).and_return(:running)
|
207
|
+
instance_2.stub!(:id).and_return('i-bake')
|
208
|
+
instance_2.stub!(:status).and_return(:stopped)
|
209
|
+
|
210
|
+
@instances = [ instance_1, instance_2 ]
|
211
|
+
|
212
|
+
@snap = mock(AWS::EC2::Snapshot)
|
288
213
|
end
|
289
214
|
|
290
|
-
it "
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
@
|
215
|
+
it "destroys the preexisting EBS assets and de-registers the image with default settings" do
|
216
|
+
@ec2helper.stub!(:live_instances)
|
217
|
+
@ec2helper.should_receive(:snapshot_by_id).with('snap-hambiscuit').and_return(@snap)
|
218
|
+
@ami.should_receive(:deregister)
|
219
|
+
@ec2helper.should_receive(:wait_for_image_death).with(@ami)
|
220
|
+
@snap.should_receive(:delete)
|
221
|
+
@plugin.stomp_ebs(@ami)
|
296
222
|
end
|
297
223
|
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
224
|
+
context "there are live running instances" do
|
225
|
+
before(:each) do
|
226
|
+
@ec2helper.stub!(:snapshot_by_id).and_return(@snap)
|
227
|
+
@ec2helper.stub!(:wait_for_image_death)
|
228
|
+
@ec2helper.stub!(:snapshot_by_id)
|
229
|
+
@ec2helper.stub!(:wait_for_image_death)
|
230
|
+
@ami.stub!(:deregister)
|
231
|
+
@snap.stub!(:delete)
|
305
232
|
end
|
306
|
-
lambda { @plugin.stomp_ebs(@ami_info) }.should raise_error(RuntimeError)
|
307
|
-
end
|
308
233
|
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
plugin.stub!(:get_volume_info).and_return(@dummy_volume_attached, @dummy_volume_detached)
|
315
|
-
plugin.stub!(:wait_for_volume_delete)
|
316
|
-
plugin.stub!(:wait_for_snapshot_status)
|
317
|
-
plugin.stub!(:wait_for_volume_status)
|
234
|
+
context "instance termination is disabled" do
|
235
|
+
it "raise an error to alert the user" do
|
236
|
+
@ec2helper.should_receive(:live_instances).with(@ami).and_return(@instances)
|
237
|
+
lambda { @plugin.stomp_ebs(@ami) }.should raise_error(RuntimeError)
|
238
|
+
end
|
318
239
|
end
|
319
240
|
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
@plugin.stomp_ebs(@ami_info)
|
241
|
+
context "instance termination is enabled" do
|
242
|
+
it "terminate any running instances" do
|
243
|
+
@plugin_config.merge!('terminate_instances' => true)
|
244
|
+
@ec2helper.should_receive(:live_instances).with(@ami).and_return(@instances)
|
245
|
+
@plugin.should_receive(:terminate_instances).with(@instances)
|
246
|
+
@plugin.stomp_ebs(@ami)
|
247
|
+
end
|
248
|
+
end
|
329
249
|
end
|
330
250
|
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
plugin.stub!(:snapshot_info).and_return(@dummy_snapshot)
|
335
|
-
plugin.stub!(:get_instances).and_return(false)
|
336
|
-
plugin.stub!(:get_volume_info).and_return(@dummy_volume_attached, @dummy_volume_detached)
|
337
|
-
plugin.stub!(:wait_for_volume_delete)
|
338
|
-
plugin.stub!(:wait_for_snapshot_status)
|
339
|
-
plugin.stub!(:wait_for_volume_status)
|
251
|
+
context "snapshot preservation" do
|
252
|
+
before(:each) do
|
253
|
+
@ec2helper.stub!(:live_instances).and_return(false)
|
340
254
|
end
|
341
255
|
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
@plugin.instance_variable_set(:@ec2, ec2)
|
351
|
-
@plugin.stomp_ebs(@ami_info)
|
256
|
+
it "retains the primary snapshot when preserve_snapshots is enabled" do
|
257
|
+
@plugin_config.merge!('preserve_snapshots' => true)
|
258
|
+
@ec2helper.should_receive(:snapshot_by_id).with('snap-hambiscuit').and_return(@snap)
|
259
|
+
@ami.should_receive(:deregister)
|
260
|
+
@ec2helper.should_receive(:wait_for_image_death).with(@ami)
|
261
|
+
@snap.should_not_receive(:delete)
|
262
|
+
@plugin.stomp_ebs(@ami)
|
263
|
+
end
|
352
264
|
end
|
353
|
-
|
354
265
|
end
|
355
266
|
|
356
267
|
#Amazon-EC2 gem uses recursive ostructs, and wont work with opencascade
|