consul_api 0.0.1 → 0.0.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 +4 -4
- data/consul_api.gemspec +5 -0
- data/lib/consul_api/agent.rb +61 -0
- data/lib/consul_api/catalog.rb +1 -1
- data/lib/consul_api/common.rb +31 -2
- data/lib/consul_api/dns.rb +24 -0
- data/lib/consul_api/version.rb +1 -1
- data/lib/consul_api.rb +4 -1
- data/spec/agent_spec.rb +16 -0
- data/spec/spec_helper.rb +15 -0
- data/spec/support/vcr.rb +13 -0
- data/spec/vcr/consul_api/agent_service_register/registers_a_service_on_consul.yml +34 -0
- data/spec/vcr/consul_api/agent_services/gets_services_running_on_an_agent.yml +34 -0
- metadata +85 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5c41569f58a1d5cfd56e2fa6f1e49aa91cd44c6d
|
4
|
+
data.tar.gz: b1d83907083c624c58129e1c32bb20aa3479a9a2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a0bb0fd26ad95722ebbea0fb8abdb0b1ca7c3456cf0149a2b0eb4338ad508691025f5c0acd8570c7f937b65f34f69cc8429570089138681a4e212dc1e05e2e78
|
7
|
+
data.tar.gz: 69c4f618c5faaefc1896fafe952417bd3b778d66319e098fc9483ccf967506809767e3adbfde37ea922cc266b5274c20e604f0d7c39c9def3c17ebc8c5433b64
|
data/consul_api.gemspec
CHANGED
@@ -23,4 +23,9 @@ Gem::Specification.new do |spec|
|
|
23
23
|
|
24
24
|
spec.add_development_dependency "bundler", "~> 1.6"
|
25
25
|
spec.add_development_dependency "rake"
|
26
|
+
spec.add_development_dependency "vcr"
|
27
|
+
spec.add_development_dependency "rspec"
|
28
|
+
spec.add_development_dependency "webmock"
|
29
|
+
spec.add_development_dependency "activesupport"
|
30
|
+
spec.add_development_dependency "pry"
|
26
31
|
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module ConsulApi
|
2
|
+
class Agent
|
3
|
+
include Common
|
4
|
+
|
5
|
+
def self.checks
|
6
|
+
issue_request(path: '/checks')
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.services
|
10
|
+
issue_request(path: '/services')
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.members
|
14
|
+
issue_request(path: '/members')
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.self
|
18
|
+
issue_request(path: '/self')
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.join(address, query={})
|
22
|
+
issue_request(path: "/join/#{address}", query: query)
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.force_leave(address)
|
26
|
+
issue_request(path: "/force-leave/#{address}")
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.check_register(query)
|
30
|
+
issue_request(path: '/check/register/', query: query, method: :put)
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.check_deregister(check_id)
|
34
|
+
issue_request(path: "/check/deregister/#{check_id}", method: :put)
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.check_pass(check_id, query={})
|
38
|
+
issue_request(path: "/check/pass/#{check_id}", query: query)
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.check_warn(check_id, query={})
|
42
|
+
issue_request(path: "/check/warn/#{check_id}", query: query)
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.check_fail(check_id, query={})
|
46
|
+
issue_request(path: "/check/fail/#{check_id}", query: query)
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.service_register(query)
|
50
|
+
issue_request(path: '/service/register', query: query, method: :put)
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.service_deregister(service_id)
|
54
|
+
issue_request(path: "/service/deregister/#{service_id}", method: :put)
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.base_url
|
58
|
+
"#{consul_api_url}/v1/agent"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
data/lib/consul_api/catalog.rb
CHANGED
data/lib/consul_api/common.rb
CHANGED
@@ -2,16 +2,45 @@ module ConsulApi
|
|
2
2
|
module Common
|
3
3
|
module ClassMethods
|
4
4
|
def issue_request(method: :get, path: '', query: nil)
|
5
|
-
|
5
|
+
conn = Faraday.new(:url => "#{base_url}#{path}")
|
6
|
+
response = conn.send(method) do |req|
|
7
|
+
req.headers['Content-Type'] = 'application/json'
|
8
|
+
req.body = query.to_json
|
9
|
+
end
|
10
|
+
|
11
|
+
# gets and puts will fail with an http status code in the 4xx and 5xx range
|
12
|
+
fail "http status #{response.status} returned from consul" if response.status >= 400
|
13
|
+
|
14
|
+
# if the response is empty, return an empty hash
|
15
|
+
body = response.body == '' ? '{}' : response.body
|
16
|
+
|
6
17
|
begin
|
7
|
-
parsed_response = JSON.parse(
|
18
|
+
parsed_response = JSON.parse(body)
|
8
19
|
rescue => e
|
9
20
|
fail "unable to parse the json returned by Consul. Returned data: #{response.body}"
|
10
21
|
end
|
22
|
+
|
11
23
|
return Hashie::Mash.new(parsed_response) if parsed_response.is_a?(Hash)
|
12
24
|
# assume array otherwise, and return a collection of Mashes
|
13
25
|
parsed_response.map { |node| Hashie::Mash.new(node) }
|
14
26
|
end
|
27
|
+
|
28
|
+
def consul_ip
|
29
|
+
# override with an environment variable, or read from the gateway of docker0 interface
|
30
|
+
@@consul_ip ||= ENV['CONSUL_IP'] ? ENV['CONSUL_IP'] : `route -n | grep 'UG[ \t]' | awk '{print $2}'`.strip
|
31
|
+
end
|
32
|
+
|
33
|
+
def consul_api_port
|
34
|
+
@@consul_api_port ||= ENV['CONSUL_API_PORT'] ? ENV['CONSUL_API_PORT'] : 8500
|
35
|
+
end
|
36
|
+
|
37
|
+
def consul_dns_port
|
38
|
+
@@consul_dns_port ||= ENV['CONSUL_DNS_PORT'] ? ENV['CONSUL_DNS_PORT'] : 8600
|
39
|
+
end
|
40
|
+
|
41
|
+
def consul_api_url
|
42
|
+
"http://#{consul_ip}:#{consul_api_port}"
|
43
|
+
end
|
15
44
|
end
|
16
45
|
|
17
46
|
def self.included(base)
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module ConsulApi
|
2
|
+
class DNS
|
3
|
+
include Common
|
4
|
+
def self.resolve_service(host)
|
5
|
+
srv = []
|
6
|
+
srv = resolver.getresources(host, Resolv::DNS::Resource::IN::SRV)
|
7
|
+
# Sort SRV records: lowest priority first, highest weight first
|
8
|
+
srv.sort! { |a,b| (a.priority != b.priority) ? (a.priority <=> b.priority) : (b.weight <=> a.weight) }
|
9
|
+
"#{resolve_node(srv.first.target)}:#{srv.first.port}"
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.resolve_node(host)
|
13
|
+
resolver.getaddress(host).to_s
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.resolver
|
17
|
+
Resolv::DNS.new(
|
18
|
+
nameserver_port: [[consul_ip, consul_dns_port]],
|
19
|
+
search: [],
|
20
|
+
ndots: 1
|
21
|
+
)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/consul_api/version.rb
CHANGED
data/lib/consul_api.rb
CHANGED
data/spec/agent_spec.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ConsulApi::Agent, :vcr do
|
4
|
+
describe '#services' do
|
5
|
+
it 'gets services running on an agent' do
|
6
|
+
expect(ConsulApi::Agent.services).to be_a(Hashie::Mash)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
describe '#service_register' do
|
11
|
+
it 'registers a service on consul' do
|
12
|
+
expect(ConsulApi::Agent.service_register({'ID' => '123', 'Name' => 'abc'})).to be_a(Hashie::Mash)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
ENV['RACK_ENV'] = 'test'
|
2
|
+
require 'webmock/rspec'
|
3
|
+
require 'vcr'
|
4
|
+
require 'active_support/all'
|
5
|
+
require 'pry'
|
6
|
+
|
7
|
+
require 'consul_api'
|
8
|
+
|
9
|
+
# Requires supporting ruby files with custom matchers and macros, etc,
|
10
|
+
# in spec/support/ and its subdirectories.
|
11
|
+
Dir['./spec/support/**/*.rb'].each { |f| require f }
|
12
|
+
ENV['CONSUL_IP'] = '127.0.0.1'
|
13
|
+
RSpec.configure do |config|
|
14
|
+
|
15
|
+
end
|
data/spec/support/vcr.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
VCR.configure do |c|
|
2
|
+
c.cassette_library_dir = './spec/vcr'
|
3
|
+
c.hook_into :webmock
|
4
|
+
end
|
5
|
+
|
6
|
+
RSpec.configure do |c|
|
7
|
+
c.treat_symbols_as_metadata_keys_with_true_values = true
|
8
|
+
c.around(:each, :vcr) do |example|
|
9
|
+
name = example.metadata[:full_description].split(/\s+/, 2).join('/').underscore.gsub(/[^\w\/]+/, '_')
|
10
|
+
options = example.metadata.slice(:record, :match_requests_on).except(:example_group)
|
11
|
+
VCR.use_cassette(name, options) { example.call }
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: put
|
5
|
+
uri: http://127.0.0.1:8500/v1/agent/service/register
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: '{"ID":"123","Name":"abc"}'
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.9.0
|
12
|
+
Content-Type:
|
13
|
+
- application/json
|
14
|
+
Accept-Encoding:
|
15
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
16
|
+
Accept:
|
17
|
+
- '*/*'
|
18
|
+
response:
|
19
|
+
status:
|
20
|
+
code: 200
|
21
|
+
message: OK
|
22
|
+
headers:
|
23
|
+
Date:
|
24
|
+
- Wed, 17 Sep 2014 22:03:52 GMT
|
25
|
+
Content-Length:
|
26
|
+
- '0'
|
27
|
+
Content-Type:
|
28
|
+
- text/plain; charset=utf-8
|
29
|
+
body:
|
30
|
+
encoding: UTF-8
|
31
|
+
string: ''
|
32
|
+
http_version:
|
33
|
+
recorded_at: Wed, 17 Sep 2014 22:03:52 GMT
|
34
|
+
recorded_with: VCR 2.9.2
|
@@ -0,0 +1,34 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: http://127.0.0.1:8500/v1/agent/services
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: 'null'
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.9.0
|
12
|
+
Content-Type:
|
13
|
+
- application/json
|
14
|
+
Accept-Encoding:
|
15
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
16
|
+
Accept:
|
17
|
+
- '*/*'
|
18
|
+
response:
|
19
|
+
status:
|
20
|
+
code: 200
|
21
|
+
message: OK
|
22
|
+
headers:
|
23
|
+
Content-Type:
|
24
|
+
- application/json
|
25
|
+
Date:
|
26
|
+
- Wed, 17 Sep 2014 22:03:52 GMT
|
27
|
+
Content-Length:
|
28
|
+
- '162'
|
29
|
+
body:
|
30
|
+
encoding: UTF-8
|
31
|
+
string: '{"123":{"ID":"123","Service":"abc","Tags":null,"Port":0},"jockey_consul_update":{"ID":"jockey_consul_update","Service":"docker_consul_update","Tags":[],"Port":0}}'
|
32
|
+
http_version:
|
33
|
+
recorded_at: Wed, 17 Sep 2014 22:03:52 GMT
|
34
|
+
recorded_with: VCR 2.9.2
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: consul_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jay OConnor
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-09-
|
11
|
+
date: 2014-09-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -66,6 +66,76 @@ dependencies:
|
|
66
66
|
- - '>='
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: vcr
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rspec
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: webmock
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: activesupport
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - '>='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: pry
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - '>='
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - '>='
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
69
139
|
description: ''
|
70
140
|
email:
|
71
141
|
- jay@bellycard.com
|
@@ -80,9 +150,16 @@ files:
|
|
80
150
|
- Rakefile
|
81
151
|
- consul_api.gemspec
|
82
152
|
- lib/consul_api.rb
|
153
|
+
- lib/consul_api/agent.rb
|
83
154
|
- lib/consul_api/catalog.rb
|
84
155
|
- lib/consul_api/common.rb
|
156
|
+
- lib/consul_api/dns.rb
|
85
157
|
- lib/consul_api/version.rb
|
158
|
+
- spec/agent_spec.rb
|
159
|
+
- spec/spec_helper.rb
|
160
|
+
- spec/support/vcr.rb
|
161
|
+
- spec/vcr/consul_api/agent_service_register/registers_a_service_on_consul.yml
|
162
|
+
- spec/vcr/consul_api/agent_services/gets_services_running_on_an_agent.yml
|
86
163
|
homepage: ''
|
87
164
|
licenses:
|
88
165
|
- MIT
|
@@ -107,4 +184,9 @@ rubygems_version: 2.2.2
|
|
107
184
|
signing_key:
|
108
185
|
specification_version: 4
|
109
186
|
summary: Ruby wrapper for Consul V1 API
|
110
|
-
test_files:
|
187
|
+
test_files:
|
188
|
+
- spec/agent_spec.rb
|
189
|
+
- spec/spec_helper.rb
|
190
|
+
- spec/support/vcr.rb
|
191
|
+
- spec/vcr/consul_api/agent_service_register/registers_a_service_on_consul.yml
|
192
|
+
- spec/vcr/consul_api/agent_services/gets_services_running_on_an_agent.yml
|