oneacct-export 0.2.7 → 0.3.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/.gitignore +2 -0
- data/.rspec +1 -0
- data/.travis.yml +1 -21
- data/bin/oneacct-export +7 -6
- data/config/conf.yml +25 -7
- data/lib/data_validators/apel_data_validator.rb +99 -0
- data/lib/data_validators/data_compute.rb +57 -0
- data/lib/data_validators/data_validator.rb +12 -0
- data/lib/data_validators/data_validator_helper.rb +15 -0
- data/lib/data_validators/logstash_data_validator.rb +82 -0
- data/lib/data_validators/pbs_data_validator.rb +86 -0
- data/lib/errors/not_implemented_error.rb +3 -0
- data/lib/errors/validation_error.rb +3 -0
- data/lib/errors.rb +2 -0
- data/lib/input_validator.rb +12 -2
- data/lib/one_data_accessor.rb +11 -10
- data/lib/one_worker.rb +109 -137
- data/lib/oneacct_exporter/version.rb +1 -1
- data/lib/oneacct_exporter.rb +9 -7
- data/lib/oneacct_opts.rb +36 -13
- data/lib/output_types.rb +5 -0
- data/lib/redis_conf.rb +2 -2
- data/lib/settings.rb +3 -3
- data/lib/templates/apel-0.2.erb +6 -6
- data/lib/templates/logstash-0.1.erb +3 -0
- data/lib/templates/pbs-0.1.erb +6 -0
- data/mock/{one_worker_vm8.xml → one_worker_vm_dn01.xml} +76 -74
- data/mock/one_worker_vm_dn02.xml +174 -0
- data/mock/{one_worker_DISK_missing.xml → one_worker_vm_empty_disk_records.xml} +10 -6
- data/mock/one_worker_vm_empty_history_records.xml +131 -0
- data/mock/one_worker_vm_image_name01.xml +175 -0
- data/mock/{one_worker_valid_machine.xml → one_worker_vm_image_name02.xml} +35 -7
- data/mock/one_worker_vm_image_name03.xml +167 -0
- data/mock/{one_worker_vm2.xml → one_worker_vm_image_name04.xml} +38 -9
- data/mock/{one_worker_vm1.xml → one_worker_vm_image_name05.xml} +36 -8
- data/mock/{one_worker_vm9.xml → one_worker_vm_image_name06.xml} +8 -5
- data/oneacct-export.gemspec +1 -0
- data/spec/data_validators/apel_data_validator_spec.rb +497 -0
- data/spec/data_validators/data_compute_spec.rb +193 -0
- data/spec/data_validators/data_validator_helper_spec.rb +66 -0
- data/spec/data_validators/data_validator_spec.rb +14 -0
- data/spec/data_validators/logstash_data_validator_spec.rb +469 -0
- data/spec/data_validators/pbs_data_validator_spec.rb +353 -0
- data/spec/one_worker_spec.rb +234 -542
- data/spec/oneacct_exporter_spec.rb +1 -41
- data/spec/oneacct_opts_spec.rb +135 -32
- data/spec/spec_helper.rb +18 -1
- metadata +51 -52
- data/mock/one_worker_DEPLOY_ID_missing.xml +0 -136
- data/mock/one_worker_DISK_SIZE_nan.xml +0 -147
- data/mock/one_worker_ETIME_0.xml +0 -137
- data/mock/one_worker_ETIME_missing.xml +0 -136
- data/mock/one_worker_ETIME_nan.xml +0 -137
- data/mock/one_worker_GID_missing.xml +0 -136
- data/mock/one_worker_GNAME_missing.xml +0 -136
- data/mock/one_worker_HISTORY_RECORDS_missing.xml +0 -91
- data/mock/one_worker_HISTORY_many.xml +0 -137
- data/mock/one_worker_HISTORY_missing.xml +0 -93
- data/mock/one_worker_HISTORY_one.xml +0 -115
- data/mock/one_worker_IMAGE_ID_missing.xml +0 -136
- data/mock/one_worker_MEMORY_0.xml +0 -137
- data/mock/one_worker_MEMORY_missing.xml +0 -135
- data/mock/one_worker_MEMORY_nan.xml +0 -137
- data/mock/one_worker_NET_RX_0.xml +0 -137
- data/mock/one_worker_NET_RX_missing.xml +0 -136
- data/mock/one_worker_NET_RX_nan.xml +0 -137
- data/mock/one_worker_NET_TX_0.xml +0 -137
- data/mock/one_worker_NET_TX_missing.xml +0 -136
- data/mock/one_worker_NET_TX_nan.xml +0 -137
- data/mock/one_worker_RETIME_0_RUNNING.xml +0 -115
- data/mock/one_worker_RETIME_0_STOPPED.xml +0 -115
- data/mock/one_worker_RETIME_missing.xml +0 -114
- data/mock/one_worker_RSTIME_0.xml +0 -115
- data/mock/one_worker_RSTIME_>_RETIME.xml +0 -115
- data/mock/one_worker_RSTIME_missing.xml +0 -114
- data/mock/one_worker_STATE_missing.xml +0 -136
- data/mock/one_worker_STATE_out_of_range.xml +0 -137
- data/mock/one_worker_STIME_>_ETIME.xml +0 -137
- data/mock/one_worker_STIME_missing.xml +0 -136
- data/mock/one_worker_STIME_nan.xml +0 -137
- data/mock/one_worker_TEMPLATE_missing.xml +0 -79
- data/mock/one_worker_UID_missing.xml +0 -136
- data/mock/one_worker_VCPU_0.xml +0 -137
- data/mock/one_worker_VCPU_missing.xml +0 -136
- data/mock/one_worker_VCPU_nan.xml +0 -137
- data/mock/one_worker_malformed_vm.xml +0 -136
- data/mock/one_worker_vm3.xml +0 -137
- data/mock/one_worker_vm4.xml +0 -106
- data/mock/one_worker_vm5.xml +0 -106
- data/mock/one_worker_vm6.xml +0 -107
- data/mock/one_worker_vm7.xml +0 -147
data/spec/one_worker_spec.rb
CHANGED
|
@@ -6,17 +6,36 @@ describe OneWorker do
|
|
|
6
6
|
let(:one_worker) { OneWorker.new }
|
|
7
7
|
let(:oda) { double('oda') }
|
|
8
8
|
|
|
9
|
-
describe '.
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
describe '.output_type_specific_data' do
|
|
10
|
+
context 'with output type apel' do
|
|
11
|
+
before :example do
|
|
12
|
+
Settings.output['output_type'] = 'apel-0.2'
|
|
13
|
+
Settings.output.apel['endpoint'] = 'machine.hogwarts.co.uk'
|
|
14
|
+
Settings.output.apel['site_name'] = 'Hogwarts'
|
|
15
|
+
Settings.output.apel['cloud_type'] = 'OpenNebula'
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
let(:output_type_specific_data) { {'endpoint' => 'machine.hogwarts.co.uk', 'site_name' => 'Hogwarts', 'cloud_type' => 'OpenNebula'} }
|
|
19
|
+
|
|
20
|
+
it 'returns data specific for apel output type in form of hash' do
|
|
21
|
+
expect(subject.output_type_specific_data).to eq(output_type_specific_data)
|
|
22
|
+
end
|
|
14
23
|
end
|
|
15
24
|
|
|
16
|
-
|
|
25
|
+
context 'with output type pbs' do
|
|
26
|
+
before :example do
|
|
27
|
+
Settings.output['output_type'] = 'pbs-0.1'
|
|
28
|
+
Settings.output.pbs['realm'] = 'REALM'
|
|
29
|
+
Settings.output.pbs['queue'] = 'cloud'
|
|
30
|
+
Settings.output.pbs['scratch_type'] = 'local'
|
|
31
|
+
Settings.output.pbs['host_identifier'] = 'on_localhost'
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
let(:output_type_specific_data) { {'realm' => 'REALM', 'pbs_queue' => 'cloud', 'scratch_type' => 'local', 'host' => 'on_localhost'} }
|
|
17
35
|
|
|
18
|
-
|
|
19
|
-
|
|
36
|
+
it 'returns data specific for pbs output type in form of hash' do
|
|
37
|
+
expect(subject.output_type_specific_data).to eq(output_type_specific_data)
|
|
38
|
+
end
|
|
20
39
|
end
|
|
21
40
|
end
|
|
22
41
|
|
|
@@ -83,38 +102,6 @@ describe OneWorker do
|
|
|
83
102
|
end
|
|
84
103
|
end
|
|
85
104
|
|
|
86
|
-
describe '.parse' do
|
|
87
|
-
let(:regex) { /[[:digit:]]+/ }
|
|
88
|
-
|
|
89
|
-
context 'with three parameters' do
|
|
90
|
-
context 'if regex matches the value' do
|
|
91
|
-
it 'returns the value' do
|
|
92
|
-
expect(subject.parse('42', regex, '0')).to eq('42')
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
context 'if regex does not match the value' do
|
|
97
|
-
it 'it returns substitute' do
|
|
98
|
-
expect(subject.parse('abc', regex, '0')).to eq('0')
|
|
99
|
-
end
|
|
100
|
-
end
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
context 'with two parameters' do
|
|
104
|
-
context 'if regex matches the value' do
|
|
105
|
-
it 'returns the value' do
|
|
106
|
-
expect(subject.parse('42', regex)).to eq('42')
|
|
107
|
-
end
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
context 'if regex does not match the value' do
|
|
111
|
-
it 'returns "NULL"' do
|
|
112
|
-
expect(subject.parse('abc', regex)).to eq('NULL')
|
|
113
|
-
end
|
|
114
|
-
end
|
|
115
|
-
end
|
|
116
|
-
end
|
|
117
|
-
|
|
118
105
|
describe 'write_data' do
|
|
119
106
|
before :example do
|
|
120
107
|
expect(OneWriter).to receive(:new).with(data, output, anything) { ow }
|
|
@@ -145,11 +132,14 @@ describe OneWorker do
|
|
|
145
132
|
end
|
|
146
133
|
end
|
|
147
134
|
|
|
148
|
-
describe '
|
|
135
|
+
describe 'process_vm' do
|
|
149
136
|
before :example do
|
|
150
|
-
Settings['
|
|
151
|
-
Settings['
|
|
152
|
-
Settings['
|
|
137
|
+
Settings.output['output_type'] = 'apel-0.2'
|
|
138
|
+
Settings.output.apel['endpoint'] = 'machine.hogwarts.co.uk'
|
|
139
|
+
Settings.output.apel['site_name'] = 'Hogwarts'
|
|
140
|
+
Settings.output.apel['cloud_type'] = 'OpenNebula'
|
|
141
|
+
|
|
142
|
+
allow(vm).to receive(:state_str) { 'DONE' }
|
|
153
143
|
end
|
|
154
144
|
|
|
155
145
|
let(:vm) do
|
|
@@ -159,650 +149,352 @@ describe OneWorker do
|
|
|
159
149
|
|
|
160
150
|
let(:data) do
|
|
161
151
|
data = {}
|
|
152
|
+
|
|
162
153
|
data['endpoint'] = 'machine.hogwarts.co.uk'
|
|
163
154
|
data['site_name'] = 'Hogwarts'
|
|
164
155
|
data['cloud_type'] = 'OpenNebula'
|
|
156
|
+
|
|
165
157
|
data['vm_uuid'] = '36551'
|
|
166
|
-
data['start_time'] =
|
|
167
|
-
data['end_time'] =
|
|
158
|
+
data['start_time'] = '1383741160'
|
|
159
|
+
data['end_time'] = '1383742270'
|
|
168
160
|
data['machine_name'] = 'one-36551'
|
|
169
161
|
data['user_id'] = '120'
|
|
170
162
|
data['group_id'] = '0'
|
|
171
|
-
data['user_name'] = '
|
|
172
|
-
data['
|
|
173
|
-
data['
|
|
174
|
-
data['
|
|
175
|
-
data['suspend'] = '514'
|
|
163
|
+
data['user_name'] = 'uname'
|
|
164
|
+
data['group_name'] = 'gname'
|
|
165
|
+
data['status_code'] = '6'
|
|
166
|
+
data['status'] = 'DONE'
|
|
176
167
|
data['cpu_count'] = '1'
|
|
177
|
-
data['network_inbound'] =
|
|
178
|
-
data['network_outbound'] =
|
|
168
|
+
data['network_inbound'] = '43557888'
|
|
169
|
+
data['network_outbound'] = '376832'
|
|
179
170
|
data['memory'] = '1736960'
|
|
180
|
-
|
|
181
|
-
|
|
171
|
+
history = []
|
|
172
|
+
rec = {}
|
|
173
|
+
rec['start_time'] = '1383741169'
|
|
174
|
+
rec['end_time'] = '1383741259'
|
|
175
|
+
rec['rstart_time'] = '0'
|
|
176
|
+
rec['rend_time'] = '0'
|
|
177
|
+
rec['seq'] = '0'
|
|
178
|
+
rec['hostname'] = 'supermachine1.somewhere.com'
|
|
179
|
+
history << rec
|
|
180
|
+
rec = {}
|
|
181
|
+
rec['start_time'] = '1383741589'
|
|
182
|
+
rec['end_time'] = '1383742270'
|
|
183
|
+
rec['rstart_time'] = '1383741674'
|
|
184
|
+
rec['rend_time'] = '1383742270'
|
|
185
|
+
rec['seq'] = '1'
|
|
186
|
+
rec['hostname'] = 'supermachine2.somewhere.com'
|
|
187
|
+
history << rec
|
|
188
|
+
data['history'] = history
|
|
189
|
+
data['disks'] = [{'size' => '10240'}, {'size' => '42368'}]
|
|
190
|
+
|
|
191
|
+
data['user_dn'] = '/Dn=FrOm/CN=DN/CN=TeMpLaTe'
|
|
192
|
+
data['image_name'] = 'https://appdb.egi.eu/store/vo/image/image_name_from_VMCATCHER_EVENT_AD_MPURI_tag/'
|
|
182
193
|
|
|
183
194
|
data
|
|
184
195
|
end
|
|
185
196
|
|
|
186
|
-
let(:user_map) { {
|
|
187
|
-
let(:image_map) { {
|
|
188
|
-
|
|
189
|
-
context 'with valid vm' do
|
|
190
|
-
let(:filename) { 'one_worker_valid_machine.xml' }
|
|
191
|
-
|
|
192
|
-
it 'returns correct vm data' do
|
|
193
|
-
expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
|
|
194
|
-
end
|
|
195
|
-
end
|
|
196
|
-
|
|
197
|
-
context 'vm without STIME' do
|
|
198
|
-
let(:filename) { 'one_worker_STIME_missing.xml' }
|
|
199
|
-
|
|
200
|
-
it 'returns nil' do
|
|
201
|
-
expect(subject.process_vm(vm, user_map, image_map)).to be_nil
|
|
202
|
-
end
|
|
203
|
-
end
|
|
204
|
-
|
|
205
|
-
context 'vm with STIME that is not a number' do
|
|
206
|
-
let(:filename) { 'one_worker_STIME_nan.xml' }
|
|
207
|
-
|
|
208
|
-
it 'returns nil' do
|
|
209
|
-
expect(subject.process_vm(vm, user_map, image_map)).to be_nil
|
|
210
|
-
end
|
|
211
|
-
end
|
|
212
|
-
|
|
213
|
-
context 'vm without ETIME' do
|
|
214
|
-
before :example do
|
|
215
|
-
data['end_time'] = 'NULL'
|
|
216
|
-
data['suspend'] = 'NULL'
|
|
217
|
-
end
|
|
218
|
-
|
|
219
|
-
let(:filename) { 'one_worker_ETIME_missing.xml' }
|
|
220
|
-
|
|
221
|
-
it 'replaces ETIME with "NULL"' do
|
|
222
|
-
expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
|
|
223
|
-
end
|
|
224
|
-
end
|
|
225
|
-
|
|
226
|
-
context 'vm with ETIME that is not a number' do
|
|
227
|
-
before :example do
|
|
228
|
-
data['end_time'] = 'NULL'
|
|
229
|
-
data['suspend'] = 'NULL'
|
|
230
|
-
end
|
|
231
|
-
|
|
232
|
-
let(:filename) { 'one_worker_ETIME_nan.xml' }
|
|
233
|
-
|
|
234
|
-
it 'replaces ETIME with "NULL"' do
|
|
235
|
-
expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
|
|
236
|
-
end
|
|
237
|
-
end
|
|
238
|
-
|
|
239
|
-
context 'vm ETIME that is 0' do
|
|
240
|
-
before :example do
|
|
241
|
-
data['end_time'] = 'NULL'
|
|
242
|
-
data['suspend'] = 'NULL'
|
|
243
|
-
end
|
|
244
|
-
|
|
245
|
-
let(:filename) { 'one_worker_ETIME_0.xml' }
|
|
246
|
-
|
|
247
|
-
it 'replaces ETIME with "NULL"' do
|
|
248
|
-
expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
|
|
249
|
-
end
|
|
250
|
-
end
|
|
251
|
-
|
|
252
|
-
context 'vm with STIME bigger than ETIME' do
|
|
253
|
-
let(:filename) { 'one_worker_STIME_>_ETIME.xml' }
|
|
254
|
-
|
|
255
|
-
it 'returns nil' do
|
|
256
|
-
expect(subject.process_vm(vm, user_map, image_map)).to be_nil
|
|
257
|
-
end
|
|
258
|
-
end
|
|
259
|
-
|
|
260
|
-
context 'vm without DEPLOY_ID' do
|
|
261
|
-
let(:filename) { 'one_worker_DEPLOY_ID_missing.xml' }
|
|
262
|
-
|
|
263
|
-
it 'replaces machine name with string created from id and prefix "one-"' do
|
|
264
|
-
expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
|
|
265
|
-
end
|
|
266
|
-
end
|
|
267
|
-
|
|
268
|
-
context 'vm without UID' do
|
|
269
|
-
before :example do
|
|
270
|
-
data['user_id'] = 'NULL'
|
|
271
|
-
data['user_name'] = 'NULL'
|
|
272
|
-
end
|
|
273
|
-
|
|
274
|
-
let(:filename) { 'one_worker_UID_missing.xml' }
|
|
275
|
-
|
|
276
|
-
it 'replaces user id with "NULL"' do
|
|
277
|
-
expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
|
|
278
|
-
end
|
|
279
|
-
end
|
|
280
|
-
|
|
281
|
-
context 'vm without GID' do
|
|
282
|
-
before :example do
|
|
283
|
-
data['group_id'] = 'NULL'
|
|
284
|
-
end
|
|
285
|
-
|
|
286
|
-
let(:filename) { 'one_worker_GID_missing.xml' }
|
|
287
|
-
|
|
288
|
-
it 'replaces group id with "NULL"' do
|
|
289
|
-
expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
|
|
290
|
-
end
|
|
291
|
-
end
|
|
292
|
-
|
|
293
|
-
context 'vm without GNAME' do
|
|
294
|
-
before :example do
|
|
295
|
-
data['fqan'] = nil
|
|
296
|
-
end
|
|
297
|
-
|
|
298
|
-
let(:filename) { 'one_worker_GNAME_missing.xml' }
|
|
299
|
-
|
|
300
|
-
it 'sets fqan to nil' do
|
|
301
|
-
expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
|
|
302
|
-
end
|
|
303
|
-
end
|
|
304
|
-
|
|
305
|
-
context 'vm without STATE' do
|
|
306
|
-
before :example do
|
|
307
|
-
data['status'] = 'NULL'
|
|
308
|
-
end
|
|
309
|
-
|
|
310
|
-
let(:filename) { 'one_worker_STATE_missing.xml' }
|
|
311
|
-
|
|
312
|
-
it 'replaces status with "NULL"' do
|
|
313
|
-
expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
|
|
314
|
-
end
|
|
315
|
-
end
|
|
316
|
-
|
|
317
|
-
context 'vm with STATE with value out of range' do
|
|
318
|
-
before :example do
|
|
319
|
-
data['status'] = 'NULL'
|
|
320
|
-
end
|
|
321
|
-
|
|
322
|
-
let(:filename) { 'one_worker_STATE_out_of_range.xml' }
|
|
323
|
-
|
|
324
|
-
it 'replaces status with "NULL"' do
|
|
325
|
-
expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
|
|
326
|
-
end
|
|
327
|
-
end
|
|
328
|
-
|
|
329
|
-
context 'vm without HISTORY_RECORDS' do
|
|
330
|
-
let(:filename) { 'one_worker_HISTORY_RECORDS_missing.xml' }
|
|
331
|
-
|
|
332
|
-
it 'returns nil' do
|
|
333
|
-
expect(subject.process_vm(vm, user_map, image_map)).to be_nil
|
|
334
|
-
end
|
|
335
|
-
end
|
|
336
|
-
|
|
337
|
-
context 'vm one HISTORY record' do
|
|
338
|
-
let(:filename) { 'one_worker_HISTORY_one.xml' }
|
|
339
|
-
|
|
340
|
-
it 'returns correct vm data' do
|
|
341
|
-
expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
|
|
342
|
-
end
|
|
343
|
-
end
|
|
344
|
-
|
|
345
|
-
context 'vm many HISTORY records' do
|
|
346
|
-
before :example do
|
|
347
|
-
data['duration'] = '831'
|
|
348
|
-
data['suspend'] = '279'
|
|
349
|
-
end
|
|
350
|
-
|
|
351
|
-
let(:filename) { 'one_worker_HISTORY_many.xml' }
|
|
352
|
-
|
|
353
|
-
it 'returns correct vm data' do
|
|
354
|
-
expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
|
|
355
|
-
end
|
|
356
|
-
end
|
|
357
|
-
|
|
358
|
-
context 'vm without TEMPLATE' do
|
|
359
|
-
before :example do
|
|
360
|
-
data['cpu_count'] = '1'
|
|
361
|
-
data['image_name'] = 'NULL'
|
|
362
|
-
data['memory'] = '0'
|
|
363
|
-
end
|
|
364
|
-
|
|
365
|
-
let(:filename) { 'one_worker_TEMPLATE_missing.xml' }
|
|
366
|
-
|
|
367
|
-
it 'replaces items in TEMPLATE section with "NULL"' do
|
|
368
|
-
expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
|
|
369
|
-
end
|
|
370
|
-
end
|
|
371
|
-
|
|
372
|
-
context 'vm without VCPU' do
|
|
373
|
-
before :example do
|
|
374
|
-
data['cpu_count'] = '1'
|
|
375
|
-
end
|
|
197
|
+
let(:user_map) { {'120' => '/Dn=FrOm/CN=DN/CN=MaP'} }
|
|
198
|
+
let(:image_map) { {'31' => 'image_name_from_map'} }
|
|
376
199
|
|
|
377
|
-
|
|
200
|
+
context 'with apel specific data' do
|
|
201
|
+
let(:filename) { 'one_worker_vm_dn01.xml' }
|
|
378
202
|
|
|
379
|
-
it '
|
|
203
|
+
it 'returns correct vm data with apel specific data' do
|
|
380
204
|
expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
|
|
381
205
|
end
|
|
382
206
|
end
|
|
383
207
|
|
|
384
|
-
context '
|
|
208
|
+
context 'with pbs specific data' do
|
|
385
209
|
before :example do
|
|
386
|
-
|
|
387
|
-
|
|
210
|
+
Settings.output['output_type'] = 'pbs-0.1'
|
|
211
|
+
Settings.output.pbs['realm'] = 'REALM'
|
|
212
|
+
Settings.output.pbs['queue'] = 'cloud'
|
|
213
|
+
Settings.output.pbs['scratch_type'] = 'local'
|
|
214
|
+
Settings.output.pbs['host_identifier'] = 'on_localhost'
|
|
388
215
|
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
end
|
|
394
|
-
end
|
|
216
|
+
data['realm'] = 'REALM'
|
|
217
|
+
data['pbs_queue'] = 'cloud'
|
|
218
|
+
data['scratch_type'] = 'local'
|
|
219
|
+
data['host'] = 'on_localhost'
|
|
395
220
|
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
data
|
|
221
|
+
data.delete 'endpoint'
|
|
222
|
+
data.delete 'site_name'
|
|
223
|
+
data.delete 'cloud_type'
|
|
399
224
|
end
|
|
400
225
|
|
|
401
|
-
let(:filename) { '
|
|
226
|
+
let(:filename) { 'one_worker_vm_dn01.xml' }
|
|
402
227
|
|
|
403
|
-
it '
|
|
228
|
+
it 'returns correct vm data with pbs specific data' do
|
|
404
229
|
expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
|
|
405
230
|
end
|
|
406
231
|
end
|
|
407
232
|
|
|
408
|
-
context '
|
|
409
|
-
|
|
410
|
-
data['network_inbound'] = 0
|
|
411
|
-
end
|
|
233
|
+
context 'with user\'s dn in template' do
|
|
234
|
+
let(:filename) { 'one_worker_vm_dn01.xml' }
|
|
412
235
|
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
it 'replaces network outbound with value 0' do
|
|
236
|
+
it 'returns correct vm data with user\'s dn from template' do
|
|
416
237
|
expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
|
|
417
238
|
end
|
|
418
239
|
end
|
|
419
240
|
|
|
420
|
-
context '
|
|
421
|
-
|
|
422
|
-
data['network_inbound'] = 0
|
|
423
|
-
end
|
|
424
|
-
|
|
425
|
-
let(:filename) { 'one_worker_NET_TX_0.xml' }
|
|
426
|
-
|
|
427
|
-
it 'replaces network outbound with value 0' do
|
|
428
|
-
expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
|
|
429
|
-
end
|
|
430
|
-
end
|
|
241
|
+
context 'with user\'s dn in map' do
|
|
242
|
+
let(:filename) { 'one_worker_vm_dn02.xml' }
|
|
431
243
|
|
|
432
|
-
context 'vm with NET_TX that is not a number' do
|
|
433
244
|
before :example do
|
|
434
|
-
data['
|
|
245
|
+
data['user_dn'] = '/Dn=FrOm/CN=DN/CN=MaP'
|
|
435
246
|
end
|
|
436
247
|
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
it 'replaces network outbound with value 0' do
|
|
248
|
+
it 'returns correct vm data with user\'s dn from map' do
|
|
440
249
|
expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
|
|
441
250
|
end
|
|
442
251
|
end
|
|
443
252
|
|
|
444
|
-
context '
|
|
445
|
-
|
|
446
|
-
data['network_outbound'] = 0
|
|
447
|
-
end
|
|
253
|
+
context 'with image name in VMCATCHER_EVENT_AD_MPURI tag' do
|
|
254
|
+
let(:filename) { 'one_worker_vm_image_name01.xml' }
|
|
448
255
|
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
it 'replaces network outbound with value 0' do
|
|
256
|
+
it 'returns correct vm data with image name from VMCATCHER_EVENT_AD_MPURI tag' do
|
|
452
257
|
expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
|
|
453
258
|
end
|
|
454
259
|
end
|
|
455
260
|
|
|
456
|
-
context '
|
|
457
|
-
|
|
458
|
-
data['network_outbound'] = 0
|
|
459
|
-
end
|
|
460
|
-
|
|
461
|
-
let(:filename) { 'one_worker_NET_RX_0.xml' }
|
|
261
|
+
context 'with image name in map' do
|
|
262
|
+
let(:filename) { 'one_worker_vm_image_name02.xml' }
|
|
462
263
|
|
|
463
|
-
it 'replaces network outbound with value 0' do
|
|
464
|
-
expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
|
|
465
|
-
end
|
|
466
|
-
end
|
|
467
|
-
|
|
468
|
-
context 'vm with NET_RX that is not a number' do
|
|
469
264
|
before :example do
|
|
470
|
-
data['
|
|
265
|
+
data['image_name'] = 'image_name_from_map'
|
|
471
266
|
end
|
|
472
267
|
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
it 'replaces network outbound with value 0' do
|
|
268
|
+
it 'returns correct vm data with image name from map' do
|
|
476
269
|
expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
|
|
477
270
|
end
|
|
478
271
|
end
|
|
479
272
|
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
end
|
|
484
|
-
|
|
485
|
-
let(:filename) { 'one_worker_MEMORY_missing.xml' }
|
|
486
|
-
|
|
487
|
-
it 'replaces memory with value 0' do
|
|
488
|
-
expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
|
|
489
|
-
end
|
|
490
|
-
end
|
|
273
|
+
#TODO should be moved into tests for mixin method
|
|
274
|
+
context 'with image name in USER_TEMPLATE/OCCI_COMPUTE_MIXINS tag' do
|
|
275
|
+
let(:filename) { 'one_worker_vm_image_name03.xml' }
|
|
491
276
|
|
|
492
|
-
context 'vm with MEMORY that is 0' do
|
|
493
277
|
before :example do
|
|
494
|
-
data['
|
|
278
|
+
data['image_name'] = 'http://occi.localhost/occi/infrastructure/os_tpl#image_name_from_USER_TEMPLATE_OCCI_COMPUTE_MIXINS'
|
|
495
279
|
end
|
|
496
280
|
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
it 'replaces memory with value 0' do
|
|
281
|
+
it 'returns correct vm data with image name from USER_TEMPLATE/OCCI_COMPUTE_MIXINS tag' do
|
|
500
282
|
expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
|
|
501
283
|
end
|
|
502
284
|
end
|
|
503
285
|
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
end
|
|
508
|
-
|
|
509
|
-
let(:filename) { 'one_worker_MEMORY_nan.xml' }
|
|
510
|
-
|
|
511
|
-
it 'replaces memory with value 0' do
|
|
512
|
-
expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
|
|
513
|
-
end
|
|
514
|
-
end
|
|
286
|
+
#TODO should be moved into tests for mixin method
|
|
287
|
+
context 'with image name in USER_TEMPLATE/OCCI_MIXIN tag' do
|
|
288
|
+
let(:filename) { 'one_worker_vm_image_name04.xml' }
|
|
515
289
|
|
|
516
|
-
context 'vm without DISK' do
|
|
517
290
|
before :example do
|
|
518
|
-
data['image_name'] = '
|
|
291
|
+
data['image_name'] = 'http://occi.localhost/occi/infrastructure/os_tpl#image_name_from_USER_TEMPLATE_OCCI_MIXIN'
|
|
519
292
|
end
|
|
520
293
|
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
it 'replaces image name with "NULL"' do
|
|
294
|
+
it 'returns correct vm data with image name from USER_TEMPLATE/OCCI_MIXIN tag' do
|
|
524
295
|
expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
|
|
525
296
|
end
|
|
526
297
|
end
|
|
527
298
|
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
let(:
|
|
531
|
-
|
|
532
|
-
it 'uses TEMPLATE/DISK/VMCATCHER_EVENT_AD_MPURI for image id mapping' do
|
|
533
|
-
expect(subject.process_vm(vm, user_map, image_map)['image_name']).to eq(image_name)
|
|
534
|
-
end
|
|
535
|
-
end
|
|
536
|
-
|
|
537
|
-
context 'vm without IMAGE_ID' do
|
|
538
|
-
before :example do
|
|
539
|
-
data['image_name'] = 'NULL'
|
|
540
|
-
end
|
|
541
|
-
|
|
542
|
-
let(:filename) { 'one_worker_IMAGE_ID_missing.xml' }
|
|
543
|
-
|
|
544
|
-
it 'replaces image name with "NULL"' do
|
|
545
|
-
expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
|
|
546
|
-
end
|
|
547
|
-
end
|
|
299
|
+
#TODO should be moved into tests for mixin method
|
|
300
|
+
context 'with image name in TEMPLATE/OCCI_MIXIN tag' do
|
|
301
|
+
let(:filename) { 'one_worker_vm_image_name05.xml' }
|
|
548
302
|
|
|
549
|
-
context 'vm without IMAGE_ID mapping' do
|
|
550
303
|
before :example do
|
|
551
|
-
data['image_name'] = '
|
|
304
|
+
data['image_name'] = 'http://occi.localhost/occi/infrastructure/os_tpl#image_name_from_TEMPLATE_OCCI_MIXIN'
|
|
552
305
|
end
|
|
553
306
|
|
|
554
|
-
|
|
555
|
-
let(:filename) { 'one_worker_valid_machine.xml' }
|
|
556
|
-
|
|
557
|
-
it 'replaces image name with IMAGE_ID' do
|
|
307
|
+
it 'returns correct vm data with image name from TEMPLATE/OCCI_MIXIN tag' do
|
|
558
308
|
expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
|
|
559
309
|
end
|
|
560
310
|
end
|
|
561
311
|
|
|
562
|
-
context '
|
|
563
|
-
let(:filename) { '
|
|
564
|
-
let(:image_name) { 'http://occi.localhost/occi/infrastructure/os_tpl#uuid_monitoring_20' }
|
|
565
|
-
|
|
566
|
-
it 'w/o map info uses os_tpl mixin' do
|
|
567
|
-
expect(subject.process_vm(vm, user_map, {})['image_name']).to eq(image_name)
|
|
568
|
-
end
|
|
569
|
-
|
|
570
|
-
it 'w/ map info uses map info' do
|
|
571
|
-
expect(subject.process_vm(vm, user_map, image_map)['image_name']).to eq(data['image_name'])
|
|
572
|
-
end
|
|
573
|
-
end
|
|
574
|
-
|
|
575
|
-
context 'vm with USER_TEMPLATE/OCCI_MIXIN' do
|
|
576
|
-
let(:filename) { 'one_worker_vm5.xml' }
|
|
577
|
-
let(:image_name) { 'https://occi.localhost/occi/infrastructure/os_tpl#omr_worker_x86_64_ide_1_0' }
|
|
578
|
-
|
|
579
|
-
it 'w/o map info uses os_tpl mixin' do
|
|
580
|
-
expect(subject.process_vm(vm, user_map, {})['image_name']).to eq(image_name)
|
|
581
|
-
end
|
|
582
|
-
|
|
583
|
-
it 'w/ map info uses map info' do
|
|
584
|
-
expect(subject.process_vm(vm, user_map, image_map)['image_name']).to eq(data['image_name'])
|
|
585
|
-
end
|
|
586
|
-
end
|
|
587
|
-
|
|
588
|
-
context 'vm with USER_TEMPLATE/USER_X509_DN' do
|
|
589
|
-
let(:filename) { 'one_worker_vm6.xml' }
|
|
590
|
-
let(:user_name) { '/MY=STuPID/CN=DN/CN=HERE' }
|
|
312
|
+
context 'with image name as image id' do
|
|
313
|
+
let(:filename) { 'one_worker_vm_image_name06.xml' }
|
|
591
314
|
|
|
592
|
-
it 'w/o map info uses USER_X509_DN' do
|
|
593
|
-
expect(subject.process_vm(vm, user_map, {})['user_name']).to eq(user_name)
|
|
594
|
-
end
|
|
595
|
-
|
|
596
|
-
it 'w/ map info uses USER_X509_DN' do
|
|
597
|
-
expect(subject.process_vm(vm, user_map, image_map)['user_name']).to eq(user_name)
|
|
598
|
-
end
|
|
599
|
-
end
|
|
600
|
-
|
|
601
|
-
context 'vm with DISK SIZEs' do
|
|
602
315
|
before :example do
|
|
603
|
-
data['
|
|
316
|
+
data['image_name'] = '42'
|
|
604
317
|
end
|
|
605
318
|
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
it 'correctly sums disk sizes' do
|
|
319
|
+
it 'returns correct vm data with image name as image id' do
|
|
609
320
|
expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
|
|
610
321
|
end
|
|
611
322
|
end
|
|
612
323
|
end
|
|
613
324
|
|
|
614
|
-
describe '
|
|
325
|
+
describe 'history_records' do
|
|
615
326
|
let(:vm) do
|
|
616
327
|
xml = File.read("#{GEM_DIR}/mock/#{filename}")
|
|
617
328
|
OpenNebula::XMLElement.new(OpenNebula::XMLElement.build_xml(xml, 'VM'))
|
|
618
329
|
end
|
|
619
330
|
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
331
|
+
let(:history) do
|
|
332
|
+
history = []
|
|
333
|
+
rec = {}
|
|
334
|
+
rec['start_time'] = '1383741169'
|
|
335
|
+
rec['end_time'] = '1383741259'
|
|
336
|
+
rec['rstart_time'] = '0'
|
|
337
|
+
rec['rend_time'] = '0'
|
|
338
|
+
rec['seq'] = '0'
|
|
339
|
+
rec['hostname'] = 'supermachine1.somewhere.com'
|
|
340
|
+
history << rec
|
|
341
|
+
rec = {}
|
|
342
|
+
rec['start_time'] = '1383741589'
|
|
343
|
+
rec['end_time'] = '1383742270'
|
|
344
|
+
rec['rstart_time'] = '1383741674'
|
|
345
|
+
rec['rend_time'] = '1383742270'
|
|
346
|
+
rec['seq'] = '1'
|
|
347
|
+
rec['hostname'] = 'supermachine2.somewhere.com'
|
|
348
|
+
history << rec
|
|
630
349
|
|
|
631
|
-
|
|
632
|
-
expect(subject.sum_disk_size(vm)).to eq('NULL')
|
|
633
|
-
end
|
|
350
|
+
history
|
|
634
351
|
end
|
|
635
352
|
|
|
636
|
-
context '
|
|
637
|
-
let(:filename) { '
|
|
353
|
+
context 'with correct history records in vm' do
|
|
354
|
+
let(:filename) { 'one_worker_vm_dn01.xml' }
|
|
638
355
|
|
|
639
|
-
it '
|
|
640
|
-
expect(subject.
|
|
356
|
+
it 'returns history records for vm' do
|
|
357
|
+
expect(subject.history_records(vm)).to eq(history)
|
|
641
358
|
end
|
|
642
359
|
end
|
|
643
360
|
|
|
644
|
-
context '
|
|
645
|
-
let(:filename) { '
|
|
361
|
+
context 'with no history records' do
|
|
362
|
+
let(:filename) { 'one_worker_vm_empty_history_records.xml' }
|
|
646
363
|
|
|
647
|
-
it '
|
|
648
|
-
expect(subject.
|
|
364
|
+
it 'returns emtpy array' do
|
|
365
|
+
expect(subject.history_records(vm)).to be_empty
|
|
649
366
|
end
|
|
650
367
|
end
|
|
651
368
|
end
|
|
652
369
|
|
|
653
|
-
describe '
|
|
370
|
+
describe 'disk_records' do
|
|
654
371
|
let(:vm) do
|
|
655
372
|
xml = File.read("#{GEM_DIR}/mock/#{filename}")
|
|
656
373
|
OpenNebula::XMLElement.new(OpenNebula::XMLElement.build_xml(xml, 'VM'))
|
|
657
374
|
end
|
|
658
375
|
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
context 'vm with RSTIME that is 0' do
|
|
668
|
-
let(:filename) { 'one_worker_RSTIME_0.xml' }
|
|
669
|
-
|
|
670
|
-
it 'returns 0' do
|
|
671
|
-
expect(subject.sum_rstime(vm)).to eq(0)
|
|
672
|
-
end
|
|
673
|
-
end
|
|
674
|
-
|
|
675
|
-
context 'vm without RETIME' do
|
|
676
|
-
let(:filename) { 'one_worker_RETIME_missing.xml' }
|
|
376
|
+
let(:disks) do
|
|
377
|
+
disks = []
|
|
378
|
+
disk = {}
|
|
379
|
+
disk['size'] = '10240'
|
|
380
|
+
disks << disk
|
|
381
|
+
disk = {}
|
|
382
|
+
disk['size'] = '42368'
|
|
383
|
+
disks << disk
|
|
677
384
|
|
|
678
|
-
|
|
679
|
-
expect(subject.sum_rstime(vm)).to eq(0)
|
|
680
|
-
end
|
|
681
|
-
end
|
|
682
|
-
|
|
683
|
-
context 'vm with RETIME that is 0 and still running' do
|
|
684
|
-
before :example do
|
|
685
|
-
allow(Time).to receive(:now) { Time.at(1383741716) }
|
|
686
|
-
end
|
|
687
|
-
|
|
688
|
-
let(:filename) { 'one_worker_RETIME_0_RUNNING.xml' }
|
|
689
|
-
|
|
690
|
-
it 'returns difference between current time and start of the virtual machine' do
|
|
691
|
-
expect(subject.sum_rstime(vm)).to eq(42)
|
|
692
|
-
end
|
|
385
|
+
disks
|
|
693
386
|
end
|
|
694
387
|
|
|
695
|
-
context '
|
|
696
|
-
let(:filename) { '
|
|
388
|
+
context 'with correct disk records in vm' do
|
|
389
|
+
let(:filename) { 'one_worker_vm_dn01.xml' }
|
|
697
390
|
|
|
698
|
-
it 'returns
|
|
699
|
-
expect(subject.
|
|
391
|
+
it 'returns history records for vm' do
|
|
392
|
+
expect(subject.disk_records(vm)).to eq(disks)
|
|
700
393
|
end
|
|
701
394
|
end
|
|
702
395
|
|
|
703
|
-
context '
|
|
704
|
-
let(:filename) { '
|
|
396
|
+
context 'with no disk records' do
|
|
397
|
+
let(:filename) { 'one_worker_vm_empty_disk_records.xml' }
|
|
705
398
|
|
|
706
|
-
it 'returns
|
|
707
|
-
expect(subject.
|
|
399
|
+
it 'returns emtpy array' do
|
|
400
|
+
expect(subject.disk_records(vm)).to be_empty
|
|
708
401
|
end
|
|
709
402
|
end
|
|
710
403
|
end
|
|
711
404
|
|
|
712
405
|
describe '.perform' do
|
|
713
406
|
before :example do
|
|
407
|
+
Settings.output['output_type'] = 'unknown'
|
|
714
408
|
allow(OneDataAccessor).to receive(:new) { oda }
|
|
715
|
-
allow(subject).to receive(:create_user_map) { user_map }
|
|
716
|
-
allow(subject).to receive(:create_image_map) { image_map }
|
|
409
|
+
allow(subject).to receive(:create_user_map) { 'user_map' }
|
|
410
|
+
allow(subject).to receive(:create_image_map) { 'image_map' }
|
|
717
411
|
allow(subject).to receive(:load_vm).and_return(:default)
|
|
718
|
-
allow(subject).to receive(:load_vm).with('10', oda).and_return(
|
|
719
|
-
allow(subject).to receive(:load_vm).with('20', oda).and_return(
|
|
720
|
-
allow(subject).to receive(:load_vm).with('30', oda).and_return(
|
|
412
|
+
allow(subject).to receive(:load_vm).with('10', oda).and_return('10')
|
|
413
|
+
allow(subject).to receive(:load_vm).with('20', oda).and_return('20')
|
|
414
|
+
allow(subject).to receive(:load_vm).with('30', oda).and_return('30')
|
|
415
|
+
allow(subject).to receive(:process_vm).with('10', anything, anything).and_return('data_vm1')
|
|
416
|
+
allow(subject).to receive(:process_vm).with('20', anything, anything).and_return('data_vm2')
|
|
417
|
+
allow(subject).to receive(:process_vm).with('30', anything, anything).and_return('data_vm3')
|
|
721
418
|
end
|
|
722
419
|
|
|
723
420
|
let(:vms) { '10|20|30' }
|
|
724
|
-
let(:
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
xml = File.read("#{GEM_DIR}/mock/one_worker_vm2.xml")
|
|
732
|
-
OpenNebula::XMLElement.new(OpenNebula::XMLElement.build_xml(xml, 'VM'))
|
|
733
|
-
end
|
|
734
|
-
let(:vm3) do
|
|
735
|
-
xml = File.read("#{GEM_DIR}/mock/one_worker_vm3.xml")
|
|
736
|
-
OpenNebula::XMLElement.new(OpenNebula::XMLElement.build_xml(xml, 'VM'))
|
|
421
|
+
let(:file_number) { 42 }
|
|
422
|
+
|
|
423
|
+
context 'with valid vms' do
|
|
424
|
+
it 'writes vm data' do
|
|
425
|
+
expect(subject).to receive(:write_data).with(['data_vm1', 'data_vm2', 'data_vm3'], file_number)
|
|
426
|
+
subject.perform(vms, file_number)
|
|
427
|
+
end
|
|
737
428
|
end
|
|
738
429
|
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
data['cloud_type'] = 'OpenNebula'
|
|
744
|
-
data['vm_uuid'] = '36551'
|
|
745
|
-
data['start_time'] = Time.at(1383741160)
|
|
746
|
-
data['end_time'] = Time.at(1383742270)
|
|
747
|
-
data['machine_name'] = 'one-36551'
|
|
748
|
-
data['user_id'] = '120'
|
|
749
|
-
data['group_id'] = '0'
|
|
750
|
-
data['user_name'] = 'user_name'
|
|
751
|
-
data['fqan'] = 'gname'
|
|
752
|
-
data['status'] = 'completed'
|
|
753
|
-
data['duration'] = '596'
|
|
754
|
-
data['suspend'] = '514'
|
|
755
|
-
data['cpu_count'] = '1'
|
|
756
|
-
data['network_inbound'] = 0
|
|
757
|
-
data['network_outbound'] = 0
|
|
758
|
-
data['memory'] = '1736960'
|
|
759
|
-
data['image_name'] = 'image_name'
|
|
760
|
-
data['disk_size'] = 'NULL'
|
|
430
|
+
context 'with one vm not loaded correctly' do
|
|
431
|
+
before :example do
|
|
432
|
+
allow(subject).to receive(:load_vm).with('20', oda).and_return(nil)
|
|
433
|
+
end
|
|
761
434
|
|
|
762
|
-
data
|
|
435
|
+
it 'writes data of the correct vms' do
|
|
436
|
+
expect(subject).to receive(:write_data).with(['data_vm1', 'data_vm3'], file_number)
|
|
437
|
+
subject.perform(vms, file_number)
|
|
438
|
+
end
|
|
763
439
|
end
|
|
764
440
|
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
441
|
+
context 'with apel data validator' do
|
|
442
|
+
before :example do
|
|
443
|
+
Settings.output['output_type'] = 'apel-0.2'
|
|
444
|
+
end
|
|
769
445
|
|
|
770
|
-
|
|
771
|
-
end
|
|
772
|
-
let(:vm3_data) do
|
|
773
|
-
vm3_data = data.clone
|
|
774
|
-
vm3_data['vm_uuid'] = '36553'
|
|
446
|
+
let(:validator) { double('validator') }
|
|
775
447
|
|
|
776
|
-
|
|
777
|
-
|
|
448
|
+
context 'and all vm valid' do
|
|
449
|
+
it 'uses apel data validator to validate all vms and all passes' do
|
|
450
|
+
expect(DataValidators::ApelDataValidator).to receive(:new).and_return(validator).exactly(3).times
|
|
451
|
+
expect(validator).to receive(:validate_data).with('data_vm1').and_return('valid_data_vm1')
|
|
452
|
+
expect(validator).to receive(:validate_data).with('data_vm2').and_return('valid_data_vm2')
|
|
453
|
+
expect(validator).to receive(:validate_data).with('data_vm3').and_return('valid_data_vm3')
|
|
454
|
+
expect(subject).to receive(:write_data).with(['valid_data_vm1', 'valid_data_vm2', 'valid_data_vm3'], file_number)
|
|
455
|
+
subject.perform(vms, file_number)
|
|
456
|
+
end
|
|
457
|
+
end
|
|
778
458
|
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
459
|
+
context 'and all vm valid but one' do
|
|
460
|
+
it 'uses apel data validator to validate all vms and all but one passes' do
|
|
461
|
+
expect(DataValidators::ApelDataValidator).to receive(:new).and_return(validator).exactly(3).times
|
|
462
|
+
expect(validator).to receive(:validate_data).with('data_vm1').and_return('valid_data_vm1')
|
|
463
|
+
expect(validator).to receive(:validate_data).with('data_vm2').and_raise(Errors::ValidationError)
|
|
464
|
+
expect(validator).to receive(:validate_data).with('data_vm3').and_return('valid_data_vm3')
|
|
465
|
+
expect(subject).to receive(:write_data).with(['valid_data_vm1', 'valid_data_vm3'], file_number)
|
|
466
|
+
subject.perform(vms, file_number)
|
|
467
|
+
end
|
|
783
468
|
end
|
|
784
469
|
end
|
|
785
470
|
|
|
786
|
-
context 'with
|
|
471
|
+
context 'with apel data validator' do
|
|
787
472
|
before :example do
|
|
788
|
-
|
|
473
|
+
Settings.output['output_type'] = 'pbs-0.1'
|
|
789
474
|
end
|
|
790
475
|
|
|
791
|
-
|
|
792
|
-
expect(subject).to receive(:write_data).with([vm1_data, vm3_data], anything)
|
|
793
|
-
subject.perform(vms, 'output_dir')
|
|
794
|
-
end
|
|
795
|
-
end
|
|
476
|
+
let(:validator) { double('validator') }
|
|
796
477
|
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
478
|
+
context 'and all vm valid' do
|
|
479
|
+
it 'uses apel data validator to validate all vms and all passes' do
|
|
480
|
+
expect(DataValidators::PbsDataValidator).to receive(:new).and_return(validator).exactly(3).times
|
|
481
|
+
expect(validator).to receive(:validate_data).with('data_vm1').and_return('valid_data_vm1')
|
|
482
|
+
expect(validator).to receive(:validate_data).with('data_vm2').and_return('valid_data_vm2')
|
|
483
|
+
expect(validator).to receive(:validate_data).with('data_vm3').and_return('valid_data_vm3')
|
|
484
|
+
expect(subject).to receive(:write_data).with(['valid_data_vm1', 'valid_data_vm2', 'valid_data_vm3'], file_number)
|
|
485
|
+
subject.perform(vms, file_number)
|
|
486
|
+
end
|
|
801
487
|
end
|
|
802
488
|
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
489
|
+
context 'and all vm valid but one' do
|
|
490
|
+
it 'uses apel data validator to validate all vms and all but one passes' do
|
|
491
|
+
expect(DataValidators::PbsDataValidator).to receive(:new).and_return(validator).exactly(3).times
|
|
492
|
+
expect(validator).to receive(:validate_data).with('data_vm1').and_return('valid_data_vm1')
|
|
493
|
+
expect(validator).to receive(:validate_data).with('data_vm2').and_raise(Errors::ValidationError)
|
|
494
|
+
expect(validator).to receive(:validate_data).with('data_vm3').and_return('valid_data_vm3')
|
|
495
|
+
expect(subject).to receive(:write_data).with(['valid_data_vm1', 'valid_data_vm3'], file_number)
|
|
496
|
+
subject.perform(vms, file_number)
|
|
497
|
+
end
|
|
806
498
|
end
|
|
807
499
|
end
|
|
808
500
|
end
|