etcdv3 0.1.0 → 0.1.1

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: 6a62664451e058e0837e78b5ea583944532f596e
4
- data.tar.gz: df7954ad160f76a260d297a8c13357f50ef15474
3
+ metadata.gz: b631270b8fb44fc9f63bf971305a3a5336bc9064
4
+ data.tar.gz: 799324974b4957ace06c52553281a37ac178a1af
5
5
  SHA512:
6
- metadata.gz: af31ea39606da03fed56cbfb723d1958feaec6507c1f13ee60dba9ab9c870bcdeaead2cec21ea79ea373a3eb9a4ece179684a3a9688ab86d659cfe9918b4fc8e
7
- data.tar.gz: 1037364a45050545ab05b6dca88661fe9ecd6d6824a29ef9fcfe53abcd8a55044550f89a4e407708c558fbd57fe865735adc78349f57001238c1ae6527e185de
6
+ metadata.gz: fbe1eb6655e78bd7ba390bb84b5d11d8b2843f8ebab0ee12838d02a0da46508409847f993081307a2eb56192ea8bd0ec98156095964b11034e3872b413940195
7
+ data.tar.gz: 7124c6966834392ee9f11b44770160ee8e0ee2cdd3fa892901f58d1f87ce46b1f6c78257a0ce86df6bfc97887acba9bf525797da57f4c8302458538f25770278
data/Gemfile CHANGED
@@ -2,3 +2,6 @@ source 'https://rubygems.org'
2
2
 
3
3
  gem "grpc"
4
4
  gem 'rspec'
5
+ gem 'faraday', '0.11.0'
6
+
7
+
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # etcdv3-ruby [![Build Status](https://travis-ci.org/davissp14/etcdv3-ruby.svg?branch=master)](https://travis-ci.org/davissp14/etcdv3-ruby)
1
+ # etcdv3-ruby [![Gem Version](https://badge.fury.io/rb/etcdv3.svg)](https://badge.fury.io/rb/etcdv3) [![Build Status](https://travis-ci.org/davissp14/etcdv3-ruby.svg?branch=master)](https://travis-ci.org/davissp14/etcdv3-ruby)
2
2
 
3
3
  Ruby client for Etcd V3
4
4
 
@@ -55,7 +55,10 @@ conn.user_list
55
55
  **Role Management**
