diplomat 2.2.4 → 2.2.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a0813e8904655cc9ce1979f5bfc6eb1b2382be25a475713c999898d4bb06d02d
4
- data.tar.gz: ccc830a11cbc3aedc20c9cb7aea4f79123d1be69b9dc076c9eaf8ef142685092
3
+ metadata.gz: 8ee74cdd0ff09ba455fa1185856231070da1a7b5296bcec09db981a72cb0a235
4
+ data.tar.gz: 2fd779c20984bc5f394c9c5fb6aef1a30abfcc99bd74d1700044c6fe2cc1d4e4
5
5
  SHA512:
6
- metadata.gz: 8debd4bbd65bf6bde7fd86ebccc87748604d593b142ff68405386fcd4c193185ca9213b38392cab874654c2657a4297d05775396840ff4553f862e05a37dc14c
7
- data.tar.gz: 2580b978e27ecb6b732d447d4cd93cf278659b1df85d7113c4b9dcf1bca98917f7f074e2caaead5e8462c21f35c47fc41a5efbae92e9aa31bebbb482218729d8
6
+ metadata.gz: 9d9a9c7e1d7a2fdfdabb7139013da70e5dee028c18dcd2fa820ed5d235a34a26ac3a1b5108d7fab2d76be1bad370ed85a47b791b190104088be2a63287d76d58
7
+ data.tar.gz: 9daf8932e9bd5e2e74ad19cb91b070552805f1f249d553c2975899edc2f1ee27146b6207fb07867cbbb563b0b60b8768d68fc3d276902de28ce0b0a65885d662
data/lib/diplomat.rb CHANGED
@@ -28,7 +28,8 @@ module Diplomat
28
28
 
29
29
  require_libs 'configuration', 'rest_client', 'kv', 'datacenter', 'service',
30
30
  'members', 'node', 'nodes', 'check', 'health', 'session', 'lock',
31
- 'error', 'event', 'acl', 'maintenance', 'query', 'agent', 'status'
31
+ 'error', 'event', 'acl', 'maintenance', 'query', 'agent', 'status',
32
+ 'policy', 'token', 'role'
32
33
  self.configuration ||= Diplomat::Configuration.new
33
34
 
34
35
  class << self
@@ -2,7 +2,7 @@ module Diplomat
2
2
  class KeyNotFound < StandardError; end
3
3
  class PathNotFound < StandardError; end
4
4
  class KeyAlreadyExists < StandardError; end
5
- class AclNotFound < StandardError; end
5
+ class AclNotFound < PathNotFound; end
6
6
  class AclAlreadyExists < StandardError; end
7
7
  class EventNotFound < StandardError; end
8
8
  class EventAlreadyExists < StandardError; end
@@ -10,6 +10,15 @@ module Diplomat
10
10
  class QueryAlreadyExists < StandardError; end
11
11
  class UnknownStatus < StandardError; end
12
12
  class IdParameterRequired < StandardError; end
13
+ class NameParameterRequired < StandardError; end
13
14
  class InvalidTransaction < StandardError; end
14
15
  class DeprecatedArgument < StandardError; end
16
+ class PolicyNotFound < StandardError; end
17
+ class NameParameterRequired < StandardError; end
18
+ class PolicyMalformed < StandardError; end
19
+ class AccessorIdParameterRequired < StandardError; end
20
+ class TokenMalformed < StandardError; end
21
+ class PolicyAlreadyExists < StandardError; end
22
+ class RoleMalformed < StandardError; end
23
+ class RoleNotFound < StandardError; end
15
24
  end
data/lib/diplomat/kv.rb CHANGED
@@ -42,12 +42,8 @@ module Diplomat
42
42
  # - W W - get the first or next value; wait until there is an update
43
43
  # rubocop:disable PerceivedComplexity, MethodLength, LineLength, CyclomaticComplexity
44
44
  def get(key, options = {}, not_found = :reject, found = :return)
