etcdv3 0.1.5 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +2 -2
- data/README.md +3 -2
- data/lib/etcdv3/kv.rb +22 -2
- data/lib/etcdv3/version.rb +1 -1
- data/lib/etcdv3.rb +15 -3
- data/spec/etcdv3_spec.rb +29 -2
- data/spec/spec_helper.rb +6 -1
- metadata +2 -4
- data/spec/etcd_spec.rb +0 -112
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6054abb122d9d779e4fc044e0e18cb6f06b03e26
|
4
|
+
data.tar.gz: 93fb0231d2ebb440f38e2e23fbd8e5c78ab45b6b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eca14e0abaad2095e87ad37a6236f304e53319a58f93adfaee300f6d068b5be039f161a066259e1941a45288ea1e41137d0746ec71d36a4c0f884bec91421512
|
7
|
+
data.tar.gz: 3a636b3b397101ed7dd479e0ecbe16ae30ffad4d3c23fa804dab9bb196d41ce0d94ee0a09bf562d36bb5e94ef55c6ead6594822af84365a72f2a6c37e9141dab
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
# etcdv3-ruby [](https://badge.fury.io/rb/etcdv3) [](https://travis-ci.org/davissp14/etcdv3-ruby)
|
1
|
+
# etcdv3-ruby [](https://badge.fury.io/rb/etcdv3) [](https://travis-ci.org/davissp14/etcdv3-ruby) [](https://codecov.io/gh/davissp14/etcdv3-ruby)
|
2
|
+
|
2
3
|
|
3
4
|
Ruby client for Etcd V3
|
4
5
|
|
@@ -40,7 +41,7 @@ conn = Etcd.new(url: 'https://hostname:port', user: "gary", password: "secret")
|
|
40
41
|
conn.get("my")
|
41
42
|
|
42
43
|
# Get Key Range
|
43
|
-
conn.get('my', 'myyyy')
|
44
|
+
conn.get('my', range_end: 'myyyy')
|
44
45
|
|
45
46
|
# Delete Key
|
46
47
|
conn.del('my')
|
data/lib/etcdv3/kv.rb
CHANGED
@@ -1,6 +1,21 @@
|
|
1
1
|
|
2
2
|
class Etcd
|
3
3
|
class KV
|
4
|
+
|
5
|
+
SORT_TARGET = {
|
6
|
+
key: 0,
|
7
|
+
version: 1,
|
8
|
+
create: 2,
|
9
|
+
mod: 3,
|
10
|
+
value: 4
|
11
|
+
}
|
12
|
+
|
13
|
+
SORT_ORDER = {
|
14
|
+
none: 0,
|
15
|
+
ascend: 1,
|
16
|
+
descend: 2
|
17
|
+
}
|
18
|
+
|
4
19
|
def initialize(hostname, credentials, metadata={})
|
5
20
|
@stub = Etcdserverpb::KV::Stub.new(hostname, credentials)
|
6
21
|
@metadata = metadata
|
@@ -12,8 +27,13 @@ class Etcd
|
|
12
27
|
@stub.put(kv, metadata: @metadata)
|
13
28
|
end
|
14
29
|
|
15
|
-
def get(key,
|
16
|
-
|
30
|
+
def get(key, opts={})
|
31
|
+
opts[:sort_order] = SORT_ORDER[opts[:sort_order]] \
|
32
|
+
if opts[:sort_order]
|
33
|
+
opts[:sort_target] = SORT_TARGET[opts[:sort_target]] \
|
34
|
+
if opts[:sort_target]
|
35
|
+
opts[:key] = key
|
36
|
+
kv = Etcdserverpb::RangeRequest.new(opts)
|
17
37
|
@stub.range(kv, metadata: @metadata)
|
18
38
|
end
|
19
39
|
|
data/lib/etcdv3/version.rb
CHANGED
data/lib/etcdv3.rb
CHANGED
@@ -80,9 +80,21 @@ class Etcd
|
|
80
80
|
request.handle(:kv, 'put', [key, value, lease_id])
|
81
81
|
end
|
82
82
|
|
83
|
-
#
|
84
|
-
|
85
|
-
|
83
|
+
# key - string
|
84
|
+
# optional :range_end - string
|
85
|
+
# optional :limit - integer
|
86
|
+
# optional :revision - integer
|
87
|
+
# optional :sort_order - symbol - [:none, :ascend, :descend]
|
88
|
+
# optional :sort_target - symbol - [:key, :version, :create, :mode, :value]
|
89
|
+
# optional :serializable - boolean
|
90
|
+
# optional :keys_only - boolean
|
91
|
+
# optional :count_only - boolean
|
92
|
+
# optional :min_mod_revision - integer
|
93
|
+
# optional :max_mod_revision - integer
|
94
|
+
# optional :min_create_revision - integer
|
95
|
+
# optional :max_create_revision - integer
|
96
|
+
def get(key, opts={})
|
97
|
+
request.handle(:kv, 'get', [key, opts])
|
86
98
|
end
|
87
99
|
|
88
100
|
# Grant a lease with a speified TTL
|
data/spec/etcdv3_spec.rb
CHANGED
@@ -41,8 +41,35 @@ describe Etcd do
|
|
41
41
|
end
|
42
42
|
|
43
43
|
describe '#get' do
|
44
|
-
|
45
|
-
|
44
|
+
before do
|
45
|
+
conn.put('apple', 'test')
|
46
|
+
conn.put('applee', 'test')
|
47
|
+
conn.put('appleee', 'test')
|
48
|
+
end
|
49
|
+
context 'no filters' do
|
50
|
+
subject { conn.get('apple') }
|
51
|
+
it { is_expected.to_not be_nil }
|
52
|
+
end
|
53
|
+
context 'sorts desc' do
|
54
|
+
subject do
|
55
|
+
conn.get('apple', range_end: 'appleeee', sort_order: :descend) \
|
56
|
+
.kvs.first.key
|
57
|
+
end
|
58
|
+
it { is_expected.to eq('appleee') }
|
59
|
+
end
|
60
|
+
context 'sorts asc' do
|
61
|
+
subject do
|
62
|
+
conn.get('apple', range_end: 'appleeee', sort_order: :ascend) \
|
63
|
+
.kvs.first.key
|
64
|
+
end
|
65
|
+
it { is_expected.to eq('apple') }
|
66
|
+
end
|
67
|
+
context 'count only' do
|
68
|
+
subject do
|
69
|
+
conn.get('apple', range_end: 'appleeee', count_only: true).kvs
|
70
|
+
end
|
71
|
+
it { is_expected.to be_empty }
|
72
|
+
end
|
46
73
|
end
|
47
74
|
|
48
75
|
describe '#put' do
|
data/spec/spec_helper.rb
CHANGED
@@ -2,12 +2,17 @@ $LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
|
|
2
2
|
$LOAD_PATH.unshift File.expand_path('./helpers', __FILE__)
|
3
3
|
|
4
4
|
require 'etcdv3'
|
5
|
+
require 'simplecov'
|
6
|
+
require 'codecov'
|
5
7
|
require 'helpers/test_instance'
|
6
8
|
require 'helpers/connections'
|
7
9
|
|
10
|
+
SimpleCov.start
|
11
|
+
SimpleCov.formatter = SimpleCov::Formatter::Codecov
|
12
|
+
|
8
13
|
RSpec.configure do |config|
|
9
14
|
config.include(Helpers::Connections)
|
10
|
-
|
15
|
+
|
11
16
|
config.expect_with :rspec do |expectations|
|
12
17
|
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
13
18
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: etcdv3
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shaun Davis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-04-
|
11
|
+
date: 2017-04-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: grpc
|
@@ -68,7 +68,6 @@ files:
|
|
68
68
|
- lib/etcdv3/protos/rpc.proto
|
69
69
|
- lib/etcdv3/request.rb
|
70
70
|
- lib/etcdv3/version.rb
|
71
|
-
- spec/etcd_spec.rb
|
72
71
|
- spec/etcdv3/auth_spec.rb
|
73
72
|
- spec/etcdv3/kv_spec.rb
|
74
73
|
- spec/etcdv3/lease_spec.rb
|
@@ -102,7 +101,6 @@ signing_key:
|
|
102
101
|
specification_version: 4
|
103
102
|
summary: A Etcd client library for Version 3
|
104
103
|
test_files:
|
105
|
-
- spec/etcd_spec.rb
|
106
104
|
- spec/etcdv3/auth_spec.rb
|
107
105
|
- spec/etcdv3/kv_spec.rb
|
108
106
|
- spec/etcdv3/lease_spec.rb
|
data/spec/etcd_spec.rb
DELETED
@@ -1,112 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Etcd do
|
4
|
-
context 'Insecure connection without Auth' do
|
5
|
-
|
6
|
-
let(:conn) { local_connection }
|
7
|
-
|
8
|
-
describe '#initialize' do
|
9
|
-
subject { conn }
|
10
|
-
it { is_expected.to have_attributes(scheme: 'http') }
|
11
|
-
it { is_expected.to have_attributes(hostname: '127.0.0.1') }
|
12
|
-
it { is_expected.to have_attributes(credentials: :this_channel_is_insecure) }
|
13
|
-
it { is_expected.to have_attributes(token: nil) }
|
14
|
-
it { is_expected.to have_attributes(user: nil) }
|
15
|
-
it { is_expected.to have_attributes(password: nil) }
|
16
|
-
end
|
17
|
-
|
18
|
-
describe '#version' do
|
19
|
-
subject { conn.version }
|
20
|
-
it { is_expected.to be_an_instance_of(String) }
|
21
|
-
end
|
22
|
-
|
23
|
-
describe '#db_size' do
|
24
|
-
subject { conn.db_size }
|
25
|
-
it { is_expected.to_not be_nil }
|
26
|
-
end
|
27
|
-
|
28
|
-
describe '#leader_id' do
|
29
|
-
subject { conn.leader_id.class }
|
30
|
-
it { is_expected.to_not be_nil }
|
31
|
-
end
|
32
|
-
|
33
|
-
describe '#disable_auth' do
|
34
|
-
before do
|
35
|
-
conn.add_user('root', 'test')
|
36
|
-
conn.grant_role_to_user('root', 'root')
|
37
|
-
conn.enable_auth
|
38
|
-
conn.authenticate('root', 'test')
|
39
|
-
end
|
40
|
-
after { conn.delete_user('root') }
|
41
|
-
subject { conn.disable_auth }
|
42
|
-
it { is_expected.to be_an_instance_of(Etcdserverpb::AuthDisableResponse) }
|
43
|
-
end
|
44
|
-
|
45
|
-
describe '#enable_auth' do
|
46
|
-
before do
|
47
|
-
conn.add_user('root', 'test')
|
48
|
-
conn.grant_role_to_user('root', 'root')
|
49
|
-
end
|
50
|
-
after do
|
51
|
-
conn.authenticate('root', 'test')
|
52
|
-
conn.disable_auth
|
53
|
-
conn.delete_user('root')
|
54
|
-
end
|
55
|
-
subject { conn.enable_auth }
|
56
|
-
it { is_expected.to be_an_instance_of(Etcdserverpb::AuthEnableResponse) }
|
57
|
-
end
|
58
|
-
|
59
|
-
describe "#authenticate" do
|
60
|
-
context "auth enabled" do
|
61
|
-
before do
|
62
|
-
conn.add_user('root', 'test')
|
63
|
-
conn.grant_role_to_user('root', 'root')
|
64
|
-
conn.enable_auth
|
65
|
-
conn.authenticate('root', 'test')
|
66
|
-
end
|
67
|
-
after do
|
68
|
-
conn.disable_auth
|
69
|
-
conn.delete_user('root')
|
70
|
-
end
|
71
|
-
it 'properly reconfigures auth and token' do
|
72
|
-
expect(conn.token).to_not be_nil
|
73
|
-
expect(conn.user).to eq('root')
|
74
|
-
expect(conn.password).to eq('test')
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
context 'auth disabled' do
|
79
|
-
it 'raises error' do
|
80
|
-
expect { conn.authenticate('root', 'root') }.to raise_error(GRPC::InvalidArgument)
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
describe '#metacache' do
|
86
|
-
context 'uses cached request object' do
|
87
|
-
let!(:object_id) { conn.send(:request).object_id }
|
88
|
-
before { conn.add_user('root', 'test') }
|
89
|
-
after { conn.delete_user('root') }
|
90
|
-
subject { conn.send(:request).object_id }
|
91
|
-
it { is_expected.to eq(object_id) }
|
92
|
-
end
|
93
|
-
context 'resets cache on auth' do
|
94
|
-
let!(:object_id) { conn.send(:request).object_id }
|
95
|
-
before do
|
96
|
-
conn.add_user('root', 'test')
|
97
|
-
conn.grant_role_to_user('root', 'root')
|
98
|
-
conn.enable_auth
|
99
|
-
conn.authenticate('root', 'test')
|
100
|
-
conn.add_user('boom', 'password')
|
101
|
-
end
|
102
|
-
after do
|
103
|
-
conn.disable_auth
|
104
|
-
conn.delete_user('root')
|
105
|
-
conn.delete_user('boom')
|
106
|
-
end
|
107
|
-
subject { conn.send(:request).object_id }
|
108
|
-
it { is_expected.to_not eq(object_id) }
|
109
|
-
end
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|