oneacct-export 0.3.0 → 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +9 -1
  3. data/bin/oneacct-export +15 -3
  4. data/config/conf.yml +1 -0
  5. data/examples/usr/bin/oneacct-export-cron +31 -7
  6. data/lib/data_validators/apel_data_validator.rb +17 -5
  7. data/lib/data_validators/data_validator_helper.rb +1 -0
  8. data/lib/input_validator.rb +5 -0
  9. data/lib/one_data_accessor.rb +62 -10
  10. data/lib/one_worker.rb +89 -10
  11. data/lib/one_writer.rb +3 -1
  12. data/lib/oneacct_exporter.rb +3 -5
  13. data/lib/oneacct_exporter/version.rb +1 -1
  14. data/lib/oneacct_opts.rb +13 -3
  15. data/lib/output_types.rb +3 -3
  16. data/lib/templates/apel-0.2.erb +1 -1
  17. data/lib/templates/apel-0.4.erb +34 -0
  18. data/mock/one_data_accessor_cluster_01.xml +27 -0
  19. data/mock/one_data_accessor_cluster_02.xml +23 -0
  20. data/mock/one_data_accessor_host_01.xml +65 -0
  21. data/mock/one_data_accessor_host_02.xml +66 -0
  22. data/mock/one_data_accessor_host_03.xml +63 -0
  23. data/mock/one_data_accessor_host_04.xml +63 -0
  24. data/mock/one_data_accessor_host_05.xml +63 -0
  25. data/mock/one_worker_vm_number_of_public_ips_01.xml +275 -0
  26. data/mock/one_worker_vm_number_of_public_ips_02.xml +164 -0
  27. data/mock/one_worker_vm_number_of_public_ips_03.xml +189 -0
  28. data/mock/one_worker_vm_search_benchmark_01.xml +175 -0
  29. data/mock/one_worker_vm_search_benchmark_02.xml +175 -0
  30. data/oneacct-export.gemspec +6 -5
  31. data/spec/data_validators/apel_data_validator_spec.rb +72 -0
  32. data/spec/one_data_accessor_spec.rb +114 -43
  33. data/spec/one_worker_spec.rb +148 -18
  34. data/spec/oneacct_exporter_spec.rb +3 -13
  35. data/spec/oneacct_opts_spec.rb +22 -0
  36. data/spec/spec_helper.rb +2 -1
  37. metadata +40 -13
@@ -20,14 +20,15 @@ Gem::Specification.new do |spec|
20
20
  spec.required_ruby_version = '>= 2.0.0'
21
21
 
22
22
  spec.add_development_dependency 'bundler', '~> 1.6'
23
- spec.add_development_dependency 'rake', '~> 10.0'
24
- spec.add_development_dependency 'rspec', '~> 3.0.0'
23
+ spec.add_development_dependency 'rake', '~> 10.4'
24
+ spec.add_development_dependency 'rspec', '~> 3.3'
25
25
  spec.add_development_dependency 'fuubar', '~> 2.0.0'
26
- spec.add_development_dependency 'simplecov', '~> 0.9.0'
26
+ spec.add_development_dependency 'simplecov', '~> 0.10'
27
27
  spec.add_development_dependency 'rubygems-tasks', '~> 0.2.4'
28
28
 
29
29
  spec.add_runtime_dependency 'opennebula', '~> 4.6.0'
30
- spec.add_runtime_dependency 'syslogger', '~> 1.6.0'
31
- spec.add_runtime_dependency 'sidekiq', '~> 3.2.6'
30
+ spec.add_runtime_dependency 'syslogger', '~> 1.6'
31
+ spec.add_runtime_dependency 'sidekiq', '~> 3.4'
32
32
  spec.add_runtime_dependency 'settingslogic', '~> 2.0.9'
33
+ spec.add_runtime_dependency 'chronic_duration', '~> 0.10'
33
34
  end
@@ -50,6 +50,11 @@ module DataValidators
50
50
  data['user_dn'] = '/MY=STuPID/CN=DN/CN=HERE'
51
51
  data['image_name'] = 'https://appdb.egi.eu/store/vo/image/blablablabla/'
52
52
 
53
+ data['cloud_compute_service'] = 'CloudComputeServiceValue'
54
+
55
+ data['benchmark_type'] = 'b_type_999'
56
+ data['benchmark_value'] = '132.68'
57
+
53
58
  data