45
- key_subst = if key.start_with? '/'
46
- key[1..-1]
47
- else
48
- key.freeze
49
- end
50
- @key = key_subst
45
+ key = normalize_key_for_uri(key)
46
+ @key = key
51
47
  @options = options
52
48
  custom_params = []
53
49
  custom_params << recurse_get(@options)
@@ -111,6 +107,7 @@ module Diplomat
111
107
  # @option options [String] :acquire Session to attach to key
112
108
  # @return [Bool] Success or failure of the write (can fail in c-a-s mode)
113
109
  def put(key, value, options = {})
110
+ key = normalize_key_for_uri(key)
114
111
  @options = options
115
112
  custom_params = []
116
113
  custom_params << use_cas(@options)
@@ -132,6 +129,7 @@ module Diplomat
132
129
  # @option options [Boolean] :recurse If to make recursive get or not
133
130
  # @return [OpenStruct]
134
131
  def delete(key, options = {})
132
+ key = normalize_key_for_uri(key)
135
133
  @key = key
136
134
  @options = options
137
135
  custom_params = []
data/lib/diplomat/lock.rb CHANGED
@@ -10,6 +10,7 @@ module Diplomat
10
10
  # @param options [Hash] options parameter hash
11
11
  # @return [Boolean] If the lock was acquired
12
12
  def acquire(key, session, value = nil, options = {})
13
+ key = normalize_key_for_uri(key)
13
14
  custom_params = []
14
15
  custom_params << use_named_parameter('acquire', session)
15
16
  custom_params << use_named_parameter('dc', options[:dc]) if options[:dc]
@@ -42,6 +43,7 @@ module Diplomat
42
43
  # @return [nil]
43
44
  # rubocop:disable AbcSize
44
45
  def release(key, session, options = {})
46
+ key = normalize_key_for_uri(key)
45
47
  custom_params = []
46
48
  custom_params << use_named_parameter('release', session)
47
49
  custom_params << use_named_parameter('dc', options[:dc]) if options[:dc]
