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 +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
|