54
59
  end
55
60
 
@@ -74,6 +79,7 @@ module DataValidators
74
79
  valid_data['network_inbound'] = 3
75
80
  valid_data['network_outbound'] = 5
76
81
  valid_data['memory'] = '1736960'
82
+ valid_data['number_of_public_ips'] = 0
77
83
  history = []
78
84
  rec = {}
79
85
  rec['start_time'] = '1383741169'
@@ -101,6 +107,11 @@ module DataValidators
101
107
  valid_data['suspend'] = 425
102
108
  valid_data['disk_size'] = 52608
103
109
 
110
+ valid_data['cloud_compute_service'] = 'CloudComputeServiceValue'
111
+
112
+ valid_data['benchmark_type'] = 'b_type_999'
113
+ valid_data['benchmark_value'] = '132.68'
114
+
104
115
  valid_data
105
116
  end
106
117
 
@@ -492,6 +503,67 @@ module DataValidators
492
503
  expect(subject.validate_data(data)).to eq(valid_data)
493
504
  end
494
505
  end
506
+
507
+ context 'without cloud compute service' do
508
+ before :example do
509
+ data['cloud_compute_service'] = nil
510
+ valid_data['cloud_compute_service'] = 'NULL'
511
+ end
512
+
513
+ it 'replaces cloud compute service with "NULL"' do
514
+ expect(subject.validate_data(data)).to eq(valid_data)
515
+ end
516
+ end
517
+
518
+ context 'without benchmark_type' do
519
+ before :example do
520
+ data['benchmark_type'] = nil
521
+ valid_data['benchmark_type'] = 'NULL'
522
+ valid_data['benchmark_value'] = 'NULL'
523
+ end
524
+
525
+ it 'replaced benchmark type and benchmark value with "NULL"' do
526
+ expect(subject.validate_data(data)).to eq(valid_data)
527
+ end
528
+ end
529
+
530
+ context 'without benchmark_value' do
531
+ before :example do
532
+ data['benchmark_value'] = nil
533
+ valid_data['benchmark_type'] = 'NULL'
534
+ valid_data['benchmark_value'] = 'NULL'
535
+ end
536
+
537
+ it 'replaced benchmark type and benchmark value with "NULL"' do
538
+ expect(subject.validate_data(data)).to eq(valid_data)
539
+ end
540
+ end
541
+
542
+ context 'without benchmark_type and benchmark_value' do
543
+ before :example do
544
+ data['benchmark_type'] = nil
545
+ data['benchmark_value'] = nil
546
+ valid_data['benchmark_type'] = 'NULL'
547
+ valid_data['benchmark_value'] = 'NULL'
548
+ end
549
+
550
+ it 'replaced benchmark type and benchmark value with "NULL"' do
551
+ expect(subject.validate_data(data)).to eq(valid_data)
552
+ end
553
+ end
554
+
555
+ context 'with benchmark_value that is not a number' do
556
+ before :example do
557
+ data['benchmark_value'] = 'string'
558
+ valid_data['benchmark_type'] = 'NULL'
559
+ valid_data['benchmark_value'] = 'NULL'
560
+ end
561
+
562
+ it 'replaced benchmark type and benchmark value with "NULL"' do
563
+ expect(subject.validate_data(data)).to eq(valid_data)
564
+ end
565
+ end
566
+
495
567
  end
496
568
  end
497
569
  end
@@ -155,42 +155,44 @@ describe OneDataAccessor do
155
155
  before :example do
156
156
  allow(vm_pool).to receive(:info) { 'valid_rc' }
157
157
  allow(vm_pool).to receive(:to) { vm_pool }
158
+ allow(vm_pool).to receive(:count) { 100 }
159
+ allow(vm_pool).to receive(:entries) { [last] }
158
160
  allow(OpenNebula::VirtualMachinePool).to receive(:new) { vm_pool }
159
161
  end
160
162
 
161
163
  let(:vm_pool) { double('vm_pool') }
164
+ let(:last) { double('last') }
162
165
 
163
166
  context 'without compatibility mode' do
