influxdb-api 0.0.2 → 0.0.3

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 (34) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +14 -0
  3. data/README.md +2 -0
  4. data/influxdb/Dockerfile.0.7.3 +8 -0
  5. data/influxdb/Dockerfile.0.8.3 +8 -0
  6. data/influxdb/Dockerfile.0.8.8 +8 -0
  7. data/lib/influxdb/api.rb +3 -0
  8. data/lib/influxdb/api/client.rb +5 -1
  9. data/lib/influxdb/api/database.rb +14 -2
  10. data/lib/influxdb/api/namespaces/base.rb +7 -0
  11. data/lib/influxdb/api/namespaces/cluster_admins.rb +4 -0
  12. data/lib/influxdb/api/namespaces/continuous_queries.rb +28 -4
  13. data/lib/influxdb/api/namespaces/databases.rb +4 -0
  14. data/lib/influxdb/api/namespaces/series.rb +3 -0
  15. data/lib/influxdb/api/namespaces/shards.rb +15 -0
  16. data/lib/influxdb/api/namespaces/users.rb +7 -0
  17. data/lib/influxdb/api/server_version.rb +6 -2
  18. data/lib/influxdb/api/version.rb +1 -1
  19. data/spec/intergrations/cluster_admins_spec.rb +75 -0
  20. data/spec/intergrations/continuous_queries_spec.rb +106 -0
  21. data/spec/intergrations/databases_spec.rb +68 -0
  22. data/spec/intergrations/series_spec.rb +104 -0
  23. data/spec/intergrations/servers_spec.rb +35 -0
  24. data/spec/intergrations/shard_spaces_spec.rb +126 -0
  25. data/spec/intergrations/shards_spec.rb +85 -0
  26. data/spec/intergrations/users_0_7_3_spec.rb +104 -0
  27. data/spec/intergrations/users_spec.rb +124 -0
  28. data/spec/lib/influxdb/api/database_spec.rb +32 -4
  29. data/spec/lib/influxdb/api/namespaces/{continuous_queries_spec.rb → continuous_queries/api_spec.rb} +2 -2
  30. data/spec/lib/influxdb/api/namespaces/continuous_queries/sql_spec.rb +41 -0
  31. data/spec/lib/influxdb/api/server_version_spec.rb +1 -0
  32. data/spec/spec_helper.rb +18 -0
  33. data/spec/support/version_resolver.rb +56 -0
  34. metadata +30 -5