@@ -0,0 +1,112 @@
1
+ module Diplomat
2
+ # Methods for interacting with the Consul ACL Policy API endpoint
3
+ class Policy < Diplomat::RestClient
4
+ @access_methods = %i[list read create delete update]
5
+ attr_reader :id, :type, :acl
6
+
7
+ # Read ACL policy with the given UUID
8
+ # @param id [String] UUID of the ACL policy to read
9
+ # @param options [Hash] options parameter hash
10
+ # @return [Hash] existing ACL policy
11
+ # rubocop:disable PerceivedComplexity
12
+ def read(id, options = {}, not_found = :reject, found = :return)
13
+ @options = options
14
+ custom_params = []
15
+ custom_params << use_consistency(options)
16
+
17
+ @raw = send_get_request(@conn_no_err, ["/v1/acl/policy/#{id}"], options, custom_params)
18
+
19
+ if @raw.status == 200 && @raw.body.chomp != 'null'
20
+ case found
21
+ when :reject
22
+ raise Diplomat::PolicyNotFound, id
23
+ when :return
24
+ return parse_body
25
+ end
26
+ elsif @raw.status == 404
27
+ case not_found
28
+ when :reject
29
+ raise Diplomat::PolicyNotFound, id
30
+ when :return
31
+ return nil
32
+ end
33
+ elsif @raw.status == 403
34
+ case not_found
35
+ when :reject
36
+ raise Diplomat::AclNotFound, id
37
+ when :return
38
+ return nil
39
+ end
40
+ else
41
+ raise Diplomat::UnknownStatus, "status #{@raw.status}: #{@raw.body}"
42
+ end
43
+ end
44
+ # rubocop:enable PerceivedComplexity
45
+
46
+ # List all the ACL policies
47
+ # @param options [Hash] options parameter hash
48
+ # @return [List] list of [Hash] of ACL policies
49
+ def list(options = {})
50
+ @raw = send_get_request(@conn_no_err, ['/v1/acl/policies'], options)
51
+ raise Diplomat::AclNotFound if @raw.status == 403
52
+
53
+ parse_body
54
+ end
55
+
56
+ # Update an existing ACL policy
57
+ # @param value [Hash] ACL policy definition, ID and Name fields are mandatory
58
+ # @param options [Hash] options parameter hash
59
+ # @return [Hash] result ACL policy
60
+ def update(value, options = {})
61
+ id = value[:ID] || value['ID']
62
+ raise Diplomat::IdParameterRequired if id.nil?
63
+
64
+ policy_name = value[:Name] || value['Name']
65
+ raise Diplomat::NameParameterRequired if policy_name.nil?
66
+
67
+ custom_params = use_cas(@options)
68
+ @raw = send_put_request(@conn, ["/v1/acl/policy/#{id}"], options, value, custom_params)
69
+ if @raw.status == 200
70
+ parse_body
71
+ elsif @raw.status == 400
72
+ raise Diplomat::PolicyMalformed, @raw.body
73
+ else
74
+ raise Diplomat::UnknownStatus, "status #{@raw.status}: #{@raw.body}"
75
+ end
76
+ end
77
+
78
+ # Create a new ACL policy
79
+ # @param value [Hash] ACL policy definition, Name field is mandatory
80
+ # @param options [Hash] options parameter hash
81
+ # @return [Hash] new ACL policy
82
+ def create(value, options = {})
83
+ blacklist = ['ID', 'iD', 'Id', :ID, :iD, :Id] & value.keys
84
+ raise Diplomat::PolicyMalformed, 'ID should not be specified' unless blacklist.empty?
85
+
86
+ id = value[:Name] || value['Name']
87
+ raise Diplomat::NameParameterRequired if id.nil?
88
+
89
+ custom_params = use_cas(@options)
90
+ @raw = send_put_request(@conn, ['/v1/acl/policy'], options, value, custom_params)
91
+
92
+ # rubocop:disable GuardClause
93
+ if @raw.status == 200
94
+ return parse_body
95
+ elsif @raw.status == 500 && @raw.body.chomp.include?('already exists')
96
+ raise Diplomat::PolicyAlreadyExists, @raw.body
97
+ else
98
+ raise Diplomat::UnknownStatus, "status #{@raw.status}: #{@raw.body}"
99
+ end
100
+ end
101
+ # rubocop:enable GuardClause
102
+
103
+ # Delete an ACL policy by its UUID
104
+ # @param id [String] UUID of the ACL policy to delete
105
+ # @param options [Hash] options parameter hash
106
+ # @return [Bool]
107
+ def delete(id, options = {})
108
+ @raw = send_delete_request(@conn, ["/v1/acl/policy/#{id}"], options, nil)
109
+ @raw.body.chomp == 'true'
110
+ end
111
+ end
112
+ end
@@ -82,6 +82,44 @@ module Diplomat
82
82
  end
83
83
  end
84
84
 