164
- context 'with valid batch number' do
165
- it 'requests vms with correct range' do
166
- expect(vm_pool).to receive(:info).with(OpenNebula::Pool::INFO_ALL, 0, 99, OpenNebula::VirtualMachinePool::INFO_ALL_VM)
167
- subject.load_vm_pool(0)
167
+ it 'requests vms with correct range' do
168
+ expect(vm_pool).to receive(:info).with(OpenNebula::Pool::INFO_ALL, 0, -100, OpenNebula::VirtualMachinePool::INFO_ALL_VM)
169
+ allow(last).to receive(:id) {99}
170
+ subject.load_vm_pool
168
171
 
169
- expect(vm_pool).to receive(:info).with(OpenNebula::Pool::INFO_ALL, 100, 199, OpenNebula::VirtualMachinePool::INFO_ALL_VM)
170
- subject.load_vm_pool(1)
172
+ expect(vm_pool).to receive(:info).with(OpenNebula::Pool::INFO_ALL, 100, -100, OpenNebula::VirtualMachinePool::INFO_ALL_VM)
173
+ allow(last).to receive(:id) {199}
174
+ subject.load_vm_pool
171
175
 
172
- expect(vm_pool).to receive(:info).with(OpenNebula::Pool::INFO_ALL, 300, 399, OpenNebula::VirtualMachinePool::INFO_ALL_VM)
173
- subject.load_vm_pool(3)
176
+ expect(vm_pool).to receive(:info).with(OpenNebula::Pool::INFO_ALL, 200, -100, OpenNebula::VirtualMachinePool::INFO_ALL_VM)
177
+ allow(last).to receive(:id) {299}
178
+ subject.load_vm_pool
174
179
 
175
- expect(vm_pool).to receive(:info).with(OpenNebula::Pool::INFO_ALL, 500, 599, OpenNebula::VirtualMachinePool::INFO_ALL_VM)
176
- subject.load_vm_pool(5)
180
+ expect(vm_pool).to receive(:info).with(OpenNebula::Pool::INFO_ALL, 300, -100, OpenNebula::VirtualMachinePool::INFO_ALL_VM)
181
+ allow(last).to receive(:id) {399}
182
+ subject.load_vm_pool
177
183
 
178
- expect(vm_pool).to receive(:info).with(OpenNebula::Pool::INFO_ALL, 1000, 1099, OpenNebula::VirtualMachinePool::INFO_ALL_VM)
179
- subject.load_vm_pool(10)
184
+ expect(vm_pool).to receive(:info).with(OpenNebula::Pool::INFO_ALL, 400, -100, OpenNebula::VirtualMachinePool::INFO_ALL_VM)
185
+ allow(last).to receive(:id) {499}
186
+ subject.load_vm_pool
180
187
 
181
- expect(vm_pool).to receive(:info).with(OpenNebula::Pool::INFO_ALL, 1200, 1299, OpenNebula::VirtualMachinePool::INFO_ALL_VM)
182
- subject.load_vm_pool(12)
183
- end
184
-
185
- it 'returns obtained vm pool' do
186
- expect(subject.load_vm_pool(0)).to eq(vm_pool)
187
- end
188
+ expect(vm_pool).to receive(:info).with(OpenNebula::Pool::INFO_ALL, 500, -100, OpenNebula::VirtualMachinePool::INFO_ALL_VM)
189
+ allow(last).to receive(:id) {599}
190
+ subject.load_vm_pool
188
191
  end
189
192
 
190
- context 'with invalid batch number' do
191
- it 'fails with ArgumentError' do
192
- expect { subject.load_vm_pool('invalid_number') }.to raise_error(ArgumentError)
193
- end
193
+ it 'returns obtained vm pool' do
194
+ allow(last).to receive(:id) {99}
195
+ expect(subject.load_vm_pool).to eq(vm_pool)
194
196
  end
195
197
  end
196
198
 
@@ -199,17 +201,19 @@ describe OneDataAccessor do
199
201
  Settings.output['num_of_vms_per_file'] = 3
200
202
  allow(OpenNebula::VirtualMachinePool).to receive(:new) { compatibility_vm_pool }
201
203
  allow(compatibility_vm_pool).to receive(:info) { 'valid_rc' }
204
+ allow(last).to receive(:id).and_return(2, 5, 8, 10)
202
205
  end
203
206
 
204
207
  let(:one_data_accessor) { OneDataAccessor.new(true, Logger.new('/dev/null')) }
205
- let(:compatibility_vm_pool) { [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] }
208
+ let(:compatibility_vm_pool) { [0, 1, last, 3, 4, last, 6, 7, last, 9, last] }
209
+ let(:last) { double('last') }
206
210
 
