etcdv3 0.1.2 → 0.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e3da4471fa89eef12de54927ad29a3dfe9ad78d1
4
- data.tar.gz: d2c7b8a7df8d7a464881a6fa226c20cc24142347
3
+ metadata.gz: afad56a64c9b93a3438296356e13a9980625d193
4
+ data.tar.gz: 6190434f69a1645f25f5336f3bebaf1efc8f3775
5
5
  SHA512:
6
- metadata.gz: 5870f96529e1084efe1c18fdc8f3295371ec6a6008f744b3db3f48198bf05564c438a2191c5a29f33d7b5a0602f4c23b86f96ee020642fe546cd7b0d3e8aacee
7
- data.tar.gz: 4bf35190f37e5453368c9a50349dcb7151f966278b88d6ef3429bdf86716670db0912fdfe9ef82b116a097b45211ff00a5858d58c1909e5d609f7b7ffa83769b
6
+ metadata.gz: 95d1672d8f0e0cd1843bf76d2998977c347711887ebacbae463d2d4aa86586b9c4ce663b9dd28e220c8a7cd87d55c94c7cb3381af98988c4ad232d2a733e9913
7
+ data.tar.gz: 520c207ec53edc8a5ea840f138780c4b7a3e0f2a21180f135045dbb170e3bdaed9a2ebc2fb72b192e7de8295d67f83be9a5572cc9677196a4607b917c3a5f5e7
data/.gitignore CHANGED
@@ -1,4 +1,5 @@
1
1
  Gemfile.lock
2
+ Guardfile
2
3
  *.sh
3
4
  *.gem
4
5
  /tmp/
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Ruby client for Etcd V3
4
4
 
5
- **Note: This is under active development and is not feature complete**
5
+ **Warning: This is under active development and should be considered unstable**
6
6
 
7
7
  ## Getting Started
8
8
 
@@ -31,16 +31,23 @@ conn = Etcd.new(url: 'https://hostname:port', user: "gary", password: "secret")
31
31
  # Coming soon...
32
32
  ```
33
33
 
34
- **Adding and Fetching Keys**
34
+ **Adding, Fetching and Deleting Keys**
35
+ ```
36
+ # Put
37
+ conn.put("my", "value")
38
+
39
+ # Get
40
+ conn.get("my")
35
41
 
36
- # Put
37
- conn.put("my", "value")
42
+ # Get Key Range
43
+ conn.get('my', 'myyyy')
38
44
 
39
- # Get
40
- conn.get("my")
45
+ # Delete Key
46
+ conn.del('my')
41
47
 
42
- # Get Key Range
43
- conn.get('my', 'myyyy')
48
+ # Delete Key Range
49
+ conn.del('my', 'myyy')
50
+ ```
44
51
 
45
52
  **User Management**
46
53
  ```
@@ -90,6 +97,21 @@ Disabling auth will clear the auth token and all previously attached user inform
90
97
  conn.disable_auth
91
98
  ```
92
99
 
100
+ **Leases**
101
+ ```
102
+ # Grant a lease with a 100 second TTL
103
+ conn.grant_lease(100)
104
+
105
+ # Attach key to lease
106
+ conn.put("testkey", "testvalue", lease: 1234566789)
107
+
108
+ # Get information about lease and its attached keys
109
+ conn.lease_ttl(1234566789)
110
+
111
+ # Revoke lease and delete all keys attached
112
+ conn.revoke_lease(1234566789)
113
+ ```
114
+
93
115
  **Alarms**
94
116
  ```
95
117
  # List all active Alarms
data/lib/etcdv3/auth.rb CHANGED
@@ -14,30 +14,34 @@ class Etcd
14
14
  end
15
15
 
16
16
  def generate_token(user, password)
