diplomatic_bag 2.2.2 → 2.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/consul-cli +5 -1
- metadata +5 -29
- data/README.md +0 -356
- data/features/configuration.feature +0 -9
- data/features/step_definitions/setup_diplomat.rb +0 -24
- data/features/step_definitions/test_key_value.rb +0 -9
- data/lib/diplomat/acl.rb +0 -81
- data/lib/diplomat/agent.rb +0 -42
- data/lib/diplomat/check.rb +0 -109
- data/lib/diplomat/configuration.rb +0 -28
- data/lib/diplomat/datacenter.rb +0 -21
- data/lib/diplomat/error.rb +0 -15
- data/lib/diplomat/event.rb +0 -166
- data/lib/diplomat/health.rb +0 -81
- data/lib/diplomat/kv.rb +0 -263
- data/lib/diplomat/lock.rb +0 -54
- data/lib/diplomat/maintenance.rb +0 -41
- data/lib/diplomat/members.rb +0 -14
- data/lib/diplomat/node.rb +0 -43
- data/lib/diplomat/nodes.rb +0 -22
- data/lib/diplomat/query.rb +0 -87
- data/lib/diplomat/rest_client.rb +0 -278
- data/lib/diplomat/service.rb +0 -111
- data/lib/diplomat/session.rb +0 -75
- data/lib/diplomat/status.rb +0 -22
- data/lib/diplomat/version.rb +0 -3
- data/lib/diplomat.rb +0 -62
data/lib/diplomat/lock.rb
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
module Diplomat
|
2
|
-
# Methods for interacting with the Consul lock API endpoint
|
3
|
-
class Lock < Diplomat::RestClient
|
4
|
-
@access_methods = %i[acquire wait_to_acquire release]
|
5
|
-
|
6
|
-
# Acquire a lock
|
7
|
-
# @param key [String] the key
|
8
|
-
# @param session [String] the session, generated from Diplomat::Session.create
|
9
|
-
# @param value [String] the value for the key
|
10
|
-
# @param options [Hash] options parameter hash
|
11
|
-
# @return [Boolean] If the lock was acquired
|
12
|
-
def acquire(key, session, value = nil, options = {})
|
13
|
-
custom_params = []
|
14
|
-
custom_params << use_named_parameter('acquire', session)
|
15
|
-
custom_params << use_named_parameter('dc', options[:dc]) if options[:dc]
|
16
|
-
custom_params << use_named_parameter('flags', options[:flags]) if options && options[:flags]
|
17
|
-
data = value unless value.nil?
|
18
|
-
raw = send_put_request(@conn, ["/v1/kv/#{key}"], options, data, custom_params)
|
19
|
-
raw.body.chomp == 'true'
|
20
|
-
end
|
21
|
-
|
22
|
-
# wait to aquire a lock
|
23
|
-
# @param key [String] the key
|
24
|
-
# @param session [String] the session, generated from Diplomat::Session.create
|
25
|
-
# @param value [String] the value for the key
|
26
|
-
# @param check_interval [Integer] number of seconds to wait between retries
|
27
|
-
# @param options [Hash] options parameter hash
|
28
|
-
# @return [Boolean] If the lock was acquired
|
29
|
-
def wait_to_acquire(key, session, value = nil, check_interval = 10, options = {})
|
30
|
-
acquired = false
|
31
|
-
until acquired
|
32
|
-
acquired = acquire(key, session, value, options)
|
33
|
-
sleep(check_interval) unless acquired
|
34
|
-
return true if acquired
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
# Release a lock
|
39
|
-
# @param key [String] the key
|
40
|
-
# @param session [String] the session, generated from Diplomat::Session.create
|
41
|
-
# @param options [Hash] :dc string for dc specific query
|
42
|
-
# @return [nil]
|
43
|
-
# rubocop:disable AbcSize
|
44
|
-
def release(key, session, options = {})
|
45
|
-
custom_params = []
|
46
|
-
custom_params << use_named_parameter('release', session)
|
47
|
-
custom_params << use_named_parameter('dc', options[:dc]) if options[:dc]
|
48
|
-
custom_params << use_named_parameter('flags', options[:flags]) if options && options[:flags]
|
49
|
-
raw = send_put_request(@conn, ["/v1/kv/#{key}"], options, nil, custom_params)
|
50
|
-
raw.body
|
51
|
-
end
|
52
|
-
# rubocop:enable AbcSize
|
53
|
-
end
|
54
|
-
end
|
data/lib/diplomat/maintenance.rb
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
module Diplomat
|
2
|
-
# Methods to interact with the Consul maintenance API endpoint
|
3
|
-
class Maintenance < Diplomat::RestClient
|
4
|
-
@access_methods = %i[enabled enable]
|
5
|
-
|
6
|
-
# Get the maintenance state of a host
|
7
|
-
# @param n [String] the node
|
8
|
-
# @param options [Hash] :dc string for dc specific query
|
9
|
-
# @return [Hash] { :enabled => true, :reason => 'foo' }
|
10
|
-
def enabled(n, options = {})
|
11
|
-
health = Diplomat::Health.new(@conn)
|
12
|
-
result = health.node(n, options)
|
13
|
-
.select { |check| check['CheckID'] == '_node_maintenance' }
|
14
|
-
|
15
|
-
if result.empty?
|
16
|
-
{ enabled: false, reason: nil }
|
17
|
-
else
|
18
|
-
{ enabled: true, reason: result.first['Notes'] }
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
# Enable or disable maintenance mode. This endpoint only works
|
23
|
-
# on the local agent.
|
24
|
-
# @param enable enable or disable maintenance mode
|
25
|
-
# @param reason [String] the reason for enabling maintenance mode
|
26
|
-
# @param options [Hash] :dc string for dc specific query
|
27
|
-
# @return true if call is successful
|
28
|
-
def enable(enable = true, reason = nil, options = {})
|
29
|
-
custom_params = []
|
30
|
-
custom_params << use_named_parameter('enable', enable.to_s)
|
31
|
-
custom_params << use_named_parameter('reason', reason) if reason
|
32
|
-
custom_params << use_named_parameter('dc', options[:dc]) if options[:dc]
|
33
|
-
raw = send_put_request(@conn, ['/v1/agent/maintenance'], options, nil, custom_params)
|
34
|
-
|
35
|
-
return_status = raw.status == 200
|
36
|
-
raise Diplomat::UnknownStatus, "status #{raw.status}: #{raw.body}" unless return_status
|
37
|
-
|
38
|
-
return_status
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
data/lib/diplomat/members.rb
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
module Diplomat
|
2
|
-
# Methods for interacting with the Consul members API endpoint
|
3
|
-
class Members < Diplomat::RestClient
|
4
|
-
@access_methods = [:get]
|
5
|
-
|
6
|
-
# Get all members
|
7
|
-
# @param options [Hash] options parameter hash
|
8
|
-
# @return [OpenStruct] all data associated with the service
|
9
|
-
def get(options = {})
|
10
|
-
ret = send_get_request(@conn, ['/v1/agent/members'], options)
|
11
|
-
JSON.parse(ret.body)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
data/lib/diplomat/node.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
module Diplomat
|
2
|
-
# Methods for interacting with the Consul node API endpoint
|
3
|
-
class Node < Diplomat::RestClient
|
4
|
-
@access_methods = %i[get get_all register deregister]
|
5
|
-
|
6
|
-
# Get a node by it's key
|
7
|
-
# @param key [String] the key
|
8
|
-
# @param options [Hash] :dc string for dc specific query
|
9
|
-
# @return [OpenStruct] all data associated with the node
|
10
|
-
def get(key, options = {})
|
11
|
-
custom_params = options[:dc] ? use_named_parameter('dc', options[:dc]) : nil
|
12
|
-
ret = send_get_request(@conn, ["/v1/catalog/node/#{key}"], options, custom_params)
|
13
|
-
OpenStruct.new JSON.parse(ret.body)
|
14
|
-
end
|
15
|
-
|
16
|
-
# Get all the nodes
|
17
|
-
# @param options [Hash] :dc string for dc specific query
|
18
|
-
# @return [OpenStruct] the list of all nodes
|
19
|
-
def get_all(options = {})
|
20
|
-
custom_params = options[:dc] ? use_named_parameter('dc', options[:dc]) : nil
|
21
|
-
ret = send_get_request(@conn, ['/v1/catalog/nodes'], options, custom_params)
|
22
|
-
JSON.parse(ret.body).map { |service| OpenStruct.new service }
|
23
|
-
end
|
24
|
-
|
25
|
-
# Register a node
|
26
|
-
# @param definition [Hash] Hash containing definition of a node to register
|
27
|
-
# @param options [Hash] options parameter hash
|
28
|
-
# @return [Boolean]
|
29
|
-
def register(definition, options = {})
|
30
|
-
register = send_put_request(@conn, ['/v1/catalog/register'], options, definition)
|
31
|
-
register.status == 200
|
32
|
-
end
|
33
|
-
|
34
|
-
# De-register a node (and all associated services and checks)
|
35
|
-
# @param definition [Hash] Hash containing definition of a node to de-register
|
36
|
-
# @param options [Hash] options parameter hash
|
37
|
-
# @return [Boolean]
|
38
|
-
def deregister(definition, options = {})
|
39
|
-
deregister = send_put_request(@conn, ['/v1/catalog/deregister'], options, definition)
|
40
|
-
deregister.status == 200
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
data/lib/diplomat/nodes.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
module Diplomat
|
2
|
-
# @depreciated
|
3
|
-
# Methods for interacting with the Consul nodes API endpoint
|
4
|
-
class Nodes < Diplomat::RestClient
|
5
|
-
@access_methods = %i[get get_all]
|
6
|
-
|
7
|
-
# Get all nodes
|
8
|
-
# @deprecated Please use Diplomat::Node instead.
|
9
|
-
# @param options [Hash] options parameter hash
|
10
|
-
# @return [OpenStruct] all data associated with the nodes in catalog
|
11
|
-
def get(options = {})
|
12
|
-
ret = send_get_request(@conn, ['/v1/catalog/nodes'], options)
|
13
|
-
JSON.parse(ret.body)
|
14
|
-
end
|
15
|
-
|
16
|
-
def get_all(options = {})
|
17
|
-
custom_params = options[:dc] ? use_named_parameter('dc', options[:dc]) : nil
|
18
|
-
ret = send_get_request(@conn, ['/v1/catalog/nodes'], options, custom_params)
|
19
|
-
JSON.parse(ret.body).map { |service| OpenStruct.new service }
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
data/lib/diplomat/query.rb
DELETED
@@ -1,87 +0,0 @@
|
|
1
|
-
module Diplomat
|
2
|
-
# Methods for interacting with the Consul query API endpoint
|
3
|
-
class Query < Diplomat::RestClient
|
4
|
-
@access_methods = %i[get get_all create delete update execute explain]
|
5
|
-
|
6
|
-
# Get a prepared query by it's key
|
7
|
-
# @param key [String] the prepared query ID
|
8
|
-
# @param options [Hash] :dc string for dc specific query
|
9
|
-
# @return [OpenStruct] all data associated with the prepared query
|
10
|
-
def get(key, options = {})
|
11
|
-
custom_params = options[:dc] ? use_named_parameter('dc', options[:dc]) : nil
|
12
|
-
ret = send_get_request(@conn, ["/v1/query/#{key}"], options, custom_params)
|
13
|
-
JSON.parse(ret.body).map { |query| OpenStruct.new query }
|
14
|
-
end
|
15
|
-
|
16
|
-
# Get all prepared queries
|
17
|
-
# @param options [Hash] :dc Consul datacenter to query
|
18
|
-
# @return [OpenStruct] the list of all prepared queries
|
19
|
-
def get_all(options = {})
|
20
|
-
custom_params = options[:dc] ? use_named_parameter('dc', options[:dc]) : nil
|
21
|
-
ret = send_get_request(@conn, ['/v1/query'], options, custom_params)
|
22
|
-
JSON.parse(ret.body).map { |query| OpenStruct.new query }
|
23
|
-
end
|
24
|
-
|
25
|
-
# Create a prepared query or prepared query template
|
26
|
-
# @param definition [Hash] Hash containing definition of prepared query
|
27
|
-
# @param options [Hash] :dc Consul datacenter to query
|
28
|
-
# @return [String] the ID of the prepared query created
|
29
|
-
def create(definition, options = {})
|
30
|
-
custom_params = options[:dc] ? use_named_parameter('dc', options[:dc]) : nil
|
31
|
-
@raw = send_post_request(@conn, ['/v1/query'], options, definition, custom_params)
|
32
|
-
parse_body
|
33
|
-
rescue Faraday::ClientError
|
34
|
-
raise Diplomat::QueryAlreadyExists
|
35
|
-
end
|
36
|
-
|
37
|
-
# Delete a prepared query or prepared query template
|
38
|
-
# @param key [String] the prepared query ID
|
39
|
-
# @param options [Hash] :dc Consul datacenter to query
|
40
|
-
# @return [Boolean]
|
41
|
-
def delete(key, options = {})
|
42
|
-
custom_params = options[:dc] ? use_named_parameter('dc', options[:dc]) : nil
|
43
|
-
ret = send_delete_request(@conn, ["/v1/query/#{key}"], options, custom_params)
|
44
|
-
ret.status == 200
|
45
|
-
end
|
46
|
-
|
47
|
-
# Update a prepared query or prepared query template
|
48
|
-
# @param key [String] the prepared query ID
|
49
|
-
# @param definition [Hash] Hash containing updated definition of prepared query
|
50
|
-
# @param options [Hash] :dc Consul datacenter to query
|
51
|
-
# @return [Boolean]
|
52
|
-
def update(key, definition, options = {})
|
53
|
-
custom_params = options[:dc] ? use_named_parameter('dc', options[:dc]) : nil
|
54
|
-
ret = send_put_request(@conn, ["/v1/query/#{key}"], options, definition, custom_params)
|
55
|
-
ret.status == 200
|
56
|
-
end
|
57
|
-
|
58
|
-
# Execute a prepared query or prepared query template
|
59
|
-
# @param key [String] the prepared query ID or name
|
60
|
-
# @param options [Hash] prepared query execution options
|
61
|
-
# @option dc [String] :dc Consul datacenter to query
|
62
|
-
# @option near [String] node name to sort the resulting list in ascending order based on the
|
63
|
-
# estimated round trip time from that node
|
64
|
-
# @option limit [Integer] to limit the size of the return list to the given number of results
|
65
|
-
# @return [OpenStruct] the list of results from the prepared query or prepared query template
|
66
|
-
# rubocop:disable PerceivedComplexity
|
67
|
-
def execute(key, options = {})
|
68
|
-
custom_params = []
|
69
|
-
custom_params << use_named_parameter('dc', options[:dc]) if options[:dc]
|
70
|
-
custom_params << use_named_parameter('near', options[:near]) if options[:near]
|
71
|
-
custom_params << use_named_parameter('limit', options[:limit]) if options[:limit]
|
72
|
-
ret = send_get_request(@conn, ["/v1/query/#{key}/execute"], options, custom_params)
|
73
|
-
OpenStruct.new JSON.parse(ret.body)
|
74
|
-
end
|
75
|
-
# rubocop:enable PerceivedComplexity
|
76
|
-
|
77
|
-
# Get the fully rendered query template
|
78
|
-
# @param key [String] the prepared query ID or name
|
79
|
-
# @param options [Hash] :dc Consul datacenter to query
|
80
|
-
# @return [OpenStruct] the list of results from the prepared query or prepared query template
|
81
|
-
def explain(key, options = {})
|
82
|
-
custom_params = options[:dc] ? use_named_parameter('dc', options[:dc]) : nil
|
83
|
-
ret = send_get_request(@conn, ["/v1/query/#{key}/explain"], options, custom_params)
|
84
|
-
OpenStruct.new JSON.parse(ret.body)
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
data/lib/diplomat/rest_client.rb
DELETED
@@ -1,278 +0,0 @@
|
|
1
|
-
require 'deep_merge'
|
2
|
-
|
3
|
-
module Diplomat
|
4
|
-
# Base class for interacting with the Consul RESTful API
|
5
|
-
class RestClient
|
6
|
-
@access_methods = []
|
7
|
-
@configuration = nil
|
8
|
-
|
9
|
-
# Initialize the fadaray connection
|
10
|
-
# @param api_connection [Faraday::Connection,nil] supply mock API Connection
|
11
|
-
# @param configuration [Diplomat::Configuration] a dedicated config to use
|
12
|
-
def initialize(api_connection = nil, configuration: nil)
|
13
|
-
@configuration = configuration
|
14
|
-
start_connection api_connection
|
15
|
-
end
|
16
|
-
|
17
|
-
# Get client configuration or global one if not specified via initialize.
|
18
|
-
# @return [Diplomat::Configuration] used by this client
|
19
|
-
def configuration
|
20
|
-
@configuration || ::Diplomat.configuration
|
21
|
-
end
|
22
|
-
|
23
|
-
# Format url parameters into strings correctly
|
24
|
-
# @param name [String] the name of the parameter
|
25
|
-
# @param value [String] the value of the parameter
|
26
|
-
# @return [Array] the resultant parameter string inside an array.
|
27
|
-
def use_named_parameter(name, value)
|
28
|
-
value ? ["#{name}=#{value}"] : []
|
29
|
-
end
|
30
|
-
|
31
|
-
# Assemble a url from an array of parts.
|
32
|
-
# @param parts [Array] the url chunks to be assembled
|
33
|
-
# @return [String] the resultant url string
|
34
|
-
def concat_url(parts)
|
35
|
-
parts.reject!(&:empty?)
|
36
|
-
if parts.length > 1
|
37
|
-
parts.first + '?' + parts.drop(1).join('&')
|
38
|
-
else
|
39
|
-
parts.first
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
class << self
|
44
|
-
def access_method?(meth_id)
|
45
|
-
@access_methods.include? meth_id
|
46
|
-
end
|
47
|
-
|
48
|
-
# Allow certain methods to be accessed
|
49
|
-
# without defining "new".
|
50
|
-
# @param meth_id [Symbol] symbol defining method requested
|
51
|
-
# @param *args Arguments list
|
52
|
-
# @return [Boolean]
|
53
|
-
def method_missing(meth_id, *args)
|
54
|
-
if access_method?(meth_id)
|
55
|
-
new.send(meth_id, *args)
|
56
|
-
else
|
57
|
-
|
58
|
-
# See https://bugs.ruby-lang.org/issues/10969
|
59
|
-
begin
|
60
|
-
super
|
61
|
-
rescue NameError => e
|
62
|
-
raise NoMethodError, e
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
# Make `respond_to?` aware of method short-cuts.
|
68
|
-
#
|
69
|
-
# @param meth_id [Symbol] the tested method
|
70
|
-
# @oaram with_private if private methods should be tested too
|
71
|
-
def respond_to?(meth_id, with_private = false)
|
72
|
-
access_method?(meth_id) || super
|
73
|
-
end
|
74
|
-
|
75
|
-
# Make `respond_to_missing` aware of method short-cuts. This is needed for
|
76
|
-
# {#method} to work on these, which is helpful for testing purposes.
|
77
|
-
#
|
78
|
-
# @param meth_id [Symbol] the tested method
|
79
|
-
# @oaram with_private if private methods should be tested too
|
80
|
-
def respond_to_missing?(meth_id, with_private = false)
|
81
|
-
access_method?(meth_id) || super
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
private
|
86
|
-
|
87
|
-
# Build the API Client
|
88
|
-
# @param api_connection [Faraday::Connection,nil] supply mock API Connection
|
89
|
-
def start_connection(api_connection = nil)
|
90
|
-
@conn = build_connection(api_connection)
|
91
|
-
@conn_no_err = build_connection(api_connection, true)
|
92
|
-
end
|
93
|
-
|
94
|
-
def build_connection(api_connection, raise_error = false)
|
95
|
-
api_connection || Faraday.new(configuration.url, configuration.options) do |faraday|
|
96
|
-
configuration.middleware.each do |middleware|
|
97
|
-
faraday.use middleware
|
98
|
-
end
|
99
|
-
|
100
|
-
faraday.request :url_encoded
|
101
|
-
faraday.response :raise_error unless raise_error
|
102
|
-
|
103
|
-
faraday.adapter Faraday.default_adapter
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
# Converts k/v data into ruby hash
|
108
|
-
def convert_to_hash(data)
|
109
|
-
data.map do |item|
|
110
|
-
item[:key].split('/').reverse.reduce(item[:value]) { |h, v| { v => h } }
|
111
|
-
end.reduce(:deep_merge)
|
112
|
-
end
|
113
|
-
|
114
|
-
# Parse the body, apply it to the raw attribute
|
115
|
-
def parse_body
|
116
|
-
return JSON.parse(@raw.body) if @raw.status == 200
|
117
|
-
|
118
|
-
raise Diplomat::UnknownStatus, "status #{@raw.status}: #{@raw.body}"
|
119
|
-
end
|
120
|
-
|
121
|
-
# Return @raw with Value fields decoded
|
122
|
-
def decode_values
|
123
|
-
return @raw if @raw.first.is_a? String
|
124
|
-
|
125
|
-
@raw.each_with_object([]) do |acc, el|
|
126
|
-
begin
|
127
|
-
acc['Value'] = Base64.decode64(acc['Value'])
|
128
|
-
rescue StandardError
|
129
|
-
nil
|
130
|
-
end
|
131
|
-
el << acc
|
132
|
-
el
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
# Get the key/value(s) from the raw output
|
137
|
-
# rubocop:disable PerceivedComplexity
|
138
|
-
def return_value(nil_values = false, transformation = nil, return_hash = false)
|
139
|
-
@value = decode_values
|
140
|
-
return @value if @value.first.is_a? String
|
141
|
-
|
142
|
-
if @value.count == 1 && !return_hash
|
143
|
-
@value = @value.first['Value']
|
144
|
-
@value = transformation.call(@value) if transformation && !@value.nil?
|
145
|
-
return @value
|
146
|
-
else
|
147
|
-
@value = @value.map do |el|
|
148
|
-
el['Value'] = transformation.call(el['Value']) if transformation && !el['Value'].nil?
|
149
|
-
{ key: el['Key'], value: el['Value'] } if el['Value'] || nil_values
|
150
|
-
end.compact
|
151
|
-
end
|
152
|
-
end
|
153
|
-
# rubocop:enable PerceivedComplexity
|
154
|
-
|
155
|
-
# Get the name and payload(s) from the raw output
|
156
|
-
def return_payload
|
157
|
-
@value = @raw.map do |e|
|
158
|
-
{ name: e['Name'],
|
159
|
-
payload: (Base64.decode64(e['Payload']) unless e['Payload'].nil?) }
|
160
|
-
end
|
161
|
-
end
|
162
|
-
|
163
|
-
def use_cas(options)
|
164
|
-
options ? use_named_parameter('cas', options[:cas]) : []
|
165
|
-
end
|
166
|
-
|
167
|
-
def use_consistency(options)
|
168
|
-
options[:consistency] ? [options[:consistency].to_s] : []
|
169
|
-
end
|
170
|
-
|
171
|
-
# rubocop:disable PerceivedComplexity
|
172
|
-
# TODO: Migrate all custom params in options
|
173
|
-
def parse_options(options)
|
174
|
-
headers = nil
|
175
|
-
query_params = []
|
176
|
-
url_prefix = nil
|
177
|
-
consistency = []
|
178
|
-
|
179
|
-
# Parse options used as header
|
180
|
-
headers = { 'X-Consul-Token' => configuration.acl_token } if configuration.acl_token
|
181
|
-
headers = { 'X-Consul-Token' => options[:token] } if options[:token]
|
182
|
-
|
183
|
-
# Parse options used as query params
|
184
|
-
consistency = 'stale' if options[:stale]
|
185
|
-
consistency = 'leader' if options[:leader]
|
186
|
-
consistency = 'consistent' if options[:consistent]
|
187
|
-
query_params << consistency
|
188
|
-
|
189
|
-
# Parse url host
|
190
|
-
url_prefix = options[:http_addr] if options[:http_addr]
|
191
|
-
{ query_params: query_params, headers: headers, url_prefix: url_prefix }
|
192
|
-
end
|
193
|
-
# rubocop:enable PerceivedComplexity
|
194
|
-
|
195
|
-
def send_get_request(connection, url, options, custom_params = nil)
|
196
|
-
rest_options = parse_options(options)
|
197
|
-
url += rest_options[:query_params]
|
198
|
-
url += custom_params unless custom_params.nil?
|
199
|
-
begin
|
200
|
-
connection.get do |req|
|
201
|
-
req.options[:params_encoder] = options[:params_encoder] if options[:params_encoder]
|
202
|
-
req.url rest_options[:url_prefix] ? rest_options[:url_prefix] + concat_url(url) : concat_url(url)
|
203
|
-
rest_options[:headers].map { |k, v| req.headers[k.to_sym] = v } unless rest_options[:headers].nil?
|
204
|
-
req.options.timeout = options[:timeout] if options[:timeout]
|
205
|
-
end
|
206
|
-
rescue Faraday::ClientError => e
|
207
|
-
raise Diplomat::PathNotFound, e
|
208
|
-
end
|
209
|
-
end
|
210
|
-
|
211
|
-
def send_put_request(connection, url, options, data, custom_params = nil, mime = 'application/json')
|
212
|
-
rest_options = parse_options(options)
|
213
|
-
url += rest_options[:query_params]
|
214
|
-
url += custom_params unless custom_params.nil?
|
215
|
-
connection.put do |req|
|
216
|
-
req.url rest_options[:url_prefix] ? rest_options[:url_prefix] + concat_url(url) : concat_url(url)
|
217
|
-
rest_options[:headers].map { |k, v| req.headers[k.to_sym] = v } unless rest_options[:headers].nil?
|
218
|
-
unless data.nil?
|
219
|
-
(req.headers || {})['Content-Type'] = mime
|
220
|
-
req.body = if mime == 'application/json' && !data.is_a?(String)
|
221
|
-
data.to_json
|
222
|
-
else
|
223
|
-
data
|
224
|
-
end
|
225
|
-
end
|
226
|
-
end
|
227
|
-
end
|
228
|
-
|
229
|
-
def send_post_request(connection, url, options, data, custom_params = nil)
|
230
|
-
rest_options = parse_options(options)
|
231
|
-
url += rest_options[:query_params]
|
232
|
-
url += custom_params unless custom_params.nil?
|
233
|
-
connection.post do |req|
|
234
|
-
req.url rest_options[:url_prefix] ? rest_options[:url_prefix] + concat_url(url) : concat_url(url)
|
235
|
-
rest_options[:headers].map { |k, v| req.headers[k.to_sym] = v } unless rest_options[:headers].nil?
|
236
|
-
req.body = JSON.dump(data) unless data.nil?
|
237
|
-
end
|
238
|
-
end
|
239
|
-
|
240
|
-
def send_delete_request(connection, url, options, custom_params = nil)
|
241
|
-
rest_options = parse_options(options)
|
242
|
-
url += rest_options[:query_params]
|
243
|
-
url += custom_params unless custom_params.nil?
|
244
|
-
connection.delete do |req|
|
245
|
-
req.url rest_options[:url_prefix] ? rest_options[:url_prefix] + concat_url(url) : concat_url(url)
|
246
|
-
rest_options[:headers].map { |k, v| req.headers[k.to_sym] = v } unless rest_options[:headers].nil?
|
247
|
-
end
|
248
|
-
end
|
249
|
-
|
250
|
-
# Mapping for valid key/value store transaction verbs and required parameters
|
251
|
-
#
|
252
|
-
# @return [Hash] valid key/store transaction verbs and required parameters
|
253
|
-
def valid_transaction_verbs
|
254
|
-
{
|
255
|
-
'set' => %w[Key Value],
|
256
|
-
'cas' => %w[Key Value Index],
|
257
|
-
'lock' => %w[Key Value Session],
|
258
|
-
'unlock' => %w[Key Value Session],
|
259
|
-
'get' => %w[Key],
|
260
|
-
'get-tree' => %w[Key],
|
261
|
-
'check-index' => %w[Key Index],
|
262
|
-
'check-session' => %w[Key Session],
|
263
|
-
'delete' => %w[Key],
|
264
|
-
'delete-tree' => %w[Key],
|
265
|
-
'delete-cas' => %w[Key Index]
|
266
|
-
}
|
267
|
-
end
|
268
|
-
|
269
|
-
# Key/value store transactions that require that a value be set
|
270
|
-
#
|
271
|
-
# @return [Array<String>] verbs that require a value be set
|
272
|
-
def valid_value_transactions
|
273
|
-
@valid_value_transactions ||= valid_transaction_verbs.select do |verb, requires|
|
274
|
-
verb if requires.include? 'Value'
|
275
|
-
end
|
276
|
-
end
|
277
|
-
end
|
278
|
-
end
|
data/lib/diplomat/service.rb
DELETED
@@ -1,111 +0,0 @@
|
|
1
|
-
module Diplomat
|
2
|
-
# Methods for interacting with the Consul service API endpoint.
|
3
|
-
class Service < Diplomat::RestClient
|
4
|
-
@access_methods = %i[get get_all register deregister register_external deregister_external maintenance]
|
5
|
-
|
6
|
-
# Get a service by it's key
|
7
|
-
# @param key [String] the key
|
8
|
-
# @param scope [Symbol] :first or :all results
|
9
|
-
# @param options [Hash] options parameter hash
|
10
|
-
# @param meta [Hash] output structure containing header information about the request (index)
|
11
|
-
# @return [OpenStruct] all data associated with the service
|
12
|
-
# rubocop:disable PerceivedComplexity
|
13
|
-
def get(key, scope = :first, options = {}, meta = nil)
|
14
|
-
custom_params = []
|
15
|
-
custom_params << use_named_parameter('wait', options[:wait]) if options[:wait]
|
16
|
-
custom_params << use_named_parameter('index', options[:index]) if options[:index]
|
17
|
-
custom_params << use_named_parameter('dc', options[:dc]) if options[:dc]
|
18
|
-
if options[:tag]
|
19
|
-
# tag can be either a String, or an array of strings
|
20
|
-
# by splatting it is guaranteed to be an array of strings
|
21
|
-
[*options[:tag]].each do |value|
|
22
|
-
custom_params << use_named_parameter('tag', value)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
# We have to provide a custom params encoder here because Faraday - by default - assumes that
|
27
|
-
# list keys have [] as part of their name. This is however not the case for consul tags, which
|
28
|
-
# just use repeated occurences of the same key.
|
29
|
-
#
|
30
|
-
# So faraday reduces this: http://localhost:8500?a=1&a=2 to http://localhost:8500?a=2 unless you
|
31
|
-
# explicitly tell it not to.
|
32
|
-
options[:params_encoder] = Faraday::FlatParamsEncoder
|
33
|
-
|
34
|
-
ret = send_get_request(@conn, ["/v1/catalog/service/#{key}"], options, custom_params)
|
35
|
-
if meta && ret.headers
|
36
|
-
meta[:index] = ret.headers['x-consul-index'] if ret.headers['x-consul-index']
|
37
|
-
meta[:knownleader] = ret.headers['x-consul-knownleader'] if ret.headers['x-consul-knownleader']
|
38
|
-
meta[:lastcontact] = ret.headers['x-consul-lastcontact'] if ret.headers['x-consul-lastcontact']
|
39
|
-
end
|
40
|
-
|
41
|
-
if scope == :all
|
42
|
-
JSON.parse(ret.body).map { |service| OpenStruct.new service }
|
43
|
-
else
|
44
|
-
OpenStruct.new JSON.parse(ret.body).first
|
45
|
-
end
|
46
|
-
end
|
47
|
-
# rubocop:enable PerceivedComplexity
|
48
|
-
|
49
|
-
# Get all the services
|
50
|
-
# @param options [Hash] :dc Consul datacenter to query
|
51
|
-
# @return [OpenStruct] the list of all services
|
52
|
-
def get_all(options = {})
|
53
|
-
custom_params = options[:dc] ? use_named_parameter('dc', options[:dc]) : nil
|
54
|
-
ret = send_get_request(@conn, ['/v1/catalog/services'], options, custom_params)
|
55
|
-
OpenStruct.new JSON.parse(ret.body)
|
56
|
-
end
|
57
|
-
|
58
|
-
# Register a service
|
59
|
-
# @param definition [Hash] Hash containing definition of service
|
60
|
-
# @param options [Hash] options parameter hash
|
61
|
-
# @return [Boolean]
|
62
|
-
def register(definition, options = {})
|
63
|
-
url = options[:path] || ['/v1/agent/service/register']
|
64
|
-
register = send_put_request(@conn, url, options, definition)
|
65
|
-
register.status == 200
|
66
|
-
end
|
67
|
-
|
68
|
-
# De-register a service
|
69
|
-
# @param service_name [String] Service name to de-register
|
70
|
-
# @param options [Hash] options parameter hash
|
71
|
-
# @return [Boolean]
|
72
|
-
def deregister(service_name, options = {})
|
73
|
-
deregister = send_put_request(@conn, ["/v1/agent/service/deregister/#{service_name}"], options, nil)
|
74
|
-
deregister.status == 200
|
75
|
-
end
|
76
|
-
|
77
|
-
# Register an external service
|
78
|
-
# @param definition [Hash] Hash containing definition of service
|
79
|
-
# @param options [Hash] options parameter hash
|
80
|
-
# @return [Boolean]
|
81
|
-
def register_external(definition, options = {})
|
82
|
-
register = send_put_request(@conn, ['/v1/catalog/register'], options, definition)
|
83
|
-
register.status == 200
|
84
|
-
end
|
85
|
-
|
86
|
-
# Deregister an external service
|
87
|
-
# @param definition [Hash] Hash containing definition of service
|
88
|
-
# @param options [Hash] options parameter hash
|
89
|
-
# @return [Boolean]
|
90
|
-
def deregister_external(definition, options = {})
|
91
|
-
deregister = send_put_request(@conn, ['/v1/catalog/deregister'], options, definition)
|
92
|
-
deregister.status == 200
|
93
|
-
end
|
94
|
-
|
95
|
-
# Enable or disable maintenance for a service
|
96
|
-
# @param service_id [String] id of the service
|
97
|
-
# @param options [Hash] opts the options for enabling or disabling maintenance for a service
|
98
|
-
# @options opts [Boolean] :enable (true) whether to enable or disable maintenance
|
99
|
-
# @options opts [String] :reason reason for the service maintenance
|
100
|
-
# @raise [Diplomat::PathNotFound] if the request fails
|
101
|
-
# @return [Boolean] if the request was successful or not
|
102
|
-
def maintenance(service_id, options = { enable: true })
|
103
|
-
custom_params = []
|
104
|
-
custom_params << ["enable=#{options[:enable]}"]
|
105
|
-
custom_params << ["reason=#{options[:reason].split(' ').join('+')}"] if options[:reason]
|
106
|
-
maintenance = send_put_request(@conn, ["/v1/agent/service/maintenance/#{service_id}"],
|
107
|
-
options, nil, custom_params)
|
108
|
-
maintenance.status == 200
|
109
|
-
end
|
110
|
-
end
|
111
|
-
end
|