207
211
  it 'returns correct parts of vm pool' do
208
212
  expect(compatibility_vm_pool).to receive(:info).with(OpenNebula::Pool::INFO_ALL, -1, -1, OpenNebula::VirtualMachinePool::INFO_ALL_VM)
209
- expect(subject.load_vm_pool(0)).to eq([0, 1, 2])
210
- expect(subject.load_vm_pool(1)).to eq([3, 4, 5])
211
- expect(subject.load_vm_pool(2)).to eq([6, 7, 8])
212
- expect(subject.load_vm_pool(3)).to eq([9, 10])
213
+ expect(subject.load_vm_pool).to eq([0, 1, last])
214
+ expect(subject.load_vm_pool).to eq([3, 4, last])
215
+ expect(subject.load_vm_pool).to eq([6, 7, last])
216
+ expect(subject.load_vm_pool).to eq([9, last])
213
217
  end
214
218
  end
215
219
  end
@@ -333,23 +337,12 @@ describe OneDataAccessor do
333
337
  let(:vm2) { { 'ID' => '2' } }
334
338
  let(:vm3) { { 'ID' => '3' } }
335
339
  let(:vm_pool) { [vm1, vm2, vm3] }
336
- let(:batch_number) { 5 }
337
-
338
- context 'is called with some batch number' do
339
- before :example do
340
- expect(subject).to receive(:load_vm_pool).with(5) { vm_pool }
341
- end
342
-
343
- it 'calls load_vm_pool with that batch number' do
344
- subject.vms(batch_number, nil, nil)
345
- end
346
- end
347
340
 
348
341
  context 'when vm pool is empty' do
349
342
  let(:vm_pool) { [] }
350
343
 
351
344
  it 'returns nil' do
352
- expect(subject.vms(batch_number, nil, nil)).to be_nil
345
+ expect(subject.vms(nil, nil)).to be_nil
353
346
  end
354
347
  end
355
348
 
@@ -360,14 +353,14 @@ describe OneDataAccessor do
360
353
  expect(subject).to receive(:want?).with(vm3, nil, nil).once
361
354
  end
362
355
  it 'calls want?' do
363
- subject.vms(batch_number, nil, nil)
356
+ subject.vms(nil, nil)
364
357
  end
365
358
  end
366
359
 
367
360
  context 'for every vm obtained from vm pool' do
368
361
  context 'with ID attribute' do
369
362
  it 'returns ID of those vms' do
370
- expect(subject.vms(batch_number, nil, nil)).to eq([1, 2, 3])
363
+ expect(subject.vms(nil, nil)).to eq([1, 2, 3])
371
364
  end
372
365
  end
373
366
 
@@ -376,7 +369,7 @@ describe OneDataAccessor do
376
369
  let(:vm3) { {} }
377
370
 
378
371
  it 'skips vms without ID attribute and returns only thouse with it' do
379
- expect(subject.vms(batch_number, nil, nil)).to eq([2])
372
+ expect(subject.vms(nil, nil)).to eq([2])
380
373
  end
381
374
  end
382
375
  end
@@ -438,4 +431,82 @@ describe OneDataAccessor do
438
431
  end
439
432
  end
440
433
  end
