vpsb_client 0.0.2

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.
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