85
+ protected
86
+
87
+ # Turn the given key into something that the Consul API
88
+ # will consider its canonical form. If we don't do this,
89
+ # then the Consul API will return a HTTP 301 response directing
90
+ # us to the same action with a canonicalized key, and we'd
91
+ # have to waste time following that redirect.
92
+ def normalize_key_for_uri(key)
93
+ # The Consul docs suggest using slashes to organise keys
94
+ # (https://www.consul.io/docs/agent/kv.html#using-consul-kv).
95
+ #
96
+ # However, Consul (like many servers) does strange things with slashes,
97
+ # presumably to "paper over" users' errors in typing URLs.
98
+ # E.g. the key "/my/path" will end up in the URI path component
99
+ # "/v1/kv//my/path", which Consul will redirect (HTTP 301) to
100
+ # "/v1/kv/my/path" -- a very different URI!
101
+ #
102
+ # One solution might be to simply always URI-encode slashes
103
+ # (and all other non-URI-safe characters), but that appears to
104
+ # result in some other weirdness, e.g., keys being returned with
105
+ # URI-encoding in them in contexts totally unrelated to URIs.
106
+ # For examples, see these issues and follow the links:
107
+ #
108
+ # - https://github.com/hashicorp/consul/issues/889
109
+ # - https://github.com/hashicorp/consul/issues/1277
110
+ #
111
+ # For now it seems safest to simply assume that leading literal
112
+ # slashes on keys are benign mistakes, and strip them off.
113
+ # Hopefully the expected behaviour will be formalised/clarified
114
+ # in future versions of Consul, and we can introduce some stricter
115
+ # and more predictable handling of keys on this side.
116
+ if key.start_with? '/'
117
+ key[1..-1]
118
+ else
119
+ key.freeze
120
+ end
121
+ end
122
+
85
123
  private
86
124
 
87
125
  # Build the API Client
@@ -180,7 +218,7 @@ module Diplomat
180
218
  headers = { 'X-Consul-Token' => configuration.acl_token } if configuration.acl_token
181
219
  headers = { 'X-Consul-Token' => options[:token] } if options[:token]
182
220
 
183
- # Parse options used as query params
221
+ # Parse consistency options used as query params
184
222
  consistency = 'stale' if options[:stale]
185
223
  consistency = 'leader' if options[:leader]
186
224
  consistency = 'consistent' if options[:consistent]
@@ -204,6 +242,10 @@ module Diplomat
204
242
  req.options.timeout = options[:timeout] if options[:timeout]
205
243
  end
206
244
  rescue Faraday::ClientError => e
245
+ resp = e.response
246
+ if resp
247
+ raise Diplomat::AclNotFound, e if resp[:status] == 403 && resp[:body] == 'ACL not found'
248
+ end
207
249
  raise Diplomat::PathNotFound, e
208
250
  end
209
251
  end