434
+
435
+ describe '.benchmark_map' do
436
+ before :example do
437
+ allow(OpenNebula::HostPool).to receive(:new) { host_pool }
438
+ allow(OpenNebula::Cluster).to receive(:new) { searched_cluster }
439
+ expect(host_pool).to receive(:info)
440
+ end
441
+
442
+ let(:host_pool) {
443
+ file = File.read("#{GEM_DIR}/mock/#{host_filename}")
444
+ xml = OpenNebula::XMLElement.new(OpenNebula::XMLElement.build_xml(file, 'HOST'))
445
+ [ xml ]
446
+ }
447
+
448
+ let(:searched_cluster) {
449
+ file = File.read("#{GEM_DIR}/mock/#{cluster_filename}")
450
+ OpenNebula::XMLElement.new(OpenNebula::XMLElement.build_xml(file, 'CLUSTER'))
451
+ }
452
+
453
+ context 'with correct data on a host with one benchmark value' do
454
+ let(:host_filename) { 'one_data_accessor_host_01.xml' }
455
+ let(:expected) { { '1' => { :benchmark_type => 'bench_type_1',
456
+ :mixins => { 'mixin1' => '36.9' } } } }
457
+
458
+ it 'creates correct benchmark_map' do
459
+ expect(subject.benchmark_map).to eq(expected)
460
+ end
461
+ end
462
+
463
+ context 'with correct data on a host with two benchmark values' do
464
+ let(:host_filename) { 'one_data_accessor_host_02.xml' }
465
+ let(:expected) { { '2' => { :benchmark_type => 'bench_type_2',
466
+ :mixins => { 'mixin1' => '788.6', 'mixin2' => '123.123' } } } }
467
+
468
+ it 'creates correct benchmark_map' do
469
+ expect(subject.benchmark_map).to eq(expected)
470
+ end
471
+ end
472
+
473
+ context 'with no data on a host and correct data on host\'s cluster' do
474
+ before :example do
475
+ expect(searched_cluster).to receive(:info)
476
+ end
477
+
478
+ let(:host_filename) { 'one_data_accessor_host_03.xml' }
479
+ let(:cluster_filename) { 'one_data_accessor_cluster_01.xml' }
480
+ let(:expected) { { '3' => { :benchmark_type => 'bench_type_cluster_1',
481
+ :mixins => { 'mixin1' => '21.7' } } } }
482
+
483
+ it 'creates correct benchmark_map' do
484
+ expect(subject.benchmark_map).to eq(expected)
485
+ end
486
+ end
487
+
488
+ context 'with no data on a host and with no data on host\'s cluster' do
489
+ before :example do
490
+ expect(searched_cluster).to receive(:info)
491
+ end
492
+
493
+ let(:host_filename) { 'one_data_accessor_host_04.xml' }
494
+ let(:cluster_filename) { 'one_data_accessor_cluster_02.xml' }
495
+ let(:expected) { { '4' => {} } }
496
+
497
+ it 'creates correct benchmark_map' do
498
+ expect(subject.benchmark_map).to eq(expected)
499
+ end
500
+ end
501
+
502
+ context 'with no data on a host and without host\'s cluster' do
503
+ let(:host_filename) { 'one_data_accessor_host_05.xml' }
504
+ let(:expected) { { '5' => {} } }
505
+ let(:searched_cluster) { nil }
506
+
507
+ it 'creates correct benchmark_map' do
508
+ expect(subject.benchmark_map).to eq(expected)
509
+ end
510
+ end
511
+ end
441
512
  end
@@ -13,9 +13,10 @@ describe OneWorker do
13
13
  Settings.output.apel['endpoint'] = 'machine.hogwarts.co.uk'
14
14
  Settings.output.apel['site_name'] = 'Hogwarts'
15
15
  Settings.output.apel['cloud_type'] = 'OpenNebula'
16
+ Settings.output.apel['cloud_compute_service'] = 'CloudComputeServiceValue'
16
17
  end
17
18
 
18
- let(:output_type_specific_data) { {'endpoint' => 'machine.hogwarts.co.uk', 'site_name' => 'Hogwarts', 'cloud_type' => 'OpenNebula'} }
19
+ let(:output_type_specific_data) { {'endpoint' => 'machine.hogwarts.co.uk', 'site_name' => 'Hogwarts', 'cloud_type' => 'OpenNebula', 'cloud_compute_service' => 'CloudComputeServiceValue'} }
19
20
 
20
21
  it 'returns data specific for apel output type in form of hash' do
21
22
  expect(subject.output_type_specific_data).to eq(output_type_specific_data)
@@ -53,6 +54,13 @@ describe OneWorker do
53
54
  end
54
55
  end
55
56
 
57
+ describe '.create_cluster_map' do
58
+ it 'returns cluster map' do
59
+ expect(subject).to receive(:create_map).with(OpenNebula::ClusterPool, anything, anything) { 'map' }
60
+ expect(subject.create_cluster_map(oda)).to eq('map')
61
+ end
62
+ end
63
+
56
64
  describe '.create_map' do
57
65
  let(:pool_type) { double('pool_type') }
58
66
  let(:mapping) { double('mapping') }
@@ -136,8 +144,9 @@ describe OneWorker do
136
144
  before :example do
137
145
  Settings.output['output_type'] = 'apel-0.2'
138
146
  Settings.output.apel['endpoint'] = 'machine.hogwarts.co.uk'
