dapi-client 0.1.1 → 0.1.2

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: 3af6232965a19b8ed245ab347a0d82e0da95f8a686d653463fa9e48e9635c30d
4
- data.tar.gz: d47460d0bbc734c3bb2df565d712f29fe010991ebb60c2c4a2381c348e352921
3
+ metadata.gz: a9475f64c82e86742b38333c59b329a2a2f0873920cfa99a46f2ef0b099ea176
4
+ data.tar.gz: 7fcd29bf890170ba4f7f42b17849cb36538b1e43d81dfd8122978dcdb0dd79aa
5
5
  SHA512:
6
- metadata.gz: 91508607d01994bd0d1a63f2775884f44624189c6d505e03f40d74fc00a3e988b9af9210dd8be62a1a9e5eecf955d8cdf9e093ef72efa05bf56cb70e08cf0950
7
- data.tar.gz: 48e415ba642caf12a1d8753ca011d0661e13bd1a2bcb77a76fb80578039a9d299f04ca7f8377cf0c63d75df7dd95e55306be7d05cf7106d544a7fa2587368066
6
+ metadata.gz: 0253ccf3080e0b77b994b9d5035193ac7f04e2df77be52c6679a47e9f9e8b6d4a8716f50bc0c03ea52f8ac552c04822ebd7759ac14ccfe1cd9fc58185b4f004a
7
+ data.tar.gz: 51ef22b2d7a6619130382a25c176499d5ead0768541d75516d999de9c6a854f00017cbc2d455457f35ac6c74fd7c394bf821d2ff961ecad24a3177a63782779c
data/lib/dapi/client.rb CHANGED
@@ -5,8 +5,8 @@ module Dapi
5
5
 
6
6
  class Client
7
7
 
8
- OPTIMISTIC_LOCKING_CHECK_WAIT = 1.0 unless defined?(OPTIMISTIC_LOCKING_CHECK_WAIT)
9
- OPTIMISTIC_LOCKING_RETRIES = 10 unless defined?(OPTIMISTIC_LOCKING_RETRIES)
8
+ OPTIMISTIC_LOCKING_CHECK_WAIT = 3.0 unless defined?(OPTIMISTIC_LOCKING_CHECK_WAIT)
9
+ OPTIMISTIC_LOCKING_RETRIES = 5 unless defined?(OPTIMISTIC_LOCKING_RETRIES)
10
10
 
11
11
  def initialize(url:, token:, http: HTTP)
12
12
  @url = url
@@ -14,23 +14,21 @@ module Dapi
14
14
  @token = token
15
15
  end
16
16
 
17
+ def delete_record(zone_name, lvalue, type)
18
+ with_optimistic_locking { delete_record!(zone_name, lvalue, type) }
19
+ end
20
+
17
21
  def get_zone(zone_name)
18
22
  unwrap { http.get(@url + "zone/" + zone_name) }
19
23
  end
20
24
 
25
+ # Useful for test suites, and staging domains
26
+ def truncate_zone(zone_name)
27
+ with_optimistic_locking { truncate_zone!(zone_name) }
28
+ end
29
+
21
30
  def upsert_record(zone_name, lvalue, type, rvalue, ttl)
22
- retries = OPTIMISTIC_LOCKING_RETRIES
23
- begin
24
- upsert_record!(zone_name, lvalue, type, rvalue, ttl)
25
- rescue Dapi::Client::OptimisticLockFailure
26
- if retries > 0
27
- retries -= 1
28
- sleep(0.1)
29
- retry
30
- else
31
- raise
32
- end
33
- end
31
+ with_optimistic_locking { upsert_record!(zone_name, lvalue, type, rvalue, ttl) }
34
32
  end
35
33
 
36
34
  private
@@ -57,19 +55,57 @@ module Dapi
57
55
  raise Dapi::Client::Error, "error parsing server response (JSON)"
58
56
  end
59
57
 
58
+ def delete_record!(zone_name, lvalue, type)
59
+ zone = get_zone(zone_name)
60
+ zone["records"].reject! { |r| r["name"] == lvalue && r["type"] == type }
61
+ unwrap { http.post(@url + "zone/" + zone_name, json: {data: zone}) }
62
+ optimistic_lock_check(zone_name) do |check|
63
+ not check["records"].detect { |r| r["name"] == lvalue && r["type"] == type }
64
+ end
65
+ end
66
+
67
+ def truncate_zone!(zone_name)
68
+ zone = get_zone(zone_name)
69
+ zone["records"].reject! { |r| r["type"] == "A" && r["name"] != "@" }
70
+ unwrap { http.post(@url + "zone/" + zone_name, json: {data: zone}) }
71
+ optimistic_lock_check(zone_name) do |check|
72
+ not check["records"].detect { |r| r["type"] == "A" && r["name"] != "@" }
73
+ end
74
+ end
75
+
60
76
  def upsert_record!(zone_name, lvalue, type, rvalue, ttl)
61
77
  zone = get_zone(zone_name)
62
78
  zone["records"].reject! { |r| r["name"] == lvalue && r["type"] == type }
63
79
  zone["records"] << {"name" => lvalue, "type" => type, "value" => rvalue, "ttl" => ttl}
64
80
  unwrap { http.post(@url + "zone/" + zone_name, json: {data: zone}) }
81
+ optimistic_lock_check(zone_name) do |check|
82
+ check["records"].detect { |r| r["name"] == lvalue && r["type"] == type && r["value"] == rvalue && r["ttl"] == ttl }
83
+ end
84
+ end
85
+
86
+ def optimistic_lock_check(zone_name, &block)
65
87
  sleep(OPTIMISTIC_LOCKING_CHECK_WAIT)
66
- zone = get_zone(zone_name)
67
- unless zone["records"].detect { |r| r["name"] == lvalue && r["type"] == type && r["value"] == rvalue && r["ttl"] == ttl }
68
- raise Dapi::Client::OptimisticLockFailure, "upsert_record: optimistic locking failed"
88
+ get_zone(zone_name).tap do |zone|
89
+ raise Dapi::Client::OptimisticLockFailure, "upsert_record: optimistic locking failed" unless block.call(zone)
90
+ end
91
+ end
92
+
93
+ def with_optimistic_locking(&block)
94
+ retries = OPTIMISTIC_LOCKING_RETRIES
95
+ begin
96
+ block.call
97
+ rescue Dapi::Client::OptimisticLockFailure
98
+ if retries > 0
99
+ retries -= 1
100
+ sleep(0.1)
101
+ retry
102
+ else
103
+ raise
104
+ end
69
105
  end
70
- zone
71
106
  end
72
107
 
108
+
73
109
  end
74
110
 
75
111
  end
@@ -1,5 +1,5 @@
1
1
  module Dapi
2
2
  class Client
3
- VERSION = "0.1.1"
3
+ VERSION = "0.1.2"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dapi-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sheldon Hearn