oneacct-export 0.2.6 → 0.2.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/one_worker.rb +7 -7
- data/lib/one_writer.rb +10 -5
- data/lib/oneacct_exporter.rb +1 -3
- data/lib/oneacct_exporter/version.rb +1 -1
- data/mock/one_worker_RETIME_0_RUNNING.xml +115 -0
- data/mock/{one_worker_RETIME_0.xml → one_worker_RETIME_0_STOPPED.xml} +0 -0
- data/spec/one_worker_spec.rb +11 -3
- data/spec/one_writer_spec.rb +21 -5
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 841473513aa37713ab102ac8b54d85d05fd52b75
|
4
|
+
data.tar.gz: c3195af5db1345b1471fb28e90909e01200525fb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d09c93b909f2c534a62c3c58d8cc5d70a4d82d9ceba4725b8a983d5d584bf15a3680fcdf63631c615c25e68145ae3c6da66eab46e890b3776857f291e883cda4
|
7
|
+
data.tar.gz: 92039510265e1bd5decbd534e79e67c324ce069faedad79e9d6fbd2e466f1107aa01d63df970f2bc9fa3954a146d14e72b8fabdedd9a001af693f4af6ccd1640
|
data/lib/one_worker.rb
CHANGED
@@ -172,7 +172,7 @@ class OneWorker
|
|
172
172
|
rstime = 0
|
173
173
|
vm.each 'HISTORY_RECORDS/HISTORY' do |h|
|
174
174
|
next unless h['RSTIME'] && h['RETIME'] && h['RSTIME'] != '0'
|
175
|
-
if h['RETIME'] == '0'
|
175
|
+
if h['RETIME'] == '0' && STATES[vm['STATE'].to_i] != 'completed'
|
176
176
|
rstime += Time.now.to_i - h['RSTIME'].to_i
|
177
177
|
next
|
178
178
|
end
|
@@ -213,8 +213,8 @@ class OneWorker
|
|
213
213
|
# Sidekiq specific method, specifies the purpose of the worker
|
214
214
|
#
|
215
215
|
# @param [String] vms IDs of virtual machines to process in form of numbers separated by '|' (easier for cooperation with redis)
|
216
|
-
# @param [String]
|
217
|
-
def perform(vms,
|
216
|
+
# @param [String] file_number number of the output file
|
217
|
+
def perform(vms, file_number)
|
218
218
|
OneacctExporter::Log.setup_log_level(logger)
|
219
219
|
|
220
220
|
vms = vms.split('|')
|
@@ -237,16 +237,16 @@ class OneWorker
|
|
237
237
|
data << vm_data
|
238
238
|
end
|
239
239
|
|
240
|
-
write_data(data,
|
240
|
+
write_data(data, file_number)
|
241
241
|
end
|
242
242
|
|
243
243
|
# Write processed data into output directory
|
244
|
-
def write_data(data,
|
244
|
+
def write_data(data, file_number)
|
245
245
|
logger.debug('Creating writer...')
|
246
|
-
ow = OneWriter.new(data,
|
246
|
+
ow = OneWriter.new(data, file_number, logger)
|
247
247
|
ow.write
|
248
248
|
rescue => e
|
249
|
-
msg = "Cannot write result
|
249
|
+
msg = "Cannot write result: #{e.message}"
|
250
250
|
logger.error(msg)
|
251
251
|
raise msg
|
252
252
|
end
|
data/lib/one_writer.rb
CHANGED
@@ -7,21 +7,26 @@ require 'logger'
|
|
7
7
|
# Class responsible for writing data into files in specific format
|
8
8
|
#
|
9
9
|
# @attr_reader [Hash] data vm data
|
10
|
-
# @attr_reader [String] output path to the output
|
10
|
+
# @attr_reader [String] output path to the output file
|
11
11
|
# @attr_reader [any logger] logger
|
12
12
|
class OneWriter
|
13
|
+
APEL_FILENAME_FORMAT = '%014d'
|
13
14
|
|
14
15
|
attr_reader :data, :output, :log
|
15
16
|
|
16
|
-
def initialize(data,
|
17
|
-
fail ArgumentError, 'Data and
|
17
|
+
def initialize(data, file_number, log = Logger.new(STDOUT))
|
18
|
+
fail ArgumentError, 'Data and file number cannot be nil' if data.nil? || file_number.nil?
|
18
19
|
|
19
|
-
|
20
|
+
output_type = Settings.output['output_type']
|
21
|
+
@template = OneWriter.template_filename(output_type) if Settings['output']
|
20
22
|
fail ArgumentError, "No such file: #{@template}." unless File.exist?(@template)
|
21
23
|
|
22
24
|
@data = data
|
23
|
-
@output = output
|
24
25
|
@log = log
|
26
|
+
|
27
|
+
filename = file_number.to_s
|
28
|
+
filename = APEL_FILENAME_FORMAT % file_number if output_type == 'apel-0.2'
|
29
|
+
@output = "#{Settings.output['output_dir']}/#{filename}"
|
25
30
|
end
|
26
31
|
|
27
32
|
# Write data to file in output directory
|
data/lib/oneacct_exporter.rb
CHANGED
@@ -13,7 +13,6 @@ require 'sidekiq/api'
|
|
13
13
|
# @attr_reader [Integer] timeout timeout for blocking mode
|
14
14
|
# @attr_reader [TrueClass, FalseClass] compatibility says whether to run export in compatibility mode or not
|
15
15
|
class OneacctExporter
|
16
|
-
CONVERT_FORMAT = '%014d'
|
17
16
|
|
18
17
|
attr_reader :log, :range, :groups, :blocking, :timeout, :compatibility
|
19
18
|
|
@@ -39,11 +38,10 @@ class OneacctExporter
|
|
39
38
|
vms = []
|
40
39
|
#load records of virtual machines in batches
|
41
40
|
while vms = oda.vms(batch_number, @range, @groups)
|
42
|
-
output_file = CONVERT_FORMAT % new_file_number
|
43
41
|
@log.info("Starting worker with batch number: #{batch_number}.")
|
44
42
|
unless vms.empty?
|
45
43
|
#add a new job for every batch to the Sidekiq's queue
|
46
|
-
OneWorker.perform_async(vms.join('|'),
|
44
|
+
OneWorker.perform_async(vms.join('|'), new_file_number)
|
47
45
|
new_file_number += 1
|
48
46
|
end
|
49
47
|
batch_number += 1
|
@@ -0,0 +1,115 @@
|
|
1
|
+
<VM>
|
2
|
+
<ID>36551</ID>
|
3
|
+
<UID>120</UID>
|
4
|
+
<GID>0</GID>
|
5
|
+
<UNAME>uname</UNAME>
|
6
|
+
<GNAME>gname</GNAME>
|
7
|
+
<NAME>one-36551</NAME>
|
8
|
+
<PERMISSIONS>
|
9
|
+
<OWNER_U>1</OWNER_U>
|
10
|
+
<OWNER_M>1</OWNER_M>
|
11
|
+
<OWNER_A>0</OWNER_A>
|
12
|
+
<GROUP_U>0</GROUP_U>
|
13
|
+
<GROUP_M>0</GROUP_M>
|
14
|
+
<GROUP_A>0</GROUP_A>
|
15
|
+
<OTHER_U>0</OTHER_U>
|
16
|
+
<OTHER_M>0</OTHER_M>
|
17
|
+
<OTHER_A>0</OTHER_A>
|
18
|
+
</PERMISSIONS>
|
19
|
+
<LAST_POLL>1383741679</LAST_POLL>
|
20
|
+
<STATE>4</STATE>
|
21
|
+
<LCM_STATE>0</LCM_STATE>
|
22
|
+
<RESCHED>0</RESCHED>
|
23
|
+
<STIME>1383741160</STIME>
|
24
|
+
<ETIME>1383742270</ETIME>
|
25
|
+
<DEPLOY_ID>one-36551</DEPLOY_ID>
|
26
|
+
<MEMORY>1736960</MEMORY>
|
27
|
+
<CPU>0</CPU>
|
28
|
+
<NET_TX>0</NET_TX>
|
29
|
+
<NET_RX>0</NET_RX>
|
30
|
+
<TEMPLATE>
|
31
|
+
<CONTEXT>
|
32
|
+
<DISK_ID><![CDATA[1]]></DISK_ID>
|
33
|
+
<FILES><![CDATA[https://somewhere.com/init.sh]]></FILES>
|
34
|
+
<HOSTNAME><![CDATA[DebianVM]]></HOSTNAME>
|
35
|
+
<PUBLIC_IP><![CDATA[123.123.5.5]]></PUBLIC_IP>
|
36
|
+
<SSH_KEY><![CDATA[ssh-rsa AAAAB3NzaC1yc2EAAAADAQABasdgsdfhfgjhxhcHPNFthrHT5/+9lfrQCorJy5YjMJEGBC22dfgjghkDjSDFgjdhgKd54645dfJKd39LdlyzlEaCnjGUeD4C6tZdAISLSDfghSDFgSJ54sSFGJ5RTHARJIRJcX8QRVH46Zq02AeTgrty567ss34tqaa8Pt user@machine1.somewhere.com]]></SSH_KEY>
|
37
|
+
<TARGET><![CDATA[xvdb]]></TARGET>
|
38
|
+
</CONTEXT>
|
39
|
+
<CPU><![CDATA[0.5]]></CPU>
|
40
|
+
<DISK>
|
41
|
+
<BUS><![CDATA[ide]]></BUS>
|
42
|
+
<CLONE><![CDATA[YES]]></CLONE>
|
43
|
+
<CLUSTER_ID><![CDATA[100]]></CLUSTER_ID>
|
44
|
+
<DATASTORE><![CDATA[default]]></DATASTORE>
|
45
|
+
<DATASTORE_ID><![CDATA[1]]></DATASTORE_ID>
|
46
|
+
<DEV_PREFIX><![CDATA[xvd]]></DEV_PREFIX>
|
47
|
+
<DISK_ID><![CDATA[0]]></DISK_ID>
|
48
|
+
<DRIVER><![CDATA[tap2:tapdisk:aio:]]></DRIVER>
|
49
|
+
<IMAGE><![CDATA[debian6]]></IMAGE>
|
50
|
+
<IMAGE_ID><![CDATA[31]]></IMAGE_ID>
|
51
|
+
<READONLY><![CDATA[NO]]></READONLY>
|
52
|
+
<SAVE><![CDATA[NO]]></SAVE>
|
53
|
+
<SOURCE><![CDATA[/opt/opennebula/var/datastores/1/bc8db254875412f417ac745b7d47820]]></SOURCE>
|
54
|
+
<TARGET><![CDATA[xvda]]></TARGET>
|
55
|
+
<TM_MAD><![CDATA[ssh]]></TM_MAD>
|
56
|
+
<TYPE><![CDATA[FILE]]></TYPE>
|
57
|
+
</DISK>
|
58
|
+
<ERROR>
|
59
|
+
<MESSAGE><![CDATA[Error executing image transfer script: Path https://somewhere.com/init.sh is not allowed!]]></MESSAGE>
|
60
|
+
<TIMESTAMP><![CDATA[Wed Nov 6 13:34:19 2013]]></TIMESTAMP>
|
61
|
+
</ERROR>
|
62
|
+
<FEATURES>
|
63
|
+
<ACPI><![CDATA[no]]></ACPI>
|
64
|
+
</FEATURES>
|
65
|
+
<MEMORY>1736960</MEMORY>
|
66
|
+
<NAME><![CDATA[one-36551]]></NAME>
|
67
|
+
<NIC>
|
68
|
+
<BRIDGE><![CDATA[xenbr0]]></BRIDGE>
|
69
|
+
<CLUSTER_ID><![CDATA[100]]></CLUSTER_ID>
|
70
|
+
<IP><![CDATA[123.123.5.5]]></IP>
|
71
|
+
<MAC><![CDATA[01:23:45:67:89:ab]]></MAC>
|
72
|
+
<NETWORK><![CDATA[public]]></NETWORK>
|
73
|
+
<NETWORK_ID><![CDATA[4]]></NETWORK_ID>
|
74
|
+
<VLAN><![CDATA[NO]]></VLAN>
|
75
|
+
<WHITE_PORTS_TCP><![CDATA[22]]></WHITE_PORTS_TCP>
|
76
|
+
<WHITE_PORTS_UDP><![CDATA[67,68]]></WHITE_PORTS_UDP>
|
77
|
+
</NIC>
|
78
|
+
<OS>
|
79
|
+
<BOOTLOADER><![CDATA[pygrub]]></BOOTLOADER>
|
80
|
+
</OS>
|
81
|
+
<RAW>
|
82
|
+
<TYPE><![CDATA[xen]]></TYPE>
|
83
|
+
</RAW>
|
84
|
+
<TEMPLATE_ID><![CDATA[66]]></TEMPLATE_ID>
|
85
|
+
<VCPU><![CDATA[1]]></VCPU>
|
86
|
+
<VMID><![CDATA[36551]]></VMID>
|
87
|
+
</TEMPLATE>
|
88
|
+
<USER_TEMPLATE>
|
89
|
+
<SCHED_REQUIREMENTS><![CDATA[CLUSTER_ID = 100]]></SCHED_REQUIREMENTS>
|
90
|
+
</USER_TEMPLATE>
|
91
|
+
<HISTORY_RECORDS>
|
92
|
+
<HISTORY>
|
93
|
+
<OID>36551</OID>
|
94
|
+
<SEQ>1</SEQ>
|
95
|
+
<HOSTNAME>supermachine1.somewhere.com</HOSTNAME>
|
96
|
+
<HID>11</HID>
|
97
|
+
<CID>100</CID>
|
98
|
+
<STIME>1383741589</STIME>
|
99
|
+
<ETIME>1383742270</ETIME>
|
100
|
+
<VMMMAD>vmm_xen</VMMMAD>
|
101
|
+
<VNMMAD>fw</VNMMAD>
|
102
|
+
<TMMAD>ssh</TMMAD>
|
103
|
+
<DS_LOCATION>/opt/opennebula/var/datastores</DS_LOCATION>
|
104
|
+
<DS_ID>0</DS_ID>
|
105
|
+
<PSTIME>1383741589</PSTIME>
|
106
|
+
<PETIME>1383741674</PETIME>
|
107
|
+
<RSTIME>1383741674</RSTIME>
|
108
|
+
<RETIME>0</RETIME>
|
109
|
+
<ESTIME>1383742270</ESTIME>
|
110
|
+
<EETIME>1383742270</EETIME>
|
111
|
+
<REASON>0</REASON>
|
112
|
+
<ACTION>0</ACTION>
|
113
|
+
</HISTORY>
|
114
|
+
</HISTORY_RECORDS>
|
115
|
+
</VM>
|
File without changes
|
data/spec/one_worker_spec.rb
CHANGED
@@ -680,18 +680,26 @@ describe OneWorker do
|
|
680
680
|
end
|
681
681
|
end
|
682
682
|
|
683
|
-
context 'vm with RETIME that is 0' do
|
683
|
+
context 'vm with RETIME that is 0 and still running' do
|
684
684
|
before :example do
|
685
|
-
allow(Time).to receive(:now) { 1383741716 }
|
685
|
+
allow(Time).to receive(:now) { Time.at(1383741716) }
|
686
686
|
end
|
687
687
|
|
688
|
-
let(:filename) { '
|
688
|
+
let(:filename) { 'one_worker_RETIME_0_RUNNING.xml' }
|
689
689
|
|
690
690
|
it 'returns difference between current time and start of the virtual machine' do
|
691
691
|
expect(subject.sum_rstime(vm)).to eq(42)
|
692
692
|
end
|
693
693
|
end
|
694
694
|
|
695
|
+
context 'vm with RETIME that is 0 and is stopped' do
|
696
|
+
let(:filename) { 'one_worker_RETIME_0_STOPPED.xml' }
|
697
|
+
|
698
|
+
it 'returns nil' do
|
699
|
+
expect(subject.sum_rstime(vm)).to be_nil
|
700
|
+
end
|
701
|
+
end
|
702
|
+
|
695
703
|
context 'vm with RSTIME bigger than RETIME' do
|
696
704
|
let(:filename) { 'one_worker_RSTIME_>_RETIME.xml' }
|
697
705
|
|
data/spec/one_writer_spec.rb
CHANGED
@@ -4,12 +4,13 @@ describe OneWriter do
|
|
4
4
|
subject { one_writer }
|
5
5
|
before :example do
|
6
6
|
Settings.output['output_type'] = 'one_writer_test_output_type'
|
7
|
+
Settings.output['output_dir'] = 'one_writer_test_output_dir'
|
7
8
|
end
|
8
9
|
|
9
10
|
let(:data) { { 'aaa' => 111, 'bbb' => 222 } }
|
10
11
|
let(:testfile) { "#{GEM_DIR}/mock/one_writer_testfile" }
|
11
12
|
let(:dev_null) { '/dev/null' }
|
12
|
-
let(:
|
13
|
+
let(:file_number) { 42 }
|
13
14
|
|
14
15
|
describe '#new' do
|
15
16
|
context 'with correct arguments' do
|
@@ -18,7 +19,7 @@ describe OneWriter do
|
|
18
19
|
end
|
19
20
|
|
20
21
|
let(:one_writer) do
|
21
|
-
OneWriter.new(data,
|
22
|
+
OneWriter.new(data, file_number, dev_null)
|
22
23
|
end
|
23
24
|
|
24
25
|
it 'takes three parameters and returns OneWriter object' do
|
@@ -27,11 +28,26 @@ describe OneWriter do
|
|
27
28
|
|
28
29
|
it 'correctly assigns three parameters' do
|
29
30
|
expect(subject.data).to eq(data)
|
30
|
-
expect(subject.output).to eq(output)
|
31
|
+
expect(subject.output).to eq("#{Settings.output['output_dir']}/#{file_number}")
|
31
32
|
expect(subject.log).to eq(dev_null)
|
32
33
|
end
|
33
34
|
end
|
34
35
|
|
36
|
+
context 'with apel output format' do
|
37
|
+
before :example do
|
38
|
+
Settings.output['output_type'] = 'apel-0.2'
|
39
|
+
allow(OneWriter).to receive(:template_filename) { testfile }
|
40
|
+
end
|
41
|
+
|
42
|
+
let(:one_writer) do
|
43
|
+
OneWriter.new(data, file_number, dev_null)
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'uses apel specific filename format' do
|
47
|
+
expect(subject.output).to eq("#{Settings.output['output_dir']}/000000000000#{file_number}")
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
35
51
|
context 'with incorrect arguments' do
|
36
52
|
before :example do
|
37
53
|
allow(OneWriter).to receive(:template_filename) { testfile }
|
@@ -128,7 +144,7 @@ describe OneWriter do
|
|
128
144
|
end
|
129
145
|
|
130
146
|
let(:one_writer) do
|
131
|
-
OneWriter.new(data,
|
147
|
+
OneWriter.new(data, file_number, Logger.new(dev_null))
|
132
148
|
end
|
133
149
|
let(:tmp) do
|
134
150
|
tmp = double('tmp')
|
@@ -138,7 +154,7 @@ describe OneWriter do
|
|
138
154
|
|
139
155
|
it 'writes result version of a template into output file' do
|
140
156
|
expect(subject).to receive(:write_to_tmp).with(tmp, data)
|
141
|
-
expect(subject).to receive(:copy_to_output).with("#{GEM_DIR}/mock/one_writer_tmp", output)
|
157
|
+
expect(subject).to receive(:copy_to_output).with("#{GEM_DIR}/mock/one_writer_tmp", "#{Settings.output['output_dir']}/#{file_number}")
|
142
158
|
expect(tmp).to receive(:close)
|
143
159
|
subject.write
|
144
160
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oneacct-export
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michal Kimle
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-04-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -198,7 +198,8 @@ files:
|
|
198
198
|
- mock/one_worker_NET_TX_0.xml
|
199
199
|
- mock/one_worker_NET_TX_missing.xml
|
200
200
|
- mock/one_worker_NET_TX_nan.xml
|
201
|
-
- mock/
|
201
|
+
- mock/one_worker_RETIME_0_RUNNING.xml
|
202
|
+
- mock/one_worker_RETIME_0_STOPPED.xml
|
202
203
|
- mock/one_worker_RETIME_missing.xml
|
203
204
|
- mock/one_worker_RSTIME_0.xml
|
204
205
|
- mock/one_worker_RSTIME_>_RETIME.xml
|