etcdv3 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +13 -13
- data/lib/etcdv3.rb +78 -79
- data/lib/etcdv3/auth.rb +59 -59
- data/lib/etcdv3/kv.rb +6 -6
- data/lib/etcdv3/lease.rb +4 -2
- data/lib/etcdv3/maintenance.rb +5 -4
- data/lib/etcdv3/request.rb +18 -28
- data/lib/etcdv3/version.rb +1 -1
- data/lib/etcdv3/watch.rb +1 -2
- data/spec/etcdv3/auth_spec.rb +44 -44
- data/spec/etcdv3/kv_spec.rb +1 -1
- data/spec/etcdv3/lease_spec.rb +6 -6
- data/spec/etcdv3/maintenance_spec.rb +1 -1
- data/spec/etcdv3_spec.rb +65 -65
- 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: c30c373c3727bf2bf9fb11361e12c868f23b0c63
|
4
|
+
data.tar.gz: bf013c81510a227345e7cb8924a80ceb5549cf3e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1f58b5adcdb86fafa2cbc5e924e1406d71d4e26988a5000211870e54b48dfa9a8f72cd663dcfc09dcfe9507b60cf8d6d337fe284e41bc85361486787407748ad
|
7
|
+
data.tar.gz: b6c432b3e2963cc7cb20b2c1151d27c55da1022094fb3047ff685b9de129ce8ffd16f8ee0dc35eec7942fdeaca454ddef986fe551e6f44bd57428ac1a75e927d
|
data/README.md
CHANGED
@@ -7,7 +7,7 @@ Ruby client for Etcd V3
|
|
7
7
|
|
8
8
|
## Getting Started
|
9
9
|
|
10
|
-
[RubyDocs](http://www.rubydoc.info/gems/etcdv3
|
10
|
+
[RubyDocs](http://www.rubydoc.info/gems/etcdv3)
|
11
11
|
|
12
12
|
To install etcdv3, run the following command:
|
13
13
|
```ruby
|
@@ -53,10 +53,10 @@ conn = Etcdv3.new(url: 'https://hostname:port', user: "gary", password: "secret"
|
|
53
53
|
## User Management
|
54
54
|
```ruby
|
55
55
|
# Add User
|
56
|
-
conn.
|
56
|
+
conn.user_add('admin', 'secret')
|
57
57
|
|
58
58
|
# Delete User
|
59
|
-
conn.
|
59
|
+
conn.user_delete('admin')
|
60
60
|
|
61
61
|
# List users
|
62
62
|
conn.user_list
|
@@ -65,13 +65,13 @@ conn.user_list
|
|
65
65
|
## Role Management
|
66
66
|
```ruby
|
67
67
|
# Add Role
|
68
|
-
conn.
|
68
|
+
conn.role_add('rolename')
|
69
69
|
|
70
70
|
# Grant Permission to Role
|
71
|
-
conn.
|
71
|
+
conn.role_grant_permission('rolename', :readwrite, 'a', 'z')
|
72
72
|
|
73
73
|
# Delete Role
|
74
|
-
conn.
|
74
|
+
conn.role_delete('rolename')
|
75
75
|
|
76
76
|
# List Roles
|
77
77
|
conn.role_list
|
@@ -80,13 +80,13 @@ conn.role_list
|
|
80
80
|
## Authentication Management
|
81
81
|
```ruby
|
82
82
|
# Configure a root user
|
83
|
-
conn.
|
83
|
+
conn.user_add('root', 'mysecretpassword')
|
84
84
|
|
85
85
|
# Grant root user the root role
|
86
|
-
conn.
|
86
|
+
conn.user_grant_role('root', 'root')
|
87
87
|
|
88
88
|
# Enable Authentication
|
89
|
-
conn.
|
89
|
+
conn.auth_enable
|
90
90
|
```
|
91
91
|
After you enable authentication, you must authenticate.
|
92
92
|
```ruby
|
@@ -95,13 +95,13 @@ conn.authenticate('root', 'mysecretpassword')
|
|
95
95
|
```
|
96
96
|
Disabling auth will clear the auth token and all previously attached user information
|
97
97
|
```
|
98
|
-
conn.
|
98
|
+
conn.auth_disable
|
99
99
|
```
|
100
100
|
|
101
101
|
## Leases
|
102
102
|
```ruby
|
103
103
|
# Grant a lease with a 100 second TTL
|
104
|
-
conn.
|
104
|
+
conn.lease_grant(100)
|
105
105
|
|
106
106
|
# Attach key to lease
|
107
107
|
conn.put("testkey", "testvalue", lease_id: 1234566789)
|
@@ -110,7 +110,7 @@ conn.put("testkey", "testvalue", lease_id: 1234566789)
|
|
110
110
|
conn.lease_ttl(1234566789)
|
111
111
|
|
112
112
|
# Revoke lease and delete all keys attached
|
113
|
-
conn.
|
113
|
+
conn.lease_revoke(1234566789)
|
114
114
|
```
|
115
115
|
|
116
116
|
## Watch
|
@@ -136,5 +136,5 @@ end
|
|
136
136
|
conn.alarm_list
|
137
137
|
|
138
138
|
# Deactivate ALL active Alarms
|
139
|
-
conn.
|
139
|
+
conn.alarm_deactivate
|
140
140
|
```
|
data/lib/etcdv3.rb
CHANGED
@@ -66,24 +66,44 @@ class Etcdv3
|
|
66
66
|
request.handle(:maintenance, 'member_status').leader
|
67
67
|
end
|
68
68
|
|
69
|
-
# Watches for changes on a specified key range.
|
70
|
-
def watch(key, range_end: '', &block)
|
71
|
-
request.handle(:watch, 'watch', [key, range_end, block])
|
72
|
-
end
|
73
|
-
|
74
69
|
# List active alarms
|
75
70
|
def alarm_list
|
76
71
|
request.handle(:maintenance, 'alarms', [:get, leader_id])
|
77
72
|
end
|
78
73
|
|
79
74
|
# Disarm alarms on a specified member.
|
80
|
-
def
|
75
|
+
def alarm_deactivate
|
81
76
|
request.handle(:maintenance, 'alarms', [:deactivate, leader_id])
|
82
77
|
end
|
83
78
|
|
84
|
-
#
|
85
|
-
|
86
|
-
|
79
|
+
# Authenticate using specified user and password.
|
80
|
+
# On successful authentication, an auth token will be assigned to the instance.
|
81
|
+
def authenticate(user, password)
|
82
|
+
token = generate_token(user, password)
|
83
|
+
return false unless token
|
84
|
+
@metadata[:token] = token
|
85
|
+
@options[:user] = user
|
86
|
+
@options[:password] = password
|
87
|
+
@metacache = set_metacache
|
88
|
+
true
|
89
|
+
end
|
90
|
+
|
91
|
+
# Enables authentication.
|
92
|
+
def auth_enable
|
93
|
+
request.handle(:auth, 'auth_enable')
|
94
|
+
end
|
95
|
+
|
96
|
+
# Disables authentication.
|
97
|
+
# This will clear any active auth / token data.
|
98
|
+
def auth_disable
|
99
|
+
response = request.handle(:auth, 'auth_disable')
|
100
|
+
if response
|
101
|
+
@metadata.delete(:token)
|
102
|
+
@options[:user] = nil
|
103
|
+
@options[:password] = nil
|
104
|
+
@metacache = set_metacache
|
105
|
+
end
|
106
|
+
response
|
87
107
|
end
|
88
108
|
|
89
109
|
# key - string
|
@@ -103,19 +123,24 @@ class Etcdv3
|
|
103
123
|
request.handle(:kv, 'get', [key, opts])
|
104
124
|
end
|
105
125
|
|
126
|
+
# Inserts a new key.
|
127
|
+
def put(key, value, lease_id: nil)
|
128
|
+
request.handle(:kv, 'put', [key, value, lease_id])
|
129
|
+
end
|
130
|
+
|
106
131
|
# Deletes a specified key
|
107
132
|
def del(key, range_end: '')
|
108
133
|
request.handle(:kv, 'del', [key, range_end])
|
109
134
|
end
|
110
135
|
|
111
136
|
# Grant a lease with a specified TTL
|
112
|
-
def
|
113
|
-
request.handle(:lease, '
|
137
|
+
def lease_grant(ttl)
|
138
|
+
request.handle(:lease, 'lease_grant', [ttl])
|
114
139
|
end
|
115
140
|
|
116
141
|
# Revokes lease and delete all attached keys
|
117
|
-
def
|
118
|
-
request.handle(:lease, '
|
142
|
+
def lease_revoke(id)
|
143
|
+
request.handle(:lease, 'lease_revoke', [id])
|
119
144
|
end
|
120
145
|
|
121
146
|
# Returns information regarding the current state of the lease
|
@@ -123,99 +148,73 @@ class Etcdv3
|
|
123
148
|
request.handle(:lease, 'lease_ttl', [id])
|
124
149
|
end
|
125
150
|
|
126
|
-
# Creates new user.
|
127
|
-
def add_user(user, password)
|
128
|
-
request.handle(:auth, 'add_user', [user, password])
|
129
|
-
end
|
130
|
-
|
131
|
-
# Fetch specified user
|
132
|
-
def get_user(user)
|
133
|
-
request.handle(:auth, 'get_user', [user])
|
134
|
-
end
|
135
|
-
|
136
|
-
# Delete specified user.
|
137
|
-
def delete_user(user)
|
138
|
-
request.handle(:auth, 'delete_user', [user])
|
139
|
-
end
|
140
|
-
|
141
|
-
# Changes the specified users password.
|
142
|
-
def change_user_password(user, new_password)
|
143
|
-
request.handle(:auth, 'change_user_password', [user, new_password])
|
144
|
-
end
|
145
|
-
|
146
|
-
# List all users.
|
147
|
-
def user_list
|
148
|
-
request.handle(:auth, 'user_list')
|
149
|
-
end
|
150
|
-
|
151
151
|
# List all roles.
|
152
152
|
def role_list
|
153
153
|
request.handle(:auth, 'role_list')
|
154
154
|
end
|
155
155
|
|
156
156
|
# Add role with specified name.
|
157
|
-
def
|
158
|
-
request.handle(:auth, '
|
157
|
+
def role_add(name)
|
158
|
+
request.handle(:auth, 'role_add', [name])
|
159
159
|
end
|
160
160
|
|
161
161
|
# Fetches a specified role.
|
162
|
-
def
|
163
|
-
request.handle(:auth, '
|
162
|
+
def role_get(name)
|
163
|
+
request.handle(:auth, 'role_get', [name])
|
164
164
|
end
|
165
165
|
|
166
166
|
# Delete role.
|
167
|
-
def
|
168
|
-
request.handle(:auth, '
|
167
|
+
def role_delete(name)
|
168
|
+
request.handle(:auth, 'role_delete', [name])
|
169
169
|
end
|
170
170
|
|
171
|
-
# Grants
|
172
|
-
def
|
173
|
-
request.handle(:auth, '
|
171
|
+
# Grants a new permission to an existing role.
|
172
|
+
def role_grant_permission(name, permission, key, range_end='')
|
173
|
+
request.handle(:auth, 'role_grant_permission', [name, permission, key, range_end])
|
174
174
|
end
|
175
175
|
|
176
|
-
|
177
|
-
|
178
|
-
request.handle(:auth, 'revoke_role_from_user', [user, role])
|
176
|
+
def role_revoke_permission(name, permission, key, range_end='')
|
177
|
+
request.handle(:auth, 'role_revoke_permission', [name, permission, key, range_end])
|
179
178
|
end
|
180
179
|
|
181
|
-
#
|
182
|
-
def
|
183
|
-
request.handle(:auth, '
|
180
|
+
# Fetch specified user
|
181
|
+
def user_get(user)
|
182
|
+
request.handle(:auth, 'user_get', [user])
|
184
183
|
end
|
185
184
|
|
186
|
-
|
187
|
-
|
185
|
+
# Creates new user.
|
186
|
+
def user_add(user, password)
|
187
|
+
request.handle(:auth, 'user_add', [user, password])
|
188
188
|
end
|
189
189
|
|
190
|
-
#
|
191
|
-
def
|
192
|
-
request.handle(:auth, '
|
190
|
+
# Delete specified user.
|
191
|
+
def user_delete(user)
|
192
|
+
request.handle(:auth, 'user_delete', [user])
|
193
193
|
end
|
194
194
|
|
195
|
-
#
|
196
|
-
|
197
|
-
|
198
|
-
response = request.handle(:auth, 'disable_auth')
|
199
|
-
if response
|
200
|
-
@metadata.delete(:token)
|
201
|
-
@options[:user] = nil
|
202
|
-
@options[:password] = nil
|
203
|
-
@metacache = set_metacache
|
204
|
-
end
|
205
|
-
response
|
195
|
+
# Changes the specified users password.
|
196
|
+
def user_change_password(user, new_password)
|
197
|
+
request.handle(:auth, 'user_change_password', [user, new_password])
|
206
198
|
end
|
207
199
|
|
208
|
-
#
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
return false unless token
|
213
|
-
@metadata[:token] = token
|
214
|
-
@options[:user] = user
|
215
|
-
@options[:password] = password
|
216
|
-
@metacache = set_metacache
|
200
|
+
# List all users.
|
201
|
+
def user_list
|
202
|
+
request.handle(:auth, 'user_list')
|
203
|
+
end
|
217
204
|
|
218
|
-
|
205
|
+
# Grants role to an existing user.
|
206
|
+
def user_grant_role(user, role)
|
207
|
+
request.handle(:auth, 'user_grant_role', [user, role])
|
208
|
+
end
|
209
|
+
|
210
|
+
# Revokes role from a specified user.
|
211
|
+
def user_revoke_role(user, role)
|
212
|
+
request.handle(:auth, 'user_revoke_role', [user, role])
|
213
|
+
end
|
214
|
+
|
215
|
+
# Watches for changes on a specified key range.
|
216
|
+
def watch(key, range_end: '', &block)
|
217
|
+
request.handle(:watch, 'watch', [key, range_end, block])
|
219
218
|
end
|
220
219
|
|
221
220
|
private
|
data/lib/etcdv3/auth.rb
CHANGED
@@ -3,9 +3,9 @@ class Etcdv3
|
|
3
3
|
class Auth
|
4
4
|
|
5
5
|
PERMISSIONS = {
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
:read => Authpb::Permission::Type::READ,
|
7
|
+
:write => Authpb::Permission::Type::WRITE,
|
8
|
+
:readwrite => Authpb::Permission::Type::READWRITE
|
9
9
|
}
|
10
10
|
|
11
11
|
def initialize(hostname, credentials, metadata = {})
|
@@ -13,71 +13,32 @@ class Etcdv3
|
|
13
13
|
@metadata = metadata
|
14
14
|
end
|
15
15
|
|
16
|
-
def
|
17
|
-
request = Etcdserverpb::
|
18
|
-
|
19
|
-
password: password
|
20
|
-
)
|
21
|
-
@stub.authenticate(request).token
|
22
|
-
end
|
23
|
-
|
24
|
-
def user_list
|
25
|
-
request = Etcdserverpb::AuthUserListRequest.new
|
26
|
-
@stub.user_list(request, metadata: @metadata)
|
27
|
-
end
|
28
|
-
|
29
|
-
def add_user(user, password)
|
30
|
-
request = Etcdserverpb::AuthUserAddRequest.new(
|
31
|
-
name: user,
|
32
|
-
password: password
|
33
|
-
)
|
34
|
-
@stub.user_add(request, metadata: @metadata)
|
35
|
-
end
|
36
|
-
|
37
|
-
def delete_user(user)
|
38
|
-
request = Etcdserverpb::AuthUserDeleteRequest.new(name: user)
|
39
|
-
@stub.user_delete(request)
|
40
|
-
end
|
41
|
-
|
42
|
-
def get_user(user)
|
43
|
-
request = Etcdserverpb::AuthUserGetRequest.new(name: user)
|
44
|
-
@stub.user_get(request)
|
16
|
+
def auth_enable
|
17
|
+
request = Etcdserverpb::AuthEnableRequest.new
|
18
|
+
@stub.auth_enable(request)
|
45
19
|
end
|
46
20
|
|
47
|
-
def
|
48
|
-
request = Etcdserverpb::
|
49
|
-
|
50
|
-
password: new_password
|
51
|
-
)
|
52
|
-
@stub.user_change_password(request, metadata: @metadata)
|
21
|
+
def auth_disable
|
22
|
+
request = Etcdserverpb::AuthDisableRequest.new
|
23
|
+
@stub.auth_disable(request, metadata: @metadata)
|
53
24
|
end
|
54
25
|
|
55
|
-
def
|
26
|
+
def role_add(name)
|
56
27
|
request = Etcdserverpb::AuthRoleAddRequest.new(name: name)
|
57
28
|
@stub.role_add(request, metadata: @metadata)
|
58
29
|
end
|
59
30
|
|
60
|
-
def
|
31
|
+
def role_get(name)
|
61
32
|
request = Etcdserverpb::AuthRoleGetRequest.new(role: name)
|
62
33
|
@stub.role_get(request, metadata: @metadata)
|
63
34
|
end
|
64
35
|
|
65
|
-
def
|
36
|
+
def role_delete(name)
|
66
37
|
request = Etcdserverpb::AuthRoleDeleteRequest.new(role: name)
|
67
38
|
@stub.role_delete(request, metadata: @metadata)
|
68
39
|
end
|
69
40
|
|
70
|
-
def
|
71
|
-
request = Etcdserverpb::AuthUserGrantRoleRequest.new(user: user, role: role)
|
72
|
-
@stub.user_grant_role(request, metadata: @metadata)
|
73
|
-
end
|
74
|
-
|
75
|
-
def revoke_role_from_user(user, role)
|
76
|
-
request = Etcdserverpb::AuthUserRevokeRoleRequest.new(name: user, role: role)
|
77
|
-
@stub.user_revoke_role(request, metadata: @metadata)
|
78
|
-
end
|
79
|
-
|
80
|
-
def grant_permission_to_role(name, permission, key, range_end)
|
41
|
+
def role_grant_permission(name, permission, key, range_end)
|
81
42
|
permission = Authpb::Permission.new(
|
82
43
|
permType: Etcdv3::Auth::PERMISSIONS[permission], key: key, range_end: range_end
|
83
44
|
)
|
@@ -90,7 +51,7 @@ class Etcdv3
|
|
90
51
|
)
|
91
52
|
end
|
92
53
|
|
93
|
-
def
|
54
|
+
def role_revoke_permission(name, permission, key, range_end)
|
94
55
|
@stub.role_revoke_permission(
|
95
56
|
Etcdserverpb::AuthRoleRevokePermissionRequest.new(
|
96
57
|
role: name,
|
@@ -106,14 +67,53 @@ class Etcdv3
|
|
106
67
|
@stub.role_list(request, metadata: @metadata)
|
107
68
|
end
|
108
69
|
|
109
|
-
def
|
110
|
-
request = Etcdserverpb::
|
111
|
-
@stub.
|
70
|
+
def user_list
|
71
|
+
request = Etcdserverpb::AuthUserListRequest.new
|
72
|
+
@stub.user_list(request, metadata: @metadata)
|
112
73
|
end
|
113
74
|
|
114
|
-
def
|
115
|
-
request = Etcdserverpb::
|
116
|
-
|
75
|
+
def user_add(user, password)
|
76
|
+
request = Etcdserverpb::AuthUserAddRequest.new(
|
77
|
+
name: user,
|
78
|
+
password: password
|
79
|
+
)
|
80
|
+
@stub.user_add(request, metadata: @metadata)
|
81
|
+
end
|
82
|
+
|
83
|
+
def user_delete(user)
|
84
|
+
request = Etcdserverpb::AuthUserDeleteRequest.new(name: user)
|
85
|
+
@stub.user_delete(request)
|
86
|
+
end
|
87
|
+
|
88
|
+
def user_get(user)
|
89
|
+
request = Etcdserverpb::AuthUserGetRequest.new(name: user)
|
90
|
+
@stub.user_get(request)
|
91
|
+
end
|
92
|
+
|
93
|
+
def user_change_password(user, new_password)
|
94
|
+
request = Etcdserverpb::AuthUserChangePasswordRequest.new(
|
95
|
+
name: user,
|
96
|
+
password: new_password
|
97
|
+
)
|
98
|
+
@stub.user_change_password(request, metadata: @metadata)
|
99
|
+
end
|
100
|
+
|
101
|
+
def user_grant_role(user, role)
|
102
|
+
request = Etcdserverpb::AuthUserGrantRoleRequest.new(user: user, role: role)
|
103
|
+
@stub.user_grant_role(request, metadata: @metadata)
|
104
|
+
end
|
105
|
+
|
106
|
+
def user_revoke_role(user, role)
|
107
|
+
request = Etcdserverpb::AuthUserRevokeRoleRequest.new(name: user, role: role)
|
108
|
+
@stub.user_revoke_role(request, metadata: @metadata)
|
109
|
+
end
|
110
|
+
|
111
|
+
def generate_token(user, password)
|
112
|
+
request = Etcdserverpb::AuthenticateRequest.new(
|
113
|
+
name: user,
|
114
|
+
password: password
|
115
|
+
)
|
116
|
+
@stub.authenticate(request).token
|
117
117
|
end
|
118
118
|
|
119
119
|
end
|
data/lib/etcdv3/kv.rb
CHANGED
@@ -21,12 +21,6 @@ class Etcdv3
|
|
21
21
|
@metadata = metadata
|
22
22
|
end
|
23
23
|
|
24
|
-
def put(key, value, lease=nil)
|
25
|
-
kv = Etcdserverpb::PutRequest.new(key: key, value: value)
|
26
|
-
kv.lease = lease if lease
|
27
|
-
@stub.put(kv, metadata: @metadata)
|
28
|
-
end
|
29
|
-
|
30
24
|
def get(key, opts={})
|
31
25
|
opts[:sort_order] = SORT_ORDER[opts[:sort_order]] \
|
32
26
|
if opts[:sort_order]
|
@@ -44,5 +38,11 @@ class Etcdv3
|
|
44
38
|
)
|
45
39
|
@stub.delete_range(request, metadata: @metadata)
|
46
40
|
end
|
41
|
+
|
42
|
+
def put(key, value, lease=nil)
|
43
|
+
kv = Etcdserverpb::PutRequest.new(key: key, value: value)
|
44
|
+
kv.lease = lease if lease
|
45
|
+
@stub.put(kv, metadata: @metadata)
|
46
|
+
end
|
47
47
|
end
|
48
48
|
end
|
data/lib/etcdv3/lease.rb
CHANGED
@@ -6,12 +6,12 @@ class Etcdv3
|
|
6
6
|
@metadata = metadata
|
7
7
|
end
|
8
8
|
|
9
|
-
def
|
9
|
+
def lease_grant(ttl)
|
10
10
|
request = Etcdserverpb::LeaseGrantRequest.new(TTL: ttl)
|
11
11
|
@stub.lease_grant(request, metadata: @metadata)
|
12
12
|
end
|
13
13
|
|
14
|
-
def
|
14
|
+
def lease_revoke(id)
|
15
15
|
request = Etcdserverpb::LeaseRevokeRequest.new(ID: id)
|
16
16
|
@stub.lease_revoke(request, metadata: @metadata)
|
17
17
|
end
|
@@ -21,5 +21,7 @@ class Etcdv3
|
|
21
21
|
@stub.lease_time_to_live(request, metadata: @metadata)
|
22
22
|
end
|
23
23
|
|
24
|
+
|
25
|
+
|
24
26
|
end
|
25
27
|
end
|
data/lib/etcdv3/maintenance.rb
CHANGED
@@ -17,10 +17,6 @@ class Etcdv3
|
|
17
17
|
@metadata = metadata
|
18
18
|
end
|
19
19
|
|
20
|
-
def member_status
|
21
|
-
@stub.status(Etcdserverpb::StatusRequest.new, metadata: @metadata)
|
22
|
-
end
|
23
|
-
|
24
20
|
def alarms(action, member_id, alarm=:NONE)
|
25
21
|
alarm = ALARM_TYPES[alarm]
|
26
22
|
request = Etcdserverpb::AlarmRequest.new(
|
@@ -30,5 +26,10 @@ class Etcdv3
|
|
30
26
|
)
|
31
27
|
@stub.alarm(request)
|
32
28
|
end
|
29
|
+
|
30
|
+
def member_status
|
31
|
+
@stub.status(Etcdserverpb::StatusRequest.new, metadata: @metadata)
|
32
|
+
end
|
33
|
+
|
33
34
|
end
|
34
35
|
end
|
data/lib/etcdv3/request.rb
CHANGED
@@ -3,43 +3,33 @@ class Etcdv3
|
|
3
3
|
|
4
4
|
attr_reader :metacache
|
5
5
|
|
6
|
-
def initialize(hostname, credentials, metadata, metacache)
|
7
|
-
@hostname
|
8
|
-
@credentials = credentials
|
9
|
-
@metadata = metadata
|
6
|
+
def initialize(hostname, credentials, metadata, metacache='')
|
7
|
+
@handlers ||= handler_map(hostname, credentials, metadata)
|
10
8
|
@metacache = metacache
|
11
9
|
end
|
12
10
|
|
13
|
-
def handle(
|
14
|
-
|
15
|
-
interface.send(method, *method_args)
|
11
|
+
def handle(stub, method, method_args=[])
|
12
|
+
@handlers.fetch(stub).send(method, *method_args)
|
16
13
|
end
|
17
14
|
|
18
15
|
private
|
19
16
|
|
20
|
-
def
|
21
|
-
|
17
|
+
def handler_map(hostname, credentials, metadata)
|
18
|
+
Hash[
|
19
|
+
handler_constants.map do |key, klass|
|
20
|
+
[key, klass.new(hostname, credentials, metadata)]
|
21
|
+
end
|
22
|
+
]
|
22
23
|
end
|
23
24
|
|
24
|
-
def
|
25
|
-
|
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
|
+
}
|
26
33
|
end
|
27
|
-
|
28
|
-
def kv
|
29
|
-
@kv ||= Etcdv3::KV.new(@hostname, @credentials, @metadata)
|
30
|
-
end
|
31
|
-
|
32
|
-
def maintenance
|
33
|
-
@maintenance ||= Etcdv3::Maintenance.new(@hostname, @credentials, @metadata)
|
34
|
-
end
|
35
|
-
|
36
|
-
def lease
|
37
|
-
@lease ||= Etcdv3::Lease.new(@hostname, @credentials, @metadata)
|
38
|
-
end
|
39
|
-
|
40
|
-
def watch
|
41
|
-
@watch ||= Etcdv3::Watch.new(@hostname, @credentials, @metadata)
|
42
|
-
end
|
43
|
-
|
44
34
|
end
|
45
35
|
end
|
data/lib/etcdv3/version.rb
CHANGED
data/lib/etcdv3/watch.rb
CHANGED
@@ -10,7 +10,7 @@ class Etcdv3
|
|
10
10
|
create_req = Etcdserverpb::WatchCreateRequest.new(key: key, range_end: range_end)
|
11
11
|
watch_req = Etcdserverpb::WatchRequest.new(create_request: create_req)
|
12
12
|
events = nil
|
13
|
-
@stub.watch([watch_req]).each do |resp|
|
13
|
+
@stub.watch([watch_req], metadata: @metadata).each do |resp|
|
14
14
|
next if resp.events.empty?
|
15
15
|
if block
|
16
16
|
block.call(resp.events)
|
@@ -21,6 +21,5 @@ class Etcdv3
|
|
21
21
|
end
|
22
22
|
events
|
23
23
|
end
|
24
|
-
|
25
24
|
end
|
26
25
|
end
|
data/spec/etcdv3/auth_spec.rb
CHANGED
@@ -4,16 +4,16 @@ describe Etcdv3::Auth do
|
|
4
4
|
|
5
5
|
let(:stub) { local_stub(Etcdv3::Auth) }
|
6
6
|
|
7
|
-
describe '#
|
8
|
-
after { stub.
|
9
|
-
subject { stub.
|
7
|
+
describe '#user_add' do
|
8
|
+
after { stub.user_delete('boom') }
|
9
|
+
subject { stub.user_add('boom', 'test') }
|
10
10
|
it { is_expected.to be_an_instance_of(Etcdserverpb::AuthUserAddResponse) }
|
11
11
|
end
|
12
12
|
|
13
|
-
describe '#
|
14
|
-
before { stub.
|
15
|
-
after { stub.
|
16
|
-
subject { stub.
|
13
|
+
describe '#user_get' do
|
14
|
+
before { stub.user_add('user_get', 'password') }
|
15
|
+
after { stub.user_delete('user_get') }
|
16
|
+
subject { stub.user_get('user_get') }
|
17
17
|
it { is_expected.to be_an_instance_of(Etcdserverpb::AuthUserGetResponse) }
|
18
18
|
end
|
19
19
|
|
@@ -22,51 +22,51 @@ describe Etcdv3::Auth do
|
|
22
22
|
it { is_expected.to be_an_instance_of(Etcdserverpb::AuthUserListResponse) }
|
23
23
|
end
|
24
24
|
|
25
|
-
describe '#
|
26
|
-
before { stub.
|
27
|
-
subject { stub.
|
25
|
+
describe '#user_delete' do
|
26
|
+
before { stub.user_add('user_delete', 'test') }
|
27
|
+
subject { stub.user_delete('user_delete') }
|
28
28
|
it { is_expected.to be_an_instance_of(Etcdserverpb::AuthUserDeleteResponse) }
|
29
29
|
end
|
30
30
|
|
31
|
-
describe '#
|
32
|
-
before { stub.
|
33
|
-
after { stub.
|
34
|
-
subject { stub.
|
31
|
+
describe '#user_grant_role' do
|
32
|
+
before { stub.user_add('grant_user', 'test') }
|
33
|
+
after { stub.user_delete('grant_user') }
|
34
|
+
subject { stub.user_grant_role('grant_user', 'root') }
|
35
35
|
it { is_expected.to be_an_instance_of(Etcdserverpb::AuthUserGrantRoleResponse) }
|
36
36
|
end
|
37
37
|
|
38
|
-
describe '#
|
38
|
+
describe '#user_revoke_role' do
|
39
39
|
before do
|
40
|
-
stub.
|
41
|
-
stub.
|
40
|
+
stub.user_add('revoke_user', 'password')
|
41
|
+
stub.user_grant_role('revoke_user', 'root')
|
42
42
|
end
|
43
|
-
after { stub.
|
44
|
-
subject { stub.
|
43
|
+
after { stub.user_delete('revoke_user') }
|
44
|
+
subject { stub.user_revoke_role('revoke_user', 'root') }
|
45
45
|
it { is_expected.to be_an_instance_of(Etcdserverpb::AuthUserRevokeRoleResponse) }
|
46
46
|
end
|
47
47
|
|
48
|
-
describe '#
|
49
|
-
after { stub.
|
50
|
-
subject { stub.
|
48
|
+
describe '#role_add' do
|
49
|
+
after { stub.role_delete('role_add') }
|
50
|
+
subject { stub.role_add('role_add') }
|
51
51
|
it 'adds a role' do
|
52
52
|
expect(subject).to be_an_instance_of(Etcdserverpb::AuthRoleAddResponse)
|
53
|
-
expect(stub.role_list.roles).to include('
|
53
|
+
expect(stub.role_list.roles).to include('role_add')
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
-
describe '#
|
58
|
-
before { stub.
|
59
|
-
after { stub.
|
60
|
-
subject { stub.
|
57
|
+
describe '#role_get' do
|
58
|
+
before { stub.role_add('role_get') }
|
59
|
+
after { stub.role_delete('role_get') }
|
60
|
+
subject { stub.role_get('role_get') }
|
61
61
|
it { is_expected.to be_an_instance_of(Etcdserverpb::AuthRoleGetResponse) }
|
62
62
|
end
|
63
63
|
|
64
|
-
describe '#
|
65
|
-
before { stub.
|
66
|
-
subject { stub.
|
64
|
+
describe '#role_delete' do
|
65
|
+
before { stub.role_add('role_delete') }
|
66
|
+
subject { stub.role_delete('role_delete') }
|
67
67
|
it 'deletes role' do
|
68
68
|
expect(subject).to be_an_instance_of(Etcdserverpb::AuthRoleDeleteResponse)
|
69
|
-
expect(stub.role_list.roles).to_not include('
|
69
|
+
expect(stub.role_list.roles).to_not include('role_delete')
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
@@ -75,10 +75,10 @@ describe Etcdv3::Auth do
|
|
75
75
|
it { is_expected.to be_an_instance_of(Etcdserverpb::AuthRoleListResponse) }
|
76
76
|
end
|
77
77
|
|
78
|
-
describe '#
|
79
|
-
before { stub.
|
80
|
-
after { stub.
|
81
|
-
subject { stub.
|
78
|
+
describe '#role_grant_permission' do
|
79
|
+
before { stub.role_add('grant_perm') }
|
80
|
+
after { stub.role_delete('grant_perm') }
|
81
|
+
subject { stub.role_grant_permission('grant_perm', :write, 'c', 'cc') }
|
82
82
|
it 'sets permission' do
|
83
83
|
expect(subject).to be_an_instance_of(Etcdserverpb::AuthRoleGrantPermissionResponse)
|
84
84
|
end
|
@@ -86,21 +86,21 @@ describe Etcdv3::Auth do
|
|
86
86
|
|
87
87
|
describe '#revoke_permission_from_role' do
|
88
88
|
before do
|
89
|
-
stub.
|
90
|
-
stub.
|
89
|
+
stub.role_add('myrole')
|
90
|
+
stub.role_grant_permission('myrole', :write, 'c', 'cc')
|
91
91
|
end
|
92
|
-
after { stub.
|
93
|
-
subject { stub.
|
92
|
+
after { stub.role_delete('myrole') }
|
93
|
+
subject { stub.role_revoke_permission('myrole', :write, 'c', 'cc') }
|
94
94
|
it 'revokes permission' do
|
95
95
|
expect(subject).to be_an_instance_of(Etcdserverpb::AuthRoleRevokePermissionResponse)
|
96
|
-
expect(stub.
|
96
|
+
expect(stub.role_get('myrole').perm.size).to eq(0)
|
97
97
|
end
|
98
98
|
end
|
99
99
|
|
100
|
-
describe '#
|
101
|
-
before { stub.
|
102
|
-
after { stub.
|
103
|
-
subject { stub.
|
100
|
+
describe '#user_change_password' do
|
101
|
+
before { stub.user_add('myuser', 'test') }
|
102
|
+
after { stub.user_delete('myuser') }
|
103
|
+
subject { stub.user_change_password('myuser', 'boom') }
|
104
104
|
it { is_expected.to be_an_instance_of(Etcdserverpb::AuthUserChangePasswordResponse) }
|
105
105
|
end
|
106
106
|
|
data/spec/etcdv3/kv_spec.rb
CHANGED
@@ -11,7 +11,7 @@ describe Etcdv3::KV do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
context 'with lease' do
|
14
|
-
let(:lease_id) { lease_stub.
|
14
|
+
let(:lease_id) { lease_stub.lease_grant(1)['ID'] }
|
15
15
|
subject { stub.put('lease', 'test', lease_id) }
|
16
16
|
it { is_expected.to be_an_instance_of(Etcdserverpb::PutResponse) }
|
17
17
|
end
|
data/spec/etcdv3/lease_spec.rb
CHANGED
@@ -4,22 +4,22 @@ describe Etcdv3::Lease do
|
|
4
4
|
|
5
5
|
let(:stub) { local_stub(Etcdv3::Lease) }
|
6
6
|
|
7
|
-
describe '#
|
8
|
-
subject { stub.
|
7
|
+
describe '#lease_grant' do
|
8
|
+
subject { stub.lease_grant(10) }
|
9
9
|
it 'grants lease' do
|
10
10
|
expect(subject).to be_an_instance_of(Etcdserverpb::LeaseGrantResponse)
|
11
11
|
expect(subject['ID']).to_not be_nil
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
-
describe '#
|
16
|
-
let(:id) { stub.
|
17
|
-
subject { stub.
|
15
|
+
describe '#lease_revoke' do
|
16
|
+
let(:id) { stub.lease_grant(60)['ID'] }
|
17
|
+
subject { stub.lease_revoke(id) }
|
18
18
|
it { is_expected.to be_an_instance_of(Etcdserverpb::LeaseRevokeResponse) }
|
19
19
|
end
|
20
20
|
|
21
21
|
describe '#lease_ttl' do
|
22
|
-
let(:id) { stub.
|
22
|
+
let(:id) { stub.lease_grant(10)['ID'] }
|
23
23
|
subject { stub.lease_ttl(id) }
|
24
24
|
it { is_expected.to be_an_instance_of(Etcdserverpb::LeaseTimeToLiveResponse) }
|
25
25
|
end
|
@@ -15,7 +15,7 @@ describe Etcdv3::Maintenance do
|
|
15
15
|
it { is_expected.to be_an_instance_of(Etcdserverpb::AlarmResponse) }
|
16
16
|
end
|
17
17
|
|
18
|
-
describe '#
|
18
|
+
describe '#alarm_deactivate' do
|
19
19
|
let(:leader_id) { stub.member_status.leader }
|
20
20
|
subject { stub.alarms(:deactivate, leader_id, :NOSPACE) }
|
21
21
|
it { is_expected.to be_an_instance_of(Etcdserverpb::AlarmResponse) }
|
data/spec/etcdv3_spec.rb
CHANGED
@@ -18,16 +18,16 @@ describe Etcdv3 do
|
|
18
18
|
context 'with auth' do
|
19
19
|
let(:auth_conn) { local_connection_with_auth('test', 'pass') }
|
20
20
|
before do
|
21
|
-
conn.
|
22
|
-
conn.
|
23
|
-
conn.
|
24
|
-
conn.
|
21
|
+
conn.user_add('root', 'pass')
|
22
|
+
conn.user_grant_role('root', 'root')
|
23
|
+
conn.user_add('test', 'pass')
|
24
|
+
conn.auth_enable
|
25
25
|
end
|
26
26
|
after do
|
27
27
|
conn.authenticate('root', 'pass')
|
28
|
-
conn.
|
29
|
-
conn.
|
30
|
-
conn.
|
28
|
+
conn.auth_disable
|
29
|
+
conn.user_delete('root')
|
30
|
+
conn.user_delete('test')
|
31
31
|
end
|
32
32
|
it 'doesnt raise error' do
|
33
33
|
expect{ auth_conn }.to_not raise_error
|
@@ -55,8 +55,8 @@ describe Etcdv3 do
|
|
55
55
|
it { is_expected.to_not be_nil }
|
56
56
|
end
|
57
57
|
|
58
|
-
describe '#
|
59
|
-
subject { conn.
|
58
|
+
describe '#alarm_deactivate' do
|
59
|
+
subject { conn.alarm_deactivate }
|
60
60
|
it { is_expected.to_not be_nil }
|
61
61
|
end
|
62
62
|
|
@@ -113,39 +113,39 @@ describe Etcdv3 do
|
|
113
113
|
end
|
114
114
|
end
|
115
115
|
|
116
|
-
describe '#
|
117
|
-
subject { conn.
|
116
|
+
describe '#lease_grant' do
|
117
|
+
subject { conn.lease_grant(2) }
|
118
118
|
it { is_expected.to_not be_nil }
|
119
119
|
end
|
120
120
|
|
121
|
-
describe '#
|
122
|
-
let!(:lease_id) { conn.
|
123
|
-
subject { conn.
|
121
|
+
describe '#lease_revoke' do
|
122
|
+
let!(:lease_id) { conn.lease_grant(2)['ID'] }
|
123
|
+
subject { conn.lease_revoke(lease_id) }
|
124
124
|
it { is_expected.to_not be_nil }
|
125
125
|
end
|
126
126
|
|
127
127
|
describe '#lease_ttl' do
|
128
|
-
let!(:lease_id) { conn.
|
128
|
+
let!(:lease_id) { conn.lease_grant(2)['ID'] }
|
129
129
|
subject { conn.lease_ttl(lease_id) }
|
130
130
|
it { is_expected.to_not be_nil }
|
131
131
|
end
|
132
132
|
|
133
|
-
describe '#
|
134
|
-
after { conn.
|
135
|
-
subject { conn.
|
133
|
+
describe '#user_add' do
|
134
|
+
after { conn.user_delete('test') }
|
135
|
+
subject { conn.user_add('test', 'user') }
|
136
136
|
it { is_expected.to_not be_nil }
|
137
137
|
end
|
138
138
|
|
139
|
-
describe '#
|
140
|
-
before { conn.
|
141
|
-
subject { conn.
|
139
|
+
describe '#user_delete' do
|
140
|
+
before { conn.user_add('test', 'user') }
|
141
|
+
subject { conn.user_delete('test') }
|
142
142
|
it { is_expected.to_not be_nil }
|
143
143
|
end
|
144
144
|
|
145
|
-
describe '#
|
146
|
-
before { conn.
|
147
|
-
after { conn.
|
148
|
-
subject { conn.
|
145
|
+
describe '#user_change_password' do
|
146
|
+
before { conn.user_add('change_user', 'pass') }
|
147
|
+
after { conn.user_delete('change_user') }
|
148
|
+
subject { conn.user_change_password('change_user', 'new_pass') }
|
149
149
|
it { is_expected.to_not be_nil }
|
150
150
|
end
|
151
151
|
|
@@ -159,76 +159,76 @@ describe Etcdv3 do
|
|
159
159
|
it { is_expected.to_not be_nil }
|
160
160
|
end
|
161
161
|
|
162
|
-
describe '#
|
163
|
-
subject { conn.
|
162
|
+
describe '#role_add' do
|
163
|
+
subject { conn.role_add('role_add') }
|
164
164
|
it { is_expected.to_not be_nil }
|
165
165
|
end
|
166
166
|
|
167
|
-
describe '#
|
168
|
-
before { conn.
|
169
|
-
subject { conn.
|
167
|
+
describe '#role_delete' do
|
168
|
+
before { conn.role_add('role_delete') }
|
169
|
+
subject { conn.role_delete('role_delete') }
|
170
170
|
it { is_expected.to_not be_nil }
|
171
171
|
end
|
172
172
|
|
173
|
-
describe '#
|
174
|
-
before { conn.
|
175
|
-
subject { conn.
|
173
|
+
describe '#user_grant_role' do
|
174
|
+
before { conn.user_add('grant_me', 'pass') }
|
175
|
+
subject { conn.user_grant_role('grant_me', 'root') }
|
176
176
|
it { is_expected.to_not be_nil }
|
177
177
|
end
|
178
178
|
|
179
|
-
describe '#
|
180
|
-
subject { conn.
|
179
|
+
describe '#user_revoke_role' do
|
180
|
+
subject { conn.user_revoke_role('grant_me', 'root') }
|
181
181
|
it { is_expected.to_not be_nil }
|
182
182
|
end
|
183
183
|
|
184
|
-
describe '#
|
185
|
-
before { conn.
|
186
|
-
subject { conn.
|
184
|
+
describe '#role_grant_permission' do
|
185
|
+
before { conn.role_add('grant') }
|
186
|
+
subject { conn.role_grant_permission('grant', :readwrite, 'a', 'Z') }
|
187
187
|
it { is_expected.to_not be_nil }
|
188
188
|
end
|
189
189
|
|
190
190
|
describe '#revoke_permission_to_role' do
|
191
|
-
subject { conn.
|
191
|
+
subject { conn.role_revoke_permission('grant', :readwrite, 'a', 'Z') }
|
192
192
|
it { is_expected.to_not be_nil }
|
193
193
|
end
|
194
194
|
|
195
|
-
describe '#
|
195
|
+
describe '#auth_disable' do
|
196
196
|
before do
|
197
|
-
conn.
|
198
|
-
conn.
|
199
|
-
conn.
|
197
|
+
conn.user_add('root', 'test')
|
198
|
+
conn.user_grant_role('root', 'root')
|
199
|
+
conn.auth_enable
|
200
200
|
conn.authenticate('root', 'test')
|
201
201
|
end
|
202
|
-
after { conn.
|
203
|
-
subject { conn.
|
202
|
+
after { conn.user_delete('root') }
|
203
|
+
subject { conn.auth_disable }
|
204
204
|
it { is_expected.to be_an_instance_of(Etcdserverpb::AuthDisableResponse) }
|
205
205
|
end
|
206
206
|
|
207
|
-
describe '#
|
207
|
+
describe '#auth_enable' do
|
208
208
|
before do
|
209
|
-
conn.
|
210
|
-
conn.
|
209
|
+
conn.user_add('root', 'test')
|
210
|
+
conn.user_grant_role('root', 'root')
|
211
211
|
end
|
212
212
|
after do
|
213
213
|
conn.authenticate('root', 'test')
|
214
|
-
conn.
|
215
|
-
conn.
|
214
|
+
conn.auth_disable
|
215
|
+
conn.user_delete('root')
|
216
216
|
end
|
217
|
-
subject { conn.
|
217
|
+
subject { conn.auth_enable }
|
218
218
|
it { is_expected.to be_an_instance_of(Etcdserverpb::AuthEnableResponse) }
|
219
219
|
end
|
220
220
|
|
221
221
|
describe "#authenticate" do
|
222
222
|
context "auth enabled" do
|
223
223
|
before do
|
224
|
-
conn.
|
225
|
-
conn.
|
226
|
-
conn.
|
224
|
+
conn.user_add('root', 'test')
|
225
|
+
conn.user_grant_role('root', 'root')
|
226
|
+
conn.auth_enable
|
227
227
|
conn.authenticate('root', 'test')
|
228
228
|
end
|
229
229
|
after do
|
230
|
-
conn.
|
231
|
-
conn.
|
230
|
+
conn.auth_disable
|
231
|
+
conn.user_delete('root')
|
232
232
|
end
|
233
233
|
it 'properly reconfigures auth and token' do
|
234
234
|
expect(conn.token).to_not be_nil
|
@@ -247,24 +247,24 @@ describe Etcdv3 do
|
|
247
247
|
describe '#metacache' do
|
248
248
|
context 'uses cached request object' do
|
249
249
|
let!(:object_id) { conn.send(:request).object_id }
|
250
|
-
before { conn.
|
251
|
-
after { conn.
|
250
|
+
before { conn.user_add('root', 'test') }
|
251
|
+
after { conn.user_delete('root') }
|
252
252
|
subject { conn.send(:request).object_id }
|
253
253
|
it { is_expected.to eq(object_id) }
|
254
254
|
end
|
255
255
|
context 'resets cache on auth' do
|
256
256
|
let!(:object_id) { conn.send(:request).object_id }
|
257
257
|
before do
|
258
|
-
conn.
|
259
|
-
conn.
|
260
|
-
conn.
|
258
|
+
conn.user_add('root', 'test')
|
259
|
+
conn.user_grant_role('root', 'root')
|
260
|
+
conn.auth_enable
|
261
261
|
conn.authenticate('root', 'test')
|
262
|
-
conn.
|
262
|
+
conn.user_add('boom', 'password')
|
263
263
|
end
|
264
264
|
after do
|
265
|
-
conn.
|
266
|
-
conn.
|
267
|
-
conn.
|
265
|
+
conn.auth_disable
|
266
|
+
conn.user_delete('root')
|
267
|
+
conn.user_delete('boom')
|
268
268
|
end
|
269
269
|
subject { conn.send(:request).object_id }
|
270
270
|
it { is_expected.to_not eq(object_id) }
|
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.5.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-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: grpc
|