@@ -0,0 +1,151 @@
1
+ module Diplomat
2
+ # Methods for interacting with the Consul ACL Role API endpoint
3
+ class Role < Diplomat::RestClient
4
+ @access_methods = %i[list read read_name create delete update]
5
+ attr_reader :id, :type, :acl
6
+
7
+ # Read ACL role with the given UUID
8
+ # @param id [String] UUID or name of the ACL role to read
9
+ # @param options [Hash] options parameter hash
10
+ # @return [Hash] existing ACL role
11
+ # rubocop:disable PerceivedComplexity
12
+ def read(id, options = {}, not_found = :reject, found = :return)
13
+ @options = options
14
+ custom_params = []
15
+ custom_params << use_consistency(options)
16
+
17
+ @raw = send_get_request(@conn_no_err, ["/v1/acl/role/#{id}"], options, custom_params)
18
+
19
+ if @raw.status == 200 && @raw.body.chomp != 'null'
20
+ case found
21
+ when :reject
22
+ raise Diplomat::RoleNotFound, id
23
+ when :return
24
+ return parse_body
25
+ end
26
+ elsif @raw.status == 404
27
+ case not_found
28
+ when :reject
29
+ raise Diplomat::RoleNotFound, id
30
+ when :return
31
+ return nil
32
+ end
33
+ elsif @raw.status == 403
34
+ case not_found
35
+ when :reject
36
+ raise Diplomat::AclNotFound, id
37
+ when :return
38
+ return nil
39
+ end
40
+ else
41
+ raise Diplomat::UnknownStatus, "status #{@raw.status}: #{@raw.body}"
42
+ end
43
+ end
44
+ # rubocop:enable PerceivedComplexity
45
+
46
+ # Read ACL role with the given name
47
+ # @param name [String] name of the ACL role to read
48
+ # @param options [Hash] options parameter hash
49
+ # @return [Hash] existing ACL role
50
+ # rubocop:disable PerceivedComplexity
51
+ def read_name(name, options = {}, not_found = :reject, found = :return)
52
+ @options = options
53
+ custom_params = []
54
+ custom_params << use_consistency(options)
55
+
56
+ @raw = send_get_request(@conn_no_err, ["/v1/acl/role/name/#{name}"], options, custom_params)
57
+
58
+ if @raw.status == 200 && @raw.body.chomp != 'null'
59
+ case found
60
+ when :reject
61
+ raise Diplomat::RoleNotFound, name
62
+ when :return
63
+ return parse_body
64
+ end
65
+ elsif @raw.status == 404
66
+ case not_found
67
+ when :reject
68
+ raise Diplomat::RoleNotFound, name
69
+ when :return
70
+ return nil
71
+ end
72
+ elsif @raw.status == 403
73
+ case not_found
74
+ when :reject
75
+ raise Diplomat::AclNotFound, name
76
+ when :return
77
+ return nil
78
+ end
79
+ else
80
+ raise Diplomat::UnknownStatus, "status #{@raw.status}: #{@raw.body}"
81
+ end
82
+ end
83
+ # rubocop:enable PerceivedComplexity
84
+
85
+ # List all the ACL roles
86
+ # @param options [Hash] options parameter hash
87
+ # @return [List] list of [Hash] of ACL roles
88
+ def list(options = {})
89
+ @raw = send_get_request(@conn_no_err, ['/v1/acl/roles'], options)
90
+ raise Diplomat::AclNotFound if @raw.status == 403
91
+
92
+ parse_body
93
+ end
94
+
95
+ # Update an existing ACL role
96
+ # @param value [Hash] ACL role definition, ID and Name fields are mandatory
97
+ # @param options [Hash] options parameter hash
98
+ # @return [Hash] result ACL role
99
+ def update(value, options = {})
100
+ id = value[:ID] || value['ID']
101
+ raise Diplomat::IdParameterRequired if id.nil?
102
+
103
+ role_name = value[:Name] || value['Name']
104
+ raise Diplomat::NameParameterRequired if role_name.nil?
105
+
106
+ custom_params = use_cas(@options)
107
+ @raw = send_put_request(@conn, ["/v1/acl/role/#{id}"], options, value, custom_params)
108
+ if @raw.status == 200
109
+ parse_body
110
+ elsif @raw.status == 400
111
+ raise Diplomat::RoleMalformed, @raw.body
112
+ else
113
+ raise Diplomat::UnknownStatus, "status #{@raw.status}: #{@raw.body}"
114
+ end
115
+ end
116
+
117
+ # Create a new ACL role
118
+ # @param value [Hash] ACL role definition, Name field is mandatory
119
+ # @param options [Hash] options parameter hash
120
+ # @return [Hash] new ACL role
121
+ def create(value, options = {})
122
+ blacklist = ['ID', 'iD', 'Id', :ID, :iD, :Id] & value.keys
123
+ raise Diplomat::RoleMalformed, 'ID should not be specified' unless blacklist.empty?
124
+
125
+ id = value[:Name] || value['Name']
126
+ raise Diplomat::NameParameterRequired if id.nil?
127
+
128
+ custom_params = use_cas(@options)
129
+ @raw = send_put_request(@conn, ['/v1/acl/role'], options, value, custom_params)
130
+
131
+ # rubocop:disable GuardClause
132
+ if @raw.status == 200
133
+ return parse_body
134
+ elsif @raw.status == 500 && @raw.body.chomp.include?('already exists')
135
+ raise Diplomat::RoleAlreadyExists, @raw.body
136
+ else
137
+ raise Diplomat::UnknownStatus, "status #{@raw.status}: #{@raw.body}"
138
+ end
139
+ end
140
+ # rubocop:enable GuardClause
141
+
142
+ # Delete an ACL role by its UUID
143
+ # @param id [String] UUID of the ACL role to delete
144
+ # @param options [Hash] options parameter hash
145
+ # @return [Bool]
146
+ def delete(id, options = {})
147
+ @raw = send_delete_request(@conn, ["/v1/acl/role/#{id}"], options, nil)
148
+ @raw.body.chomp == 'true'
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,133 @@
1
+ module Diplomat
2
+ # Methods for interacting with the Consul ACL Policy API endpoint
3
+ class Token < Diplomat::RestClient
4
+ @access_methods = %i[list read create delete update clone self]
5
+ attr_reader :id, :type, :acl
6
+
7
+ # Read ACL token with the given Accessor ID
8
+ # @param id [String] accessor ID of the ACL token to read
9
+ # @param options [Hash] options parameter hash
10
+ # @return [Hash] existing ACL token
11
+ # rubocop:disable PerceivedComplexity
12
+ def read(id, options = {}, not_found = :reject, found = :return)
13
+ @options = options
14
+ custom_params = []
15
+ custom_params << use_consistency(options)
16
+
17
+ @raw = send_get_request(@conn_no_err, ["/v1/acl/token/#{id}"], options, custom_params)
18
+
19
+ if @raw.status == 200 && @raw.body.chomp != 'null'
20
+ case found
21
+ when :reject
22
+ raise Diplomat::AclNotFound, id
23
+ when :return
24
+ return parse_body
25
+ end
26
+ elsif @raw.status == 403
27
+ case not_found
28
+ when :reject
29
+ raise Diplomat::AclNotFound, id
30
+ when :return
31
+ return nil
32
+ end
33
+ else
34
+ raise Diplomat::UnknownStatus, "status #{@raw.status}: #{@raw.body}"
35
+ end
36
+ end
37
+ # rubocop:enable PerceivedComplexity
38
+
39
+ # List all the ACL tokens
40
+ # @param policy [String] filters the token list matching the specific policy ID
41
+ # @param role [String] filters the token list matching the specific role ID
42
+ # @param authmethod [String] the token list matching the specific named auth method
43
+ # @param options [Hash] options parameter hash
44
+ # @return [List] list of [Hash] of ACL tokens
45
+ def list(policy = nil, role = nil, authmethod = nil, options = {})
46
+ custom_params = []
47
+ custom_params << use_named_parameter('policy', policy) if policy
48
+ custom_params << use_named_parameter('role', policy) if role
49
+ custom_params << use_named_parameter('authmethod', policy) if authmethod
50
+ @raw = send_get_request(@conn_no_err, ['/v1/acl/tokens'], options, custom_params)
51
+ raise Diplomat::AclNotFound if @raw.status == 403
52
+
53
+ parse_body
54
+ end
55
+
56
+ # Update an existing ACL token
57
+ # @param value [Hash] ACL token definition, AccessorID is mandatory
58
+ # @param options [Hash] options parameter hash
59
+ # @return [Hash] result ACL token
60
+ def update(value, options = {})
61
+ id = value[:AccessorID] || value['AccessorID']
62
+ raise Diplomat::AccessorIdParameterRequired if id.nil?
63
+
64
+ custom_params = use_cas(@options)
65
+ @raw = send_put_request(@conn, ["/v1/acl/token/#{id}"], options, value, custom_params)
66
+ if @raw.status == 200
67
+ parse_body
68
+ elsif @raw.status == 403
69
+ raise Diplomat::AclNotFound, id
70
+ elsif @raw.status == 400
71
+ raise Diplomat::TokenMalformed, @raw.body
72
+ else
73
+ raise Diplomat::UnknownStatus, "status #{@raw.status}: #{@raw.body}"
74
+ end
75
+ end
76
+
77
+ # Create a new ACL token
78
+ # @param value [Hash] ACL token definition
79
+ # @param options [Hash] options parameter hash
80
+ # @return [Hash] new ACL token
81
+ def create(value, options = {})
82
+ custom_params = use_cas(@options)
83
+ @raw = send_put_request(@conn, ['/v1/acl/token'], options, value, custom_params)
84
+ return parse_body if @raw.status == 200
85
+
86
+ raise Diplomat::UnknownStatus, "status #{@raw.status}: #{@raw.body}"
87
+ end
88
+
89
+ # Delete an existing ACL token
90
+ # @param id [String] UUID of the ACL token to delete
91
+ # @param options [Hash] options parameter hash
92
+ # @return [Bool]
93
+ def delete(id, options = {})
94
+ anonymous_token = '00000000-0000-0000-0000-000000000002'
95
+ raise Diplomat::NotPermitted, "status #{@raw.status}: #{@raw.body}" if id == anonymous_token
96
+
97
+ @raw = send_delete_request(@conn, ["/v1/acl/token/#{id}"], options, nil)
98
+ @raw.body.chomp == 'true'
99
+ end
100
+
101
+ # Clone an existing ACL token
102
+ # @param value [Hash] ACL token definition, AccessorID is mandatory
103
+ # @param options [Hash] options parameter hash
104
+ # @return [Hash] cloned ACL token
105
+ def clone(value, options = {})
106
+ id = value[:AccessorID] || value['AccessorID']
107
+ raise Diplomat::AccessorIdParameterRequired if id.nil?
108
+
109
+ custom_params = use_cas(@options)
110
+ @raw = send_put_request(@conn, ["/v1/acl/token/#{id}/clone"], options, value, custom_params)
111
+ if @raw.status == 200
112
+ parse_body
113
+ elsif @raw.status == 403
114
+ raise Diplomat::AclNotFound, id
115
+ else
116
+ raise Diplomat::UnknownStatus, "status #{@raw.status}: #{@raw.body}"
117
+ end
118
+ end
119
+
120
+ # Returns ACL token details matching X-Consul-Token header
121
+ # @param options [Hash] options parameter hash
122
+ # @return [Hash] ACL token
123
+ def self(options = {})
124
+ custom_params = use_cas(@options)
125
+ @raw = send_get_request(@conn, ['/v1/acl/token/self'], options, custom_params)
126
+ if @raw.status == 200
127
+ parse_body
128
+ elsif @raw.status == 403
129
+ raise Diplomat::AclNotFound, id
130
+ end
131
+ end
132
+ end
133
+ end
@@ -1,3 +1,3 @@
1
1
  module Diplomat