17
- response = @stub.authenticate(
18
- Authpb::User.new(name: user, password: password)
17
+ request = Etcdserverpb::AuthenticateRequest.new(
18
+ name: user,
19
+ password: password
19
20
  )
20
- response.token
21
- rescue GRPC::FailedPrecondition, GRPC::InvalidArgument => exception
22
- false
21
+ @stub.authenticate(request).token
23
22
  end
24
23
 
25
24
  def user_list
26
- @stub.user_list(Authpb::User.new, metadata: @metadata).users
25
+ request = Etcdserverpb::AuthUserListRequest.new
26
+ @stub.user_list(request, metadata: @metadata)
27
27
  end
28
28
 
29
29
  def add_user(user, password)
30
- @stub.user_add(
31
- Authpb::User.new(name: user, password: password), metadata: @metadata
30
+ request = Etcdserverpb::AuthUserAddRequest.new(
31
+ name: user,
32
+ password: password
32
33
  )
34
+ @stub.user_add(request, metadata: @metadata)
33
35
  end
34
36
 
35
37
  def delete_user(user)
36
- @stub.user_delete(Authpb::User.new(name: user))
38
+ request = Etcdserverpb::AuthUserDeleteRequest.new(name: user)
39
+ @stub.user_delete(request)
37
40
  end
38
41
 
39
42
  def get_user(user)
40
- @stub.user_get(Authpb::User.new(name: user))
43
+ request = Etcdserverpb::AuthUserGetRequest.new(name: user)
44
+ @stub.user_get(request)
41
45
  end
42
46
 
43
47
  def change_user_password(user, new_password)
@@ -49,7 +53,8 @@ class Etcd
49
53
  end
50
54
 
51
55
  def add_role(name)
52
- @stub.role_add(Authpb::Role.new(name: name), metadata: @metadata)
56
+ request = Etcdserverpb::AuthRoleAddRequest.new(name: name)
57
+ @stub.role_add(request, metadata: @metadata)
53
58
  end
54
59
 
55
60
  def get_role(name)
@@ -58,7 +63,8 @@ class Etcd
58
63
  end
59
64
 
60
65
  def delete_role(name)
61
- @stub.role_delete(Authpb::Role.new(name: name), metadata: @metadata)
66
+ request = Etcdserverpb::AuthRoleDeleteRequest.new(role: name)
67
+ @stub.role_delete(request, metadata: @metadata)
62
68
  end
63
69
 
64
70
  def grant_role_to_user(user, role)
@@ -96,15 +102,18 @@ class Etcd
96
102
  end
97
103
 
98
104
  def role_list
99
- @stub.role_list(Authpb::Role.new, metadata: @metadata)
105
+ request = Etcdserverpb::AuthRoleListRequest.new
106
+ @stub.role_list(request, metadata: @metadata)
100
107
  end
101
108
 
102
109
  def enable_auth
103
- @stub.auth_enable(Authpb::User.new)
110
+ request = Etcdserverpb::AuthEnableRequest.new
111
+ @stub.auth_enable(request)
104
112
  end
105
113
 
106
114
  def disable_auth
107
- @stub.auth_disable(Authpb::User.new, metadata: @metadata)
115
+ request = Etcdserverpb::AuthDisableRequest.new
116
+ @stub.auth_disable(request, metadata: @metadata)
108
117
  end
109
118
 
110
119
  end
data/lib/etcdv3/kv.rb CHANGED
@@ -6,14 +6,23 @@ class Etcd
6
6
  @metadata = metadata
7
7
  end
8
8
 
9
- def put(key, value)
9
+ def put(key, value, lease=nil)
10
10
  kv = Etcdserverpb::PutRequest.new(key: key, value: value)
11
+ kv.lease = lease if lease
11
12
  @stub.put(kv, metadata: @metadata)
12
13
  end
13
14
 
14
15
  def get(key, range_end="")
15
16
  kv = Etcdserverpb::RangeRequest.new(key: key, range_end: range_end)
16
- @stub.range(kv, metadata: @metadata).kvs
17
+ @stub.range(kv, metadata: @metadata)
18
+ end
19
+
20
+ def del(key, range_end="")
21
+ request = Etcdserverpb::DeleteRangeRequest.new(
22
+ key: key,
23
+ range_end: range_end
24
+ )
25
+ @stub.delete_range(request, metadata: @metadata)
17
26
  end
18
27
  end
19
28
  end
@@ -0,0 +1,25 @@
1
+
2
+ class Etcd
3
+ class Lease
4
+ def initialize(hostname, port, credentials, metadata={})
5
+ @stub = Etcdserverpb::Lease::Stub.new("#{hostname}:#{port}", credentials)
6
+ @metadata = metadata
7
+ end
8
+
9
+ def grant_lease(ttl)
10
+ request = Etcdserverpb::LeaseGrantRequest.new(TTL: ttl)
11
+ @stub.lease_grant(request, metadata: @metadata)
12
+ end
13
+
14
+ def revoke_lease(id)
15
+ request = Etcdserverpb::LeaseRevokeRequest.new(ID: id)
16
+ @stub.lease_revoke(request, metadata: @metadata)
17
+ end
18
+
19
+ def lease_ttl(id)
20
+ request = Etcdserverpb::LeaseTimeToLiveRequest.new(ID: id, keys: true)
21
+ @stub.lease_time_to_live(request, metadata: @metadata)
22
+ end
23
+
24
+ end
25
+ end
@@ -1,3 +1,3 @@
1
1
  class Etcd
2
- VERSION = '0.1.2'
2
+ VERSION = '0.1.3'
3
3
  end
data/lib/etcdv3.rb CHANGED
@@ -6,6 +6,7 @@ require 'etcdv3/etcdrpc/rpc_services_pb'
6
6
  require 'etcdv3/auth'
7
7
  require 'etcdv3/kv'
8
8
  require 'etcdv3/maintenance'
9
+ require 'etcdv3/lease'
9
10
 
10
11
  class Etcd
11
12
 
@@ -62,8 +63,8 @@ class Etcd
62
63
  end
63
64
 
64
65
  # Inserts a new key.
65
- def put(key, value)
66
- kv.put(key, value)
66
+ def put(key, value, lease_id: nil)
67
+ kv.put(key, value, lease_id)
67
68
  end
68
69
 
69
70
  # Fetches key(s).
@@ -71,6 +72,21 @@ class Etcd
71
72
  kv.get(key, range_end)
72
73
  end
73
74
 
75
+ # Grant a lease with a speified TTL
76
+ def grant_lease(ttl)
77
+ lease.grant_lease(ttl)
78
+ end
79
+
80
+ # Revokes lease and delete all attached keys
81
+ def revoke_lease(id)
82
+ lease.revoke_lease(id)
83
+ end
84
+
85
+ # Returns information regarding the current state of the lease
86
+ def lease_ttl(id)
87
+ lease.lease_ttl(id)
88
+ end
89
+
74
90
  # Creates new user.
75
91
  def add_user(user, password)
76
92
  auth.add_user(user, password)
@@ -188,6 +204,10 @@ class Etcd
188
204
  Etcd::Maintenance.new(hostname, port, @credentials, @metadata)
189
205
  end
190
206
 
207
+ def lease
208
+ Etcd::Lease.new(hostname, port, @credentials, @metadata)
209
+ end
210
+
191
211
  def resolve_credentials
192
212
  case scheme
193
213
  when 'http'
data/spec/etcd_spec.rb CHANGED
@@ -15,5 +15,72 @@ describe Etcd do
15
15
  it { is_expected.to have_attributes(user: nil) }
16
16
  it { is_expected.to have_attributes(password: nil) }
17
17
  end
18
+
19
+ describe '#version' do
20
+ subject { conn.version }
21
+ it { is_expected.to be_an_instance_of(String) }
22
+ end
23
+
24
+ describe '#db_size' do
25
+ subject { conn.db_size }
26
+ it { is_expected.to_not be_nil }
27
+ end
28
+
29
+ describe '#leader_id' do
30
+ subject { conn.leader_id.class }
31
+ it { is_expected.to_not be_nil }
32
+ end
33
+
34
+ describe '#disable_auth' do
35
+ before do
36
+ conn.add_user('root', 'test')
37
+ conn.grant_role_to_user('root', 'root')
38
+ conn.enable_auth
39
+ conn.authenticate('root', 'test')
40
+ end
41
+ after { conn.delete_user('root') }
42
+ subject { conn.disable_auth }
43
+ it { is_expected.to be_an_instance_of(Etcdserverpb::AuthDisableResponse) }
44
+ end
45
+
46
+ describe '#enable_auth' do
47
+ before do
48
+ conn.add_user('root', 'test')
49
+ conn.grant_role_to_user('root', 'root')
50
+ end
51
+ after do
52
+ conn.authenticate('root', 'test')
53
+ conn.disable_auth
54
+ conn.delete_user('root')
55
+ end
56
+ subject { conn.enable_auth }
57
+ it { is_expected.to be_an_instance_of(Etcdserverpb::AuthEnableResponse) }
58
+ end
59
+
60
+ describe "#authenticate" do
61
+ context "auth enabled" do
62
+ before do
63
+ conn.add_user('root', 'test')
64
+ conn.grant_role_to_user('root', 'root')
65
+ conn.enable_auth
66
+ conn.authenticate('root', 'test')
67
+ end
68
+ after do
69
+ conn.disable_auth
70
+ conn.delete_user('root')
71
+ end
72
+ it 'properly reconfigures auth and token' do
73
+ expect(conn.token).to_not be_nil
74
+ expect(conn.user).to eq('root')
75
+ expect(conn.password).to eq('test')
76
+ end
77
+ end
78
+
79
+ context 'auth disabled' do
80
+ it 'raises error' do
81
+ expect { conn.authenticate('root', 'root') }.to raise_error(GRPC::InvalidArgument)
82
+ end
83
+ end
84
+ end
18
85
  end
19
86
  end
@@ -2,90 +2,85 @@ require 'spec_helper'
2
2
 
3
3
  describe Etcd::Auth do
4
4
 
5
- let(:conn) do
6
- Etcd.new(url: 'http://127.0.0.1:2379')
5
+ let(:stub) do
6
+ Etcd::Auth.new("127.0.0.1", 2379, :this_channel_is_insecure, {})
7
7
  end
8
8
 
9
9
  describe '#add_user' do
10
- after { conn.delete_user('boom') }
11
- subject { conn.add_user('boom', 'test') }
10
+ after { stub.delete_user('boom') }
11
+ subject { stub.add_user('boom', 'test') }
12
12
  it { is_expected.to be_an_instance_of(Etcdserverpb::AuthUserAddResponse) }
13
13
  end
14
14
 
15
15
  describe '#get_user' do
16
- before { conn.add_user('get_user', 'password') }
17
- after { conn.delete_user('get_user') }
18
- subject { conn.get_user('get_user') }
16
+ before { stub.add_user('get_user', 'password') }
17
+ after { stub.delete_user('get_user') }
18
+ subject { stub.get_user('get_user') }
19
19
  it { is_expected.to be_an_instance_of(Etcdserverpb::AuthUserGetResponse) }
20
20
  end
21
21
 
22
22
  describe '#user_list' do
23
- before { conn.add_user('list', 'test') }
24
- after { conn.delete_user('list') }
25
- subject { conn.user_list }
26
- it 'returns correcty user information' do
27
- expect(subject).to be_an_instance_of(Google::Protobuf::RepeatedField)
28
- expect(subject).to include('list')
29
- end
23
+ subject { stub.user_list }
24
+ it { is_expected.to be_an_instance_of(Etcdserverpb::AuthUserListResponse) }
30
25
  end
31
26
 
32
27
  describe '#delete_user' do
33
- before { conn.add_user('delete_user', 'test') }
34
- subject { conn.delete_user('delete_user') }
28
+ before { stub.add_user('delete_user', 'test') }
29
+ subject { stub.delete_user('delete_user') }
35
30
  it { is_expected.to be_an_instance_of(Etcdserverpb::AuthUserDeleteResponse) }
36
31
  end
37
32
 
38
33
  describe '#grant_role_to_user' do
39
- before { conn.add_user('grant_user', 'test') }
40
- after { conn.delete_user('grant_user') }
41
- subject { conn.grant_role_to_user('grant_user', 'root') }
34
+ before { stub.add_user('grant_user', 'test') }
35
+ after { stub.delete_user('grant_user') }
36
+ subject { stub.grant_role_to_user('grant_user', 'root') }
42
37
  it { is_expected.to be_an_instance_of(Etcdserverpb::AuthUserGrantRoleResponse) }
43
38
  end
44
39
 
45
40
  describe '#revoke_role_from_user' do
46
41
  before do
47
- conn.add_user('revoke_user', 'password')
48
- conn.grant_role_to_user('revoke_user', 'root')
42
+ stub.add_user('revoke_user', 'password')
43
+ stub.grant_role_to_user('revoke_user', 'root')
49
44
  end
50
- after { conn.delete_user('revoke_user') }
51
- subject { conn.revoke_role_from_user('revoke_user', 'root') }
45
+ after { stub.delete_user('revoke_user') }
46
+ subject { stub.revoke_role_from_user('revoke_user', 'root') }
52
47
  it { is_expected.to be_an_instance_of(Etcdserverpb::AuthUserRevokeRoleResponse) }
53
48
  end
54
49
 
55
50
  describe '#add_role' do
56
- after { conn.delete_role('add_role') }
57
- subject { conn.add_role('add_role') }
51
+ after { stub.delete_role('add_role') }
52
+ subject { stub.add_role('add_role') }
58
53
  it 'adds a role' do
59
54
  expect(subject).to be_an_instance_of(Etcdserverpb::AuthRoleAddResponse)
60
- expect(conn.role_list.roles).to include('add_role')
55
+ expect(stub.role_list.roles).to include('add_role')
61
56
  end
62
57
  end
63
58
 
64
59
  describe '#get_role' do
65
- before { conn.add_role('get_role') }
66
- after { conn.delete_role('get_role') }
67
- subject { conn.get_role('get_role') }
60
+ before { stub.add_role('get_role') }
61
+ after { stub.delete_role('get_role') }
62
+ subject { stub.get_role('get_role') }
68
63
  it { is_expected.to be_an_instance_of(Etcdserverpb::AuthRoleGetResponse) }
69
64
  end
70
65
 
71
66
  describe '#delete_role' do
72
- before { conn.add_role('delete_role') }
73
- subject { conn.delete_role('delete_role') }
67
+ before { stub.add_role('delete_role') }
68
+ subject { stub.delete_role('delete_role') }
74
69
  it 'deletes role' do
75
70
  expect(subject).to be_an_instance_of(Etcdserverpb::AuthRoleDeleteResponse)
76
- expect(conn.role_list.roles).to_not include('delete_role')
71
+ expect(stub.role_list.roles).to_not include('delete_role')
77
72
  end
78
73
  end
79
74
 
80
75
  describe '#role_list' do
81
- subject { conn.role_list }
76
+ subject { stub.role_list }
82
77
  it { is_expected.to be_an_instance_of(Etcdserverpb::AuthRoleListResponse) }
83
78
  end
84
79
 
85
80
  describe '#grant_permission_to_role' do
86
- before { conn.add_role('grant_perm') }
87
- after { conn.delete_role('grant_perm') }
88
- subject { conn.grant_permission_to_role('grant_perm', 'write', 'c', 'cc') }
81
+ before { stub.add_role('grant_perm') }
82
+ after { stub.delete_role('grant_perm') }
83
+ subject { stub.grant_permission_to_role('grant_perm', 'write', 'c', 'cc') }
89
84
  it 'sets permission' do
90
85
  expect(subject).to be_an_instance_of(Etcdserverpb::AuthRoleGrantPermissionResponse)
91
86
  end
@@ -93,72 +88,22 @@ describe Etcd::Auth do
93
88
 
94
89
  describe '#revoke_permission_from_role' do
95
90
  before do
96
- conn.add_role('myrole')
97
- conn.grant_permission_to_role('myrole', 'write', 'c', 'cc')
91
+ stub.add_role('myrole')
92
+ stub.grant_permission_to_role('myrole', 'write', 'c', 'cc')
98
93
  end
99
- after { conn.delete_role('myrole') }
100
- subject { conn.revoke_permission_from_role('myrole', 'write', 'c', 'cc') }
94
+ after { stub.delete_role('myrole') }
95
+ subject { stub.revoke_permission_from_role('myrole', 'write', 'c', 'cc') }
101
96
  it 'revokes permission' do
102
97
  expect(subject).to be_an_instance_of(Etcdserverpb::AuthRoleRevokePermissionResponse)
103
- expect(conn.get_role('myrole').perm.size).to eq(0)
104
- end
105
- end
106
-
107
- describe '#disable_auth' do
108
- before do
109
- conn.add_user('root', 'test')
110
- conn.grant_role_to_user('root', 'root')
111
- conn.enable_auth
112
- conn.authenticate('root', 'test')
113
- end
114
- after { conn.delete_user('root') }
115
- subject { conn.disable_auth }
116
- it { is_expected.to be_an_instance_of(Etcdserverpb::AuthDisableResponse) }
117
- end
118
-
119
- describe '#enable_auth' do
120
- before do
121
- conn.add_user('root', 'test')
122
- conn.grant_role_to_user('root', 'root')
98
+ expect(stub.get_role('myrole').perm.size).to eq(0)
123
99
  end
124
- after do
125
- conn.authenticate('root', 'test')
126
- conn.disable_auth
127
- conn.delete_user('root')
128
- end
129
- subject { conn.enable_auth }
130
- it { is_expected.to be_an_instance_of(Etcdserverpb::AuthEnableResponse) }
131
100
  end
132
101
 
133
102
  describe '#change_user_password' do
134
- before { conn.add_user('myuser', 'test') }
135
- after { conn.delete_user('myuser') }
136
- subject { conn.change_user_password('myuser', 'boom') }
103
+ before { stub.add_user('myuser', 'test') }
104
+ after { stub.delete_user('myuser') }
105
+ subject { stub.change_user_password('myuser', 'boom') }
137
106
  it { is_expected.to be_an_instance_of(Etcdserverpb::AuthUserChangePasswordResponse) }
138
107
  end
139
108
 
140
- describe "#authenticate" do
141
- context "auth enabled" do
142
- before do
143
- conn.add_user('root', 'test')
144
- conn.grant_role_to_user('root', 'root')
145
- conn.enable_auth
146
- conn.authenticate('root', 'test')
147
- end
148
- after do
149
- conn.disable_auth
150
- conn.delete_user('root')
151
- end
152
- it 'properly reconfigures auth and token' do
153
- expect(conn.token).to_not be_nil
154
- expect(conn.user).to eq('root')
155
- expect(conn.password).to eq('test')
156
- end
157
- end
158
-
159
- context 'auth disabled' do
160
- subject { conn.authenticate('root', 'root') }
161
- it { is_expected.to eq(false) }
162
- end
163
- end
164
109
  end
@@ -2,22 +2,41 @@ require 'spec_helper'
2
2
 
3
3
  describe Etcd::KV do
4
4
 
5
- let(:conn) do
6
- Etcd.new(url: 'http://127.0.0.1:2379')
5
+ let(:stub) do
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, {})
7
11
  end
8
12
 
9
13
  describe '#put' do
10
- subject { conn.put('test', 'test') }
11
- it { is_expected.to be_an_instance_of(Etcdserverpb::PutResponse) }
14
+ context 'without lease' do
15
+ subject { stub.put('test', 'test') }
16
+ it { is_expected.to be_an_instance_of(Etcdserverpb::PutResponse) }
17
+ end
18
+
19
+ context 'with lease' do
20
+ let(:lease_id) { lease_stub.grant_lease(1)['ID'] }
21
+ subject { stub.put('lease', 'test', lease_id) }
22
+ it { is_expected.to be_an_instance_of(Etcdserverpb::PutResponse) }
23
+ end
12
24
  end
13
25
 
14
26
  describe '#get' do
15
- before { conn.put('test', "zoom") }
16
- subject { conn.get('test') }
17
- it 'returns correct response' do
18
- expect(subject).to be_an_instance_of(Google::Protobuf::RepeatedField)
19
- expect(subject.first.key).to eq('test')
20
- expect(subject.size).to eq(1)
27
+ subject { stub.get('test') }
28
+ it { is_expected.to be_an_instance_of(Etcdserverpb::RangeResponse) }
29
+ end
30
+
31
+ describe '#del' do
32
+ context 'del without range' do
33
+ subject { stub.del('test') }
34
+ it { is_expected.to be_an_instance_of(Etcdserverpb::DeleteRangeResponse) }
35
+ end
36
+ context 'del with range' do
37
+ subject { stub.del('test', 'testtt') }
38
+ it { is_expected.to be_an_instance_of(Etcdserverpb::DeleteRangeResponse) }
21
39
  end
22
40
  end
41
+
23
42
  end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe Etcd::Lease do
4
+
5
+ let(:stub) do
6
+ Etcd::Lease.new("127.0.0.1", 2379, :this_channel_is_insecure, {})
7
+ end
8
+
9
+ describe '#grant_lease' do
10
+ subject { stub.grant_lease(10) }
11
+ it 'grants lease' do
12
+ expect(subject).to be_an_instance_of(Etcdserverpb::LeaseGrantResponse)
13
+ expect(subject['ID']).to_not be_nil
14
+ end
15
+ end
16
+
17
+ describe '#revoke_lease' do
18
+ let(:id) { stub.grant_lease(60)['ID'] }
19
+ subject { stub.revoke_lease(id) }
20
+ it { is_expected.to be_an_instance_of(Etcdserverpb::LeaseRevokeResponse) }
21
+ end
22
+
23
+ describe '#lease_ttl' do
24
+ let(:id) { stub.grant_lease(10)['ID'] }
25
+ subject { stub.lease_ttl(id) }
26
+ it { is_expected.to be_an_instance_of(Etcdserverpb::LeaseTimeToLiveResponse) }
27
+ end
28
+
29
+ end
@@ -2,42 +2,25 @@ require 'spec_helper'
2
2
 
3
3
  describe Etcd::Maintenance do
4
4
 
5
- let(:conn) do
6
- Etcd.new(url: 'http://127.0.0.1:2379')
5
+ let(:stub) do
6
+ Etcd::Maintenance.new("127.0.0.1", 2379, :this_channel_is_insecure, {})
7
7
  end
8
8
 
9
- describe '#version' do
10
- subject { conn.version }
11
- it { is_expected.to_not be_nil }
12
- end
13
-
14
- describe '#leader_id' do
15
- subject { conn.leader_id }
16
- it { is_expected.to_not be_nil }
17
- end
18
-
19
- describe '#db_size' do
20
- subject { conn.db_size }
21
- it { is_expected.to_not be_nil }
9
+ describe "#member_status" do
10
+ subject { stub.member_status }
11
+ it { is_expected.to be_an_instance_of(Etcdserverpb::StatusResponse)}
22
12
  end
23
13
 
24
14
  describe '#alarm_list' do
25
- before { conn.send(:maintenance).alarms(:activate, conn.leader_id, :NOSPACE) }
26
- after { conn.deactivate_alarms }
27
- subject { conn.alarm_list }
28
- it 'returns an alarm' do
29
- expect(subject).to be_an_instance_of(Etcdserverpb::AlarmResponse)
30
- expect(subject.alarms.size).to eq(1)
31
- end
15
+ let(:leader_id) { stub.member_status.leader }
16
+ subject { stub.alarms(:get, leader_id)}
17
+ it { is_expected.to be_an_instance_of(Etcdserverpb::AlarmResponse) }
32
18
  end
33
19
 
34
20
  describe '#deactivate_alarms' do
35
- before { conn.send(:maintenance).alarms(:activate, conn.leader_id, :NOSPACE) }
36
- subject { conn.deactivate_alarms }
37
- it 'deactivates alarms' do
38
- expect(subject).to be_an_instance_of(Etcdserverpb::AlarmResponse)
39
- expect(conn.alarm_list.alarms.size).to eq(0)
40
- end
21
+ let(:leader_id) { stub.member_status.leader }
22
+ subject { stub.alarms(:deactivate, leader_id, :NOSPACE) }
23
+ it { is_expected.to be_an_instance_of(Etcdserverpb::AlarmResponse) }
41
24
  end
42
25
 
43
26
  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.1.2
4
+ version: 0.1.3
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-03 00:00:00.000000000 Z
11
+ date: 2017-04-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: grpc
@@ -57,6 +57,7 @@ files:
57
57
  - lib/etcdv3/etcdrpc/rpc_pb.rb
58
58
  - lib/etcdv3/etcdrpc/rpc_services_pb.rb
59
59
  - lib/etcdv3/kv.rb
60
+ - lib/etcdv3/lease.rb
60
61
  - lib/etcdv3/maintenance.rb
61
62
  - lib/etcdv3/protos/annotations.proto
62
63
  - lib/etcdv3/protos/auth.proto
@@ -69,6 +70,7 @@ files:
69
70
  - spec/etcd_spec.rb
70
71
  - spec/etcdv3/auth_spec.rb
71
72
  - spec/etcdv3/kv_spec.rb
73
+ - spec/etcdv3/lease_spec.rb
72
74
  - spec/etcdv3/maintenance_spec.rb
73
75
  - spec/helpers/test_instance.rb
74
76
  - spec/spec_helper.rb
@@ -92,7 +94,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
92
94
  version: '0'
93
95
  requirements: []
94
96
  rubyforge_project:
95
- rubygems_version: 2.6.8
97
+ rubygems_version: 2.4.5.1
96
98
  signing_key:
97
99
  specification_version: 4
98
100
  summary: A Etcd client library for Version 3
@@ -100,6 +102,7 @@ test_files:
100
102
  - spec/etcd_spec.rb
101
103
  - spec/etcdv3/auth_spec.rb
102
104
  - spec/etcdv3/kv_spec.rb
105
+ - spec/etcdv3/lease_spec.rb
103
106
  - spec/etcdv3/maintenance_spec.rb
104
107
  - spec/helpers/test_instance.rb
105
108
  - spec/spec_helper.rb