dendrite 0.3.4 → 0.4.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 +4 -4
- data/bin/add_proxy +29 -0
- data/bin/register +4 -4
- data/conf/services/service.yml +14 -14
- data/lib/dendrite/generators/nerve.rb +3 -8
- data/lib/dendrite/generators/synapse.rb +13 -11
- data/lib/dendrite/io.rb +4 -4
- data/lib/dendrite/service_graph.rb +12 -18
- data/lib/dendrite/service_node.rb +11 -11
- data/lib/dendrite/version.rb +1 -1
- data/lib/dendrite.rb +10 -0
- metadata +5 -5
- /data/{bin → script}/console +0 -0
- /data/{bin → script}/setup +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 75ab8e520c89530e8855ee657590709d2e4ceaf4
|
4
|
+
data.tar.gz: 607f0d08f5dc040d93740df12feb6092e604e0df
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c72ead6e5303f23398df7da5d1d96061e36b35183edec8fad23dbb249c95ced2161154ccbd79ed9f57654219d58d996aaa152097e938c0ea7de26549755c3404
|
7
|
+
data.tar.gz: ec833d9b8f212131fa7c41e6421719dfddcab9ae1267f13e21643aa8ed1c0a58c05a72cdae5019d0eabda3852fc5bb3af6825893b4c26d2cd3f188d839496ad9
|
data/bin/add_proxy
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'dendrite'
|
3
|
+
require 'optparse'
|
4
|
+
|
5
|
+
options = {}
|
6
|
+
OptionParser.new do |opts|
|
7
|
+
opts.banner = "Usage: proxy [options]"
|
8
|
+
opts.on("-s", "--service SERVICE_NAME", "service name") do |v|
|
9
|
+
options[:service_name] = v
|
10
|
+
end
|
11
|
+
|
12
|
+
opts.on("-c", "--config CONFIG_FILE", "config file") do |v|
|
13
|
+
options[:config] = v
|
14
|
+
end
|
15
|
+
|
16
|
+
opts.on("-p", "--port PORT", "port") do |v|
|
17
|
+
options[:port] = v.to_i
|
18
|
+
end
|
19
|
+
end.parse!
|
20
|
+
|
21
|
+
Dendrite::Config.load(source: options[:config])
|
22
|
+
services = [options[:service_name]]
|
23
|
+
graph = Dendrite::IO.load(source: Dendrite::Config.services_source)
|
24
|
+
raise Dendrite::InvalidData unless graph.valid?
|
25
|
+
raise Dendrite::UnknownService unless services.collect {|service_name| graph[service_name]}.all?
|
26
|
+
|
27
|
+
Dendrite::Config.custom_frontend!(name: "custom_#{options[:service_name]}", port: options[:port], backend_name: options[:service_name])
|
28
|
+
synapse = Dendrite::Generators::Synapse.new(graph: graph, service_names: services)
|
29
|
+
Dendrite::IO.write(data: synapse.to_yaml, destination: Dendrite::Config.synapse_config_path)
|
data/bin/register
CHANGED
@@ -15,19 +15,19 @@ OptionParser.new do |opts|
|
|
15
15
|
end.parse!
|
16
16
|
|
17
17
|
Dendrite::Config.load(source: options[:config])
|
18
|
+
graph = Dendrite::IO.load(source: Dendrite::Config.services_source)
|
19
|
+
|
18
20
|
services = begin
|
19
21
|
Dendrite::IO.read(source: Dendrite::Config.nerve_config_path)[:services].keys
|
20
22
|
rescue
|
21
23
|
[]
|
22
24
|
end.collect(&:to_s)
|
23
|
-
|
25
|
+
services += options[:service_name].split(',')
|
26
|
+
services.uniq!
|
24
27
|
|
25
28
|
raise Dendrite::InvalidData unless graph.valid?
|
26
29
|
raise Dendrite::UnknownService unless services.collect {|service_name| graph[service_name]}.all?
|
27
|
-
raise Dendrite::UnknownService unless options[:service_name].split(',').collect{|s| graph[s]}.all?
|
28
30
|
|
29
|
-
services += options[:service_name].split(',')
|
30
|
-
services.uniq!
|
31
31
|
synapse = Dendrite::Generators::Synapse.new(graph: graph, service_names: services)
|
32
32
|
Dendrite::IO.write(data: synapse.to_yaml, destination: Dendrite::Config.synapse_config_path)
|
33
33
|
|
data/conf/services/service.yml
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
organization: sd
|
2
|
-
|
2
|
+
component: cams
|
3
3
|
lead_email: vp@foobar.com
|
4
4
|
team_email: team@foobar.com
|
5
|
-
|
5
|
+
subcomponents:
|
6
6
|
- name: foobar
|
7
7
|
type: tomcat
|
8
8
|
deploy:
|
@@ -12,14 +12,14 @@ services:
|
|
12
12
|
min_instance_count: 1
|
13
13
|
max_instance_count: 5
|
14
14
|
ports:
|
15
|
-
|
16
|
-
|
15
|
+
loadbalancer_port: 8082
|
16
|
+
service_port: 8080
|
17
17
|
dependencies:
|
18
|
-
-
|
19
|
-
|
18
|
+
- component: cams
|
19
|
+
subcomponent: cat
|
20
20
|
latency: foo
|
21
|
-
-
|
22
|
-
|
21
|
+
- component: cams
|
22
|
+
subcomponent: foobar
|
23
23
|
latency: foo
|
24
24
|
- name: cat
|
25
25
|
type: tomcat
|
@@ -30,11 +30,11 @@ services:
|
|
30
30
|
min_instance_count: 1
|
31
31
|
max_instance_count: 5
|
32
32
|
ports:
|
33
|
-
|
34
|
-
|
33
|
+
loadbalancer_port: 8081
|
34
|
+
service_port: 8080
|
35
35
|
dependencies:
|
36
|
-
-
|
37
|
-
|
36
|
+
- component: cams
|
37
|
+
subcomponent: foobar
|
38
38
|
latency: foo
|
39
39
|
- name: baz
|
40
40
|
type: tomcat
|
@@ -45,6 +45,6 @@ services:
|
|
45
45
|
min_instance_count: 1
|
46
46
|
max_instance_count: 5
|
47
47
|
ports:
|
48
|
-
|
49
|
-
|
48
|
+
loadbalancer_port: 8083
|
49
|
+
service_port: 8080
|
50
50
|
dependencies: []
|
@@ -4,11 +4,6 @@ module Dendrite
|
|
4
4
|
|
5
5
|
def initialize(graph:, service_names:)
|
6
6
|
super
|
7
|
-
@services.group_by { |service| service.listening_port }.each do |port, services|
|
8
|
-
if services.length > 1
|
9
|
-
raise PortCollision, "Port collission between #{services.collect(&:name).join(',')}"
|
10
|
-
end
|
11
|
-
end
|
12
7
|
@services = @services.collect { |service| ServiceConfig.new(service)}
|
13
8
|
end
|
14
9
|
|
@@ -26,13 +21,13 @@ module Dendrite
|
|
26
21
|
ServiceConfig = Struct.new(:service) do
|
27
22
|
extend Forwardable
|
28
23
|
def_delegator :service, :name, :name
|
29
|
-
def_delegator :service, :
|
24
|
+
def_delegator :service, :component, :component
|
30
25
|
def_delegator :service, :organization, :organization
|
31
26
|
|
32
27
|
def to_h
|
33
28
|
{
|
34
29
|
host: Dendrite::Config.public_ip,
|
35
|
-
port: service.
|
30
|
+
port: service.service_port,
|
36
31
|
labels: {
|
37
32
|
dc: Dendrite::Config.dc,
|
38
33
|
env: Dendrite::Config.env
|
@@ -44,7 +39,7 @@ module Dendrite
|
|
44
39
|
{
|
45
40
|
reporter_type: 'zookeeper',
|
46
41
|
zk_hosts: Dendrite::Config.zk_hosts,
|
47
|
-
zk_path: "/smartstack/services/#{organization}/#{
|
42
|
+
zk_path: "/smartstack/services/#{organization}/#{component}/#{service.real_name}/instances"
|
48
43
|
}
|
49
44
|
end
|
50
45
|
end
|
@@ -1,16 +1,18 @@
|
|
1
1
|
module Dendrite
|
2
2
|
module Generators
|
3
3
|
class Synapse < Base
|
4
|
-
def initialize(graph:, service_names:)
|
5
|
-
super
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
4
|
+
def initialize(graph:, service_names:, proxy: false)
|
5
|
+
super(graph: graph, service_names: service_names)
|
6
|
+
unless proxy
|
7
|
+
dep = []
|
8
|
+
@services.each do |service|
|
9
|
+
service.dependencies.each do |_, dependency|
|
10
|
+
dep << dependency.service
|
11
|
+
end
|
10
12
|
end
|
13
|
+
@services = dep.uniq
|
11
14
|
end
|
12
|
-
@services
|
13
|
-
@services.group_by { |service| service.advertised_port }.each do |port, services|
|
15
|
+
@services.group_by { |service| service.loadbalancer_port }.each do |port, services|
|
14
16
|
if services.length > 1
|
15
17
|
raise PortCollision, "Port collission between #{services.collect(&:name).join(',')}"
|
16
18
|
end
|
@@ -37,7 +39,7 @@ module Dendrite
|
|
37
39
|
ServiceConfig = Struct.new(:service) do
|
38
40
|
extend Forwardable
|
39
41
|
def_delegator :service, :name, :name
|
40
|
-
def_delegator :service, :
|
42
|
+
def_delegator :service, :component, :component
|
41
43
|
def_delegator :service, :organization, :organization
|
42
44
|
|
43
45
|
def to_h
|
@@ -49,7 +51,7 @@ module Dendrite
|
|
49
51
|
discovery: {
|
50
52
|
method: 'zookeeper',
|
51
53
|
hosts: Dendrite::Config.zk_hosts,
|
52
|
-
path: "/smartstack/services/#{organization}/#{
|
54
|
+
path: "/smartstack/services/#{organization}/#{component}/#{service.real_name}/instances"
|
53
55
|
}
|
54
56
|
}
|
55
57
|
end
|
@@ -57,7 +59,7 @@ module Dendrite
|
|
57
59
|
def haproxy_config
|
58
60
|
{
|
59
61
|
haproxy: {
|
60
|
-
port: service.
|
62
|
+
port: service.loadbalancer_port,
|
61
63
|
server_options: 'check inter 2s rise 3 fall 2',
|
62
64
|
listen: [
|
63
65
|
'mode tcp'
|
data/lib/dendrite/io.rb
CHANGED
@@ -15,13 +15,13 @@ module Dendrite
|
|
15
15
|
node = ServiceNode.new(service)
|
16
16
|
if service[:dependencies]
|
17
17
|
service[:dependencies].each do |deps|
|
18
|
-
dependency_name = "#{service[:organization]}_#{deps[:
|
18
|
+
dependency_name = "#{service[:organization]}_#{deps[:component]}_#{deps[:subcomponent]}"
|
19
19
|
graph[node.name].add_dependency(service: graph[dependency_name], latency: deps[:latency])
|
20
20
|
end
|
21
21
|
end
|
22
22
|
if service[:dependancies]
|
23
23
|
service[:dependancies].each do |deps|
|
24
|
-
dependency_name = "#{service[:organization]}_#{deps[:
|
24
|
+
dependency_name = "#{service[:organization]}_#{deps[:component]}_#{deps[:subcomponent]}"
|
25
25
|
graph[node.name].add_dependency(service: graph[dependency_name], latency: deps[:latency])
|
26
26
|
end
|
27
27
|
end
|
@@ -43,9 +43,9 @@ module Dendrite
|
|
43
43
|
|
44
44
|
def services_from_file(source:)
|
45
45
|
data = read(source: source)
|
46
|
-
data[:
|
46
|
+
data[:subcomponents].collect do |service|
|
47
47
|
service[:organization] = data[:organization]
|
48
|
-
service[:
|
48
|
+
service[:component] = data[:component]
|
49
49
|
service[:lead_email] = data[:lead_email]
|
50
50
|
service[:team_email] = data[:team_email]
|
51
51
|
service
|
@@ -1,10 +1,14 @@
|
|
1
1
|
module Dendrite
|
2
2
|
class ServiceGraph
|
3
|
+
include ActiveModel::Validations
|
3
4
|
extend Forwardable
|
4
5
|
|
5
6
|
attr_reader :services
|
6
7
|
def_delegators :services, :each, :each
|
7
8
|
|
9
|
+
validate :validate_nodes
|
10
|
+
validate :collisions
|
11
|
+
|
8
12
|
def initialize
|
9
13
|
@services = {}
|
10
14
|
end
|
@@ -19,29 +23,19 @@ module Dendrite
|
|
19
23
|
services.fetch(name)
|
20
24
|
end
|
21
25
|
|
22
|
-
def
|
23
|
-
services.values.
|
24
|
-
services.values.group_by(&:advertised_port)
|
26
|
+
def collisions
|
27
|
+
services.values.group_by(&:loadbalancer_port)
|
25
28
|
.reject {|port, svc| port == nil}
|
26
|
-
.
|
27
|
-
|
29
|
+
.select {|port, svc| svc.length > 1}
|
30
|
+
.each do |port, svc|
|
31
|
+
errors.add("port_collisions_#{port}", "collision between #{svc.collect(&:name).join(',')}")
|
28
32
|
end
|
29
33
|
end
|
30
34
|
|
31
|
-
def
|
32
|
-
|
33
|
-
|
34
|
-
hash
|
35
|
-
end
|
36
|
-
services.values.group_by(&:advertised_port)
|
37
|
-
.reject {|port, svc| port == nil}
|
38
|
-
.each do |port, svc|
|
39
|
-
if svc.length > 1
|
40
|
-
hash[:port_collisions] ||= {}
|
41
|
-
hash[:port_collisions][port] = svc.collect(&:name)
|
42
|
-
end
|
35
|
+
def validate_nodes
|
36
|
+
services.each do |name, service|
|
37
|
+
errors.add(name, service.errors.messages) unless service.valid?
|
43
38
|
end
|
44
|
-
return hash
|
45
39
|
end
|
46
40
|
end
|
47
41
|
end
|
@@ -11,9 +11,9 @@ module Dendrite
|
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
-
ports.each do |
|
15
|
-
if
|
16
|
-
|
14
|
+
ports.each do |name, prt|
|
15
|
+
if prt.invalid?
|
16
|
+
prt.errors.each do |key, value|
|
17
17
|
errors.add "port_#{key}", value
|
18
18
|
end
|
19
19
|
end
|
@@ -75,15 +75,15 @@ module Dendrite
|
|
75
75
|
|
76
76
|
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i
|
77
77
|
|
78
|
-
attr_reader :organization, :
|
78
|
+
attr_reader :organization, :component, :lead_email, :team_email,
|
79
79
|
:type, :deploy, :scale, :ports, :dependencies
|
80
80
|
# :name is set but magically
|
81
81
|
|
82
|
-
validates_presence_of :organization, :
|
82
|
+
validates_presence_of :organization, :component, :lead_email, :team_email,
|
83
83
|
:name, :type, :deploy, :scale
|
84
84
|
|
85
85
|
validates :organization, format: { with: /\A[a-z]+\z/, message: "only allows lowercase letters" }
|
86
|
-
validates :
|
86
|
+
validates :component, format: { with: /\A[a-z]+\z/, message: "only allows lowercase letters" }
|
87
87
|
validates :lead_email, format: { with: VALID_EMAIL_REGEX, message: "invalid email format" }
|
88
88
|
validates :team_email, format: { with: VALID_EMAIL_REGEX, message: "invalid email format" }
|
89
89
|
validates :name, format: { with: /\A[a-z_]+\z/, message: "only allows lowercase letters" }
|
@@ -113,15 +113,15 @@ module Dendrite
|
|
113
113
|
end
|
114
114
|
|
115
115
|
def name
|
116
|
-
"#{organization}_#{
|
116
|
+
"#{organization}_#{component}_#{@name}" if @name
|
117
117
|
end
|
118
118
|
|
119
|
-
def
|
120
|
-
ports[:
|
119
|
+
def service_port
|
120
|
+
ports[:service_port].port if ports[:service_port]
|
121
121
|
end
|
122
122
|
|
123
|
-
def
|
124
|
-
ports[:
|
123
|
+
def loadbalancer_port
|
124
|
+
ports[:loadbalancer_port].port if ports[:loadbalancer_port]
|
125
125
|
end
|
126
126
|
|
127
127
|
def add_dependency(service:, latency:)
|
data/lib/dendrite/version.rb
CHANGED
data/lib/dendrite.rb
CHANGED
@@ -46,6 +46,16 @@ module Dendrite
|
|
46
46
|
@@data[:synapse][:haproxy]
|
47
47
|
end
|
48
48
|
|
49
|
+
def custom_frontend!(name:, port:, backend_name:)
|
50
|
+
data = {
|
51
|
+
"frontend #{name}": [
|
52
|
+
"bind :#{port}",
|
53
|
+
"use_backend #{backend_name}"
|
54
|
+
]
|
55
|
+
}
|
56
|
+
@@data[:synapse][:haproxy][:extra_sections] = @@data[:synapse][:haproxy][:extra_sections].merge(data)
|
57
|
+
end
|
58
|
+
|
49
59
|
def valid_types
|
50
60
|
@@data[:dendrite][:valid_app_types]
|
51
61
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dendrite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yagnik
|
@@ -84,9 +84,8 @@ description: Build config files for synapse and nerve of smartstack
|
|
84
84
|
email:
|
85
85
|
- yagnikkhanna@gmail.com
|
86
86
|
executables:
|
87
|
-
-
|
87
|
+
- add_proxy
|
88
88
|
- register
|
89
|
-
- setup
|
90
89
|
extensions: []
|
91
90
|
extra_rdoc_files: []
|
92
91
|
files:
|
@@ -96,9 +95,8 @@ files:
|
|
96
95
|
- LICENSE.txt
|
97
96
|
- README.md
|
98
97
|
- Rakefile
|
99
|
-
- bin/
|
98
|
+
- bin/add_proxy
|
100
99
|
- bin/register
|
101
|
-
- bin/setup
|
102
100
|
- conf/config.yaml
|
103
101
|
- conf/services/service.yml
|
104
102
|
- dendrite.gemspec
|
@@ -110,6 +108,8 @@ files:
|
|
110
108
|
- lib/dendrite/service_graph.rb
|
111
109
|
- lib/dendrite/service_node.rb
|
112
110
|
- lib/dendrite/version.rb
|
111
|
+
- script/console
|
112
|
+
- script/setup
|
113
113
|
homepage: https://github.com/yagnik/dendrite
|
114
114
|
licenses:
|
115
115
|
- MIT
|
/data/{bin → script}/console
RENAMED
File without changes
|
/data/{bin → script}/setup
RENAMED
File without changes
|