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
|
@@ -0,0 +1,497 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module DataValidators
|
|
4
|
+
describe ApelDataValidator do
|
|
5
|
+
|
|
6
|
+
subject { ApelDataValidator.new(Logger.new('/dev/null')) }
|
|
7
|
+
|
|
8
|
+
describe '.validate_data' do
|
|
9
|
+
let(:data) do
|
|
10
|
+
data = {}
|
|
11
|
+
|
|
12
|
+
data['endpoint'] = 'machine.hogwarts.co.uk'
|
|
13
|
+
data['site_name'] = 'Hogwarts'
|
|
14
|
+
data['cloud_type'] = 'OpenNebula'
|
|
15
|
+
|
|
16
|
+
data['vm_uuid'] = '36551'
|
|
17
|
+
data['start_time'] = '1383741160'
|
|
18
|
+
data['end_time'] = '1383742270'
|
|
19
|
+
data['machine_name'] = 'one-36551'
|
|
20
|
+
data['user_id'] = '120'
|
|
21
|
+
data['group_id'] = '0'
|
|
22
|
+
data['user_name'] = 'uname'
|
|
23
|
+
data['group_name'] = 'gname'
|
|
24
|
+
data['status_code'] = '3'
|
|
25
|
+
data['status'] = 'STATUS'
|
|
26
|
+
data['cpu_count'] = '1'
|
|
27
|
+
data['network_inbound'] = '4154845418'
|
|
28
|
+
data['network_outbound'] = '6326418701'
|
|
29
|
+
data['memory'] = '1736960'
|
|
30
|
+
history = []
|
|
31
|
+
rec = {}
|
|
32
|
+
rec['start_time'] = '1383741169'
|
|
33
|
+
rec['end_time'] = '1383741259'
|
|
34
|
+
rec['rstart_time'] = '1383741278'
|
|
35
|
+
rec['rend_time'] = '1383741367'
|
|
36
|
+
rec['seq'] = '0'
|
|
37
|
+
rec['hostname'] = 'supermachine1.somewhere.com'
|
|
38
|
+
history << rec
|
|
39
|
+
rec = {}
|
|
40
|
+
rec['start_time'] = '1383741589'
|
|
41
|
+
rec['end_time'] = '1383742270'
|
|
42
|
+
rec['rstart_time'] = '1383741674'
|
|
43
|
+
rec['rend_time'] = '1383742270'
|
|
44
|
+
rec['seq'] = '1'
|
|
45
|
+
rec['hostname'] = 'supermachine2.somewhere.com'
|
|
46
|
+
history << rec
|
|
47
|
+
data['history'] = history
|
|
48
|
+
data['disks'] = [{'size' => '10240'}, {'size' => '42368'}]
|
|
49
|
+
|
|
50
|
+
data['user_dn'] = '/MY=STuPID/CN=DN/CN=HERE'
|
|
51
|
+
data['image_name'] = 'https://appdb.egi.eu/store/vo/image/blablablabla/'
|
|
52
|
+
|
|
53
|
+
data
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
let(:valid_data) do
|
|
57
|
+
valid_data = {}
|
|
58
|
+
|
|
59
|
+
valid_data['endpoint'] = 'machine.hogwarts.co.uk'
|
|
60
|
+
valid_data['site_name'] = 'Hogwarts'
|
|
61
|
+
valid_data['cloud_type'] = 'OpenNebula'
|
|
62
|
+
|
|
63
|
+
valid_data['vm_uuid'] = '36551'
|
|
64
|
+
valid_data['start_time'] = Time.at(1383741160)
|
|
65
|
+
valid_data['end_time'] = Time.at(1383742270)
|
|
66
|
+
valid_data['machine_name'] = 'one-36551'
|
|
67
|
+
valid_data['user_id'] = '120'
|
|
68
|
+
valid_data['group_id'] = '0'
|
|
69
|
+
valid_data['user_name'] = 'uname'
|
|
70
|
+
valid_data['group_name'] = 'gname'
|
|
71
|
+
valid_data['status_code'] = '3'
|
|
72
|
+
valid_data['status'] = 'started'
|
|
73
|
+
valid_data['cpu_count'] = '1'
|
|
74
|
+
valid_data['network_inbound'] = 3
|
|
75
|
+
valid_data['network_outbound'] = 5
|
|
76
|
+
valid_data['memory'] = '1736960'
|
|
77
|
+
history = []
|
|
78
|
+
rec = {}
|
|
79
|
+
rec['start_time'] = '1383741169'
|
|
80
|
+
rec['end_time'] = '1383741259'
|
|
81
|
+
rec['rstart_time'] = '1383741278'
|
|
82
|
+
rec['rend_time'] = '1383741367'
|
|
83
|
+
rec['seq'] = '0'
|
|
84
|
+
rec['hostname'] = 'supermachine1.somewhere.com'
|
|
85
|
+
history << rec
|
|
86
|
+
rec = {}
|
|
87
|
+
rec['start_time'] = '1383741589'
|
|
88
|
+
rec['end_time'] = '1383742270'
|
|
89
|
+
rec['rstart_time'] = '1383741674'
|
|
90
|
+
rec['rend_time'] = '1383742270'
|
|
91
|
+
rec['seq'] = '1'
|
|
92
|
+
rec['hostname'] = 'supermachine2.somewhere.com'
|
|
93
|
+
history << rec
|
|
94
|
+
valid_data['history'] = history
|
|
95
|
+
valid_data['disks'] = [{'size' => '10240'}, {'size' => '42368'}]
|
|
96
|
+
|
|
97
|
+
valid_data['user_dn'] = '/MY=STuPID/CN=DN/CN=HERE'
|
|
98
|
+
valid_data['image_name'] = 'https://appdb.egi.eu/store/vo/image/blablablabla/'
|
|
99
|
+
|
|
100
|
+
valid_data['duration'] = Time.at(685)
|
|
101
|
+
valid_data['suspend'] = 425
|
|
102
|
+
valid_data['disk_size'] = 52608
|
|
103
|
+
|
|
104
|
+
valid_data
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
context 'with all data valid' do
|
|
108
|
+
it 'returns the same data transformed if needed' do
|
|
109
|
+
expect(subject.validate_data(data)).to eq(valid_data)
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
context 'without any data' do
|
|
114
|
+
let(:data) { nil }
|
|
115
|
+
|
|
116
|
+
it 'fails with ValidationError' do
|
|
117
|
+
expect { subject.validate_data(data) }.to raise_error(Errors::ValidationError)
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
context 'with empty data' do
|
|
122
|
+
let(:data) { {} }
|
|
123
|
+
|
|
124
|
+
it 'fails with ValidationError' do
|
|
125
|
+
expect { subject.validate_data(data) }.to raise_error(Errors::ValidationError)
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
context 'without endpoint' do
|
|
130
|
+
before :example do
|
|
131
|
+
data['endpoint'] = nil
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
it 'fails with ValidationError' do
|
|
135
|
+
expect { subject.validate_data(data) }.to raise_error(Errors::ValidationError)
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
context 'without site name' do
|
|
140
|
+
before :example do
|
|
141
|
+
data['site_name'] = nil
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
it 'fails with ValidationError' do
|
|
145
|
+
expect { subject.validate_data(data) }.to raise_error(Errors::ValidationError)
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
context 'without cloud type' do
|
|
150
|
+
before :example do
|
|
151
|
+
data['cloud_type'] = nil
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
it 'fails with ValidationError' do
|
|
155
|
+
expect { subject.validate_data(data) }.to raise_error(Errors::ValidationError)
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
context 'without vm uuid' do
|
|
160
|
+
before :example do
|
|
161
|
+
data['vm_uuid'] = nil
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
it 'fails with ValidationError' do
|
|
165
|
+
expect { subject.validate_data(data) }.to raise_error(Errors::ValidationError)
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
context 'without start time' do
|
|
170
|
+
before :example do
|
|
171
|
+
data['start_time'] = nil
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
it 'it fails with ValidationError' do
|
|
175
|
+
expect { subject.validate_data(data) }.to raise_error(Errors::ValidationError)
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
context 'with zero start time' do
|
|
180
|
+
before :example do
|
|
181
|
+
data['start_time'] = '0'
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
it 'it fails with ValidationError' do
|
|
185
|
+
expect { subject.validate_data(data) }.to raise_error(Errors::ValidationError)
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
context 'with start time that is not a number' do
|
|
190
|
+
before :example do
|
|
191
|
+
data['start_time'] = 'string'
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
it 'it fails with ValidationError' do
|
|
195
|
+
expect { subject.validate_data(data) }.to raise_error(Errors::ValidationError)
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
context 'without end time' do
|
|
200
|
+
before :example do
|
|
201
|
+
data['end_time'] = nil
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
it 'it fails with ValidationError' do
|
|
205
|
+
expect { subject.validate_data(data) }.to raise_error(Errors::ValidationError)
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
context 'with end time that is not a number' do
|
|
210
|
+
before :example do
|
|
211
|
+
data['end_time'] = 'string'
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
it 'it fails with ValidationError' do
|
|
215
|
+
expect { subject.validate_data(data) }.to raise_error(Errors::ValidationError)
|
|
216
|
+
end
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
context 'with zero end time' do
|
|
220
|
+
before :example do
|
|
221
|
+
data['end_time'] = '0'
|
|
222
|
+
valid_data['end_time'] = 'NULL'
|
|
223
|
+
valid_data['suspend'] = 'NULL'
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
it 'it replaces end_time and suspend with "NULL"' do
|
|
227
|
+
expect(subject.validate_data(data)).to eq(valid_data)
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
context 'with start time bigger than end time' do
|
|
232
|
+
before :example do
|
|
233
|
+
time = data['end_time']
|
|
234
|
+
data['end_time'] = data['start_time']
|
|
235
|
+
data['start_time'] = time
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
it 'it fails with ValidationError' do
|
|
239
|
+
expect { subject.validate_data(data) }.to raise_error(Errors::ValidationError)
|
|
240
|
+
end
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
context 'without machine name' do
|
|
244
|
+
before :example do
|
|
245
|
+
data['machine_name'] = nil
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
it 'replaces machine name with string created from id and prefix "one-"' do
|
|
249
|
+
expect(subject.validate_data(data)).to eq(valid_data)
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
context 'without user id' do
|
|
254
|
+
before :example do
|
|
255
|
+
data['user_id'] = nil
|
|
256
|
+
valid_data['user_id'] = 'NULL'
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
it 'replaces user id with "NULL"' do
|
|
260
|
+
expect(subject.validate_data(data)).to eq(valid_data)
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
context 'without group id' do
|
|
265
|
+
before :example do
|
|
266
|
+
data['group_id'] = nil
|
|
267
|
+
valid_data['group_id'] = 'NULL'
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
it 'replaces group id with "NULL"' do
|
|
271
|
+
expect(subject.validate_data(data)).to eq(valid_data)
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
context 'without user dn' do
|
|
276
|
+
before :example do
|
|
277
|
+
data['user_dn'] = nil
|
|
278
|
+
valid_data['user_dn'] = 'NULL'
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
it 'replaces user dn with "NULL"' do
|
|
282
|
+
expect(subject.validate_data(data)).to eq(valid_data)
|
|
283
|
+
end
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
context 'without user name' do
|
|
287
|
+
before :example do
|
|
288
|
+
data['user_name'] = nil
|
|
289
|
+
valid_data['user_name'] = 'NULL'
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
it 'replaces user name with "NULL"' do
|
|
293
|
+
expect(subject.validate_data(data)).to eq(valid_data)
|
|
294
|
+
end
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
context 'without group name' do
|
|
298
|
+
before :example do
|
|
299
|
+
data['group_name'] = nil
|
|
300
|
+
valid_data['group_name'] = nil
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
it 'replaces group name with nil' do
|
|
304
|
+
expect(subject.validate_data(data)).to eq(valid_data)
|
|
305
|
+
end
|
|
306
|
+
end
|
|
307
|
+
|
|
308
|
+
context 'without status code' do
|
|
309
|
+
before :example do
|
|
310
|
+
data['status_code'] = nil
|
|
311
|
+
valid_data['status'] = 'NULL'
|
|
312
|
+
valid_data['status_code'] = nil
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
it 'replaces status with "NULL"' do
|
|
316
|
+
expect(subject.validate_data(data)).to eq(valid_data)
|
|
317
|
+
end
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
context 'with status coce out of range' do
|
|
321
|
+
before :example do
|
|
322
|
+
data['status_code'] = '42'
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
it 'it fails with ValidationError' do
|
|
326
|
+
expect { subject.validate_data(data) }.to raise_error(Errors::ValidationError)
|
|
327
|
+
end
|
|
328
|
+
end
|
|
329
|
+
|
|
330
|
+
context 'with status code that is not a number' do
|
|
331
|
+
before :example do
|
|
332
|
+
data['status_code'] = 'string'
|
|
333
|
+
valid_data['status'] = 'NULL'
|
|
334
|
+
valid_data['status_code'] = 'string'
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
it 'replaces status with "NULL"' do
|
|
338
|
+
expect(subject.validate_data(data)).to eq(valid_data)
|
|
339
|
+
end
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
context 'without history records' do
|
|
343
|
+
before :example do
|
|
344
|
+
data['history'] = nil
|
|
345
|
+
end
|
|
346
|
+
|
|
347
|
+
it 'it fails with ValidationError' do
|
|
348
|
+
expect { subject.validate_data(data) }.to raise_error(Errors::ValidationError)
|
|
349
|
+
end
|
|
350
|
+
end
|
|
351
|
+
|
|
352
|
+
context 'with empty history records' do
|
|
353
|
+
before :example do
|
|
354
|
+
data['history'] = []
|
|
355
|
+
end
|
|
356
|
+
|
|
357
|
+
it 'it fails with ValidationError' do
|
|
358
|
+
expect { subject.validate_data(data) }.to raise_error(Errors::ValidationError)
|
|
359
|
+
end
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
context 'without cpu count' do
|
|
363
|
+
before :example do
|
|
364
|
+
data['cpu_count'] = nil
|
|
365
|
+
valid_data['cpu_count'] = '1'
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
it 'replaces cpu count with 1' do
|
|
369
|
+
expect(subject.validate_data(data)).to eq(valid_data)
|
|
370
|
+
end
|
|
371
|
+
end
|
|
372
|
+
|
|
373
|
+
context 'with cpu count that is not a number' do
|
|
374
|
+
before :example do
|
|
375
|
+
data['cpu_count'] = 'string'
|
|
376
|
+
valid_data['cpu_count'] = '1'
|
|
377
|
+
end
|
|
378
|
+
|
|
379
|
+
it 'replaces cpu count with 1' do
|
|
380
|
+
expect(subject.validate_data(data)).to eq(valid_data)
|
|
381
|
+
end
|
|
382
|
+
end
|
|
383
|
+
|
|
384
|
+
context 'with zero cpu count' do
|
|
385
|
+
before :example do
|
|
386
|
+
data['cpu_count'] = '0'
|
|
387
|
+
valid_data['cpu_count'] = '1'
|
|
388
|
+
end
|
|
389
|
+
|
|
390
|
+
it 'replaces cpu count with 1' do
|
|
391
|
+
expect(subject.validate_data(data)).to eq(valid_data)
|
|
392
|
+
end
|
|
393
|
+
end
|
|
394
|
+
|
|
395
|
+
context 'without network inbound' do
|
|
396
|
+
before :example do
|
|
397
|
+
data['network_inbound'] = nil
|
|
398
|
+
valid_data['network_inbound'] = 0
|
|
399
|
+
end
|
|
400
|
+
|
|
401
|
+
it 'replaces network_inbound with 0' do
|
|
402
|
+
expect(subject.validate_data(data)).to eq(valid_data)
|
|
403
|
+
end
|
|
404
|
+
end
|
|
405
|
+
|
|
406
|
+
context 'with network inbound that is not a number' do
|
|
407
|
+
before :example do
|
|
408
|
+
data['network_inbound'] = 'string'
|
|
409
|
+
valid_data['network_inbound'] = 0
|
|
410
|
+
end
|
|
411
|
+
|
|
412
|
+
it 'replaces network_inbound with 0' do
|
|
413
|
+
expect(subject.validate_data(data)).to eq(valid_data)
|
|
414
|
+
end
|
|
415
|
+
end
|
|
416
|
+
|
|
417
|
+
context 'without network outbound' do
|
|
418
|
+
before :example do
|
|
419
|
+
data['network_outbound'] = nil
|
|
420
|
+
valid_data['network_outbound'] = 0
|
|
421
|
+
end
|
|
422
|
+
|
|
423
|
+
it 'replaces network outbound with 0' do
|
|
424
|
+
expect(subject.validate_data(data)).to eq(valid_data)
|
|
425
|
+
end
|
|
426
|
+
end
|
|
427
|
+
|
|
428
|
+
context 'with network outbound that is not a number' do
|
|
429
|
+
before :example do
|
|
430
|
+
data['network_outbound'] = 'string'
|
|
431
|
+
valid_data['network_outbound'] = 0
|
|
432
|
+
end
|
|
433
|
+
|
|
434
|
+
it 'replaces network outbound with 0' do
|
|
435
|
+
expect(subject.validate_data(data)).to eq(valid_data)
|
|
436
|
+
end
|
|
437
|
+
end
|
|
438
|
+
|
|
439
|
+
context 'without memory' do
|
|
440
|
+
before :example do
|
|
441
|
+
data['memory'] = nil
|
|
442
|
+
valid_data['memory'] = '0'
|
|
443
|
+
end
|
|
444
|
+
|
|
445
|
+
it 'replaces memory with 0' do
|
|
446
|
+
expect(subject.validate_data(data)).to eq(valid_data)
|
|
447
|
+
end
|
|
448
|
+
end
|
|
449
|
+
|
|
450
|
+
context 'with memory that is not a number' do
|
|
451
|
+
before :example do
|
|
452
|
+
data['memory'] = 'string'
|
|
453
|
+
valid_data['memory'] = '0'
|
|
454
|
+
end
|
|
455
|
+
|
|
456
|
+
it 'replaces memory with 0' do
|
|
457
|
+
expect(subject.validate_data(data)).to eq(valid_data)
|
|
458
|
+
end
|
|
459
|
+
end
|
|
460
|
+
|
|
461
|
+
context 'without image name' do
|
|
462
|
+
before :example do
|
|
463
|
+
data['image_name'] = nil
|
|
464
|
+
valid_data['image_name'] = 'NULL'
|
|
465
|
+
end
|
|
466
|
+
|
|
467
|
+
it 'replaces image name with "NULL"' do
|
|
468
|
+
expect(subject.validate_data(data)).to eq(valid_data)
|
|
469
|
+
end
|
|
470
|
+
end
|
|
471
|
+
|
|
472
|
+
context 'without disks' do
|
|
473
|
+
before :example do
|
|
474
|
+
data['disks'] = nil
|
|
475
|
+
valid_data['disks'] = nil
|
|
476
|
+
valid_data['disk_size'] = 'NULL'
|
|
477
|
+
end
|
|
478
|
+
|
|
479
|
+
it 'replaces disk size with "NULL"' do
|
|
480
|
+
expect(subject.validate_data(data)).to eq(valid_data)
|
|
481
|
+
end
|
|
482
|
+
end
|
|
483
|
+
|
|
484
|
+
context 'with empty disks' do
|
|
485
|
+
before :example do
|
|
486
|
+
data['disks'] = []
|
|
487
|
+
valid_data['disks'] = []
|
|
488
|
+
valid_data['disk_size'] = 0
|
|
489
|
+
end
|
|
490
|
+
|
|
491
|
+
it 'replaces disk size with 0' do
|
|
492
|
+
expect(subject.validate_data(data)).to eq(valid_data)
|
|
493
|
+
end
|
|
494
|
+
end
|
|
495
|
+
end
|
|
496
|
+
end
|
|
497
|
+
end
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module DataValidators
|
|
4
|
+
describe DataCompute do
|
|
5
|
+
subject { data_compute }
|
|
6
|
+
|
|
7
|
+
let(:data_compute) do
|
|
8
|
+
data_compute = Object.new
|
|
9
|
+
data_compute.extend(Errors)
|
|
10
|
+
data_compute.extend(InputValidator)
|
|
11
|
+
data_compute.extend(DataValidatorHelper)
|
|
12
|
+
data_compute.extend(DataCompute)
|
|
13
|
+
|
|
14
|
+
data_compute
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
let(:log) { double('log') }
|
|
18
|
+
|
|
19
|
+
before :example do
|
|
20
|
+
allow(subject).to receive(:log).and_return(log)
|
|
21
|
+
allow(log).to receive(:warn)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
describe '.sum_disk_size' do
|
|
25
|
+
let(:disks) do
|
|
26
|
+
disks = []
|
|
27
|
+
disk = {'size' => '10240'}
|
|
28
|
+
disks << disk
|
|
29
|
+
disk = {'size' => '42368'}
|
|
30
|
+
disks << disk
|
|
31
|
+
|
|
32
|
+
disks
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
let(:vm_id) { 42 }
|
|
36
|
+
|
|
37
|
+
context 'vm without disks' do
|
|
38
|
+
it 'returns nil' do
|
|
39
|
+
expect(subject.sum_disk_size(nil, vm_id)).to be_nil
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
context 'vm empty disks' do
|
|
44
|
+
it 'returns 0' do
|
|
45
|
+
expect(subject.sum_disk_size([], vm_id)).to eq(0)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
context 'vm with disk without size' do
|
|
50
|
+
before :example do
|
|
51
|
+
disks[0] = {}
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it 'returns nil' do
|
|
55
|
+
expect(subject.sum_disk_size(disks, vm_id)).to be_nil
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
context 'vm with disk with invalid size' do
|
|
60
|
+
before :example do
|
|
61
|
+
disks[0] = {'size' => 'not_a_number'}
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it 'returns nil' do
|
|
65
|
+
expect(subject.sum_disk_size(disks, vm_id)).to be_nil
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
context 'vm with single disk and valid size' do
|
|
70
|
+
it 'return correct disk size' do
|
|
71
|
+
expect(subject.sum_disk_size(disks[1..1], vm_id)).to eq(42368)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
context 'vm with multiple disks and valid size' do
|
|
76
|
+
it 'return correct disk size' do
|
|
77
|
+
expect(subject.sum_disk_size(disks, vm_id)).to eq(52608)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
describe '.sum_rstime' do
|
|
83
|
+
|
|
84
|
+
let(:history) do
|
|
85
|
+
history = []
|
|
86
|
+
rec = {}
|
|
87
|
+
rec['start_time'] = '1383741169'
|
|
88
|
+
rec['end_time'] = '1383741259'
|
|
89
|
+
rec['rstart_time'] = '1383741278'
|
|
90
|
+
rec['rend_time'] = '1383741367'
|
|
91
|
+
rec['seq'] = '0'
|
|
92
|
+
rec['hostname'] = 'supermachine1.somewhere.com'
|
|
93
|
+
history << rec
|
|
94
|
+
rec = {}
|
|
95
|
+
rec['start_time'] = '1383741589'
|
|
96
|
+
rec['end_time'] = '1383742270'
|
|
97
|
+
rec['rstart_time'] = '1383741674'
|
|
98
|
+
rec['rend_time'] = '1383742270'
|
|
99
|
+
rec['seq'] = '1'
|
|
100
|
+
rec['hostname'] = 'supermachine2.somewhere.com'
|
|
101
|
+
history << rec
|
|
102
|
+
|
|
103
|
+
history
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
let(:vm_id) { 42 }
|
|
107
|
+
let(:completed) { true }
|
|
108
|
+
|
|
109
|
+
context 'vm without history records' do
|
|
110
|
+
it 'returns nil' do
|
|
111
|
+
expect(subject.sum_rstime(nil, completed, vm_id)).to be_nil
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
context 'vm with empty history records' do
|
|
116
|
+
it 'returns 0' do
|
|
117
|
+
expect(subject.sum_rstime([], completed, vm_id)).to eq(0)
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
context 'vm without rstart_time' do
|
|
122
|
+
before :example do
|
|
123
|
+
history[0]['rstart_time'] = nil
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
it 'skips invalid history record and count the rest' do
|
|
127
|
+
expect(subject.sum_rstime(history, completed, vm_id)).to eq(596)
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
context 'vm with rstart_time that is 0' do
|
|
132
|
+
before :example do
|
|
133
|
+
history[0]['rstart_time'] = '0'
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
it 'skips invalid history record and count the rest' do
|
|
137
|
+
expect(subject.sum_rstime(history, completed, vm_id)).to eq(596)
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
context 'vm without rend_time' do
|
|
142
|
+
before :example do
|
|
143
|
+
history[0]['rend_time'] = nil
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
it 'skips invalid history record and count the rest' do
|
|
147
|
+
expect(subject.sum_rstime(history, completed, vm_id)).to eq(596)
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
context 'vm with rend_time that is 0' do
|
|
152
|
+
before :example do
|
|
153
|
+
history[0]['rend_time'] = '0'
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
context 'and running' do
|
|
157
|
+
before :example do
|
|
158
|
+
allow(Time).to receive(:now) { 1383741716 }
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
let(:completed) { false }
|
|
162
|
+
|
|
163
|
+
it 'returns difference between current time and start of the virtual machine and count the rest' do
|
|
164
|
+
expect(subject.sum_rstime(history, completed, vm_id)).to eq(1034)
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
context 'and stopped' do
|
|
169
|
+
it 'fails with ValidationError' do
|
|
170
|
+
expect { subject.sum_rstime(history, completed, vm_id) }.to raise_error(Errors::ValidationError)
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
context 'vm with rstart_time bigger than rend_time' do
|
|
176
|
+
before :example do
|
|
177
|
+
history[0]['rstart_time'] = '1383741259'
|
|
178
|
+
history[0]['rend_time'] = '1383741169'
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
it 'fails with ValidationError' do
|
|
182
|
+
expect { subject.sum_rstime(history, completed, vm_id) }.to raise_error(Errors::ValidationError)
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
context 'with all data valid' do
|
|
187
|
+
it 'count the correct value' do
|
|
188
|
+
expect(subject.sum_rstime(history, completed, vm_id)).to eq(685)
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
end
|