diplomatic_bag 2.2.1
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 +7 -0
- data/LICENSE +24 -0
- data/README.md +356 -0
- data/features/configuration.feature +9 -0
- data/features/step_definitions/setup_diplomat.rb +24 -0
- data/features/step_definitions/test_key_value.rb +9 -0
- data/lib/diplomat/acl.rb +81 -0
- data/lib/diplomat/agent.rb +42 -0
- data/lib/diplomat/check.rb +109 -0
- data/lib/diplomat/configuration.rb +28 -0
- data/lib/diplomat/datacenter.rb +21 -0
- data/lib/diplomat/error.rb +15 -0
- data/lib/diplomat/event.rb +166 -0
- data/lib/diplomat/health.rb +81 -0
- data/lib/diplomat/kv.rb +263 -0
- data/lib/diplomat/lock.rb +54 -0
- data/lib/diplomat/maintenance.rb +41 -0
- data/lib/diplomat/members.rb +14 -0
- data/lib/diplomat/node.rb +43 -0
- data/lib/diplomat/nodes.rb +22 -0
- data/lib/diplomat/query.rb +87 -0
- data/lib/diplomat/rest_client.rb +278 -0
- data/lib/diplomat/service.rb +111 -0
- data/lib/diplomat/session.rb +75 -0
- data/lib/diplomat/status.rb +22 -0
- data/lib/diplomat/version.rb +3 -0
- data/lib/diplomat.rb +62 -0
- data/lib/diplomatic_bag/datacenters.rb +11 -0
- data/lib/diplomatic_bag/info.rb +32 -0
- data/lib/diplomatic_bag/nodes.rb +28 -0
- data/lib/diplomatic_bag/service.rb +20 -0
- data/lib/diplomatic_bag/services.rb +38 -0
- data/lib/diplomatic_bag.rb +7 -0
- metadata +89 -0
data/lib/diplomat.rb
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
require 'json'
|
|
2
|
+
require 'base64'
|
|
3
|
+
require 'faraday'
|
|
4
|
+
|
|
5
|
+
# Top level namespace ensures all required libraries are included and initializes the gem configration.
|
|
6
|
+
module Diplomat
|
|
7
|
+
class << self
|
|
8
|
+
attr_accessor :root_path
|
|
9
|
+
attr_accessor :lib_path
|
|
10
|
+
attr_accessor :configuration
|
|
11
|
+
|
|
12
|
+
# Internal: Requires internal Faraday libraries.
|
|
13
|
+
# @param *libs One or more relative String names to Faraday classes.
|
|
14
|
+
# @return [nil]
|
|
15
|
+
def require_libs(*libs)
|
|
16
|
+
libs.each do |lib|
|
|
17
|
+
require "#{lib_path}/#{lib}"
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
alias require_lib require_libs
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
raise 'Diplomat only supports ruby >= 2.0.0' unless RUBY_VERSION.to_f >= 2.0
|
|
25
|
+
|
|
26
|
+
self.root_path = File.expand_path __dir__
|
|
27
|
+
self.lib_path = File.expand_path 'diplomat', __dir__
|
|
28
|
+
|
|
29
|
+
require_libs 'configuration', 'rest_client', 'kv', 'datacenter', 'service',
|
|
30
|
+
'members', 'node', 'nodes', 'check', 'health', 'session', 'lock',
|
|
31
|
+
'error', 'event', 'acl', 'maintenance', 'query', 'agent', 'status'
|
|
32
|
+
self.configuration ||= Diplomat::Configuration.new
|
|
33
|
+
|
|
34
|
+
class << self
|
|
35
|
+
# Build optional configuration by yielding a block to configure
|
|
36
|
+
# @yield [Diplomat::Configuration]
|
|
37
|
+
def configure
|
|
38
|
+
self.configuration ||= Diplomat::Configuration.new
|
|
39
|
+
yield(configuration)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
private
|
|
43
|
+
|
|
44
|
+
# Send all other unknown commands to Diplomat::Kv
|
|
45
|
+
# @deprecated Please use Diplomat::Kv instead.
|
|
46
|
+
# @param name [Symbol] Method to send to Kv
|
|
47
|
+
# @param *args List of arguments to send to Kv
|
|
48
|
+
# @param &block block to send to Kv
|
|
49
|
+
# @return [Object]
|
|
50
|
+
def method_missing(name, *args, &block)
|
|
51
|
+
Diplomat::Kv.new.send(name, *args, &block) || super
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Make `respond_to_missing?` fall back to super
|
|
55
|
+
#
|
|
56
|
+
# @param meth_id [Symbol] the tested method
|
|
57
|
+
# @oaram with_private if private methods should be tested too
|
|
58
|
+
def respond_to_missing?(meth_id, with_private = false)
|
|
59
|
+
access_method?(meth_id) || super
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Usefull usage of Diplomat lib: Datacenter functions
|
|
2
|
+
module DiplomaticBag
|
|
3
|
+
def self.get_datacenters_list(dc, options = {})
|
|
4
|
+
dcs = []
|
|
5
|
+
datacenters = Diplomat::Datacenter.get(nil, options)
|
|
6
|
+
dc.each do |c|
|
|
7
|
+
dcs.concat(datacenters.select { |d| d[/#{c}/] })
|
|
8
|
+
end
|
|
9
|
+
dcs.uniq
|
|
10
|
+
end
|
|
11
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Usefull usage of Diplomat lib: Info functions
|
|
2
|
+
module DiplomaticBag
|
|
3
|
+
# rubocop:disable AbcSize
|
|
4
|
+
def self.consul_info(options = {})
|
|
5
|
+
consul_self = Diplomat::Agent.self(options)
|
|
6
|
+
puts 'Server: ' + consul_self['Config']['NodeName']
|
|
7
|
+
puts 'Datacenter: ' + consul_self['Config']['Datacenter']
|
|
8
|
+
puts 'Consul Version: ' + consul_self['Config']['Version']
|
|
9
|
+
if consul_self['Stats']['consul']['leader_addr']
|
|
10
|
+
puts 'Leader Address: ' + consul_self['Stats']['consul']['leader_addr']
|
|
11
|
+
puts 'applied_index: ' + consul_self['Stats']['raft']['applied_index']
|
|
12
|
+
puts 'commit_index: ' + consul_self['Stats']['raft']['commit_index']
|
|
13
|
+
end
|
|
14
|
+
members = Diplomat::Members.get(options)
|
|
15
|
+
servers = members.select { |member| member['Tags']['role'] == 'consul' }.sort_by { |n| n['Name'] }
|
|
16
|
+
nodes = members.select { |member| member['Tags']['role'] == 'node' }
|
|
17
|
+
leader = Diplomat::Status.leader(options).split(':')[0]
|
|
18
|
+
puts 'Servers Count: ' + servers.count.to_s
|
|
19
|
+
puts 'Nodes Count: ' + nodes.count.to_s
|
|
20
|
+
puts 'Servers:'
|
|
21
|
+
servers.map do |s|
|
|
22
|
+
if s['Tags']['role'] == 'consul'
|
|
23
|
+
if s['Addr'] == leader
|
|
24
|
+
puts ' ' + s['Name'] + ' ' + s['Addr'] + ' *Leader*'
|
|
25
|
+
else
|
|
26
|
+
puts ' ' + s['Name'] + ' ' + s['Addr']
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
# rubocop:enable AbcSize
|
|
32
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Usefull usage of Diplomat lib: Nodes functions
|
|
2
|
+
module DiplomaticBag
|
|
3
|
+
def self.get_duplicate_node_id(options = {})
|
|
4
|
+
status = {
|
|
5
|
+
1 => 'Alive',
|
|
6
|
+
2 => '?',
|
|
7
|
+
3 => 'Left',
|
|
8
|
+
4 => 'Failed'
|
|
9
|
+
}
|
|
10
|
+
result = []
|
|
11
|
+
members = Diplomat::Members.get(options)
|
|
12
|
+
grouped = members.group_by do |row|
|
|
13
|
+
[row['Tags']['id']]
|
|
14
|
+
end
|
|
15
|
+
filtered = grouped.values.select { |a| a.size > 1 }
|
|
16
|
+
filtered.each do |dup|
|
|
17
|
+
instance = {}
|
|
18
|
+
instance[:node_id] = dup[0]['Tags']['id']
|
|
19
|
+
nodes = []
|
|
20
|
+
dup.each do |inst|
|
|
21
|
+
nodes << { name: inst['Name'], status: status[inst['Status']] }
|
|
22
|
+
end
|
|
23
|
+
instance[:nodes] = nodes
|
|
24
|
+
result << instance
|
|
25
|
+
end
|
|
26
|
+
result
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Usefull usage of Diplomat lib: Service functions
|
|
2
|
+
module DiplomaticBag
|
|
3
|
+
def self.get_service_info(service, options = {})
|
|
4
|
+
result = {}
|
|
5
|
+
health = Diplomat::Health.service(service, options)
|
|
6
|
+
result[service] = {}
|
|
7
|
+
health.each do |h|
|
|
8
|
+
result[service][h['Node']['Node']] = {
|
|
9
|
+
'Address': h['Node']['Address'],
|
|
10
|
+
'Port': h['Service']['Port']
|
|
11
|
+
}
|
|
12
|
+
checks = {}
|
|
13
|
+
h['Checks'].each do |c|
|
|
14
|
+
checks[c['Name']] = { 'status': c['Status'], 'output': c['Output'] }
|
|
15
|
+
end
|
|
16
|
+
result[service][h['Node']['Node']]['Checks'] = checks
|
|
17
|
+
end
|
|
18
|
+
result
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Usefull usage of Diplomat lib: Services functions
|
|
2
|
+
module DiplomaticBag
|
|
3
|
+
def self.compute_service_name(s)
|
|
4
|
+
return '/node::health/' if s.nil? || s == ''
|
|
5
|
+
|
|
6
|
+
s
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def self.get_all_services_status(options = {})
|
|
10
|
+
result = {}
|
|
11
|
+
services = Diplomat::Health.state('any', options)
|
|
12
|
+
grouped_by_service = services.group_by { |h| compute_service_name(h['ServiceName']) }.values
|
|
13
|
+
grouped_by_service.each do |s|
|
|
14
|
+
grouped_by_status = s.group_by { |h| h['Status'] }.values
|
|
15
|
+
status = {}
|
|
16
|
+
grouped_by_status.each do |state|
|
|
17
|
+
status[state[0]['Status']] = state.count
|
|
18
|
+
end
|
|
19
|
+
service_name = compute_service_name(s[0]['ServiceName'])
|
|
20
|
+
result[service_name] = status
|
|
21
|
+
end
|
|
22
|
+
result
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def self.get_services_list(service, options = {})
|
|
26
|
+
services = Diplomat::Service.get_all(options)
|
|
27
|
+
services.to_h.keys.grep(/#{service}/)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def self.get_services_info(service, options = {})
|
|
31
|
+
result = []
|
|
32
|
+
services = get_services_list(service, options)
|
|
33
|
+
services.each do |s|
|
|
34
|
+
result << get_service_info(s.to_s, options)
|
|
35
|
+
end
|
|
36
|
+
result
|
|
37
|
+
end
|
|
38
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: diplomatic_bag
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 2.2.1
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Nicolas Benoit
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2019-04-11 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: diplomat
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ">="
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '0'
|
|
20
|
+
type: :development
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ">="
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '0'
|
|
27
|
+
description: Toolbox for Consul
|
|
28
|
+
email:
|
|
29
|
+
- n.benoit@criteo.com
|
|
30
|
+
executables: []
|
|
31
|
+
extensions: []
|
|
32
|
+
extra_rdoc_files: []
|
|
33
|
+
files:
|
|
34
|
+
- LICENSE
|
|
35
|
+
- README.md
|
|
36
|
+
- features/configuration.feature
|
|
37
|
+
- features/step_definitions/setup_diplomat.rb
|
|
38
|
+
- features/step_definitions/test_key_value.rb
|
|
39
|
+
- lib/diplomat.rb
|
|
40
|
+
- lib/diplomat/acl.rb
|
|
41
|
+
- lib/diplomat/agent.rb
|
|
42
|
+
- lib/diplomat/check.rb
|
|
43
|
+
- lib/diplomat/configuration.rb
|
|
44
|
+
- lib/diplomat/datacenter.rb
|
|
45
|
+
- lib/diplomat/error.rb
|
|
46
|
+
- lib/diplomat/event.rb
|
|
47
|
+
- lib/diplomat/health.rb
|
|
48
|
+
- lib/diplomat/kv.rb
|
|
49
|
+
- lib/diplomat/lock.rb
|
|
50
|
+
- lib/diplomat/maintenance.rb
|
|
51
|
+
- lib/diplomat/members.rb
|
|
52
|
+
- lib/diplomat/node.rb
|
|
53
|
+
- lib/diplomat/nodes.rb
|
|
54
|
+
- lib/diplomat/query.rb
|
|
55
|
+
- lib/diplomat/rest_client.rb
|
|
56
|
+
- lib/diplomat/service.rb
|
|
57
|
+
- lib/diplomat/session.rb
|
|
58
|
+
- lib/diplomat/status.rb
|
|
59
|
+
- lib/diplomat/version.rb
|
|
60
|
+
- lib/diplomatic_bag.rb
|
|
61
|
+
- lib/diplomatic_bag/datacenters.rb
|
|
62
|
+
- lib/diplomatic_bag/info.rb
|
|
63
|
+
- lib/diplomatic_bag/nodes.rb
|
|
64
|
+
- lib/diplomatic_bag/service.rb
|
|
65
|
+
- lib/diplomatic_bag/services.rb
|
|
66
|
+
homepage: https://github.com/WeAreFarmGeek/diplomat
|
|
67
|
+
licenses:
|
|
68
|
+
- BSD-3-Clause
|
|
69
|
+
metadata: {}
|
|
70
|
+
post_install_message:
|
|
71
|
+
rdoc_options: []
|
|
72
|
+
require_paths:
|
|
73
|
+
- lib
|
|
74
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
75
|
+
requirements:
|
|
76
|
+
- - ">="
|
|
77
|
+
- !ruby/object:Gem::Version
|
|
78
|
+
version: '0'
|
|
79
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
80
|
+
requirements:
|
|
81
|
+
- - ">="
|
|
82
|
+
- !ruby/object:Gem::Version
|
|
83
|
+
version: '0'
|
|
84
|
+
requirements: []
|
|
85
|
+
rubygems_version: 3.0.3
|
|
86
|
+
signing_key:
|
|
87
|
+
specification_version: 4
|
|
88
|
+
summary: Toolbox for Consul
|
|
89
|
+
test_files: []
|