@@ -0,0 +1,68 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'databases', integration: true do
4
+ let(:config){ Influxdb::Api::Configuration.new }
5
+ let(:client){ Influxdb::Api::Client.new(config) }
6
+
7
+ subject{ client.databases }
8
+
9
+ before do
10
+ subject.all.each{|db| subject.delete(db['name']) }
11
+ end
12
+
13
+ after do
14
+ subject.all.each{|db| subject.delete(db['name']) }
15
+ end
16
+
17
+ describe '.all' do
18
+ context 'when there is none database' do
19
+ it 'returns empty array' do
20
+ expect(subject.all).to eq([])
21
+ end
22
+ end
23
+
24
+ context 'when there are some databases' do
25
+ before do
26
+ subject.create('db_name1')
27
+ subject.create('db_name2')
28
+ end
29
+
30
+ it 'returns the list of databases' do
31
+ expect(subject.all).to match_array([{ 'name' => 'db_name1' }, { 'name' => 'db_name2' }])
32
+ end
33
+ end
34
+ end
35
+
36
+ describe '.create' do
37
+ it 'creates a new db with given name' do
38
+ subject.create('db_name')
39
+ expect(subject.all.include?({ 'name' => 'db_name' })).to be_truthy
40
+ end
41
+
42
+ context 'when there is db with the same name' do
43
+ before{ subject.create('db_name') }
44
+
45
+ it 'raises error' do
46
+ expect{ subject.create('db_name') }.to raise_error(
47
+ Influxdb::Api::Client::Errors::Conflict, '[409] database db_name exists'
48
+ )
49
+ end
50
+ end
51
+ end
52
+
53
+ describe '.delete' do
54
+ context 'for unexisted db' do
55
+ it 'returns false' do
56
+ expect(subject.delete('db_name')).to be_falsy
57
+ end
58
+ end
59
+
60
+ context 'for existed db' do
61
+ before{ subject.create('db_name') }
62
+
63
+ it 'removes db and returns true' do
64
+ expect(subject.delete('db_name')).to be_truthy
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,104 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'series', integration: true do
4
+ let(:config){ Influxdb::Api::Configuration.new }
5
+ let(:client){ Influxdb::Api::Client.new(config) }
6
+
7
+ subject{ client.databases('db_name').series }
8
+
9
+ before do
10
+ client.databases.create('db_name')
11
+ subject.all.each{|name| subject.delete(name) }
12
+ end
13
+
14
+ after{ client.databases.delete('db_name') }
15
+
16
+ def series_data(name)
17
+ name = name.to_s
18
+ subject.execute('select * from ' + name)[name] || []
19
+ end
20
+
21
+ describe '.all' do
22
+ context 'when there is none series' do
23
+ it 'returns empty array' do
24
+ expect(subject.all).to eq([])
25
+ end
26
+ end
27
+
28
+ context 'when there are some series' do
29
+ before do
30
+ subject.write('name1', v: 1)
31
+ subject.write('name2', v: 2)
32
+ end
33
+
34
+ it 'returns the list of series' do
35
+ expect(subject.all).to match_array(['name1', 'name2'])
36
+ end
37
+ end
38
+ end
39
+
40
+ describe '.write' do
41
+ it 'writes row into the series' do
42
+ subject.write(:name, v: 1)
43
+ expect(series_data(:name).size).to eq(1)
44
+ end
45
+
46
+ it 'writes multiple rows into the series' do
47
+ subject.write(:name, [{ v: 1 }, { v: 2 }])
48
+ expect(series_data(:name).size).to eq(2)
49
+ end
50
+
51
+ it 'writes multiple rows into multiple series' do
52
+ subject.write(name1: [{ v: 1 }], name2: [{ v: 2 }])
53
+
54
+ expect(series_data(:name1).size).to eq(1)
55
+ expect(series_data(:name2).size).to eq(1)
56
+ end
57
+ end
58
+
59
+ describe '.execute' do
60
+ context 'when series does not exist', version: '<=0.8.3' do
61
+ it 'returns empty Hash' do
62
+ expect(subject.execute('SELECT * FROM name')).to eq({})
63
+ end
64
+ end
65
+
66
+ context 'when series does not exist', version: '>0.8.3' do
67
+ it 'raises error' do
68
+ expect{ subject.execute('SELECT * FROM name') }.to raise_error(
69
+ Influxdb::Api::Client::Errors::BadRequest, "[400] Couldn't find series: name"
70
+ )
71
+ end
72
+ end
73
+
74
+ context 'when series exists', time_freeze: '16.09.2014 00:00:00 +0700' do
75
+ before{ subject.write(:name, v: 1) }
76
+
77
+ let(:result){ subject.execute('SELECT * FROM name') }
78
+
79
+ it 'returns result of the query' do
80
+ expect(result).to be_instance_of(Hash)
81
+ expect(result['name']).to be_instance_of(Array)
82
+ expect(result['name'].size).to eq(1)
83
+ expect(result['name'][0]).to be_instance_of(Hash)
84
+ expect(result['name'][0]['v']).to eq(1)
85
+ end
86
+ end
87
+ end
88
+
89
+ describe '.delete' do
90
+ context 'for unexisted series' do
91
+ it 'returns true' do
92
+ expect(subject.delete('name')).to be_truthy
93
+ end
94
+ end
95
+
96
+ context 'for existed db' do
97
+ before{ subject.write(:name, v: 1) }
98
+
99
+ it 'removes db and returns true' do
100
+ expect(subject.delete('name')).to be_truthy
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'servers', integration: true do
4
+ let(:config){ Influxdb::Api::Configuration.new }
5
+ let(:client){ Influxdb::Api::Client.new(config) }
6
+ let(:result){ subject.all }
7
+
8
+ subject{ client.servers }
9
+
10
+ before{ client.databases.create('db_name') }
11
+ after{ client.databases.delete('db_name') }
12
+
13
+ describe '.all' do
14
+ it 'returns list of shards', version: '<=0.7.3' do
15
+ expect(result).to be_instance_of(Array)
16
+ expect(result[0]).to include('id', 'protobufConnectString')
17
+ end
18
+
19
+ it 'returns list of shards', version: '0.7.3-0.8.4' do
20
+ expect(result).to be_instance_of(Array)
21
+ expect(result[0]).to include(
22
+ 'id', 'isLeader', 'isUp', 'leaderRaftConnectString', 'leaderRaftName', 'protobufConnectString',
23
+ 'raftConnectionString', 'raftName', 'state', 'stateName'
24
+ )
25
+ end
26
+
27
+ it 'returns list of shards', version: '>0.8.3' do
28
+ expect(result).to be_instance_of(Array)
29
+ expect(result[0]).to include(
30
+ 'id', 'isLeader', 'isUp', 'leaderRaftConnectString', 'leaderRaftName', 'protobufConnectString',
31
+ 'raftConnectionString', 'raftName'
32
+ )
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,126 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'shard_spaces', version: '>0.7.3', integration: true do
4
+ let(:config){ Influxdb::Api::Configuration.new }
5
+ let(:client){ Influxdb::Api::Client.new(config) }
6
+ let(:shard_space){ {
7
+ 'name' => 'default',
8
+ 'database' => 'db_name',
9
+ 'retentionPolicy' => 'inf',
10
+ 'shardDuration' => '7d',
11
+ 'regex' => '/.*/',
12
+ 'replicationFactor' => 1,
13
+ 'split' => 1
14
+ } }
15
+
16
+ subject{ client.databases('db_name').shard_spaces }
17
+
18
+ before{ client.databases.create('db_name') }
19
+ after{ client.databases.delete('db_name') }
20
+
21
+ describe '.all' do
22
+ context 'when database just has been created' do
23
+ it 'returns empty list' do
24
+ expect(subject.all).to eq([])
25
+ end
26
+ end
27
+
28
+ context 'when there are some shard spaces' do
29
+ before{ client.databases('db_name').series.write(:name, v: 1) }
30
+
31
+ it 'returns list of shard spaces' do
32
+ expect(subject.all).to eq([shard_space])
33
+ end
34
+ end
35
+ end
36
+
37
+ describe '.create' do
38
+ it 'creates shard space' do
39
+ subject.create(shard_space)
40
+ expect(subject.all).to eq([shard_space])
41
+ end
42
+
43
+ context 'when there is already the same shard space' do
44
+ before{ subject.create(shard_space) }
45
+
46
+ it 'raises error' do
47
+ expect{ subject.create(shard_space) }.to raise_error(
48
+ Influxdb::Api::Client::Errors::BadRequest, '[400] Shard space default exists for db db_name'
49
+ )
50
+ end
51
+ end
52
+ end
53
+
54
+ describe '.update' do
55
+ let(:new_attributes){ {
56
+ retentionPolicy: '30d',
57
+ shardDuration: '15d',
58
+ regex: '/.*/',
59
+ replicationFactor: 1,
60
+ split: 1
61
+ } }
62
+
63
+ let(:unacceptable_attributes){ {
64
+ retentionPolicy: '30d',
65
+ shardDuration: '15d',
66
+ regex: '/.*/',
67
+ replicationFactor: 1,
68
+ split: 1,
69
+ someuUnacceptableAttribute: 'lalala'
70
+ } }
71
+
72
+ before{ subject.create(shard_space) }
73
+
74
+ it 'updates attributes of shard space' do
75
+ subject.update('default', new_attributes)
76
+ expect(subject.all).to eq([{
77
+ 'name' => 'default',
78
+ 'database' => 'db_name',
79
+ 'retentionPolicy' => '30d',
80
+ 'shardDuration' => '15d',
81
+ 'regex' => '/.*/',
82
+ 'replicationFactor' => 1,
83
+ 'split' => 1
84
+ }])
85
+ end
86
+
87
+ context 'when same shard space does not exist' do
88
+ it 'raises error' do
89
+ expect{ subject.update('unexisted_name', new_attributes) }.to raise_error(
90
+ Influxdb::Api::Client::Errors::NotAcceptable, "[406] Can't update a shard space that doesn't exist"
91
+ )
92
+ end
93
+ end
94
+
95
+ context 'with unacceptable attributes' do
96
+ it 'updates only valid attributes' do
97
+ subject.update('default', unacceptable_attributes)
98
+ expect(subject.all).to eq([{
99
+ 'name' => 'default',
100
+ 'database' => 'db_name',
101
+ 'retentionPolicy' => '30d',
102
+ 'shardDuration' => '15d',
103
+ 'regex' => '/.*/',
104
+ 'replicationFactor' => 1,
105
+ 'split' => 1
106
+ }])
107
+ end
108
+ end
109
+ end
110
+
111
+ describe '.delete' do
112
+ context 'when shard space exists' do
113
+ before{ subject.create(shard_space) }
114
+
115
+ it 'deletes shard space' do
116
+ expect{ subject.delete('default') }.to change{ subject.all.size }.from(1).to(0)
117
+ end
118
+ end
119
+
120
+ context 'when shard space does not exist' do
121
+ it 'does nothing' do
122
+ expect{ subject.delete('unexisted_name') }.not_to change{ subject.all.size }
123
+ end
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,85 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'shards', integration: true do
4
+ let(:config){ Influxdb::Api::Configuration.new }
5
+ let(:client){ Influxdb::Api::Client.new(config) }
6
+ let(:result){ subject.all }
7
+
8
+ subject{ client.shards }
9
+
10
+ before do
11
+ client.databases.create('db_name')
12
+ client.databases('db_name').series.write(:name, v: 1)
13
+ end
14
+
15
+ after{ client.databases.delete('db_name') }
16
+
17
+ describe '.all' do
18
+ it 'returns list of shards', version: '>0.7.3' do
19
+ expect(result).to be_instance_of(Array)
20
+ expect(result).not_to be_empty
21
+ end
22
+
23
+ it 'returns list of shards', version: '<=0.7.3' do
24
+ expect(result).to be_instance_of(Hash)
25
+ expect(result).not_to be_empty
26
+ end
27
+ end
28
+
29
+ describe '.create', time_freeze: Time.now, version: '<=0.7.3' do
30
+ let(:attributes){ {
31
+ startTime: Time.now,
32
+ endTime: Time.now.to_i + 86400,
33
+ spaceName: 'default',
34
+ shards: [{ serverIds: [1] }],
35
+ database: 'db_name'
36
+ } }
37
+ let(:shard){ result['shortTerm'].sort_by{|v| v['id'] }.last }
38
+
39
+ it 'creates new shard' do
40
+ subject.create(attributes)
41
+
42
+ expect(result['shortTerm'].size).to eq(2)
43
+ expect(shard['startTime']).to eq(Time.now.to_i)
44
+ expect(shard['endTime']).to eq(Time.now.to_i + 86400)
45
+ expect(shard['spaceName']).to be_nil
46
+ expect(shard['database']).to be_nil
47
+ expect(shard['serverIds']).to eq([1])
48
+ end
49
+ end
50
+
51
+ describe '.create', time_freeze: Time.now, version: '>0.7.3' do
52
+ let(:attributes){ {
53
+ startTime: Time.now,
54
+ endTime: Time.now.to_i + 86400,
55
+ spaceName: 'default',
56
+ shards: [{ serverIds: [1] }],
57
+ database: 'db_name'
58
+ } }
59
+ let(:shard){ result.sort_by{|v| v['id'] }.last }
60
+
61
+ it 'creates new shard' do
62
+ subject.create(attributes)
63
+
64
+ expect(result.size).to eq(2)
65
+ expect(shard['startTime']).to eq(Time.now.to_i)
66
+ expect(shard['endTime']).to eq(Time.now.to_i + 86400)
67
+ expect(shard['spaceName']).to eq('default')
68
+ expect(shard['database']).to eq('db_name')
69
+ expect(shard['serverIds']).to eq([1])
70
+ end
71
+ end
72
+
73
+ describe '.delete' do
74
+ # It doesn't work on InfluxDB before 0.9.0
75
+ # https://github.com/influxdb/influxdb/issues/1043
76
+ skip("It doesn't work on InfluxDB before 0.9.0 (https://github.com/influxdb/influxdb/issues/1043)") do
77
+
78
+ let(:shard_id){ result[0]['id'] }
79
+
80
+ it 'deletes shard' do
81
+ expect{ subject.delete(shard_id) }.to change{ subject.all.size }.from(1).to(0)
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,104 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'users', version: '<0.8.0', integration: true do
4
+ let(:config){ Influxdb::Api::Configuration.new }
5
+ let(:client){ Influxdb::Api::Client.new(config) }
6
+
7
+ subject{ client.databases('db_name').users }
8
+
9
+ before do
10
+ client.databases.create('db_name')
11
+ subject.all.each{|u| subject.delete(u['name']) }
12
+ end
13
+
14
+ after{ client.databases.delete('db_name') }
15
+
16
+ describe '.all' do
17
+ context 'when there are no users' do
18
+ it 'returns empty array' do
19
+ expect(subject.all).to eq([])
20
+ end
21
+ end
22
+
23
+ context 'when there are some users' do
24
+ before do
25
+ subject.create(name: 'username1', password: 'mypass1')
26
+ subject.create(name: 'username2', password: 'mypass2')
27
+ end
28
+
29
+ it 'returns the list of users' do
30
+ expect(subject.all).to match_array([
31
+ { 'name' => 'username1', 'isAdmin' => false },
32
+ { 'name' => 'username2', 'isAdmin' => false }
33
+ ])
34
+ end
35
+ end
36
+ end
37
+
38
+ describe '.create' do
39
+ it 'creates a new user with given name' do
40
+ expect{ subject.create(name: 'username', password: 'mypass') }.to change{ subject.all.size }.from(0).to(1)
41
+ end
42
+
43
+ context 'when there is user with the same name' do
44
+ before{ subject.create(name: 'username', password: 'mypass') }
45
+
46
+ it 'raises error' do
47
+ expect{ subject.create(name: 'username', password: 'mypass') }.to raise_error(
48
+ Influxdb::Api::Client::Errors::BadRequest, '[400] User username already exists'
49
+ )
50
+ end
51
+ end
52
+ end
53
+
54
+ describe '.update' do
55
+ context 'when user does not exist' do
56
+ it 'raises error' do
57
+ expect{ subject.update('username', admin: true) }.to raise_error(
58
+ Influxdb::Api::Client::Errors::BadRequest, '[400] Invalid username username'
59
+ )
60
+ end
61
+ end
62
+
63
+ context 'when user exists' do
64
+ before{ subject.create(name: 'username', password: 'mypass') }
65
+
66
+ it 'updates user attributes' do
67
+ subject.update('username', admin: true)
68
+ expect(subject.all).to eq([{ 'name' => 'username', 'isAdmin' => true }])
69
+ end
70
+ end
71
+ end
72
+
73
+ describe '.find' do
74
+ context 'when user does not exist' do
75
+ it 'returns nil' do
76
+ expect(subject.find('username2')).to be_nil
77
+ end
78
+ end
79
+
80
+ context 'when user exists' do
81
+ before{ subject.create(name: 'username', password: 'mypass') }
82
+
83
+ it 'returns user' do
84
+ expect(subject.find('username')).to eq('name' => 'username', 'isAdmin' => false)
85
+ end
86
+ end
87
+ end
88
+
89
+ describe '.delete' do
90
+ context 'when user does not exist' do
91
+ it 'returns false' do
92
+ expect(subject.delete('username')).to be_falsy
93
+ end
94
+ end
95
+
96
+ context 'when user exists' do
97
+ before{ subject.create(name: 'username', password: 'mypass') }
98
+
99
+ it 'removes db and returns true' do
100
+ expect(subject.delete('username')).to be_truthy
101
+ end
102
+ end
103
+ end
104
+ end