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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c9df8cb99fab62bc29a5d0cc10e98ec3e836099a
4
- data.tar.gz: 03e90f508ce70a2c353635d099443c625762e2d0
3
+ metadata.gz: 75ab8e520c89530e8855ee657590709d2e4ceaf4
4
+ data.tar.gz: 607f0d08f5dc040d93740df12feb6092e604e0df
5
5
  SHA512:
6
- metadata.gz: 877b22c3b316d7f95b78217221174deb1be1721348f31d3dd98d87f1a8b57e59688cdd99f04f571de05231a647fecb2aae105e3c0d092f6e1b5014369c900a31
7
- data.tar.gz: 18910d742a7380782d6f35b3f559ddc7819c4391023f6003672dde0b559a36c114acce7eebb8460c1790028c0c825dfed3958fe6ef8e38ff30b7216bf01ed0c7
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
- graph = Dendrite::IO.load(source: Dendrite::Config.services_source)
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
 
@@ -1,8 +1,8 @@
1
1
  organization: sd
2
- namespace: cams
2
+ component: cams
3
3
  lead_email: vp@foobar.com
4
4
  team_email: team@foobar.com
5
- services:
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
- advertised_port: 8082
16
- listening_port: 8080
15
+ loadbalancer_port: 8082
16
+ service_port: 8080
17
17
  dependencies:
18
- - namespace: cams
19
- name: cat
18
+ - component: cams
19
+ subcomponent: cat
20
20
  latency: foo
21
- - namespace: cams
22
- name: foobar
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
- advertised_port: 8081
34
- listening_port: 8080
33
+ loadbalancer_port: 8081
34
+ service_port: 8080
35
35
  dependencies:
36
- - namespace: cams
37
- name: foobar
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
- advertised_port: 8083
49
- listening_port: 8080
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, :namespace, :namespace
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.listening_port,
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}/#{namespace}/#{service.real_name}/instances"
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
- dep = []
7
- @services.each do |service|
8
- service.dependencies.each do |_, dependency|
9
- dep << dependency.service
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 = dep.uniq
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, :namespace, :namespace
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}/#{namespace}/#{service.real_name}/instances"
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.advertised_port,
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[:namespace]}_#{deps[:name]}"
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[:namespace]}_#{deps[:name]}"
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[:services].collect do |service|
46
+ data[:subcomponents].collect do |service|
47
47
  service[:organization] = data[:organization]
48
- service[:namespace] = data[:namespace]
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 valid?
23
- services.values.collect(&:valid?).all? &&
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
- .all? do |port, svc|
27
- svc.length == 1
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 errors
32
- hash = services.inject({}) do |hash, (name, service)|
33
- hash[name] = service.errors.messages if service.errors.messages.length > 0
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 |depname, dep|
15
- if dep.invalid?
16
- dep.errors.each do |key, value|
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, :namespace, :lead_email, :team_email,
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, :namespace, :lead_email, :team_email,
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 :namespace, format: { with: /\A[a-z]+\z/, message: "only allows lowercase letters" }
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}_#{namespace}_#{@name}" if @name
116
+ "#{organization}_#{component}_#{@name}" if @name
117
117
  end
118
118
 
119
- def listening_port
120
- ports[:listening_port].port if ports[:listening_port]
119
+ def service_port
120
+ ports[:service_port].port if ports[:service_port]
121
121
  end
122
122
 
123
- def advertised_port
124
- ports[:advertised_port].port if ports[:advertised_port]
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:)
@@ -1,3 +1,3 @@
1
1
  module Dendrite
2
- VERSION = "0.3.4"
2
+ VERSION = "0.4.0"
3
3
  end
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.3.4
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
- - console
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/console
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
File without changes
File without changes