vm_shepherd 0.7.1 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e40010121984be566b3f88a3e7d12984223d10df
4
- data.tar.gz: 85e3ec192349a2a70de3612dcde0ec982edec9f0
3
+ metadata.gz: e61d2d0bffe4fd5fbe2ef132b05a0b334ce8a8be
4
+ data.tar.gz: c0b639a5ba9e19ccb2950da552e9c5f3185d0f56
5
5
  SHA512:
6
- metadata.gz: a0afc08340253f1d54b01762c960f1e879ca367e6ecb6fa0d47bd19e9cef67566f820131af993db862c082b03fa51333369a65d5735cbecce62fddb106a2ad22
7
- data.tar.gz: bea513f347e77b7fee6cf95404a9f4a17e7f20acf881bd40a785c4c3163f43a19a4e563e4b169b01cc6f8a5c166da882cd37594efdf303e66b0418871ae7aa33
6
+ metadata.gz: 1f529936e8fa331185f96d0e9f68cd69bfdde4bb7e2d2f7a425522333a944e4ba2e50502d5a0c4bf3e8c43534428e35459a60af22535e2870a939ddfb7d09b77
7
+ data.tar.gz: d12b06f004e913fa49fcfd47cdd78f105f2956cc6da979294fd1ce4d004b5d8d2be2457195c4fd6402e1102779bb2786d0de409ab595d3f4b16e9c74b97fb18d
@@ -46,15 +46,17 @@ module VmShepherd
46
46
 
47
47
  def destroy(vm_options)
48
48
  say('Destroying Ops Manager instances')
49
- ip = service.addresses.find { |address| address.ip == vm_options[:public_ip] }
50
- server = service.servers.get(ip.instance_id)
49
+
50
+ server = service.servers.find { |srv| srv.name == vm_options[:name] }
51
51
  if server
52
52
  say("Found running Ops Manager instance #{server.id}")
53
- image = image_service.images.get(server.image['id'])
54
- say("Found Ops Manager image #{image.id}")
55
-
56
53
  server.destroy
57
54
  say('Ops Manager instance destroyed')
55
+ end
56
+
57
+ image = image_service.images.find { |img| img.name == vm_options[:name] }
58
+ if image
59
+ say("Found Ops Manager image #{image.id}")
58
60
  image.destroy
59
61
  say('Ops Manager image destroyed')
60
62
  end
@@ -62,6 +64,34 @@ module VmShepherd
62
64
  end
63
65
 
64
66
  def clean_environment
67
+ say("Destroying #{service.servers.size} instances:")
68
+ service.servers.each do |server|
69
+ say(" Destroying instance #{server.id}")
70
+ server.destroy
71
+ end
72
+
73
+ private_images = image_service.images.reject(&:is_public)
74
+
75
+ say("Destroying #{private_images.size} images:")
76
+ private_images.each do |image|
77
+ say(" Destroying image #{image.id}")
78
+ image.destroy
79
+ end
80
+
81
+ say("Destroying #{service.volumes.size} volumes:")
82
+ service.volumes.each do |volume|
83
+ say(" Destroying volume #{volume.id}")
84
+ volume.destroy
85
+ end
86
+
87
+ say("Destroying contents of #{storage_service.directories.size} containers:")
88
+ storage_service.directories.each do |directory|
89
+ say(" Destroying #{directory.files.size} files from #{directory.key}")
90
+ directory.files.each do |file|
91
+ say(" Destroying file #{file.key}")
92
+ file.destroy
93
+ end
94
+ end
65
95
  end
66
96
 
67
97
  def service
@@ -92,7 +122,16 @@ module VmShepherd
92
122
  openstack_username: username,
93
123
  openstack_tenant: tenant,
94
124
  openstack_api_key: api_key,
95
- openstack_endpoint_type: 'publicURL',
125
+ )
126
+ end
127
+
128
+ def storage_service
129
+ @network_service ||= Fog::Storage.new(
130
+ provider: 'openstack',
131
+ openstack_auth_url: auth_url,
132
+ openstack_username: username,
133
+ openstack_tenant: tenant,
134
+ openstack_api_key: api_key,
96
135
  )