2
- VERSION = '2.2.4'.freeze
2
+ VERSION = '2.2.5'.freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: diplomat
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.4
4
+ version: 2.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Hamelink
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-04-11 00:00:00.000000000 Z
12
+ date: 2019-06-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -149,14 +149,14 @@ dependencies:
149
149
  requirements:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
- version: '0.49'
152
+ version: 0.67.0
153
153
  type: :development
154
154
  prerelease: false
155
155
  version_requirements: !ruby/object:Gem::Requirement
156
156
  requirements:
157
157
  - - "~>"
158
158
  - !ruby/object:Gem::Version
159
- version: '0.49'
159
+ version: 0.67.0
160
160
  - !ruby/object:Gem::Dependency
161
161
  name: webmock
162
162
  requirement: !ruby/object:Gem::Requirement
@@ -233,11 +233,14 @@ files:
233
233
  - lib/diplomat/members.rb
234
234
  - lib/diplomat/node.rb
235
235
  - lib/diplomat/nodes.rb
236
+ - lib/diplomat/policy.rb
236
237
  - lib/diplomat/query.rb
237
238
  - lib/diplomat/rest_client.rb
239
+ - lib/diplomat/role.rb
238
240
  - lib/diplomat/service.rb
239
241
  - lib/diplomat/session.rb
240
242
  - lib/diplomat/status.rb
243
+ - lib/diplomat/token.rb
241
244
  - lib/diplomat/version.rb
242
245
  homepage: https://github.com/WeAreFarmGeek/diplomat
243
246
  licenses: