vm_shepherd 0.7.1 → 0.8.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 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