97
136
  end
98
137
 
@@ -1,3 +1,3 @@
1
1
  module VmShepherd
2
- VERSION = '0.7.1'.freeze
2
+ VERSION = '0.8.0'.freeze
3
3
  end
@@ -5,12 +5,13 @@ module VmShepherd
5
5
  RSpec.describe OpenstackManager do
6
6
  include PatchedFog
7
7
 
8
+ let(:tenant_name) { 'tenant' }
8
9
  let(:openstack_options) do
9
10
  {
10
11
  auth_url: 'http://example.com/version/tokens',
11
12
  username: 'username',
12
13
  api_key: 'api-key',
13
- tenant: 'tenant',
14
+ tenant: tenant_name,
14
15
  }
15
16
  end
16
17
  let(:openstack_vm_options) do
@@ -71,7 +72,6 @@ module VmShepherd
71
72
  openstack_username: openstack_options[:username],
72
73
  openstack_tenant: openstack_options[:tenant],
73
74
  openstack_api_key: openstack_options[:api_key],
74
- openstack_endpoint_type: 'publicURL',
75
75
  }
76
76
  )
77
77
  openstack_vm_manager.network_service
@@ -155,7 +155,7 @@ module VmShepherd
155
155
  assigned_network = network_service.networks.find { |network| network.name == openstack_vm_options[:network_name] }
156
156
  expect(servers).to receive(:create).with(
157
157
  hash_including(:nics => [
158
- { net_id: assigned_network.id, v4_fixed_ip: openstack_vm_options[:private_ip]}
158
+ {net_id: assigned_network.id, v4_fixed_ip: openstack_vm_options[:private_ip]}
159
159
  ]
160
160
  )
161
161
  ).and_call_original
@@ -183,10 +183,8 @@ module VmShepherd
183
183
 
184
184
  let(:compute_service) { openstack_vm_manager.service }
185
185
  let(:image_service) { openstack_vm_manager.image_service }
186
- let(:network_service) { openstack_vm_manager.network_service }
187
186
 
188
187
  let(:servers) { compute_service.servers }
189
- let(:addresses) { compute_service.addresses }
190
188
  let(:images) { image_service.images }
191
189
  let(:image) { images.find { |image| image.name == openstack_vm_options[:name] } }
192
190
  let(:instance) { servers.find { |server| server.name == openstack_vm_options[:name] } }
@@ -200,12 +198,18 @@ module VmShepherd
200
198
  Fog::Mock.delay = 0
201
199
 
202
200
  allow(compute_service).to receive(:servers).and_return(servers)
203
- allow(compute_service).to receive(:addresses).and_return(addresses)
204
201
  allow(image_service).to receive(:images).and_return(images)
205
202
 
206
203
  openstack_vm_manager.deploy(path, openstack_vm_options)
207
204
  end
208
205
 
206
+ def destroy_correct_image
207
+ change do
208
+ images.reload
209
+ images.select { |image| image.name == openstack_vm_options[:name] }.any?
210
+ end.from(true).to(false)
211
+ end
212
+
209
213
  it 'calls destroy on the correct instance' do
210
214
  destroy_correct_server = change do
211
215
  servers.reload
@@ -216,22 +220,107 @@ module VmShepherd
216
220
  end
217
221
 
218
222
  it 'calls destroy on the correct image' do
219
- destroy_correct_image = change do
220
- images.reload
221
- images.find { |image| image.name == openstack_vm_options[:name] }
222
- end.to(nil)
223
-
224
223
  expect { openstack_vm_manager.destroy(openstack_vm_options) }.to(destroy_correct_image)
225
224
  end
226
225
 
227
226
  context 'when the server does not exist' do
228
227
  before do
229
- allow(servers).to receive(:get).and_return(nil)
228
+ allow(servers).to receive(:find).and_return(nil)
230
229
  end
231
230
 
