volcano-sdk 0.28.0 → 0.29.0

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
  SHA256:
3
- metadata.gz: 47568709329b06a2dd8a84c4ab0058accc47d749d6cc773de6a87c0fc08a6ce1
4
- data.tar.gz: d9685709f29037f6db0c5598bae32a84537500f2025337dbf6497a729a315774
3
+ metadata.gz: e946d4476603cf2c234194f51e63aadd8ca1327719bcae02bf098de61049b65b
4
+ data.tar.gz: 38d3aa7dbbc508796620f75285b2a483b70a9e2d49a255aded0dba3fa023334b
5
5
  SHA512:
6
- metadata.gz: 776a324b0d6330c0152e4ef6f46f87d4145f5605c8ed9c4f1fbe648418b8d806e67c668af5f1d41e75ecd5825aa58b4b8d894cb6941c75413f3991153e021f84
7
- data.tar.gz: 2b3a2bc60a3cd4e77c32c08f44fc2c8529cc886688381eec5abcdb8ca6bd4f2160fa8bddbfba75544fd865b99b44160a055fece6b65f78c4c6ca1fd79a8bddaf
6
+ metadata.gz: 014b16629b5d06e89d39f010b1c8cb550582f3f7f224b6c6911324c6b2b07196eed9729305c2edd623d6fbedb2ba12a9460d4d128bda61202c9c88874823fada
7
+ data.tar.gz: d98691e237fd5cdb277f701701e3549aa6e533179d36c0039e188a66143fe5992a1ac9565f210304704838d2e855a9512e9e2e60de7ec0b2abfa9a8a30ae4cb2
@@ -52,7 +52,9 @@ module Volcano
52
52
  invoke do
53
53
  apis = @api_factory.call(authorization)
54
54
  body = Generated::ProjectLockLeaseRequest.new(ttl_seconds: ttl)
55
- result = apis.locks.acquire_project_lock_with_http_info(key, token, request_id, body)
55
+ result = apis.locks.acquire_project_lock_with_http_info(
56
+ key, token, request_id, body, debug_return_type: 'Object'
57
+ )
56
58
  data, status, headers = result
57
59
  response(data, status, headers)
58
60
  end
@@ -63,7 +65,8 @@ module Volcano
63
65
  apis = @api_factory.call(authorization)
64
66
  data, status, headers = apis.locks.get_project_lock_with_http_info(
65
67
  key,
66
- request_id
68
+ request_id,
69
+ debug_return_type: 'Object'
67
70
  )
68
71
  response(data, status, headers)
69
72
  end
@@ -85,7 +88,7 @@ module Volcano
85
88
  apis = @api_factory.call(authorization)
86
89
  body = Generated::ProjectLockLeaseRequest.new(ttl_seconds: ttl)
87
90
  result = apis.locks.renew_project_lock_with_http_info(
88
- key, token, request_id, body
91
+ key, token, request_id, body, debug_return_type: 'Object'
89
92
  )
90
93
  data, status, headers = result
91
94
  response(data, status, headers)
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'time'
4
+
5
+ module Volcano
6
+ # Validates lock response fields before creating public records.
7
+ module LockResponse
8
+ private
9
+
10
+ def parse_time(value)
11
+ return Time.iso8601(value) if value.is_a?(String)
12
+ return value if value.nil? || value.is_a?(Time)
13
+
14
+ raise Error::TransportError, 'invalid lock expiry'
15
+ rescue ArgumentError => e
16
+ raise Error::TransportError, 'invalid lock expiry', cause: e
17
+ end
18
+
19
+ def required_time(value)
20
+ parse_time(value) || raise(Error::TransportError, 'invalid lock expiry')
21
+ end
22
+
23
+ def lock_payload(body)
24
+ raise Error::TransportError, 'invalid lock response' unless body.is_a?(Hash)
25
+
26
+ body
27
+ end
28
+
29
+ def lock_held(value)
30
+ return true if value == true
31
+ return false if value == false
32
+
33
+ raise Error::TransportError, 'invalid lock held flag'
34
+ end
35
+
36
+ def required_fencing_token(value)
37
+ raise Error::TransportError, 'invalid lock fencing token' unless value.is_a?(Integer)
38
+
39
+ value
40
+ end
41
+
42
+ def optional_fencing_token(value)
43
+ return if value.nil?
44
+
45
+ required_fencing_token(value)
46
+ end
47
+ end
48
+ end
data/lib/volcano/locks.rb CHANGED
@@ -7,6 +7,7 @@ module Volcano
7
7
  # Acquires and releases project-scoped distributed locks.
