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 +4 -4
- data/lib/vm_shepherd/openstack_manager.rb +45 -6
- data/lib/vm_shepherd/version.rb +1 -1
- data/spec/vm_shepherd/openstack_manager_spec.rb +101 -12
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e61d2d0bffe4fd5fbe2ef132b05a0b334ce8a8be
|
4
|
+
data.tar.gz: c0b639a5ba9e19ccb2950da552e9c5f3185d0f56
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
50
|
-
server = service.servers.
|
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
|
-
|
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
|
|
data/lib/vm_shepherd/version.rb
CHANGED
@@ -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:
|
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
|
-
{
|
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(:
|
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.
|
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-
|
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
|