139
- Settings.output.apel['site_name'] = 'Hogwarts'
147
+ Settings.output.apel['site_name'] = 'site-name-from-config'
140
148
  Settings.output.apel['cloud_type'] = 'OpenNebula'
149
+ Settings.output.apel['cloud_compute_service'] = nil
141
150
 
142
151
  allow(vm).to receive(:state_str) { 'DONE' }
143
152
  end
@@ -151,8 +160,9 @@ describe OneWorker do
151
160
  data = {}
152
161
 
153
162
  data['endpoint'] = 'machine.hogwarts.co.uk'
154
- data['site_name'] = 'Hogwarts'
163
+ data['site_name'] = 'site-name-from-cluster'
155
164
  data['cloud_type'] = 'OpenNebula'
165
+ data['cloud_compute_service'] = nil
156
166
 
157
167
  data['vm_uuid'] = '36551'
158
168
  data['start_time'] = '1383741160'
@@ -168,6 +178,7 @@ describe OneWorker do
168
178
  data['network_inbound'] = '43557888'
169
179
  data['network_outbound'] = '376832'
170
180
  data['memory'] = '1736960'
181
+ data['number_of_public_ips'] = 1
171
182
  history = []
172
183
  rec = {}
173
184
  rec['start_time'] = '1383741169'
@@ -191,17 +202,24 @@ describe OneWorker do
191
202
  data['user_dn'] = '/Dn=FrOm/CN=DN/CN=TeMpLaTe'
192
203
  data['image_name'] = 'https://appdb.egi.eu/store/vo/image/image_name_from_VMCATCHER_EVENT_AD_MPURI_tag/'
193
204
 
205
+ data['benchmark_type'] = nil
206
+ data['benchmark_value'] = nil
207
+
208
+ data['oneacct_export_version'] = ::OneacctExporter::VERSION
209
+
194
210
  data
195
211
  end
196
212
 
197
213
  let(:user_map) { {'120' => '/Dn=FrOm/CN=DN/CN=MaP'} }
198
214
  let(:image_map) { {'31' => 'image_name_from_map'} }
215
+ let(:cluster_map) { {'100' => 'site-name-from-cluster'}}
216
+ let(:benchmark_map) { {'123' => nil} }
199
217
 
200
218
  context 'with apel specific data' do
201
219
  let(:filename) { 'one_worker_vm_dn01.xml' }
202
220
 
203
221
  it 'returns correct vm data with apel specific data' do
204
- expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
222
+ expect(subject.process_vm(vm, user_map, image_map, cluster_map, benchmark_map)).to eq(data)
205
223
  end
206
224
  end
207
225
 
@@ -219,14 +237,14 @@ describe OneWorker do
219
237
  data['host'] = 'on_localhost'
220
238
 
221
239
  data.delete 'endpoint'
222
- data.delete 'site_name'
223
240
  data.delete 'cloud_type'
241
+ data.delete 'cloud_compute_service'
224
242
  end
225
243
 
226
244
  let(:filename) { 'one_worker_vm_dn01.xml' }
227
245
 
228
246
  it 'returns correct vm data with pbs specific data' do
229
- expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
247
+ expect(subject.process_vm(vm, user_map, image_map, cluster_map, benchmark_map)).to eq(data)
230
248
  end
231
249
  end
232
250
 
@@ -234,7 +252,7 @@ describe OneWorker do
234
252
  let(:filename) { 'one_worker_vm_dn01.xml' }
235
253
 
236
254
  it 'returns correct vm data with user\'s dn from template' do
237
- expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
255
+ expect(subject.process_vm(vm, user_map, image_map, cluster_map, benchmark_map)).to eq(data)
238
256
  end
239
257
  end
240
258
 
@@ -246,7 +264,7 @@ describe OneWorker do
246
264
  end
247
265
 
248
266
  it 'returns correct vm data with user\'s dn from map' do
249
- expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
267
+ expect(subject.process_vm(vm, user_map, image_map, cluster_map, benchmark_map)).to eq(data)
250
268
  end
251
269
  end
252
270
 
@@ -254,7 +272,7 @@ describe OneWorker do
254
272
  let(:filename) { 'one_worker_vm_image_name01.xml' }
255
273
 
256
274
  it 'returns correct vm data with image name from VMCATCHER_EVENT_AD_MPURI tag' do
