etcdv3 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/etcdv3/auth.rb +2 -2
- data/lib/etcdv3/kv.rb +2 -2
- data/lib/etcdv3/lease.rb +2 -2
- data/lib/etcdv3/maintenance.rb +2 -2
- data/lib/etcdv3/request.rb +41 -0
- data/lib/etcdv3/version.rb +1 -1
- data/lib/etcdv3.rb +54 -54
- data/spec/etcd_spec.rb +30 -4
- data/spec/etcdv3/auth_spec.rb +1 -3
- data/spec/etcdv3/kv_spec.rb +2 -8
- data/spec/etcdv3/lease_spec.rb +1 -3
- data/spec/etcdv3/maintenance_spec.rb +1 -3
- data/spec/helpers/connections.rb +21 -0
- data/spec/helpers/test_instance.rb +40 -6
- data/spec/spec_helper.rb +4 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9275ec7e8408f87efd369493235bea9e7bd18a98
|
4
|
+
data.tar.gz: 9fcdd5d3199a60e6c0066758dc32e455e5125e8c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f5755de875074e6268cd378568ba6633d141d71efeccffe197f59fa142c6fcaa553a4802d438b551f24808b524e07e68221d435f9cf20a434620850164bdf1e7
|
7
|
+
data.tar.gz: ee7cf3faf3e6694843a3c99ee553d3bbcf081c491fa463cf36223bc8e8eb6688c8fb2fe19a42c3d0737ed56d849504e9cea5215e65cc978380448502c4894a24
|
data/lib/etcdv3/auth.rb
CHANGED
@@ -8,8 +8,8 @@ class Etcd
|
|
8
8
|
'readwrite' => Authpb::Permission::Type::READWRITE
|
9
9
|
}
|
10
10
|
|
11
|
-
def initialize(hostname,
|
12
|
-
@stub = Etcdserverpb::Auth::Stub.new(
|
11
|
+
def initialize(hostname, credentials, metadata = {})
|
12
|
+
@stub = Etcdserverpb::Auth::Stub.new(hostname, credentials)
|
13
13
|
@metadata = metadata
|
14
14
|
end
|
15
15
|
|
data/lib/etcdv3/kv.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
|
2
2
|
class Etcd
|
3
3
|
class KV
|
4
|
-
def initialize(hostname,
|
5
|
-
@stub = Etcdserverpb::KV::Stub.new(
|
4
|
+
def initialize(hostname, credentials, metadata={})
|
5
|
+
@stub = Etcdserverpb::KV::Stub.new(hostname, credentials)
|
6
6
|
@metadata = metadata
|
7
7
|
end
|
8
8
|
|
data/lib/etcdv3/lease.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
|
2
2
|
class Etcd
|
3
3
|
class Lease
|
4
|
-
def initialize(hostname,
|
5
|
-
@stub = Etcdserverpb::Lease::Stub.new(
|
4
|
+
def initialize(hostname, credentials, metadata={})
|
5
|
+
@stub = Etcdserverpb::Lease::Stub.new(hostname, credentials)
|
6
6
|
@metadata = metadata
|
7
7
|
end
|
8
8
|
|
data/lib/etcdv3/maintenance.rb
CHANGED
@@ -14,8 +14,8 @@ class Etcd
|
|
14
14
|
deactivate: 2
|
15
15
|
}
|
16
16
|
|
17
|
-
def initialize(hostname,
|
18
|
-
@stub = Etcdserverpb::Maintenance::Stub.new(
|
17
|
+
def initialize(hostname, credentials, metadata = {})
|
18
|
+
@stub = Etcdserverpb::Maintenance::Stub.new(hostname, credentials)
|
19
19
|
@metadata = metadata
|
20
20
|
end
|
21
21
|
|
@@ -0,0 +1,41 @@
|
|
1
|
+
class Etcd
|
2
|
+
class Request
|
3
|
+
|
4
|
+
attr_reader :metacache
|
5
|
+
|
6
|
+
def initialize(hostname, credentials, metadata, metacache)
|
7
|
+
@hostname = hostname
|
8
|
+
@credentials = credentials
|
9
|
+
@metadata = metadata
|
10
|
+
@metacache = metacache
|
11
|
+
end
|
12
|
+
|
13
|
+
def handle(interface, method, method_args=[])
|
14
|
+
interface = resolve_interface(interface)
|
15
|
+
interface.send(method, *method_args)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def resolve_interface(interface)
|
21
|
+
self.send(interface)
|
22
|
+
end
|
23
|
+
|
24
|
+
def auth
|
25
|
+
@auth ||= Etcd::Auth.new(@hostname, @credentials, @metadata)
|
26
|
+
end
|
27
|
+
|
28
|
+
def kv
|
29
|
+
@kv ||= Etcd::KV.new(@hostname, @credentials, @metadata)
|
30
|
+
end
|
31
|
+
|
32
|
+
def maintenance
|
33
|
+
@maintenance ||= Etcd::Maintenance.new(@hostname, @credentials, @metadata)
|
34
|
+
end
|
35
|
+
|
36
|
+
def lease
|
37
|
+
@lease ||= Etcd::Lease.new(@hostname, @credentials, @metadata)
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
data/lib/etcdv3/version.rb
CHANGED
data/lib/etcdv3.rb
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
|
2
2
|
require 'grpc'
|
3
3
|
require 'uri'
|
4
|
+
require 'base64'
|
4
5
|
|
5
6
|
require 'etcdv3/etcdrpc/rpc_services_pb'
|
6
7
|
require 'etcdv3/auth'
|
7
8
|
require 'etcdv3/kv'
|
8
9
|
require 'etcdv3/maintenance'
|
9
10
|
require 'etcdv3/lease'
|
11
|
+
require 'etcdv3/request'
|
10
12
|
|
11
13
|
class Etcd
|
12
14
|
|
@@ -45,167 +47,165 @@ class Etcd
|
|
45
47
|
@credentials = resolve_credentials
|
46
48
|
@metadata = {}
|
47
49
|
@metadata[:token] = auth.generate_token(user, password) unless user.nil?
|
50
|
+
@metacache = set_metacache
|
48
51
|
end
|
49
52
|
|
50
53
|
# Version of Etcd running on member
|
51
54
|
def version
|
52
|
-
maintenance
|
55
|
+
request.handle(:maintenance, 'member_status').version
|
53
56
|
end
|
54
57
|
|
55
58
|
# Store size in bytes.
|
56
59
|
def db_size
|
57
|
-
maintenance
|
60
|
+
request.handle(:maintenance, 'member_status').dbSize
|
58
61
|
end
|
59
62
|
|
60
63
|
# Cluster leader id
|
61
64
|
def leader_id
|
62
|
-
maintenance
|
65
|
+
request.handle(:maintenance, 'member_status').leader
|
63
66
|
end
|
64
67
|
|
65
68
|
# Inserts a new key.
|
66
69
|
def put(key, value, lease_id: nil)
|
67
|
-
kv
|
70
|
+
request.handle(:kv, 'put', [key, value, lease_id])
|
68
71
|
end
|
69
72
|
|
70
73
|
# Fetches key(s).
|
71
74
|
def get(key, range_end='')
|
72
|
-
|
75
|
+
request.handle(:get, 'get', [key, range_end])
|
73
76
|
end
|
74
77
|
|
75
78
|
# Grant a lease with a speified TTL
|
76
79
|
def grant_lease(ttl)
|
77
|
-
lease
|
80
|
+
request.handle(:lease, 'grant_lease', [ttl])
|
78
81
|
end
|
79
82
|
|
80
83
|
# Revokes lease and delete all attached keys
|
81
84
|
def revoke_lease(id)
|
82
|
-
lease
|
85
|
+
request.handle(:lease, 'revoke_lease', [id])
|
83
86
|
end
|
84
87
|
|
85
88
|
# Returns information regarding the current state of the lease
|
86
89
|
def lease_ttl(id)
|
87
|
-
lease
|
90
|
+
request.handle(:lease, 'lease_ttl', [id])
|
88
91
|
end
|
89
92
|
|
90
93
|
# Creates new user.
|
91
94
|
def add_user(user, password)
|
92
|
-
auth
|
95
|
+
request.handle(:auth, 'add_user', [user, password])
|
93
96
|
end
|
94
97
|
|
95
98
|
# Fetch specified user
|
96
99
|
def get_user(user)
|
97
|
-
auth
|
100
|
+
request.handle(:auth, 'get_user', [user])
|
98
101
|
end
|
99
102
|
|
100
103
|
# Delete specified user.
|
101
104
|
def delete_user(user)
|
102
|
-
auth
|
105
|
+
request.handle(:auth, 'delete_user', [user])
|
103
106
|
end
|
104
107
|
|
105
108
|
# Changes the specified users password.
|
106
109
|
def change_user_password(user, new_password)
|
107
|
-
auth
|
110
|
+
request.handle(:auth, 'change_user_password', [user, new_password])
|
108
111
|
end
|
109
112
|
|
110
113
|
# List all users.
|
111
114
|
def user_list
|
112
|
-
auth
|
113
|
-
end
|
114
|
-
|
115
|
-
# Authenticate using specified user and password.
|
116
|
-
# On successful authentication, an auth token will be assigned to the instance.
|
117
|
-
def authenticate(user, password)
|
118
|
-
token = auth.generate_token(user, password)
|
119
|
-
return false unless token
|
120
|
-
@metadata[:token] = token
|
121
|
-
@options[:user] = user
|
122
|
-
@options[:password] = password
|
123
|
-
|
124
|
-
true
|
115
|
+
request.handle(:auth, 'user_list')
|
125
116
|
end
|
126
117
|
|
127
118
|
# List all roles.
|
128
119
|
def role_list
|
129
|
-
auth
|
120
|
+
request.handle(:auth, 'role_list')
|
130
121
|
end
|
131
122
|
|
132
123
|
# Add role with specified name.
|
133
124
|
def add_role(name)
|
134
|
-
auth
|
125
|
+
request.handle(:auth, 'add_role', [name])
|
135
126
|
end
|
136
127
|
|
137
128
|
# Fetches a specified role.
|
138
129
|
def get_role(name)
|
139
|
-
auth
|
130
|
+
request.handle(:auth, 'get_role', [name])
|
140
131
|
end
|
141
132
|
|
142
133
|
# Delete role.
|
143
134
|
def delete_role(name)
|
144
|
-
auth
|
135
|
+
request.handle(:auth, 'delete_role', [name])
|
145
136
|
end
|
146
137
|
|
147
138
|
# Grants role to an existing user.
|
148
139
|
def grant_role_to_user(user, role)
|
149
|
-
auth
|
140
|
+
request.handle(:auth, 'grant_role_to_user', [user, role])
|
150
141
|
end
|
151
142
|
|
152
143
|
# Revokes role from a specified user.
|
153
144
|
def revoke_role_from_user(user, role)
|
154
|
-
auth
|
145
|
+
request.handle(:auth, 'revoke_role_from_user', [user, role])
|
155
146
|
end
|
156
147
|
|
157
148
|
# Grants a new permission to an existing role.
|
158
149
|
def grant_permission_to_role(name, permission, key, range_end='')
|
159
|
-
auth
|
150
|
+
request.handle(:auth, 'grant_permission_to_role', [name, permission, key, range_end])
|
160
151
|
end
|
161
152
|
|
162
153
|
def revoke_permission_from_role(name, permission, key, range_end='')
|
163
|
-
auth
|
154
|
+
request.handle(:auth, 'revoke_permission_from_role', [name, permission, key, range_end])
|
155
|
+
end
|
156
|
+
|
157
|
+
# List active alarms
|
158
|
+
def alarm_list
|
159
|
+
request.handle(:maintenance, 'alarms', [:get, leader_id])
|
160
|
+
end
|
161
|
+
|
162
|
+
# Disarm alarms on a specified member.
|
163
|
+
def deactivate_alarms
|
164
|
+
request.handle(:maintenance, 'alarms', [leader_id])
|
164
165
|
end
|
165
166
|
|
166
167
|
# Enables authentication.
|
167
168
|
def enable_auth
|
168
|
-
auth
|
169
|
+
request.handle(:auth, 'enable_auth')
|
169
170
|
end
|
170
171
|
|
171
172
|
# Disables authentication.
|
172
173
|
# This will clear any active auth / token data.
|
173
174
|
def disable_auth
|
174
|
-
response = auth
|
175
|
+
response = request.handle(:auth, 'disable_auth')
|
175
176
|
if response
|
176
177
|
@metadata.delete(:token)
|
177
178
|
@options[:user] = nil
|
178
179
|
@options[:password] = nil
|
180
|
+
@metacache = set_metacache
|
179
181
|
end
|
180
182
|
response
|
181
183
|
end
|
182
184
|
|
183
|
-
#
|
184
|
-
|
185
|
-
|
186
|
-
|
185
|
+
# Authenticate using specified user and password.
|
186
|
+
# On successful authentication, an auth token will be assigned to the instance.
|
187
|
+
def authenticate(user, password)
|
188
|
+
token = request.handle(:auth, 'generate_token', [user, password])
|
189
|
+
return false unless token
|
190
|
+
@metadata[:token] = token
|
191
|
+
@options[:user] = user
|
192
|
+
@options[:password] = password
|
193
|
+
@metacache = set_metacache
|
187
194
|
|
188
|
-
|
189
|
-
def deactivate_alarms
|
190
|
-
maintenance.alarms(:deactivate, leader_id)
|
195
|
+
true
|
191
196
|
end
|
192
197
|
|
193
198
|
private
|
194
199
|
|
195
|
-
def
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
def kv
|
200
|
-
Etcd::KV.new(hostname, port, @credentials, @metadata)
|
201
|
-
end
|
202
|
-
|
203
|
-
def maintenance
|
204
|
-
Etcd::Maintenance.new(hostname, port, @credentials, @metadata)
|
200
|
+
def request
|
201
|
+
# Only re-initialize when metadata changes.
|
202
|
+
return @request if @request && @request.metacache == @metacache
|
203
|
+
@request = Request.new("#{hostname}:#{port}", @credentials, @metadata, @metacache)
|
205
204
|
end
|
206
205
|
|
207
|
-
|
208
|
-
|
206
|
+
# Generates a new hash using a base64 of the metadata.
|
207
|
+
def set_metacache
|
208
|
+
Base64.strict_encode64(@metadata.to_s)
|
209
209
|
end
|
210
210
|
|
211
211
|
def resolve_credentials
|
data/spec/etcd_spec.rb
CHANGED
@@ -2,14 +2,13 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Etcd do
|
4
4
|
context 'Insecure connection without Auth' do
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
|
6
|
+
let(:conn) { local_connection }
|
7
|
+
|
8
8
|
describe '#initialize' do
|
9
9
|
subject { conn }
|
10
10
|
it { is_expected.to have_attributes(scheme: 'http') }
|
11
11
|
it { is_expected.to have_attributes(hostname: '127.0.0.1') }
|
12
|
-
it { is_expected.to have_attributes(port: 2379) }
|
13
12
|
it { is_expected.to have_attributes(credentials: :this_channel_is_insecure) }
|
14
13
|
it { is_expected.to have_attributes(token: nil) }
|
15
14
|
it { is_expected.to have_attributes(user: nil) }
|
@@ -82,5 +81,32 @@ describe Etcd do
|
|
82
81
|
end
|
83
82
|
end
|
84
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
|
85
111
|
end
|
86
112
|
end
|
data/spec/etcdv3/auth_spec.rb
CHANGED
data/spec/etcdv3/kv_spec.rb
CHANGED
@@ -1,14 +1,8 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Etcd::KV do
|
4
|
-
|
5
|
-
let(:
|
6
|
-
Etcd::KV.new("127.0.0.1", 2379, :this_channel_is_insecure, {})
|
7
|
-
end
|
8
|
-
|
9
|
-
let(:lease_stub) do
|
10
|
-
Etcd::Lease.new("127.0.0.1", 2379, :this_channel_is_insecure, {})
|
11
|
-
end
|
4
|
+
let(:stub) { local_stub(Etcd::KV) }
|
5
|
+
let(:lease_stub) { local_stub(Etcd::Lease) }
|
12
6
|
|
13
7
|
describe '#put' do
|
14
8
|
context 'without lease' do
|
data/spec/etcdv3/lease_spec.rb
CHANGED
@@ -2,9 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Etcd::Maintenance do
|
4
4
|
|
5
|
-
let(:stub)
|
6
|
-
Etcd::Maintenance.new("127.0.0.1", 2379, :this_channel_is_insecure, {})
|
7
|
-
end
|
5
|
+
let(:stub) { local_stub(Etcd::Maintenance) }
|
8
6
|
|
9
7
|
describe "#member_status" do
|
10
8
|
subject { stub.member_status }
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Helpers
|
2
|
+
module Connections
|
3
|
+
|
4
|
+
def local_connection
|
5
|
+
Etcd.new(url: "http://#{local_url}")
|
6
|
+
end
|
7
|
+
|
8
|
+
def local_stub(interface)
|
9
|
+
interface.new(local_url, :this_channel_is_insecure, {})
|
10
|
+
end
|
11
|
+
|
12
|
+
def local_url
|
13
|
+
"127.0.0.1:#{port}"
|
14
|
+
end
|
15
|
+
|
16
|
+
def port
|
17
|
+
ENV.fetch('ETCD_TEST_PORT', 2379).to_i
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -1,8 +1,16 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
require 'tmpdir'
|
3
|
+
require 'socket'
|
4
|
+
require 'timeout'
|
5
|
+
require 'helpers/connections'
|
3
6
|
|
4
7
|
module Helpers
|
5
8
|
class TestInstance
|
9
|
+
include Helpers::Connections
|
10
|
+
|
11
|
+
class InvalidVersionException < StandardError; end
|
12
|
+
class PortInUseException < StandardError; end
|
13
|
+
|
6
14
|
MINIMUM_VERSION = Gem::Version.new('3.0.0')
|
7
15
|
|
8
16
|
def initialize
|
@@ -11,21 +19,28 @@ module Helpers
|
|
11
19
|
@bin = discover_binary_path
|
12
20
|
@version = discover_binary_version
|
13
21
|
|
14
|
-
raise
|
15
|
-
|
22
|
+
raise InvalidVersionException if @version < MINIMUM_VERSION
|
23
|
+
raise PortInUseException if port_open?
|
24
|
+
|
25
|
+
rescue InvalidVersionException
|
26
|
+
puts "Invalid Etcd Version: #{@version}. Must be running 3.0+"
|
27
|
+
exit(1)
|
28
|
+
rescue PortInUseException
|
29
|
+
puts "Port #{port} is already in use. To choose a new port: `export ETCD_TEST_PORT=new_port`"
|
30
|
+
exit(1)
|
16
31
|
end
|
17
32
|
|
18
33
|
def start
|
19
34
|
raise "Already running etcd servers(#{@pids.inspect})" unless @pids.empty?
|
20
|
-
puts
|
35
|
+
puts "Starting up testing environment on port #{port}..."
|
21
36
|
@pids << spawn_etcd_instance
|
22
37
|
sleep(5)
|
23
38
|
end
|
24
39
|
|
25
40
|
def spawn_etcd_instance
|
26
|
-
peer_url =
|
27
|
-
client_url =
|
28
|
-
cluster_url =
|
41
|
+
peer_url = "http://127.0.0.1:#{port+1}"
|
42
|
+
client_url = "http://127.0.0.1:#{port}"
|
43
|
+
cluster_url = "node=http://127.0.0.1:#{port+1}"
|
29
44
|
flags = ' --name=node'
|
30
45
|
flags << " --initial-advertise-peer-urls=#{peer_url}"
|
31
46
|
flags << " --listen-peer-urls=#{peer_url}"
|
@@ -47,6 +62,8 @@ module Helpers
|
|
47
62
|
@pids.clear
|
48
63
|
end
|
49
64
|
|
65
|
+
private
|
66
|
+
|
50
67
|
def discover_binary_path
|
51
68
|
'etcd'
|
52
69
|
end
|
@@ -54,6 +71,23 @@ module Helpers
|
|
54
71
|
def discover_binary_version
|
55
72
|
result = `#{@bin} --version | grep "etcd Version"`
|
56
73
|
Gem::Version.new(result.split(':').last.strip)
|
74
|
+
rescue
|
75
|
+
puts "The etcd binary is not in $PATH. Export it, and try again."
|
76
|
+
exit(1)
|
57
77
|
end
|
78
|
+
|
79
|
+
def port_open?(seconds=1)
|
80
|
+
Timeout::timeout(seconds) do
|
81
|
+
begin
|
82
|
+
TCPSocket.new('127.0.0.1', port).close
|
83
|
+
true
|
84
|
+
rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
|
85
|
+
false
|
86
|
+
end
|
87
|
+
end
|
88
|
+
rescue Timeout::Error
|
89
|
+
false
|
90
|
+
end
|
91
|
+
|
58
92
|
end
|
59
93
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -3,8 +3,11 @@ $LOAD_PATH.unshift File.expand_path('./helpers', __FILE__)
|
|
3
3
|
|
4
4
|
require 'etcdv3'
|
5
5
|
require 'helpers/test_instance'
|
6
|
+
require 'helpers/connections'
|
6
7
|
|
7
8
|
RSpec.configure do |config|
|
9
|
+
config.include(Helpers::Connections)
|
10
|
+
|
8
11
|
config.expect_with :rspec do |expectations|
|
9
12
|
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
10
13
|
end
|
@@ -12,6 +15,7 @@ RSpec.configure do |config|
|
|
12
15
|
mocks.verify_partial_doubles = true
|
13
16
|
end
|
14
17
|
config.shared_context_metadata_behavior = :apply_to_host_groups
|
18
|
+
|
15
19
|
instance = Helpers::TestInstance.new
|
16
20
|
config.before(:suite) do
|
17
21
|
instance.start
|
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.1.
|
4
|
+
version: 0.1.4
|
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-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: grpc
|
@@ -66,12 +66,14 @@ files:
|
|
66
66
|
- lib/etcdv3/protos/http.proto
|
67
67
|
- lib/etcdv3/protos/kv.proto
|
68
68
|
- lib/etcdv3/protos/rpc.proto
|
69
|
+
- lib/etcdv3/request.rb
|
69
70
|
- lib/etcdv3/version.rb
|
70
71
|
- spec/etcd_spec.rb
|
71
72
|
- spec/etcdv3/auth_spec.rb
|
72
73
|
- spec/etcdv3/kv_spec.rb
|
73
74
|
- spec/etcdv3/lease_spec.rb
|
74
75
|
- spec/etcdv3/maintenance_spec.rb
|
76
|
+
- spec/helpers/connections.rb
|
75
77
|
- spec/helpers/test_instance.rb
|
76
78
|
- spec/spec_helper.rb
|
77
79
|
homepage: https://github.com/davissp14/etcdv3-ruby
|
@@ -104,5 +106,6 @@ test_files:
|
|
104
106
|
- spec/etcdv3/kv_spec.rb
|
105
107
|
- spec/etcdv3/lease_spec.rb
|
106
108
|
- spec/etcdv3/maintenance_spec.rb
|
109
|
+
- spec/helpers/connections.rb
|
107
110
|
- spec/helpers/test_instance.rb
|
108
111
|
- spec/spec_helper.rb
|