etcdv3 0.5.1 → 0.5.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +17 -14
- data/lib/etcdv3/request.rb +36 -18
- data/lib/etcdv3/version.rb +1 -1
- data/lib/etcdv3.rb +18 -40
- data/spec/etcdv3_spec.rb +2 -29
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bfb94e2d833d0412e229748f89be3697776aa677
|
4
|
+
data.tar.gz: a4878727100089890d69309ea3e063d767a8f5ec
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5fbac1f489e35934579e6ed3e92158b23a5ad6aaf39c8c381b1a304b4a9f969cb954c79113c4b207d976a73c2c9638b30fa96ecc8393e77c08ccd77d581e86e1
|
7
|
+
data.tar.gz: 2a22159afd0bb01446764763e79dc5fffa47fe8d51edbd063f59f7afa801d40a8532213ca32f9be556482027124172ac169cb0fb11d104ebbe29f5771e113bf7
|
data/README.md
CHANGED
@@ -26,7 +26,7 @@ conn = Etcdv3.new(url: 'http://127.0.0.1:2379')
|
|
26
26
|
conn = Etcdv3.new(url: 'https://hostname:port')
|
27
27
|
|
28
28
|
# Secure connection with Auth
|
29
|
-
conn = Etcdv3.new(url: 'https://hostname:port', user:
|
29
|
+
conn = Etcdv3.new(url: 'https://hostname:port', user: 'root', password: 'mysecretpassword')
|
30
30
|
|
31
31
|
# Secure connection specifying own certificates
|
32
32
|
# Coming soon...
|
@@ -35,19 +35,19 @@ conn = Etcdv3.new(url: 'https://hostname:port', user: "gary", password: "secret"
|
|
35
35
|
## Adding, Fetching and Deleting Keys
|
36
36
|
```ruby
|
37
37
|
# Put
|
38
|
-
conn.put(
|
38
|
+
conn.put('foo', 'bar')
|
39
39
|
|
40
40
|
# Get
|
41
|
-
conn.get(
|
41
|
+
conn.get('my')
|
42
42
|
|
43
43
|
# Get Key Range
|
44
|
-
conn.get('
|
44
|
+
conn.get('foo', range_end: 'foo80')
|
45
45
|
|
46
46
|
# Delete Key
|
47
|
-
conn.del('
|
47
|
+
conn.del('foo')
|
48
48
|
|
49
49
|
# Delete Key Range
|
50
|
-
conn.del('
|
50
|
+
conn.del('foo', range_end: 'foo80')
|
51
51
|
```
|
52
52
|
|
53
53
|
## User Management
|
@@ -58,20 +58,23 @@ conn.user_add('admin', 'secret')
|
|
58
58
|
# Delete User
|
59
59
|
conn.user_delete('admin')
|
60
60
|
|
61
|
-
#
|
61
|
+
# Get User
|
62
|
+
conn.user_get('admin')
|
63
|
+
|
64
|
+
# List Users
|
62
65
|
conn.user_list
|
63
66
|
```
|
64
67
|
|
65
68
|
## Role Management
|
66
69
|
```ruby
|
67
70
|
# Add Role
|
68
|
-
conn.role_add('
|
71
|
+
conn.role_add('admin')
|
69
72
|
|
70
73
|
# Grant Permission to Role
|
71
|
-
conn.role_grant_permission('
|
74
|
+
conn.role_grant_permission('admin', :readwrite, 'foo', 'foo99')
|
72
75
|
|
73
76
|
# Delete Role
|
74
|
-
conn.role_delete('
|
77
|
+
conn.role_delete('admin')
|
75
78
|
|
76
79
|
# List Roles
|
77
80
|
conn.role_list
|
@@ -82,7 +85,7 @@ conn.role_list
|
|
82
85
|
# Configure a root user
|
83
86
|
conn.user_add('root', 'mysecretpassword')
|
84
87
|
|
85
|
-
# Grant root
|
88
|
+
# Grant root role to root user
|
86
89
|
conn.user_grant_role('root', 'root')
|
87
90
|
|
88
91
|
# Enable Authentication
|
@@ -104,7 +107,7 @@ conn.auth_disable
|
|
104
107
|
conn.lease_grant(100)
|
105
108
|
|
106
109
|
# Attach key to lease
|
107
|
-
conn.put(
|
110
|
+
conn.put('foo', 'bar', lease_id: 1234566789)
|
108
111
|
|
109
112
|
# Get information about lease and its attached keys
|
110
113
|
conn.lease_ttl(1234566789)
|
@@ -116,10 +119,10 @@ conn.lease_revoke(1234566789)
|
|
116
119
|
## Watch
|
117
120
|
```ruby
|
118
121
|
# Watch for changes on a specified key and return
|
119
|
-
events = conn.watch('
|
122
|
+
events = conn.watch('foo')
|
120
123
|
|
121
124
|
# Watch for changes on a specified key range and return
|
122
|
-
events = conn.watch('
|
125
|
+
events = conn.watch('foo', range_end: 'fop')
|
123
126
|
|
124
127
|
# Watches for changes continuously until killed.
|
125
128
|
event_count = 0
|
data/lib/etcdv3/request.rb
CHANGED
@@ -1,35 +1,53 @@
|
|
1
|
+
require 'base64'
|
1
2
|
class Etcdv3
|
2
3
|
class Request
|
3
4
|
|
4
|
-
|
5
|
+
HANDLERS = {
|
6
|
+
auth: Etcdv3::Auth,
|
7
|
+
kv: Etcdv3::KV,
|
8
|
+
maintenance: Etcdv3::Maintenance,
|
9
|
+
lease: Etcdv3::Lease,
|
10
|
+
watch: Etcdv3::Watch
|
11
|
+
}
|
5
12
|
|
6
|
-
|
7
|
-
|
8
|
-
|
13
|
+
attr_reader :user, :password, :token
|
14
|
+
|
15
|
+
def initialize(hostname, credentials)
|
16
|
+
@user, @password, @token = nil, nil, nil
|
17
|
+
@hostname = hostname
|
18
|
+
@credentials = credentials
|
19
|
+
@handlers = handler_map
|
9
20
|
end
|
10
21
|
|
11
|
-
def handle(stub, method, method_args=[])
|
22
|
+
def handle(stub, method, method_args=[], retries: 1)
|
12
23
|
@handlers.fetch(stub).send(method, *method_args)
|
24
|
+
rescue GRPC::Unauthenticated => exception
|
25
|
+
# Regenerate token in the event it expires.
|
26
|
+
if exception.details == 'etcdserver: invalid auth token'
|
27
|
+
if retries > 0
|
28
|
+
authenticate(@user, @password)
|
29
|
+
return handle(stub, method, method_args, retries: retries - 1)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
raise exception
|
33
|
+
end
|
34
|
+
|
35
|
+
def authenticate(user, password)
|
36
|
+
# Attempt to generate token using user and password.
|
37
|
+
@token = handle(:auth, 'generate_token', [user, password])
|
38
|
+
@user = user
|
39
|
+
@password = password
|
40
|
+
@handlers = handler_map(token: @token)
|
13
41
|
end
|
14
42
|
|
15
43
|
private
|
16
44
|
|
17
|
-
def handler_map(
|
45
|
+
def handler_map(metadata={})
|
18
46
|
Hash[
|
19
|
-
|
20
|
-
[key, klass.new(hostname, credentials, metadata)]
|
47
|
+
HANDLERS.map do |key, klass|
|
48
|
+
[key, klass.new(@hostname, @credentials, metadata)]
|
21
49
|
end
|
22
50
|
]
|
23
51
|
end
|
24
|
-
|
25
|
-
def handler_constants
|
26
|
-
{
|
27
|
-
auth: Etcdv3::Auth,
|
28
|
-
kv: Etcdv3::KV,
|
29
|
-
maintenance: Etcdv3::Maintenance,
|
30
|
-
lease: Etcdv3::Lease,
|
31
|
-
watch: Etcdv3::Watch
|
32
|
-
}
|
33
|
-
end
|
34
52
|
end
|
35
53
|
end
|
data/lib/etcdv3/version.rb
CHANGED
data/lib/etcdv3.rb
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
|
2
2
|
require 'grpc'
|
3
3
|
require 'uri'
|
4
|
-
require 'base64'
|
5
4
|
|
6
5
|
require 'etcdv3/etcdrpc/rpc_services_pb'
|
7
6
|
require 'etcdv3/auth'
|
8
7
|
require 'etcdv3/kv'
|
9
8
|
require 'etcdv3/maintenance'
|
10
9
|
require 'etcdv3/lease'
|
11
|
-
require 'etcdv3/request'
|
12
10
|
require 'etcdv3/watch'
|
13
11
|
|
12
|
+
require 'etcdv3/request'
|
13
|
+
|
14
14
|
class Etcdv3
|
15
15
|
|
16
16
|
attr_reader :credentials, :options
|
@@ -31,24 +31,22 @@ class Etcdv3
|
|
31
31
|
uri.hostname
|
32
32
|
end
|
33
33
|
|
34
|
-
def token
|
35
|
-
@metadata[:token]
|
36
|
-
end
|
37
|
-
|
38
34
|
def user
|
39
|
-
|
35
|
+
request.user
|
40
36
|
end
|
41
37
|
|
42
38
|
def password
|
43
|
-
|
39
|
+
request.password
|
40
|
+
end
|
41
|
+
|
42
|
+
def token
|
43
|
+
request.token
|
44
44
|
end
|
45
45
|
|
46
46
|
def initialize(options = {})
|
47
47
|
@options = options
|
48
48
|
@credentials = resolve_credentials
|
49
|
-
|
50
|
-
@metadata[:token] = generate_token(user, password) unless user.nil?
|
51
|
-
@metacache = set_metacache
|
49
|
+
authenticate(options[:user], options[:password]) unless options[:user].nil?
|
52
50
|
end
|
53
51
|
|
54
52
|
# Version of Etcd running on member
|
@@ -77,33 +75,23 @@ class Etcdv3
|
|
77
75
|
end
|
78
76
|
|
79
77
|
# Authenticate using specified user and password.
|
80
|
-
# On successful authentication, an auth token will be assigned to the instance.
|
78
|
+
# On successful authentication, an auth token will be assigned to the request instance.
|
81
79
|
def authenticate(user, password)
|
82
|
-
|
83
|
-
return false unless token
|
84
|
-
@metadata[:token] = token
|
85
|
-
@options[:user] = user
|
86
|
-
@options[:password] = password
|
87
|
-
@metacache = set_metacache
|
88
|
-
true
|
80
|
+
request.authenticate(user, password)
|
89
81
|
end
|
90
82
|
|
91
83
|
# Enables authentication.
|
92
84
|
def auth_enable
|
93
85
|
request.handle(:auth, 'auth_enable')
|
86
|
+
true
|
94
87
|
end
|
95
88
|
|
96
89
|
# Disables authentication.
|
97
90
|
# This will clear any active auth / token data.
|
98
91
|
def auth_disable
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
@options[:user] = nil
|
103
|
-
@options[:password] = nil
|
104
|
-
@metacache = set_metacache
|
105
|
-
end
|
106
|
-
response
|
92
|
+
request.handle(:auth, 'auth_disable')
|
93
|
+
request(reset: true)
|
94
|
+
true
|
107
95
|
end
|
108
96
|
|
109
97
|
# key - string
|
@@ -219,19 +207,9 @@ class Etcdv3
|
|
219
207
|
|
220
208
|
private
|
221
209
|
|
222
|
-
def request
|
223
|
-
|
224
|
-
|
225
|
-
@request = Request.new("#{hostname}:#{port}", @credentials, @metadata, @metacache)
|
226
|
-
end
|
227
|
-
|
228
|
-
# Generates a new hash using a base64 of the metadata.
|
229
|
-
def set_metacache
|
230
|
-
Base64.strict_encode64(@metadata.to_s)
|
231
|
-
end
|
232
|
-
|
233
|
-
def generate_token(user, password)
|
234
|
-
request.handle(:auth, 'generate_token', [user, password])
|
210
|
+
def request(reset: false)
|
211
|
+
return @request if @request && !reset
|
212
|
+
@request = Request.new("#{hostname}:#{port}", @credentials)
|
235
213
|
end
|
236
214
|
|
237
215
|
def resolve_credentials
|
data/spec/etcdv3_spec.rb
CHANGED
@@ -201,7 +201,7 @@ describe Etcdv3 do
|
|
201
201
|
end
|
202
202
|
after { conn.user_delete('root') }
|
203
203
|
subject { conn.auth_disable }
|
204
|
-
it { is_expected.to
|
204
|
+
it { is_expected.to eq(true) }
|
205
205
|
end
|
206
206
|
|
207
207
|
describe '#auth_enable' do
|
@@ -215,7 +215,7 @@ describe Etcdv3 do
|
|
215
215
|
conn.user_delete('root')
|
216
216
|
end
|
217
217
|
subject { conn.auth_enable }
|
218
|
-
it { is_expected.to
|
218
|
+
it { is_expected.to eq(true) }
|
219
219
|
end
|
220
220
|
|
221
221
|
describe "#authenticate" do
|
@@ -243,32 +243,5 @@ describe Etcdv3 do
|
|
243
243
|
end
|
244
244
|
end
|
245
245
|
end
|
246
|
-
|
247
|
-
describe '#metacache' do
|
248
|
-
context 'uses cached request object' do
|
249
|
-
let!(:object_id) { conn.send(:request).object_id }
|
250
|
-
before { conn.user_add('root', 'test') }
|
251
|
-
after { conn.user_delete('root') }
|
252
|
-
subject { conn.send(:request).object_id }
|
253
|
-
it { is_expected.to eq(object_id) }
|
254
|
-
end
|
255
|
-
context 'resets cache on auth' do
|
256
|
-
let!(:object_id) { conn.send(:request).object_id }
|
257
|
-
before do
|
258
|
-
conn.user_add('root', 'test')
|
259
|
-
conn.user_grant_role('root', 'root')
|
260
|
-
conn.auth_enable
|
261
|
-
conn.authenticate('root', 'test')
|
262
|
-
conn.user_add('boom', 'password')
|
263
|
-
end
|
264
|
-
after do
|
265
|
-
conn.auth_disable
|
266
|
-
conn.user_delete('root')
|
267
|
-
conn.user_delete('boom')
|
268
|
-
end
|
269
|
-
subject { conn.send(:request).object_id }
|
270
|
-
it { is_expected.to_not eq(object_id) }
|
271
|
-
end
|
272
|
-
end
|
273
246
|
end
|
274
247
|
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.5.
|
4
|
+
version: 0.5.2
|
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-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: grpc
|