8
8
  class Locks
9
9
  include LockAutoRenewal
10
+ include LockResponse
10
11
 
11
12
  def initialize(client, transport)
12
13
  @client = client
@@ -14,80 +15,103 @@ module Volcano
14
15
  end
15
16
 
16
17
  def get(key, request_id: nil)
17
- payload = lock_request(:get_project_lock, 200, key: key, request_id: request_id)
18
- LockState.new(
19
- held: payload.fetch('held'),
20
- expires_at: parse_time(payload['expires_at']),
21
- fencing_token: payload['fencing_token']
22
- )
18
+ payload = lock_payload(perform_request(200) do
19
+ @transport.get_project_lock(
20
+ authorization: @client.service_token, key: key, request_id: request_uuid(request_id, 'request_id')
21
+ )
22
+ end)
23
+ build_state(payload)
23
24
  end
24
25
 
25
26
  def acquire(key, ttl:, token: nil, request_id: nil)
26
27
  validate_ttl(ttl)
27
- parameters = {
28
- authorization: @client.service_token.dup.freeze, key: key.dup.freeze,
29
- ttl: ttl, token: request_uuid(token, 'token'), request_id: request_uuid(request_id, 'request_id')
30
- }.freeze
31
- payload = acquire_payload(parameters)
32
- build_lease(parameters[:key], parameters[:token], payload)
28
+ authorization = @client.service_token.dup.freeze
29
+ owned_key = key.dup.freeze
30
+ owned_token = request_uuid(token, 'token')
31
+ owned_request_id = request_uuid(request_id, 'request_id')
32
+ payload = acquire_payload(
33
+ authorization: authorization, key: owned_key, ttl: ttl, token: owned_token, request_id: owned_request_id
34
+ )
35
+ build_lease(owned_key, owned_token, payload)
33
36
  end
34
37
 
35
38
  def renew(key, lease, ttl:, request_id: nil)
36
39
  validate_ttl(ttl)
37
- payload = lock_request(:renew_project_lock, 200, key: key, ttl: ttl,
38
- token: lease.token, request_id: request_id)
40
+ payload = lock_payload(perform_request(200) do
41
+ @transport.renew_project_lock(
42
+ authorization: @client.service_token, key: key, ttl: ttl,
43
+ token: lease.token, request_id: request_uuid(request_id, 'request_id')
44
+ )
45
+ end)
39
46
  build_lease(key, lease.token, payload)
40
47
  end
41
48
 
42
49
  def release(key, lease, request_id: nil)
43
- lock_request(:release_project_lock, 204, key: key, token: lease.token, request_id: request_id)
50
+ perform_request(204) do
51
+ @transport.release_project_lock(
52
+ authorization: @client.service_token, key: key, token: lease.token,
53
+ request_id: request_uuid(request_id, 'request_id')
54
+ )
55
+ end
44
56
  nil
45
57
  end
46
58
 
47
59
  def force_release(key, request_id: nil)
48
- lock_request(:force_release_project_lock, 204, key: key, request_id: request_id)
60
+ perform_request(204) do
61
+ @transport.force_release_project_lock(
62
+ authorization: @client.service_token, key: key, request_id: request_uuid(request_id, 'request_id')
63
+ )
64
+ end
49
65
  nil
50
66
  end
51
67
 
52
68
  private
53
69
 
54
- def acquire_payload(parameters)
55
- perform_request(:acquire_project_lock, 201, parameters)
70
+ def acquire_payload(authorization:, key:, ttl:, token:, request_id:)
71
+ lock_payload(perform_request(201) do
72
+ @transport.acquire_project_lock(authorization: authorization, key: key, ttl: ttl,
73
+ token: token, request_id: request_id)
74
+ end)
56
75
  rescue Error::TransportError, Error::ServerError => e
57
76
  raise unless e.status.nil? || e.status == 503