257
- expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
275
+ expect(subject.process_vm(vm, user_map, image_map, cluster_map, benchmark_map)).to eq(data)
258
276
  end
259
277
  end
260
278
 
@@ -266,7 +284,7 @@ describe OneWorker do
266
284
  end
267
285
 
268
286
  it 'returns correct vm data with image name from map' do
269
- expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
287
+ expect(subject.process_vm(vm, user_map, image_map, cluster_map, benchmark_map)).to eq(data)
270
288
  end
271
289
  end
272
290
 
@@ -279,7 +297,7 @@ describe OneWorker do
279
297
  end
280
298
 
281
299
  it 'returns correct vm data with image name from USER_TEMPLATE/OCCI_COMPUTE_MIXINS tag' do
282
- expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
300
+ expect(subject.process_vm(vm, user_map, image_map, cluster_map, benchmark_map)).to eq(data)
283
301
  end
284
302
  end
285
303
 
@@ -292,7 +310,7 @@ describe OneWorker do
292
310
  end
293
311
 
294
312
  it 'returns correct vm data with image name from USER_TEMPLATE/OCCI_MIXIN tag' do
295
- expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
313
+ expect(subject.process_vm(vm, user_map, image_map, cluster_map, benchmark_map)).to eq(data)
296
314
  end
297
315
  end
298
316
 
@@ -305,7 +323,7 @@ describe OneWorker do
305
323
  end
306
324
 
307
325
  it 'returns correct vm data with image name from TEMPLATE/OCCI_MIXIN tag' do
308
- expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
326
+ expect(subject.process_vm(vm, user_map, image_map, cluster_map, benchmark_map)).to eq(data)
309
327
  end
310
328
  end
311
329
 
@@ -317,7 +335,47 @@ describe OneWorker do
317
335
  end
318
336
 
319
337
  it 'returns correct vm data with image name as image id' do
320
- expect(subject.process_vm(vm, user_map, image_map)).to eq(data)
338
+ expect(subject.process_vm(vm, user_map, image_map, cluster_map, benchmark_map)).to eq(data)
339
+ end
340
+ end
341
+
342
+ context 'without site-name on cluster (APEL)' do
343
+ let(:filename) { 'one_worker_vm_dn01.xml' }
344
+ let(:cluster_map) { {} }
345
+
346
+ before :example do
347
+ data['site_name'] = 'site-name-from-config'
348
+ end
349
+
350
+ it 'returns correct vm data with site-name from configuration file' do
351
+ expect(subject.process_vm(vm, user_map, image_map, cluster_map, benchmark_map)).to eq(data)
352
+ end
353
+ end
354
+
355
+ context 'without site-name on cluster (NON APEL)' do
356
+ let(:filename) { 'one_worker_vm_dn01.xml' }
357
+ let(:cluster_map) { {} }
358
+
359
+ before :example do
360
+ Settings.output['output_type'] = 'pbs-0.1'
361
+ Settings.output.pbs['realm'] = 'REALM'
362
+ Settings.output.pbs['queue'] = 'cloud'
363
+ Settings.output.pbs['scratch_type'] = 'local'
364
+ Settings.output.pbs['host_identifier'] = 'on_localhost'
365
+
366
+ data['realm'] = 'REALM'
367
+ data['pbs_queue'] = 'cloud'
368
+ data['scratch_type'] = 'local'
369
+ data['host'] = 'on_localhost'
370
+
371
+ data.delete 'endpoint'
372
+ data.delete 'cloud_type'
373
+ data.delete 'cloud_compute_service'
374
+ data.delete 'site_name'
375
+ end
376
+
377
+ it 'returns correct vm data without any site-name' do
378
+ expect(subject.process_vm(vm, user_map, image_map, cluster_map, benchmark_map)).to eq(data)
321
379
  end
322
380
  end
323
381
  end
@@ -402,19 +460,46 @@ describe OneWorker do
402
460
  end
403
461
  end
404
462
 