56
56
  ```
57
57
  # Add Role
58
- conn.add_role('rolename', 'readwrite', 'a', 'Z')
58
+ conn.add_role('rolename')
59
+
60
+ # Grant Permission to Role
61
+ conn.grant_permission_to_role('rolename', 'readwrite', 'a', 'z')
59
62
 
60
63
  # Delete Role
61
64
  conn.delete_role('rolename')
data/lib/etcdv3/auth.rb CHANGED
@@ -37,14 +37,25 @@ class Etcd
37
37
  @stub.user_delete(Authpb::User.new(name: user))
38
38
  end
39
39
 
40
- def add_role(name, permission, key, range_end)
41
- permission = Authpb::Permission.new(
42
- permType: Etcd::Auth::PERMISSIONS[permission], key: key, range_end: range_end
43
- )
44
- @stub.role_add(
45
- Authpb::Role.new(name: name, keyPermission: [permission]),
46
- metadata: @metadata
40
+ def get_user(user)
41
+ @stub.user_get(Authpb::User.new(name: user))
42
+ end
43
+
44
+ def change_user_password(user, new_password)
45
+ request = Etcdserverpb::AuthUserChangePasswordRequest.new(
46
+ name: user,
47
+ password: new_password
47
48
  )
49
+ @stub.user_change_password(request, metadata: @metadata)
50
+ end
51
+
52
+ def add_role(name)
53
+ @stub.role_add(Authpb::Role.new(name: name), metadata: @metadata)
54
+ end
55
+
56
+ def get_role(name)
57
+ request = Etcdserverpb::AuthRoleGetRequest.new(role: name)
58
+ @stub.role_get(request, metadata: @metadata)
48
59
  end
49
60
 
50
61
  def delete_role(name)
@@ -61,6 +72,30 @@ class Etcd
61
72
  @stub.user_revoke_role(request, metadata: @metadata)
62
73
  end
63
74
 
75
+ def grant_permission_to_role(name, permission, key, range_end)
76
+ permission = Authpb::Permission.new(
77
+ permType: Etcd::Auth::PERMISSIONS[permission], key: key, range_end: range_end
78
+ )
79
+ @stub.role_grant_permission(
80
+ Etcdserverpb::AuthRoleGrantPermissionRequest.new(
81
+ name: name,
82
+ perm: permission
83
+ ),
84
+ metadata: @metadata
85
+ )
86
+ end
87
+
88
+ def revoke_permission_from_role(name, permission, key, range_end)
89
+ @stub.role_revoke_permission(
90
+ Etcdserverpb::AuthRoleRevokePermissionRequest.new(
91
+ role: name,
92
+ key: key,
93
+ range_end: range_end
94
+ ),
95
+ metadata: @metadata
96
+ )
97
+ end
98
+
64
99
  def role_list
65
100
  @stub.role_list(Authpb::Role.new, metadata: @metadata)
66
101
  end
data/lib/etcdv3/kv.rb CHANGED
@@ -9,11 +9,17 @@ class Etcd
9
9
  def put(key, value)
10
10
  kv = Etcdserverpb::PutRequest.new(key: key, value: value)
11
11
  @stub.put(kv, metadata: @metadata)
12
+ rescue GRPC::PermissionDenied, GRPC::InvalidArgument => exception
13
+ puts exception.message
14
+ false
12
15
  end
13
16
 
14
17
  def get(key, range_end="")
15
18
  kv = Etcdserverpb::RangeRequest.new(key: key, range_end: range_end)
16
19
  @stub.range(kv, metadata: @metadata).kvs
20
+ rescue GRPC::PermissionDenied, GRPC::InvalidArgument => exception
21
+ puts exception.message
22
+ false
17
23
  end
18
24
  end
19
25
  end
@@ -1,3 +1,3 @@
1
1
  class Etcd
2
- VERSION = '0.1.0'
2
+ VERSION = '0.1.1'
3
3
  end
data/lib/etcdv3.rb CHANGED
@@ -45,26 +45,43 @@ class Etcd
45
45
  @metadata[:token] = auth.generate_token(user, password) unless user.nil?
46
46
  end
47
47
 
48
+ # Inserts a new key.
48
49
  def put(key, value)
49
50
  kv.put(key, value)
50
51
  end
51
52
 
53
+ # Fetches key(s).
52
54
  def get(key, range_end='')
53
55
  kv.get(key, range_end)
54
56
  end
55
57
 
58
+ # Creates new user.
56
59
  def add_user(user, password)
57
60
  auth.add_user(user, password)
58
61
  end
59
62
 
63
+ # Fetch specified user
64
+ def get_user(user)
65
+ auth.get_user(user)
66
+ end
67
+
68
+ # Delete specified user.
60
69
  def delete_user(user)
61
70
  auth.delete_user(user)
62
71
  end
63
72
 
73
+ # Changes the specified users password.
74
+ def change_user_password(user, new_password)
75
+ auth.change_user_password(user, new_password)
76
+ end
77
+
78
+ # List all users.
64
79
  def user_list
65
80
  auth.user_list
66
81
  end
67
82
 
83
+ # Authenticate using specified user and password.
84
+ # On successful authentication, an auth token will be assigned to the instance.
68
85
  def authenticate(user, password)
69
86
  token = auth.generate_token(user, password)
70
87
  if token
@@ -73,35 +90,57 @@ class Etcd
73
90
  @options[:password] = password
74
91
  return true
75
92
  end
93
+ return false
76
94
  rescue GRPC::InvalidArgument => exception
77
- print exception.message
78
95
  return false
79
96
  end
80
97
 
98
+ # List all roles.
81
99
  def role_list
82
100
  auth.role_list
83
101
  end
84
102
 
85
- def add_role(name, permission, key, range_end='')
86
- auth.add_role(name, permission, key, range_end)
103
+ # Add role with specified name.
104
+ def add_role(name)
105
+ auth.add_role(name)
87
106
  end
88
107
 
108
+ # Fetches a specified role.
109
+ def get_role(name)
110
+ auth.get_role(name)
111
+ end
112
+
113
+ # Delete role.
89
114
  def delete_role(name)
90
115
  auth.delete_role(name)
91
116
  end
92
117
 
118
+ # Grants role to an existing user.
93
119
  def grant_role_to_user(user, role)
94
120
  auth.grant_role_to_user(user, role)
95
121
  end
96
122
 
123
+ # Revokes role from a specified user.
97
124
  def revoke_role_from_user(user, role)
98
125
  auth.revoke_role_from_user(user, role)
99
126
  end
100
127
 
128
+ # Grants a new permission to an existing role.
129
+ def grant_permission_to_role(name, permission, key, range_end='')
130
+ auth.grant_permission_to_role(name, permission, key, range_end)
131
+ end
132
+
133
+ def revoke_permission_from_role(name, permission, key, range_end='')
134
+ auth.revoke_permission_from_role(name, permission, key, range_end)
135
+ end
136
+
137
+ # Enables authentication.
101
138
  def enable_auth
102
139
  auth.enable_auth
103
140
  end
104
141
 
142
+ # Disables authentication.
143
+ # This will clear any active auth / token data.
105
144
  def disable_auth
106
145
  response = auth.disable_auth
107
146
  if response
data/spec/etcd_spec.rb CHANGED
@@ -6,25 +6,14 @@ describe Etcd do
6
6
  Etcd.new(url: 'http://127.0.0.1:2379')
7
7
  end
8
8
  describe '#initialize' do
9
- it 'assigns scheme' do
10
- expect(conn.scheme).to eq('http')
11
- end
12
-
13
- it 'assigns host' do
14
- expect(conn.hostname).to eq('127.0.0.1')
15
- end
16
-
17
- it 'assigns port' do
18
- expect(conn.port).to eq(2379)
19
- end
20
-
21
- it 'returns nil token' do
22
- expect(conn.token).to eq(nil)
23
- end
24
-
25
- it 'assigns proper credentials' do
26
- expect(conn.credentials).to eq(:this_channel_is_insecure)
27
- end
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(port: 2379) }
13
+ it { is_expected.to have_attributes(credentials: :this_channel_is_insecure) }
14
+ it { is_expected.to have_attributes(token: nil) }
15
+ it { is_expected.to have_attributes(user: nil) }
16
+ it { is_expected.to have_attributes(password: nil) }
28
17
  end
29
18
  end
30
19
  end
@@ -7,80 +7,100 @@ describe Etcd::Auth do
7
7
  end
8
8
 
9
9
  describe '#add_user' do
10
- it 'returns AuthUserAddResponse' do
11
- expect(conn.add_user("boom", 'test')).to \
12
- be_an_instance_of(Etcdserverpb::AuthUserAddResponse)
13
- end
10
+ after { conn.delete_user('boom') }
11
+ subject { conn.add_user('boom', 'test') }
12
+ it { is_expected.to be_an_instance_of(Etcdserverpb::AuthUserAddResponse) }
14
13
  end
15
14
 
16
- describe '#user_list' do
17
-
18
- it 'returns Protobuf' do
19
- expect(conn.user_list).to \
20
- be_an_instance_of(Google::Protobuf::RepeatedField)
21
- end
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') }
19
+ it { is_expected.to be_an_instance_of(Etcdserverpb::AuthUserGetResponse) }
20
+ end
22
21
 
23
- it 'returns listme user' do
24
- conn.add_user('listme', 'test')
25
- expect(conn.user_list).to include('listme')
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')
26
29
  end
27
30
  end
28
31
 
29
32
  describe '#delete_user' do
30
- before do
31
- conn.add_user('testuser', 'test')
32
- end
33
- it 'returns AuthUserDeleteResponse' do
34
- expect(conn.delete_user('testuser')).to \
35
- be_an_instance_of(Etcdserverpb::AuthUserDeleteResponse)
36
- end
33
+ before { conn.add_user('delete_user', 'test') }
34
+ subject { conn.delete_user('delete_user') }
35
+ it { is_expected.to be_an_instance_of(Etcdserverpb::AuthUserDeleteResponse) }
37
36
  end
38
37
 
39
38
  describe '#grant_role_to_user' do
40
- before do
41
- conn.add_user('root', 'password')
42
- end
43
- after do
44
- conn.delete_user('root')
45
- end
46
- it 'returns AuthUserGrantRoleResponse' do
47
- expect(conn.grant_role_to_user("root", 'root')).to \
48
- be_an_instance_of(Etcdserverpb::AuthUserGrantRoleResponse)
49
- end
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') }
42
+ it { is_expected.to be_an_instance_of(Etcdserverpb::AuthUserGrantRoleResponse) }
50
43
  end
51
44
 
52
45
  describe '#revoke_role_from_user' do
53
46
  before do
54
- conn.add_user('test_user', 'password')
55
- conn.grant_role_to_user('test_user', 'root')
56
- end
57
- after do
58
- conn.delete_user('test_user')
59
- end
60
- it 'returns AuthUserGrantRoleResponse' do
61
- expect(conn.revoke_role_from_user("test_user", 'root')).to \
62
- be_an_instance_of(Etcdserverpb::AuthUserRevokeRoleResponse)
47
+ conn.add_user('revoke_user', 'password')
48
+ conn.grant_role_to_user('revoke_user', 'root')
63
49
  end
50
+ after { conn.delete_user('revoke_user') }
51
+ subject { conn.revoke_role_from_user('revoke_user', 'root') }
52
+ it { is_expected.to be_an_instance_of(Etcdserverpb::AuthUserRevokeRoleResponse) }
64
53
  end
65
54
 
66
55
  describe '#add_role' do
67
- it 'returns AuthRoleAddResponse' do
68
- expect(conn.add_role('testRole', 'readwrite', 'a', 'Z')).to \
69
- be_an_instance_of(Etcdserverpb::AuthRoleAddResponse)
56
+ after { conn.delete_role('add_role') }
57
+ subject { conn.add_role('add_role') }
58
+ it 'adds a role' do
59
+ expect(subject).to be_an_instance_of(Etcdserverpb::AuthRoleAddResponse)
60
+ expect(conn.role_list.roles).to include('add_role')
70
61
  end
71
62
  end
72
63
 
73
- describe '#add_delete' do
74
- it 'returns AuthRoleAddResponse' do
75
- expect(conn.delete_role('testRole')).to \
76
- be_an_instance_of(Etcdserverpb::AuthRoleDeleteResponse)
64
+ 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') }
68
+ it { is_expected.to be_an_instance_of(Etcdserverpb::AuthRoleGetResponse) }
69
+ end
70
+
71
+ describe '#delete_role' do
72
+ before { conn.add_role('delete_role') }
73
+ subject { conn.delete_role('delete_role') }
74
+ it 'deletes role' do
75
+ expect(subject).to be_an_instance_of(Etcdserverpb::AuthRoleDeleteResponse)
76
+ expect(conn.role_list.roles).to_not include('delete_role')
77
77
  end
78
78
  end
79
79
 
80
80
  describe '#role_list' do
81
- it 'returns AuthRoleListResponse' do
82
- expect(conn.role_list).to \
83
- be_an_instance_of(Etcdserverpb::AuthRoleListResponse)
81
+ subject { conn.role_list }
82
+ it { is_expected.to be_an_instance_of(Etcdserverpb::AuthRoleListResponse) }
83
+ end
84
+
85
+ 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') }
89
+ it 'sets permission' do
90
+ expect(subject).to be_an_instance_of(Etcdserverpb::AuthRoleGrantPermissionResponse)
91
+ end
92
+ end
93
+
94
+ describe '#revoke_permission_from_role' do
95
+ before do
96
+ conn.add_role('myrole')
97
+ conn.grant_permission_to_role('myrole', 'write', 'c', 'cc')
98
+ end
99
+ after { conn.delete_role('myrole') }
100
+ subject { conn.revoke_permission_from_role('myrole', 'write', 'c', 'cc') }
101
+ it 'revokes permission' do
102
+ expect(subject).to be_an_instance_of(Etcdserverpb::AuthRoleRevokePermissionResponse)
103
+ expect(conn.get_role('myrole').perm.size).to eq(0)
84
104
  end
85
105
  end
86
106
 
@@ -91,13 +111,9 @@ describe Etcd::Auth do
91
111
  conn.enable_auth
92
112
  conn.authenticate('root', 'test')
93
113
  end
94
- after do
95
- conn.delete_user('root')
96
- end
97
- it 'returns AuthDisableResponse' do
98
- expect(conn.disable_auth).to \
99
- be_an_instance_of(Etcdserverpb::AuthDisableResponse)
100
- end
114
+ after { conn.delete_user('root') }
115
+ subject { conn.disable_auth }
116
+ it { is_expected.to be_an_instance_of(Etcdserverpb::AuthDisableResponse) }
101
117
  end
102
118
 
103
119
  describe '#enable_auth' do
@@ -110,9 +126,15 @@ describe Etcd::Auth do
110
126
  conn.disable_auth
111
127
  conn.delete_user('root')
112
128
  end
113
- it 'returns AuthEnableResponse' do
114
- expect(conn.enable_auth).to be_an_instance_of(Etcdserverpb::AuthEnableResponse)
115
- end
129
+ subject { conn.enable_auth }
130
+ it { is_expected.to be_an_instance_of(Etcdserverpb::AuthEnableResponse) }
131
+ end
132
+
133
+ 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') }
137
+ it { is_expected.to be_an_instance_of(Etcdserverpb::AuthUserChangePasswordResponse) }
116
138
  end
117
139
 
118
140
  describe "#authenticate" do
@@ -127,7 +149,7 @@ describe Etcd::Auth do
127
149
  conn.disable_auth
128
150
  conn.delete_user('root')
129
151
  end
130
- it 'properly reconfigures token + user + password' do
152
+ it 'properly reconfigures auth and token' do
131
153
  expect(conn.token).to_not be_nil
132
154
  expect(conn.user).to eq('root')
133
155
  expect(conn.password).to eq('test')
@@ -135,9 +157,8 @@ describe Etcd::Auth do
135
157
  end
136
158
 
137
159
  context 'auth disabled' do
138
- it 'returns false when authenticating with auth disabled' do
139
- expect(conn.authenticate('root', 'root')).to eq(false)
140
- end
160
+ subject { conn.authenticate('root', 'root') }
161
+ it { is_expected.to eq(false) }
141
162
  end
142
163
  end
143
164
  end
@@ -7,23 +7,17 @@ describe Etcd::KV do
7
7
  end
8
8
 
9
9
  describe '#put' do
10
- it 'returns PutResponse' do
11
- expect(conn.put('test', 'test')).to \
12
- be_an_instance_of(Etcdserverpb::PutResponse)
13
- end
10
+ subject { conn.put('test', 'test') }
11
+ it { is_expected.to be_an_instance_of(Etcdserverpb::PutResponse) }
14
12
  end
15
13
 
16
14
  describe '#get' do
17
- before do
18
- conn.put('test', "zoom")
19
- end
20
- it 'returns protobuf' do
21
- expect(conn.get('test')).to \
22
- be_an_instance_of(Google::Protobuf::RepeatedField)
23
- end
24
-
25
- it 'returns correct result' do
26
- expect(conn.get('test').first.key).to eq('test')
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
21
  end
28
22
  end
29
23
  end
@@ -42,7 +42,7 @@ module Helpers
42
42
  end
43
43
 
44
44
  def stop
45
- @pids.each { |pid| Process.kill('TERM', pid) }
45
+ @pids.each { |pid| Process.kill('TERM', pid) } rescue nil
46
46
  FileUtils.remove_entry_secure(@tmpdir, true)
47
47
  @pids.clear
48
48
  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.0
4
+ version: 0.1.1
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-03-31 00:00:00.000000000 Z
11
+ date: 2017-04-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: grpc
@@ -90,7 +90,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
90
90
  version: '0'
91
91
  requirements: []
92
92
  rubyforge_project:
93
- rubygems_version: 2.6.8
93
+ rubygems_version: 2.6.11
94
94
  signing_key:
95
95
  specification_version: 4
96
96
  summary: A Etcd client library for Version 3