58
77
 
59
- perform_request(:acquire_project_lock, 201, parameters)
60
- end
61
-
62
- def lock_request(operation, status, **parameters)
63
- parameters[:authorization] = @client.service_token
64
- parameters[:request_id] = request_uuid(parameters[:request_id], 'request_id')
65
- perform_request(operation, status, parameters)
78
+ lock_payload(perform_request(201) do
79
+ @transport.acquire_project_lock(authorization: authorization, key: key, ttl: ttl,
80
+ token: token, request_id: request_id)
81
+ end)
66
82
  end
67
83
 
68
- def perform_request(operation, status, parameters)
69
- response = Transport.invoke { @transport.public_send(operation, **parameters) }
84
+ def perform_request(status, &)
85
+ response = Transport.invoke(&)
70
86
  Transport.body(response, status)
71
87
  end
72
88
 
73
89
  def request_uuid(value, name)
74
90
  return SecureRandom.uuid.freeze if value.nil?
75
91
 
76
- valid = value.is_a?(String) && value.match?(/\A[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}\z/i)
77
- raise ArgumentError, "#{name} must be a UUID string" unless valid
92
+ unless value.is_a?(String) && value.match?(/\A[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}\z/i)
93
+ raise ArgumentError, "#{name} must be a UUID string"
94
+ end
78
95
 
79
96
  value.dup.freeze
80
97
  end
81
98
 
82
99
  def build_lease(key, token, payload)
83
100
  LockLease.new(
84
- key: key, token: token, expires_at: parse_time(payload['expires_at']),
85
- fencing_token: payload['fencing_token']
101
+ key: key, token: token, expires_at: required_time(payload['expires_at']),
102
+ fencing_token: required_fencing_token(payload['fencing_token'])
86
103
  )
87
104
  end
88
105
 
89
- def parse_time(value)
90
- value.is_a?(String) ? Time.iso8601(value) : value
106
+ def build_state(payload)
107
+ held = lock_held(payload['held'])
108
+ expiry = held ? required_time(payload['expires_at']) : parse_time(payload['expires_at'])
109
+ fencing = if held
110
+ required_fencing_token(payload['fencing_token'])
111
+ else
112
+ optional_fencing_token(payload['fencing_token'])
113
+ end
114
+ LockState.new(held: held, expires_at: expiry, fencing_token: fencing)
91
115
  end
92
116
  end
93
117
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Volcano
4
- VERSION = '0.28.0'
4
+ VERSION = '0.29.0'
5
5
  end
data/lib/volcano.rb CHANGED
@@ -50,6 +50,7 @@ require_relative 'volcano/lock_guard'
50
50
  require_relative 'volcano/lock_renewer'
51
51
  require_relative 'volcano/lock_session'
52
52
  require_relative 'volcano/lock_auto_renewal'
53
+ require_relative 'volcano/lock_response'
53
54
  require_relative 'volcano/locks'
54
55
  require_relative 'volcano/realtime/protocol'
55
56
  require_relative 'volcano/realtime'
@@ -57,7 +58,7 @@ require_relative 'volcano/client'
57
58
 
58
59
  # Public namespace for the Volcano Ruby SDK.
59
60
  module Volcano
60
- private_constant :GeneratedTransport, :LockAutoRenewal, :LockLeaseClock, :LockRenewer, :LockSession,
61
+ private_constant :GeneratedTransport, :LockAutoRenewal, :LockLeaseClock, :LockRenewer, :LockSession, :LockResponse,
61
62
  :Redaction, :SessionOperations
62
63
 
63
64
  Realtime.private_constant :Protocol, :ProtocolDispatch, :ProtocolPublicationDispatch, :ProtocolRecovery,
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: volcano-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.28.0
4
+ version: 0.29.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kong
@@ -560,6 +560,7 @@ files:
560
560
  - lib/volcano/lock_guard.rb
561
561
  - lib/volcano/lock_lease_clock.rb
562
562
  - lib/volcano/lock_renewer.rb
563
+ - lib/volcano/lock_response.rb
563
564
  - lib/volcano/lock_session.rb
564
565
  - lib/volcano/locks.rb
565
566
  - lib/volcano/log_responses.rb