232
231
  it 'returns without error' do
233
232
  expect { openstack_vm_manager.destroy(openstack_vm_options) }.not_to raise_error
234
233
  end
234
+
235
+ it 'calls destroy on the correct image' do
236
+ expect { openstack_vm_manager.destroy(openstack_vm_options) }.to(destroy_correct_image)
237
+ end
238
+ end
239
+ end
240
+
241
+ describe '#clean_environment' do
242
+ before do
243
+ allow(openstack_vm_manager).to receive(:say)
244
+
245
+ Fog.mock!
246
+ Fog::Mock.reset
247
+ Fog::Mock.delay = 0
248
+
249
+ make_server_and_image!('vm1')
250
+ make_server_and_image!('vm2')
251
+ openstack_vm_manager.image_service.images.create(
252
+ name: 'public',
253
+ size: 13784321,
254
+ disk_format: 'raw',
255
+ container_format: 'bare',
256
+ location: '/tmp/notreal',
257
+ is_public: true,
258
+ )
259
+
260
+ openstack_vm_manager.storage_service.directories
261
+ a_dir = instance_double(Fog::Storage::OpenStack::Directory, key: 'a_dir')
262
+ allow(a_dir).to receive(:files).and_return(a_dir_files)
263
+ b_dir = instance_double(Fog::Storage::OpenStack::Directory, key: 'b_dir')
264
+ allow(b_dir).to receive(:files).and_return(b_dir_files)
265
+ allow(openstack_vm_manager.storage_service).to receive(:directories).and_return([a_dir, b_dir])
266
+ end
267
+
268
+ let(:a_dir_files) { [create_file_double('a_file'), create_file_double('b_file')] }
269
+ let(:b_dir_files) { [create_file_double('c_file'), create_file_double('d_file')] }
270
+
271
+ def create_file_double(key)
272
+ instance_double(Fog::Storage::OpenStack::File, destroy: nil, key: key)
273
+ end
274
+
275
+ def make_server_and_image!(name)
276
+ image = openstack_vm_manager.image_service.images.create(
277
+ name: name,
278
+ size: 13784321,
279
+ disk_format: 'raw',
280
+ container_format: 'bare',
281
+ location: '/tmp/notreal',
282
+ is_public: false,
283
+ )
284
+
285
+ openstack_vm_manager.service.servers.create(
286
+ name: name,
287
+ flavor_ref: openstack_vm_manager.service.flavors.first.id,
288
+ image_ref: image.id,
289
+ key_name: 'some key',
290
+ security_groups: ['some security group'],
291
+ )
292
+
293
+ openstack_vm_manager.service.volumes.create(
294
+ name: name,
295
+ description: "description #{name}",
296
+ size: name.to_i,
297
+ )
298
+ end
299
+
300
+ it 'deletes all servers' do
301
+ expect {
302
+ openstack_vm_manager.clean_environment
303
+ }.to change { openstack_vm_manager.service.servers.size }.from(2).to(0)
304
+ end
305
+
306
+ it 'deletes all private images' do
307
+ expect {
308
+ openstack_vm_manager.clean_environment
309
+ }.to change { openstack_vm_manager.image_service.images.size }.from(3).to(1)
310
+ end
311
+
312
+ it 'deletes all volumes' do
313
+ expect {
314
+ openstack_vm_manager.clean_environment
315
+ }.to change { openstack_vm_manager.service.volumes.size }.from(2).to(0)
316
+ end
317
+
318
+ it 'deletes everything in the correct container' do
319
+ openstack_vm_manager.clean_environment
320
+ expect(a_dir_files[0]).to have_received(:destroy)
321
+ expect(a_dir_files[1]).to have_received(:destroy)
322
+ expect(b_dir_files[0]).to have_received(:destroy)
323
+ expect(b_dir_files[1]).to have_received(:destroy)
235
324
  end
236
325
  end
237
326
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vm_shepherd
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ops Manager Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-28 00:00:00.000000000 Z
11
+ date: 2015-04-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-v1