vpsb_client 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +29 -0
  6. data/Rakefile +2 -0
  7. data/bin/close_trial.rb +20 -0
  8. data/bin/create_trial.rb +13 -0
  9. data/bin/get_current_trial.rb +8 -0
  10. data/bin/get_item_ids.rb +9 -0
  11. data/bin/get_trial_last_metric.rb +8 -0
  12. data/bin/signed_in.rb +7 -0
  13. data/bin/sync_metrics.rb +19 -0
  14. data/bin/test_timing_interval.rb +18 -0
  15. data/bin/upload_metric.rb +37 -0
  16. data/doc/design.rb +109 -0
  17. data/lib/vpsb_client/api/close_trial_request.rb +23 -0
  18. data/lib/vpsb_client/api/create_trial_request.rb +38 -0
  19. data/lib/vpsb_client/api/get_current_trial_request.rb +30 -0
  20. data/lib/vpsb_client/api/get_item_id_request.rb +33 -0
  21. data/lib/vpsb_client/api/get_trial_last_metric_request.rb +25 -0
  22. data/lib/vpsb_client/api/post_metric_request.rb +28 -0
  23. data/lib/vpsb_client/api/request.rb +57 -0
  24. data/lib/vpsb_client/api/response.rb +30 -0
  25. data/lib/vpsb_client/builders/system_info_parser.rb +127 -0
  26. data/lib/vpsb_client/builders/trial.rb +54 -0
  27. data/lib/vpsb_client/client/upload_metrics.rb +39 -0
  28. data/lib/vpsb_client/config.rb +18 -0
  29. data/lib/vpsb_client/curl_wrapper.rb +41 -0
  30. data/lib/vpsb_client/datafiles/formatted_sar_log_parser.rb +38 -0
  31. data/lib/vpsb_client/datafiles/logfile_decompressor.rb +48 -0
  32. data/lib/vpsb_client/datafiles/pxx_aggregator.rb +94 -0
  33. data/lib/vpsb_client/datafiles/sar_manager.rb +71 -0
  34. data/lib/vpsb_client/datafiles/timing_log_parser.rb +32 -0
  35. data/lib/vpsb_client/http_client.rb +60 -0
  36. data/lib/vpsb_client/manager.rb +149 -0
  37. data/lib/vpsb_client/metrics/interval_builder.rb +85 -0
  38. data/lib/vpsb_client/metrics/interval_config.rb +45 -0
  39. data/lib/vpsb_client/metrics/manager.rb +34 -0
  40. data/lib/vpsb_client/metrics/uploader.rb +16 -0
  41. data/lib/vpsb_client/version.rb +3 -0
  42. data/lib/vpsb_client.rb +33 -0
  43. data/spec/lib/client/upload_metrics_spec.rb +23 -0
  44. data/spec/lib/config_spec.rb +26 -0
  45. data/spec/lib/logfile_decompressor_spec.rb +74 -0
  46. data/spec/lib/metrics/interval_builder_spec.rb +88 -0
  47. data/spec/lib/metrics/interval_config_spec.rb +99 -0
  48. data/spec/lib/metrics/manager_spec.rb +60 -0
  49. data/spec/lib/metrics/uploader_spec.rb +45 -0
  50. data/spec/lib/pxx_spec.rb +120 -0
  51. data/spec/lib/request_spec.rb +186 -0
  52. data/spec/lib/sar_manager_spec.rb +57 -0
  53. data/spec/lib/system_info_parser_spec.rb +51 -0
  54. data/spec/spec_helper.rb +9 -0
  55. data/spec/support/sarfiles/formatted/formatted_sa20 +147 -0
  56. data/spec/support/sarfiles/formatted/formatted_sa21 +85 -0
  57. data/spec/support/sarfiles/orig/sa18 +0 -0
  58. data/spec/support/sarfiles/orig/sa19 +0 -0
  59. data/spec/support/sarfiles/orig/sa20 +0 -0
  60. data/spec/support/sarfiles/orig/sa21 +0 -0
  61. data/spec/support/timingfiles/other.log.2.gz +0 -0
  62. data/spec/support/timingfiles/timings.log +11 -0
  63. data/spec/support/timingfiles/timings.log.1 +11 -0
  64. data/spec/support/timingfiles/timings.log.2.gz +0 -0
  65. data/spec/support/timingfiles/timings.log.3.gz +0 -0
  66. data/spec/support/vpsb.yml +12 -0
  67. data/vpsb_client.gemspec +29 -0
  68. metadata +241 -0
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+
3
+ module VpsbClient
4
+ module Metrics
5
+ describe Manager do
6
+ before :each do
7
+ @min_start_time = Time.new(2014, 11, 15, 20, 0, 0)
8
+ @length = 3600
9
+ @builder = double('builder')
10
+ @uploader = double('uploader')
11
+ @interval_config = double('config')
12
+ allow(@interval_config).to receive(:length).and_return(@length)
13
+ allow(@interval_config).to receive(:min_start_time).and_return(@min_start_time)
14
+ allow(@interval_config).to receive(:min_end_time).and_return(@min_start_time + @length)
15
+
16
+ @manager = Manager.new(@builder, @uploader, @interval_config)
17
+ end
18
+
19
+ describe :run do
20
+ it 'uploads each builder metric' do
21
+ metric = double('metric')
22
+ allow(metric).to receive(:[]).with(:started_at).and_return(@min_start_time)
23
+ expect(@builder).to receive(:each).and_yield(metric)
24
+ expect(@uploader).to receive(:upload).with(metric).once
25
+
26
+ @manager.run
27
+ end
28
+
29
+ it 'stops at the first metric with start_time lower than min_start_time' do
30
+ metric1 = double('metric1')
31
+ allow(metric1).to receive(:[]).with(:started_at).and_return(@min_start_time)
32
+
33
+ metric2 = double('metric2')
34
+ allow(metric2).to receive(:[]).with(:started_at).and_return(@min_start_time - 2)
35
+ expect(@builder).to receive(:each).and_yield(metric1).and_yield(metric2)
36
+ expect(@uploader).to receive(:upload).with(metric1).once
37
+ expect(@uploader).to receive(:upload).with(metric2).never
38
+
39
+ @manager.run
40
+ end
41
+ end
42
+
43
+ describe :created_metric_ids do
44
+ it 'contains the ids of the new metrics' do
45
+ metric1 = double('metric1')
46
+ allow(metric1).to receive(:[]).with(:started_at).and_return(@min_start_time + 1)
47
+
48
+ metric2 = double('metric2')
49
+ allow(metric2).to receive(:[]).with(:started_at).and_return(@min_start_time)
50
+ allow(@builder).to receive(:each).and_yield(metric1).and_yield(metric2)
51
+ allow(@uploader).to receive(:upload).with(metric1).and_return(100)
52
+ allow(@uploader).to receive(:upload).with(metric2).and_return(101)
53
+
54
+ @manager.run
55
+ expect(@manager.created_metric_ids).to eq([100, 101])
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+
3
+ module VpsbClient
4
+ module Metrics
5
+ describe Uploader do
6
+ before :each do
7
+ VpsbClient.logger = Logger.new('/dev/null')
8
+ @curl = double('curl')
9
+ @client = HttpClient.new(@curl, 'http', 'localhost')
10
+ @trial_id = 1
11
+ @start = Time.new(2014, 10, 15, 20, 0, 0)
12
+ @len = 3600
13
+ end
14
+
15
+ describe 'upload' do
16
+ before :each do
17
+ @metric = {started_at: @start + @len, duration_seconds: @len, trial_id: @trial_id}
18
+ @metric_params = { metric: @metric }
19
+
20
+ @curl_response = double('response')
21
+ allow(@curl_response).to receive(:response_code).and_return(200)
22
+ allow(@curl_response).to receive(:body_str).and_return('{"id": 8}')
23
+ allow(@curl_response).to receive(:content_type).and_return("application/json")
24
+ end
25
+
26
+ it 'posts once for each interval' do
27
+ expect(@curl).to receive(:post).with('http://localhost/api/metrics.json',
28
+ @metric_params.to_json,
29
+ "application/json").once.and_return(@curl_response)
30
+
31
+ uploader = Uploader.new(@client, @trial_id)
32
+ uploader.upload(@metric)
33
+ end
34
+
35
+ it 'returns the new metric id' do
36
+ allow(@curl).to receive(:post).with('http://localhost/api/metrics.json',
37
+ @metric_params.to_json,
38
+ "application/json").once.and_return(@curl_response)
39
+ uploader = Uploader.new(@client, @trial_id)
40
+ expect(uploader.upload(@metric)).to eq(8)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,120 @@
1
+ require 'spec_helper'
2
+ require_relative File.expand_path("../../../lib/vpsb_client/datafiles/pxx_aggregator", __FILE__)
3
+
4
+ describe PxxBuckets do
5
+ before :each do
6
+ @ranges = {
7
+ 10 => 5,
8
+ 20 => 10
9
+ }
10
+ @pxxbuckets = PxxBuckets.new({ :ranges => @ranges, :pxx_keys => [ 75, 95, 99 ] })
11
+ end
12
+
13
+ it 'initializes 4 buckets' do
14
+ expect(@pxxbuckets.buckets.size).to eq(4)
15
+ expect(@pxxbuckets.ary[0]).to eq(0)
16
+ expect(@pxxbuckets.ary[1]).to eq(5)
17
+ expect(@pxxbuckets.ary[2]).to eq(10)
18
+ expect(@pxxbuckets.ary[3]).to eq(20)
19
+ end
20
+
21
+ it 'initializes bucket values to 0' do
22
+ expect(@pxxbuckets.buckets.values).to eq([0, 0, 0, 0])
23
+ end
24
+
25
+ it 'sets bucket keys to ranges start' do
26
+ expect(@pxxbuckets.buckets.keys).to eq([0, 5, 10, 20])
27
+ end
28
+
29
+ describe :find_bucket_key do
30
+ it 'returns bucket indexes' do
31
+ expect(@pxxbuckets.find_bucket_key(0)).to eq(0)
32
+ expect(@pxxbuckets.find_bucket_key(5)).to eq(1)
33
+ expect(@pxxbuckets.find_bucket_key(15)).to eq(2)
34
+ expect(@pxxbuckets.find_bucket_key(1000)).to eq(3)
35
+ end
36
+ end
37
+
38
+ it 'places 0 in first bucket' do
39
+ @pxxbuckets.increment(0)
40
+ expect(@pxxbuckets.buckets[0]).to eq(1)
41
+ expect(@pxxbuckets.buckets[5]).to eq(0)
42
+ expect(@pxxbuckets.buckets[10]).to eq(0)
43
+ expect(@pxxbuckets.buckets[20]).to eq(0)
44
+ end
45
+
46
+ it 'places 15 in 3rd bucket' do
47
+ @pxxbuckets.increment(15)
48
+ expect(@pxxbuckets.buckets[0]).to eq(0)
49
+ expect(@pxxbuckets.buckets[5]).to eq(0)
50
+ expect(@pxxbuckets.buckets[10]).to eq(1)
51
+ expect(@pxxbuckets.buckets[20]).to eq(0)
52
+ end
53
+
54
+ it 'places 1000 in last bucket' do
55
+ @pxxbuckets.increment(1000)
56
+ expect(@pxxbuckets.buckets[0]).to eq(0)
57
+ expect(@pxxbuckets.buckets[5]).to eq(0)
58
+ expect(@pxxbuckets.buckets[10]).to eq(0)
59
+ expect(@pxxbuckets.buckets[20]).to eq(1)
60
+ end
61
+
62
+ describe :value do
63
+ it 'finds the pXX value for single high item' do
64
+ @pxxbuckets.increment(1000)
65
+ expect(@pxxbuckets.value(0.50)).to eq(20)
66
+ expect(@pxxbuckets.value(0.75)).to eq(20)
67
+ expect(@pxxbuckets.value(0.95)).to eq(20)
68
+ end
69
+
70
+ it 'finds the pXX value for single low item' do
71
+ @pxxbuckets.increment(2)
72
+ expect(@pxxbuckets.value(0.50)).to eq(0)
73
+ expect(@pxxbuckets.value(0.75)).to eq(0)
74
+ expect(@pxxbuckets.value(0.95)).to eq(0)
75
+ end
76
+
77
+ it 'finds the pxx value for low majority' do
78
+ @pxxbuckets.increment(2)
79
+ @pxxbuckets.increment(2)
80
+ @pxxbuckets.increment(10)
81
+ expect(@pxxbuckets.value(0.50)).to eq(0)
82
+ expect(@pxxbuckets.value(0.75)).to eq(10)
83
+ expect(@pxxbuckets.value(0.95)).to eq(10)
84
+ end
85
+
86
+ it 'finds the pxx value for scattered data points' do
87
+ @pxxbuckets.increment(2)
88
+ @pxxbuckets.increment(7)
89
+ @pxxbuckets.increment(12)
90
+ @pxxbuckets.increment(14)
91
+ @pxxbuckets.increment(18)
92
+ @pxxbuckets.increment(25)
93
+ expect(@pxxbuckets.value(0.50)).to eq(10)
94
+ expect(@pxxbuckets.value(0.75)).to eq(10)
95
+ expect(@pxxbuckets.value(0.95)).to eq(20)
96
+ end
97
+ end
98
+
99
+ context :with_floats do
100
+ before :each do
101
+ @ranges = {
102
+ 10 => 0.1,
103
+ 20 => 0.2,
104
+ 40 => 0.5,
105
+ 100 => 1
106
+ }
107
+
108
+ @pxxbuckets = PxxBuckets.new({ :ranges => @ranges, :pxx_keys => [ 75, 95, 99 ] })
109
+ end
110
+
111
+ it 'finds the pxx value for scattered data points' do
112
+ 0.upto(99) do |i|
113
+ @pxxbuckets.increment(i+0.1)
114
+ end
115
+ expect(@pxxbuckets.value(0.95)).to eq(94)
116
+ expect(@pxxbuckets.value(0.99)).to eq(98)
117
+ end
118
+ end
119
+
120
+ end
@@ -0,0 +1,186 @@
1
+ require 'spec_helper'
2
+
3
+ module VpsbClient
4
+ module Api
5
+ describe 'Requests' do
6
+ support_dir = File.join(File.dirname(__FILE__), '..', 'support/')
7
+
8
+ before :each do
9
+ @curl = double('curl')
10
+ @client = HttpClient.new(@curl, 'http', 'localhost')
11
+ end
12
+
13
+ describe GetItemIdRequest do
14
+ it 'url includes item type and name' do
15
+ expect(@curl).to receive(:get).with('http://localhost/api/hosters/by_name/linode.json').once
16
+
17
+ req = GetItemIdRequest.new(@client, 'hosters', 'linode')
18
+ req.run
19
+ end
20
+
21
+ it 'parses the response from the server' do
22
+ curl_response = double('response')
23
+ allow(curl_response).to receive(:response_code).and_return(200)
24
+ allow(curl_response).to receive(:body_str).and_return('[{"id": 25}]')
25
+ allow(curl_response).to receive(:content_type).and_return("application/json")
26
+ allow(@curl).to receive(:get).and_return(curl_response)
27
+ req = GetItemIdRequest.new(@client, 'hosters', 'linode')
28
+ resp = Response.new(req.run)
29
+ expect(GetItemIdRequest.item_id(resp)).to eq(25)
30
+ end
31
+ end
32
+
33
+ describe CreateTrialRequest do
34
+ before :each do
35
+ @config = { 'client_host' => 'test-001' , 'comment' => 'rien a dire' }
36
+ @params = Builders::Trial.new(@config, 1, 1, 1).create_params
37
+ @trial_params = { 'trial' => @params }
38
+ end
39
+
40
+ it 'url id /api/trials' do
41
+ expect(@curl).to receive(:post).with('http://localhost/api/trials.json',
42
+ @trial_params.to_json,
43
+ "application/json").once
44
+
45
+ req = CreateTrialRequest.new(@client, @params)
46
+ req.run
47
+ end
48
+
49
+ it 'parses the response from the server' do
50
+ curl_response = double('response')
51
+ allow(curl_response).to receive(:response_code).and_return(200)
52
+ allow(curl_response).to receive(:body_str).and_return('{"id": 8, "application_id": 1}')
53
+ allow(curl_response).to receive(:content_type).and_return("application/json")
54
+ allow(@curl).to receive(:post).and_return(curl_response)
55
+ req = CreateTrialRequest.new(@client, @params)
56
+ resp = Response.new(req.run)
57
+ expect(CreateTrialRequest.trial_id(resp)).to eq(8)
58
+ end
59
+ end
60
+
61
+ describe GetCurrentTrialRequest do
62
+ before :each do
63
+ @params = { client_hostname: 'test-001' }
64
+ end
65
+
66
+ it 'gets /api/trials/current with ids' do
67
+ expect(@curl).to receive(:get).with('http://localhost/api/trials/current.json?client_hostname=test-001').once
68
+
69
+ req = GetCurrentTrialRequest.new(@client, @params)
70
+ req.run
71
+ end
72
+
73
+ it 'extracts current trial id from response if found' do
74
+ curl_response = double('response')
75
+ allow(curl_response).to receive(:response_code).and_return(200)
76
+ allow(curl_response).to receive(:body_str).and_return('[{"id": 8, "application_id": 1}]')
77
+ allow(curl_response).to receive(:content_type).and_return("application/json")
78
+ allow(@curl).to receive(:get).and_return(curl_response)
79
+ req = GetCurrentTrialRequest.new(@client, @params)
80
+ resp = Response.new(req.run)
81
+ expect(GetCurrentTrialRequest.trial_id(resp)).to eq(8)
82
+ end
83
+
84
+ it 'extracts nil from response if notfound' do
85
+ curl_response = double('response')
86
+ allow(curl_response).to receive(:response_code).and_return(200)
87
+ allow(curl_response).to receive(:body_str).and_return('[]')
88
+ allow(curl_response).to receive(:content_type).and_return("application/json")
89
+ allow(@curl).to receive(:get).and_return(curl_response)
90
+ req = GetCurrentTrialRequest.new(@client, @params)
91
+ resp = Response.new(req.run)
92
+ expect(GetCurrentTrialRequest.trial_id(resp)).to be_nil
93
+ end
94
+ end
95
+
96
+ describe GetTrialLastMetricRequest do
97
+ before :each do
98
+ @params = { trial_id: 1, length: 3600 }
99
+ end
100
+
101
+ it 'gets /api/trials/:id/last_metric with length' do
102
+ expect(@curl).to receive(:get).with('http://localhost/api/trials/1/last_metric.json?length=3600').once
103
+
104
+ req = GetTrialLastMetricRequest.new(@client, @params)
105
+ req.run
106
+ end
107
+
108
+ it 'extracts current trial id from response if found' do
109
+ curl_response = double('response')
110
+ allow(curl_response).to receive(:response_code).and_return(200)
111
+ allow(curl_response).to receive(:body_str).and_return('[{"id":3016,"trial_id":22,"started_at":"2014-07-06T23:00:00.000Z","duration_seconds":3600}]')
112
+ allow(curl_response).to receive(:content_type).and_return("application/json")
113
+ allow(@curl).to receive(:get).and_return(curl_response)
114
+ req = GetTrialLastMetricRequest.new(@client, @params)
115
+ resp = Response.new(req.run)
116
+ expect(GetTrialLastMetricRequest.started_at(resp)).to eq(Time.new(2014,7,6,16,0,0))
117
+ end
118
+
119
+ it 'extracts nil from response if notfound' do
120
+ curl_response = double('response')
121
+ allow(curl_response).to receive(:response_code).and_return(200)
122
+ allow(curl_response).to receive(:body_str).and_return('[]')
123
+ allow(curl_response).to receive(:content_type).and_return("application/json")
124
+ allow(@curl).to receive(:get).and_return(curl_response)
125
+ req = GetTrialLastMetricRequest.new(@client, @params)
126
+ resp = Response.new(req.run)
127
+ expect(GetTrialLastMetricRequest.started_at(resp)).to be_nil
128
+ end
129
+ end
130
+
131
+ describe PostMetricRequest do
132
+ before :each do
133
+ @trial_id = 1
134
+ @metric = { duration_seconds: 3600 }
135
+ @metric_params = { metric: @metric.merge({ 'trial_id' => @trial_id}) }
136
+ end
137
+
138
+ it 'posts /api/metrics with length' do
139
+ expect(@curl).to receive(:post).with('http://localhost/api/metrics.json',
140
+ @metric_params.to_json,
141
+ "application/json").once
142
+
143
+ req = PostMetricRequest.new(@client, @trial_id, @metric)
144
+ req.run
145
+ end
146
+
147
+ it 'parses the response from the server' do
148
+ curl_response = double('response')
149
+ allow(curl_response).to receive(:response_code).and_return(200)
150
+ allow(curl_response).to receive(:body_str).and_return('{"id": 8}')
151
+ allow(curl_response).to receive(:content_type).and_return("application/json")
152
+ allow(@curl).to receive(:post).and_return(curl_response)
153
+ req = PostMetricRequest.new(@client, @trial_id, @metric)
154
+ resp = Response.new(req.run)
155
+ expect(PostMetricRequest.metric_id(resp)).to eq(8)
156
+ end
157
+ end
158
+
159
+ describe CloseTrialRequest do
160
+ before :each do
161
+ @trial_id = 1
162
+ @params = { }
163
+ end
164
+
165
+ it 'posts /api/metrics with length' do
166
+ expect(@curl).to receive(:put).with('http://localhost/api/trials/1/close.json',
167
+ @params.to_json,
168
+ "application/json").once
169
+
170
+ req = CloseTrialRequest.new(@client, @trial_id)
171
+ req.run
172
+ end
173
+
174
+ it 'parses the response from the server' do
175
+ curl_response = double('response')
176
+ allow(curl_response).to receive(:response_code).and_return(200)
177
+ allow(curl_response).to receive(:body_str).and_return('')
178
+ allow(curl_response).to receive(:content_type).and_return("application/json")
179
+ expect(@curl).to receive(:put).and_return(curl_response)
180
+ req = CloseTrialRequest.new(@client, @trial_id)
181
+ resp = Response.new(req.run)
182
+ end
183
+ end
184
+ end
185
+ end
186
+ end
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ module VpsbClient
4
+
5
+ module Datafiles
6
+ data_dir = File.join(File.dirname(__FILE__), '..', 'support/sarfiles')
7
+
8
+ class TestSadf
9
+ SADF = '/usr/bin/sadf'
10
+
11
+ def self.run(src, dest)
12
+ cmd = "touch #{dest}"
13
+ ret = system cmd
14
+ raise VpsbClient::Datafiles::SarManager::SadfError, "\"#{cmd}\" failed" unless ret
15
+ end
16
+ end
17
+
18
+ describe SarManager do
19
+ before :each do
20
+ @orig_dir = "#{data_dir}/orig"
21
+ @target_dir = "#{data_dir}/dest"
22
+ @manager = SarManager.new(@orig_dir, @target_dir, TestSadf)
23
+ allow(Time).to receive(:now).and_return(Time.new(2014,9,21,16,0,1,'-08:00'))
24
+ end
25
+
26
+ after :each do
27
+ FileUtils.rm_rf(@target_dir)
28
+ end
29
+
30
+ it 'raises an error if the orig dir does not exist' do
31
+ expect{SarManager.new('blah', @target_dir)}.to raise_error(SarManager::NotFoundError)
32
+ end
33
+
34
+ it 'creates the target directory' do
35
+ @manager.run
36
+ expect(File.directory?(@target_dir)).to be true
37
+ end
38
+
39
+ it 'generates daily formatted files' do
40
+ @manager.run
41
+ sa_files = [ 'sa18', 'sa19', 'sa20', 'sa21' ]
42
+ formatted_files = sa_files.map { |f| "#{@target_dir}/formatted_#{f}" }
43
+ formatted_files.each do |f|
44
+ expect(File.exist?(f)).to be true
45
+ end
46
+ end
47
+
48
+ it 'replaces current day formatted file if it exists' do
49
+ system "mkdir #{@target_dir}"
50
+ system "echo \"hello\" > #{@target_dir}/formatted_sa21"
51
+ @manager.run
52
+ lines = File.readlines("#{@target_dir}/formatted_sa21")
53
+ expect(lines.first).not_to match(/hello/)
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+
3
+ module VpsbClient
4
+ module Builders
5
+ support_dir = File.join(File.dirname(__FILE__), '..', 'support/')
6
+
7
+ describe MemoryParser do
8
+ it 'finds the amount of memory available in the system' do
9
+ mp = MemoryParser.new
10
+ mp.parse
11
+ expect(mp.used).to be_an_instance_of(Fixnum)
12
+ expect(mp.free).to be_an_instance_of(Fixnum)
13
+ expect(mp.total).to be_an_instance_of(Fixnum)
14
+ end
15
+ end
16
+
17
+ describe UnameParser do
18
+ it 'finds the kernel version' do
19
+ mp = UnameParser.new
20
+ mp.parse
21
+ expect(mp.kernel).to match(/^\d\.\d+\.\d+$/)
22
+ end
23
+ end
24
+
25
+ describe CpuinfoParser do
26
+ before :each do
27
+ @mp = CpuinfoParser.new
28
+ @mp.parse
29
+ end
30
+
31
+ it 'finds the model and number of processors' do
32
+ expect(@mp.model).to match(/^.*CPU.*GHz$/)
33
+ expect(@mp.num).to be_an_instance_of(Fixnum)
34
+ end
35
+
36
+ it 'finds the cpu speed' do
37
+ expect(@mp.mhz).to be_an_instance_of(Fixnum)
38
+ end
39
+ end
40
+
41
+ describe IssueParser do
42
+ it 'finds the linux release' do
43
+ mp = IssueParser.new
44
+ mp.parse
45
+ expect(mp.os).to be_a(String)
46
+ expect(mp.os.size).to be > 0
47
+ end
48
+ end
49
+ end
50
+ end
51
+
@@ -0,0 +1,9 @@
1
+ require 'bundler/setup'
2
+ Bundler.setup
3
+
4
+ require 'awesome_print'
5
+ require 'vpsb_client' # and any other gems you need
6
+
7
+ RSpec.configure do |config|
8
+ # some (optional) config here
9
+ end
@@ -0,0 +1,147 @@
1
+ # hostname;interval;timestamp;CPU;%user;%nice;%system;%iowait;%steal;%idle
2
+ gcengine;288;1411196701;-1;13.36;0.00;1.10;0.05;0.00;85.49
3
+ gcengine;590;1411197301;-1;9.08;0.00;0.83;0.29;0.00;89.80
4
+ gcengine;595;1411197901;-1;7.05;0.00;0.57;0.03;0.00;92.34
5
+ gcengine;595;1411198502;-1;7.54;0.00;0.60;0.04;0.00;91.83
6
+ gcengine;592;1411199101;-1;8.46;0.00;0.65;0.04;0.00;90.86
7
+ gcengine;595;1411199701;-1;7.77;0.00;0.56;0.04;0.00;91.63
8
+ gcengine;594;1411200301;-1;7.66;0.00;0.60;0.04;0.00;91.70
9
+ gcengine;589;1411200901;-1;7.88;0.00;0.83;0.36;0.00;90.93
10
+ gcengine;597;1411201501;-1;6.06;0.00;0.51;0.04;0.00;93.39
11
+ gcengine;596;1411202101;-1;6.42;0.00;0.53;0.03;0.00;93.01
12
+ gcengine;595;1411202701;-1;6.44;0.00;0.54;0.05;0.00;92.97
13
+ gcengine;596;1411203301;-1;6.45;0.00;0.53;0.04;0.00;92.99
14
+ gcengine;587;1411203901;-1;9.31;0.00;0.74;0.04;0.00;89.92
15
+ gcengine;587;1411204501;-1;9.10;0.00;0.87;0.23;0.00;89.80
16
+ gcengine;596;1411205101;-1;6.60;0.00;0.52;0.04;0.00;92.85
17
+ gcengine;595;1411205701;-1;5.98;0.00;0.53;0.03;0.00;93.46
18
+ gcengine;594;1411206301;-1;6.85;0.00;0.56;0.03;0.00;92.55
19
+ gcengine;595;1411206901;-1;6.56;0.00;0.52;0.03;0.00;92.89
20
+ gcengine;597;1411207501;-1;6.47;0.00;0.54;0.05;0.00;92.94
21
+ gcengine;590;1411208101;-1;6.93;0.00;0.71;0.25;0.00;92.11
22
+ gcengine;597;1411208701;-1;4.09;0.00;0.41;0.03;0.00;95.47
23
+ gcengine;596;1411209301;-1;5.80;0.00;0.51;0.03;0.00;93.66
24
+ gcengine;596;1411209901;-1;5.29;0.00;0.51;0.04;0.00;94.16
25
+ gcengine;597;1411210501;-1;4.96;0.00;0.44;0.04;0.00;94.57
26
+ gcengine;592;1411211101;-1;8.11;0.00;0.71;0.03;0.00;91.14
27
+ gcengine;583;1411211702;-1;7.61;0.00;0.80;0.47;0.00;91.12
28
+ gcengine;596;1411212301;-1;4.26;0.00;0.38;0.05;0.00;95.31
29
+ gcengine;597;1411212901;-1;4.94;0.00;0.46;0.04;0.00;94.56
30
+ gcengine;595;1411213501;-1;5.51;0.00;0.47;0.05;0.00;93.98
31
+ gcengine;595;1411214101;-1;4.97;0.00;0.47;0.04;0.00;94.52
32
+ gcengine;596;1411214701;-1;4.79;0.00;0.45;0.05;0.00;94.71
33
+ gcengine;580;1411215301;-1;8.15;0.00;0.81;0.28;0.00;90.76
34
+ gcengine;595;1411215901;-1;4.41;0.00;0.41;0.06;0.00;95.11
35
+ gcengine;596;1411216501;-1;4.46;0.00;0.41;0.06;0.00;95.07
36
+ gcengine;596;1411217101;-1;4.63;0.00;0.44;0.06;0.00;94.87
37
+ gcengine;595;1411217701;-1;4.97;0.00;0.42;0.04;0.00;94.58
38
+ gcengine;590;1411218301;-1;8.47;0.00;0.69;0.04;0.00;90.81
39
+ gcengine;590;1411218901;-1;7.57;0.00;0.79;0.26;0.00;91.38
40
+ gcengine;596;1411219501;-1;6.20;0.00;0.52;0.04;0.00;93.24
41
+ gcengine;583;1411220101;-1;6.88;0.00;0.72;1.90;0.00;90.50
42
+ gcengine;595;1411220701;-1;6.42;0.00;0.56;0.06;0.00;92.97
43
+ gcengine;596;1411221301;-1;6.23;0.00;0.49;0.05;0.00;93.24
44
+ gcengine;596;1411221901;-1;5.43;0.00;0.46;0.05;0.00;94.05
45
+ gcengine;586;1411222501;-1;8.62;0.00;0.79;0.23;0.00;90.36
46
+ gcengine;597;1411223101;-1;6.19;0.00;0.49;0.04;0.00;93.28
47
+ gcengine;595;1411223701;-1;6.57;0.00;0.49;0.04;0.00;92.89
48
+ gcengine;594;1411224301;-1;6.86;0.00;0.55;0.05;0.00;92.54
49
+ gcengine;595;1411224901;-1;6.60;0.00;0.55;0.06;0.00;92.79
50
+ gcengine;589;1411225501;-1;9.26;0.00;0.79;0.05;0.00;89.90
51
+ gcengine;589;1411226101;-1;8.41;0.00;0.80;0.23;0.00;90.56
52
+ gcengine;594;1411226701;-1;7.60;0.00;0.56;0.05;0.00;91.80
53
+ gcengine;596;1411227301;-1;6.46;0.00;0.56;0.05;0.00;92.94
54
+ gcengine;595;1411227901;-1;6.36;0.00;0.53;0.04;0.00;93.06
55
+ gcengine;595;1411228501;-1;5.85;0.00;0.50;0.04;0.00;93.60
56
+ gcengine;597;1411229101;-1;5.59;0.00;0.46;0.04;0.00;93.90
57
+ gcengine;590;1411229701;-1;7.31;0.00;0.76;0.34;0.00;91.59
58
+ gcengine;595;1411230301;-1;5.86;0.00;0.49;0.05;0.00;93.60
59
+ gcengine;596;1411230901;-1;6.20;0.00;0.51;0.04;0.00;93.25
60
+ gcengine;596;1411231501;-1;5.88;0.00;0.55;0.05;0.00;93.52
61
+ gcengine;596;1411232101;-1;5.64;0.00;0.47;0.04;0.00;93.84
62
+ gcengine;593;1411232701;-1;8.48;0.00;0.68;0.04;0.00;90.80
63
+ gcengine;589;1411233301;-1;7.37;0.00;0.73;0.26;0.00;91.65
64
+ gcengine;597;1411233902;-1;6.10;0.00;0.49;0.04;0.00;93.38
65
+ gcengine;595;1411234501;-1;5.75;0.00;0.45;0.04;0.00;93.76
66
+ gcengine;596;1411235101;-1;5.66;0.00;0.48;0.04;0.00;93.82
67
+ gcengine;595;1411235701;-1;6.37;0.00;0.54;0.04;0.00;93.05
68
+ gcengine;596;1411236301;-1;5.46;0.00;0.47;0.04;0.00;94.02
69
+ gcengine;581;1411236901;-1;9.59;0.00;0.91;0.29;0.00;89.21
70
+ gcengine;596;1411237501;-1;5.70;0.00;0.50;0.04;0.00;93.76
71
+ gcengine;596;1411238101;-1;5.68;0.00;0.46;0.04;0.00;93.82
72
+ gcengine;593;1411238701;-1;7.48;0.00;0.62;0.06;0.00;91.84
73
+ gcengine;595;1411239301;-1;7.70;0.00;0.61;0.05;0.00;91.64
74
+ gcengine;593;1411239901;-1;10.08;0.00;0.70;0.05;0.00;89.17
75
+ gcengine;586;1411240501;-1;9.64;0.00;0.88;0.23;0.00;89.25
76
+ gcengine;596;1411241101;-1;8.08;0.00;0.66;0.05;0.00;91.22
77
+ gcengine;595;1411241701;-1;7.44;0.00;0.58;0.04;0.00;91.94
78
+ gcengine;595;1411242301;-1;8.30;0.00;0.65;0.04;0.00;91.01
79
+ gcengine;592;1411242901;-1;10.76;0.00;0.79;0.05;0.00;88.40
80
+ gcengine;595;1411243501;-1;7.72;0.00;0.62;0.04;0.00;91.62
81
+ gcengine;582;1411244101;-1;9.96;0.00;0.88;0.25;0.00;88.92
82
+ gcengine;595;1411244701;-1;8.03;0.00;0.59;0.04;0.00;91.34
83
+ gcengine;596;1411245301;-1;7.72;0.00;0.60;0.04;0.00;91.64
84
+ gcengine;595;1411245901;-1;8.19;0.00;0.65;0.04;0.00;91.11
85
+ gcengine;596;1411246501;-1;8.07;0.00;0.61;0.03;0.00;91.29
86
+ gcengine;588;1411247101;-1;10.00;0.00;0.75;0.04;0.00;89.22
87
+ gcengine;589;1411247701;-1;9.28;0.00;0.81;0.22;0.00;89.69
88
+ gcengine;596;1411248301;-1;7.32;0.00;0.59;0.04;0.00;92.05
89
+ gcengine;595;1411248901;-1;7.46;0.00;0.60;0.05;0.00;91.89
90
+ gcengine;595;1411249502;-1;7.98;0.00;0.62;0.04;0.00;91.35
91
+ gcengine;594;1411250101;-1;7.79;0.00;0.59;0.03;0.00;91.59
92
+ gcengine;596;1411250701;-1;7.89;0.00;0.58;0.04;0.00;91.49
93
+ gcengine;589;1411251301;-1;9.32;0.00;0.88;0.26;0.00;89.54
94
+ gcengine;595;1411251901;-1;7.93;0.00;0.62;0.04;0.00;91.42
95
+ gcengine;596;1411252501;-1;8.34;0.00;0.69;0.04;0.00;90.94
96
+ gcengine;593;1411253101;-1;8.73;0.00;0.66;0.05;0.00;90.56
97
+ gcengine;596;1411253701;-1;8.08;0.00;0.62;0.04;0.00;91.26
98
+ gcengine;586;1411254301;-1;10.95;0.00;0.85;0.04;0.00;88.16
99
+ gcengine;579;1411254901;-1;11.20;0.00;1.00;0.26;0.00;87.54
100
+ gcengine;595;1411255501;-1;8.76;0.00;0.72;0.03;0.00;90.49
101
+ gcengine;596;1411256101;-1;8.19;0.00;0.61;0.03;0.00;91.17
102
+ gcengine;595;1411256701;-1;8.16;0.00;0.68;0.05;0.00;91.11
103
+ gcengine;595;1411257301;-1;7.31;0.00;0.54;0.03;0.00;92.12
104
+ gcengine;593;1411257901;-1;9.31;0.00;0.70;0.06;0.00;89.93
105
+ gcengine;589;1411258501;-1;9.95;0.00;0.88;0.25;0.00;88.92
106
+ gcengine;593;1411259101;-1;7.28;0.00;0.71;0.03;0.00;91.98
107
+ gcengine;595;1411259701;-1;8.93;0.00;0.64;0.04;0.00;90.39
108
+ gcengine;595;1411260301;-1;7.55;0.00;0.56;0.04;0.00;91.85
109
+ gcengine;595;1411260901;-1;7.89;0.00;0.64;0.04;0.00;91.43
110
+ gcengine;585;1411261501;-1;10.37;0.00;0.82;0.04;0.00;88.77
111
+ gcengine;592;1411262101;-1;8.42;0.00;0.77;0.22;0.00;90.59
112
+ gcengine;595;1411262701;-1;8.72;0.00;0.67;0.03;0.00;90.58
113
+ gcengine;594;1411263301;-1;7.82;0.00;0.60;0.03;0.00;91.55
114
+ gcengine;594;1411263901;-1;7.28;0.00;0.56;0.04;0.00;92.13
115
+ gcengine;596;1411264501;-1;6.95;0.00;0.52;0.03;0.00;92.50
116
+ gcengine;595;1411265101;-1;7.43;0.00;0.58;0.04;0.00;91.95
117
+ gcengine;591;1411265701;-1;8.63;0.00;0.78;0.23;0.00;90.35
118
+ gcengine;595;1411266301;-1;7.14;0.00;0.59;0.03;0.00;92.24
119
+ gcengine;596;1411266901;-1;6.89;0.00;0.56;0.04;0.00;92.50
120
+ gcengine;594;1411267501;-1;7.42;0.00;0.59;0.05;0.00;91.94
121
+ gcengine;595;1411268101;-1;8.08;0.00;0.58;0.03;0.00;91.31
122
+ gcengine;587;1411268701;-1;10.12;0.00;0.82;0.03;0.00;89.03
123
+ gcengine;591;1411269301;-1;8.24;0.00;0.77;0.24;0.00;90.75
124
+ gcengine;595;1411269901;-1;6.88;0.00;0.52;0.04;0.00;92.56
125
+ gcengine;596;1411270501;-1;7.02;0.00;0.59;0.04;0.00;92.36
126
+ gcengine;594;1411271101;-1;7.43;0.00;0.57;0.04;0.00;91.96
127
+ gcengine;595;1411271701;-1;7.12;0.00;0.58;0.04;0.00;92.27
128
+ gcengine;595;1411272301;-1;7.55;0.00;0.57;0.09;0.00;91.79
129
+ gcengine;592;1411272901;-1;9.16;0.00;0.81;0.21;0.00;89.82
130
+ gcengine;596;1411273501;-1;7.01;0.00;0.56;0.04;0.00;92.40
131
+ gcengine;597;1411274101;-1;7.08;0.00;0.57;0.04;0.00;92.31
132
+ gcengine;595;1411274701;-1;7.35;0.00;0.59;0.04;0.00;92.03
133
+ gcengine;597;1411275301;-1;6.53;0.00;0.52;0.04;0.00;92.91
134
+ gcengine;587;1411275901;-1;9.65;0.00;0.75;0.03;0.00;89.57
135
+ gcengine;583;1411276501;-1;10.96;0.00;0.98;0.38;0.00;87.69
136
+ gcengine;594;1411277101;-1;7.48;0.00;0.60;0.03;0.00;91.88
137
+ gcengine;595;1411277701;-1;8.07;0.00;0.64;0.04;0.00;91.25
138
+ gcengine;593;1411278301;-1;8.68;0.00;0.65;0.04;0.00;90.63
139
+ gcengine;594;1411278901;-1;7.36;0.00;0.60;0.04;0.00;92.01
140
+ gcengine;595;1411279501;-1;7.69;0.00;0.58;0.03;0.00;91.70
141
+ gcengine;581;1411280101;-1;10.51;0.00;0.96;0.22;0.00;88.30
142
+ gcengine;594;1411280701;-1;8.05;0.00;0.60;0.03;0.00;91.31
143
+ gcengine;597;1411281301;-1;7.50;0.00;0.56;0.03;0.00;91.90
144
+ gcengine;593;1411281901;-1;8.20;0.00;0.61;0.05;0.00;91.14
145
+ gcengine;594;1411282501;-1;8.62;0.00;0.66;0.05;0.00;90.67
146
+ gcengine;159;1411282741;-1;55.12;0.00;2.44;1.31;0.00;41.13
147
+ gcengine;58;1411282801;-1;10.39;0.00;0.85;0.69;0.00;88.07