463
+ describe ".number_of_public_ips" do
464
+ let(:vm) do
465
+ xml = File.read("#{GEM_DIR}/mock/#{filename}")
466
+ OpenNebula::XMLElement.new(OpenNebula::XMLElement.build_xml(xml, 'VM'))
467
+ end
468
+
469
+ context "with multiple NICs (multiple IPs with duplicates) " do
470
+ let(:filename) { 'one_worker_vm_number_of_public_ips_01.xml' }
471
+ it "returns the correct number of public IPs" do
472
+ expect(subject.number_of_public_ips(vm)).to eq 8
473
+ end
474
+ end
475
+ context "with no NICs" do
476
+ let(:filename) { 'one_worker_vm_number_of_public_ips_02.xml' }
477
+ it "returns 0, the correct number of IPs" do
478
+ expect(subject.number_of_public_ips(vm)).to eq 0
479
+ end
480
+ end
481
+ context "with single NIC (multiple IPs with duplicates)" do
482
+ let(:filename) { 'one_worker_vm_number_of_public_ips_03.xml' }
483
+ it "returns the correct number of public IPs" do
484
+ expect(subject.number_of_public_ips(vm)).to eq 8
485
+ end
486
+ end
487
+ end
488
+
405
489
  describe '.perform' do
406
490
  before :example do
407
491
  Settings.output['output_type'] = 'unknown'
408
492
  allow(OneDataAccessor).to receive(:new) { oda }
409
493
  allow(subject).to receive(:create_user_map) { 'user_map' }
410
494
  allow(subject).to receive(:create_image_map) { 'image_map' }
411
- allow(subject).to receive(:load_vm).and_return(:default)
495
+ allow(subject).to receive(:create_cluster_map) { 'cluster_map' }
496
+ allow(oda).to receive(:benchmark_map) { 'benchmark_map' }
412
497
  allow(subject).to receive(:load_vm).with('10', oda).and_return('10')
413
498
  allow(subject).to receive(:load_vm).with('20', oda).and_return('20')
414
499
  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')
500
+ allow(subject).to receive(:process_vm).with('10', anything, anything, anything, anything).and_return('data_vm1')
501
+ allow(subject).to receive(:process_vm).with('20', anything, anything, anything, anything).and_return('data_vm2')
502
+ allow(subject).to receive(:process_vm).with('30', anything, anything, anything, anything).and_return('data_vm3')
418
503
  end
419
504
 
420
505
  let(:vms) { '10|20|30' }
@@ -498,4 +583,49 @@ describe OneWorker do
498
583
  end
499
584
  end
500
585
  end
586
+
587
+ describe '.search_benchmark' do
588
+ let(:vm) do
589
+ xml = File.read("#{GEM_DIR}/mock/#{filename}")
590
+ OpenNebula::XMLElement.new(OpenNebula::XMLElement.build_xml(xml, 'VM'))
591
+ end
592
+
593
+ let(:benchmark_map) do
594
+ values1 = { :benchmark_type => 'bench_type_1', :mixins => { 'mixin1' => '34.12' } }
595
+ values2 = { :benchmark_type => 'bench_type_2', :mixins => { 'mixin2' => '123.2', 'mixin3' => '129.6' } }
596
+ values3 = { }
597
+
598
+ benchmark_map = { '19' => values1, '11' => values2, '23' => values3 }
599
+ benchmark_map
600
+ end
601
+
602
+ context 'with empty benchmark_map' do
603
+ let(:filename) { 'one_worker_vm_search_benchmark_01.xml' }
604
+ let(:benchmark_map) { {} }
605
+ let(:expected) { { :benchmark_type => nil, :benchmark_value => nil } }
606
+
607
+ it 'returns array with two nil items' do
608
+ expect(subject.search_benchmark(vm, benchmark_map)).to eq(expected)
609
+ end
610
+ end
611
+
612
+ context 'with no data for the virtual machine in benchmark_map' do
613
+ let(:filename) { 'one_worker_vm_search_benchmark_02.xml' }
614
+ let(:expected) { { :benchmark_type => nil, :benchmark_value => nil } }
615
+
616
+ it 'returns array with two nil items' do
617
+ expect(subject.search_benchmark(vm, benchmark_map)).to eq(expected)
618
+ end
619
+ end
620
+
621
+ context 'with correct data in vm and benchmark_map' do
622
+ let(:filename) { 'one_worker_vm_search_benchmark_01.xml' }
623
+ let(:expected) { { :benchmark_type => 'bench_type_2', :benchmark_value => '129.6' } }
624
+
625
+ it 'returns correct benchmark type and value' do
626
+ expect(subject.search_benchmark(vm, benchmark_map)).to eq(expected)
627
+ end
628
+ end
629
+ end
630
+
501
631
  end