kumonos 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 981d08ab41459f0b6974d1e9db66bf36298319cd
4
- data.tar.gz: a8f4fbb16ebb30de0b587a5820a37beb1d6e4da6
3
+ metadata.gz: 4c5bcbbfe1bf50df5f3ca86866224f841ff22215
4
+ data.tar.gz: bd670f7af51eec530a2b038bcd6308d32d93dbbf
5
5
  SHA512:
6
- metadata.gz: ecec920e45a4165cb2774c3e8b8b5d21990da3da8b0077ae8f18c0158800623faa95570d7f610dc54510444b192c8a93096516bf15ec58da482223a26b4c1496
7
- data.tar.gz: 4ef6d9a17b3ee7fc7b1307cf0d5b11a2092b7ee75a4468629e6683e4f0ccec664bba8b6b8f3c8bc391a298f9ddbcf705ef1a758de37eb2e615927685dfae9d7f
6
+ metadata.gz: 38dc408e5f62ef628f557d604c7c2d2f41225b7e4155bce923e4dd5ab534205913f714a12f234d5630ee5f4a54789c66c69587119adef7cb6bd9db85b391a7ca
7
+ data.tar.gz: b310762a15b754e011d4e1aa8b8c95a9cfb4c0745ce471573fa339ae6ae745c78d6a3660973509229bb6cc6a81754ae29c8c7e4d6c3b0a3df9ad69d12e33f1b1
data/.rubocop.yml CHANGED
@@ -1,5 +1,6 @@
1
1
  AllCops:
2
2
  DisplayCopNames: true
3
+ DisplayStyleGuide: true
3
4
 
4
5
  Metrics/BlockLength:
5
6
  Enabled: false
data/Rakefile CHANGED
@@ -1,6 +1,19 @@
1
1
  require 'bundler/gem_tasks'
2
- require 'rspec/core/rake_task'
3
2
 
3
+ require 'rspec/core/rake_task'
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
 
6
- task default: :spec
6
+ require 'rubocop/rake_task'
7
+ RuboCop::RakeTask.new
8
+
9
+ task default: %i[spec rubocop]
10
+
11
+ desc 'Run integration test'
12
+ task :integration_test do
13
+ Dir.chdir('test') do
14
+ sh './run_test'
15
+ end
16
+ end
17
+
18
+ desc 'Run all tests'
19
+ task all: %i[spec rubocop integration_test]
data/{bump.rb → bump} RENAMED
@@ -1,6 +1,7 @@
1
+ #!/usr/bin/env ruby
1
2
  level = ARGV.first
2
3
  if level.nil?
3
- warn "Example: ruby #{__FILE__} (tiny|minor|major)"
4
+ warn "Example: #{__FILE__} (tiny|minor|major)"
4
5
  exit 1
5
6
  end
6
7
 
@@ -25,7 +26,7 @@ when 'major'
25
26
  version_strs[1] = 0
26
27
  version_strs[2] = 0
27
28
  else
28
- warn "Example: ruby #{__FILE__} (tiny|minor|major)"
29
+ warn "Example: #{__FILE__} (tiny|minor|major)"
29
30
  exit 1
30
31
  end
31
32
 
data/example/book.yml CHANGED
@@ -1,7 +1,7 @@
1
1
  # A definition for book service.
2
2
  # The book service uses user service and ab-testing service.
3
3
  version: 1
4
- services:
4
+ dependencies:
5
5
  - name: 'user'
6
6
  lb: 'user:8080'
7
7
  connect_timeout_ms: 250
@@ -15,7 +15,7 @@ services:
15
15
  retry_policy:
16
16
  retry_on: '5xx,connect-failure,refused-stream'
17
17
  num_retries: 3
18
- per_try_timeout_ms: 250
18
+ per_try_timeout_ms: 1000
19
19
  - name: 'ab-testing'
20
20
  lb: 'ab-testing:8080'
21
21
  connect_timeout_ms: 250
@@ -29,4 +29,4 @@ services:
29
29
  retry_policy:
30
30
  retry_on: '5xx,connect-failure,refused-stream'
31
31
  num_retries: 3
32
- per_try_timeout_ms: 250
32
+ per_try_timeout_ms: 1000
data/exe/kumonos CHANGED
@@ -29,6 +29,7 @@ class KumonosCli < Thor
29
29
  def clusters(filepath, output_dir)
30
30
  name = File.basename(filepath, '.*')
31
31
  definition = YAML.load_file(filepath)
32
+ validate_service_definition!(definition, filepath)
32
33
  out = JSON.dump(Kumonos.generate_clusters(definition))
33
34
 
34
35
  output_dir = Pathname.new(output_dir)
@@ -42,6 +43,7 @@ class KumonosCli < Thor
42
43
  def routes(filepath, output_dir)
43
44
  name = File.basename(filepath, '.*')
44
45
  definition = YAML.load_file(filepath)
46
+ validate_service_definition!(definition, filepath)
45
47
  out = JSON.dump(Kumonos.generate_routes(definition))
46
48
 
47
49
  output_dir = Pathname.new(output_dir)
@@ -50,6 +52,30 @@ class KumonosCli < Thor
50
52
  target.write(out)
51
53
  puts target
52
54
  end
55
+
56
+ desc 'init NAME', 'Generate a service definition'
57
+ def init(name)
58
+ definition = YAML.load_file(File.expand_path('../example/book.yml', __dir__))
59
+ definition['dependencies'] = definition.fetch('dependencies')[0..0]
60
+ dep = definition['dependencies'][0]
61
+ dep['name'] = 'target-service-name'
62
+ dep['lb'] = 'hostname-for-load-balancer:port'
63
+ path = "#{name}.yml"
64
+ File.open(path, 'w') { |f| YAML.dump(definition, f) }
65
+ puts path
66
+ end
67
+
68
+ private
69
+
70
+ def validate_service_definition!(definition, filepath)
71
+ result = Kumonos::Schemas.validate_service_definition(definition)
72
+ return if result.empty?
73
+
74
+ warn("#{filepath} has invalid format:")
75
+ warn(result)
76
+ warn("A schema file is #{Kumonos::Schemas::SERVIVE_DEFINITION_PATH}")
77
+ exit 1
78
+ end
53
79
  end
54
80
 
55
81
  KumonosCli.start(ARGV)
@@ -6,6 +6,7 @@ module Kumonos
6
6
  module Schemas
7
7
  ROOT = Pathname.new(File.expand_path('../schemas', __dir__))
8
8
  CONFIG_SCHEMA_PATH = ROOT.join('kumonos_config.json')
9
+ SERVIVE_DEFINITION_PATH = ROOT.join('service_definition.json')
9
10
 
10
11
  class << self
11
12
  def validate_kumonos_config(hash)
@@ -13,6 +14,11 @@ module Kumonos
13
14
  JSON::Validator.fully_validate(schema, hash)
14
15
  end
15
16
 
17
+ def validate_service_definition(hash)
18
+ schema = load_schema(SERVIVE_DEFINITION_PATH)
19
+ JSON::Validator.fully_validate(schema, hash)
20
+ end
21
+
16
22
  private
17
23
 
18
24
  def load_schema(path)
@@ -1,3 +1,3 @@
1
1
  module Kumonos
2
- VERSION = '0.2.0'.freeze
2
+ VERSION = '0.3.0'.freeze
3
3
  end
data/lib/kumonos.rb CHANGED
@@ -46,16 +46,15 @@ module Kumonos
46
46
  end
47
47
 
48
48
  def generate_routes(definition)
49
- virtual_hosts = definition['services'].map { |s| service_to_vhost(s) }
50
49
  {
51
50
  validate_clusters: false,
52
- virtual_hosts: virtual_hosts
51
+ virtual_hosts: definition['dependencies'].map { |s| service_to_vhost(s) }
53
52
  }
54
53
  end
55
54
 
56
55
  def generate_clusters(definition)
57
56
  {
58
- clusters: definition['services'].map { |s| service_to_cluster(s) }
57
+ clusters: definition['dependencies'].map { |s| service_to_cluster(s) }
59
58
  }
60
59
  end
61
60
 
@@ -63,7 +62,6 @@ module Kumonos
63
62
 
64
63
  def service_to_vhost(service)
65
64
  name = service['name']
66
-
67
65
  {
68
66
  name: name,
69
67
  domains: [name],
@@ -0,0 +1,131 @@
1
+ {
2
+ "definitions": {},
3
+ "$schema": "http://json-schema.org/draft-04/schema#",
4
+ "type": "object",
5
+ "id": "service-definition",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "version",
9
+ "dependencies"
10
+ ],
11
+ "properties": {
12
+ "version": {
13
+ "type": "integer",
14
+ "id": "/properties/version",
15
+ "default": 1
16
+ },
17
+ "dependencies": {
18
+ "type": "array",
19
+ "id": "/properties/dependencies",
20
+ "items": {
21
+ "type": "object",
22
+ "id": "/properties/dependencies/items",
23
+ "additionalProperties": false,
24
+ "required": [
25
+ "name",
26
+ "lb",
27
+ "connect_timeout_ms",
28
+ "circuit_breaker",
29
+ "routes"
30
+ ],
31
+ "properties": {
32
+ "name": {
33
+ "type": "string",
34
+ "id": "/properties/dependencies/items/properties/name",
35
+ "default": "dependency-service-name"
36
+ },
37
+ "lb": {
38
+ "type": "string",
39
+ "id": "/properties/dependencies/items/properties/lb",
40
+ "default": "host:port"
41
+ },
42
+ "connect_timeout_ms": {
43
+ "type": "integer",
44
+ "id": "/properties/dependencies/items/properties/connect_timeout_ms",
45
+ "default": 250
46
+ },
47
+ "circuit_breaker": {
48
+ "type": "object",
49
+ "id": "/properties/dependencies/items/properties/circuit_breaker",
50
+ "additionalProperties": false,
51
+ "required": [
52
+ "max_connections",
53
+ "max_pending_requests",
54
+ "max_retries"
55
+ ],
56
+ "properties": {
57
+ "max_connections": {
58
+ "type": "integer",
59
+ "id": "/properties/dependencies/items/properties/circuit_breaker/properties/max_connections",
60
+ "default": 64
61
+ },
62
+ "max_pending_requests": {
63
+ "type": "integer",
64
+ "id": "/properties/dependencies/items/properties/circuit_breaker/properties/max_pending_requests",
65
+ "default": 128
66
+ },
67
+ "max_retries": {
68
+ "type": "integer",
69
+ "id": "/properties/dependencies/items/properties/circuit_breaker/properties/max_retries",
70
+ "default": 3
71
+ }
72
+ }
73
+ },
74
+ "routes": {
75
+ "type": "array",
76
+ "id": "/properties/dependencies/items/properties/routes",
77
+ "items": {
78
+ "type": "object",
79
+ "id": "/properties/dependencies/items/properties/routes/items",
80
+ "additionalProperties": false,
81
+ "required": [
82
+ "prefix",
83
+ "timeout_ms",
84
+ "retry_policy"
85
+ ],
86
+ "properties": {
87
+ "prefix": {
88
+ "type": "string",
89
+ "id": "/properties/dependencies/items/properties/routes/items/properties/prefix",
90
+ "default": "/"
91
+ },
92
+ "timeout_ms": {
93
+ "type": "integer",
94
+ "id": "/properties/dependencies/items/properties/routes/items/properties/timeout_ms",
95
+ "default": 3000
96
+ },
97
+ "retry_policy": {
98
+ "type": "object",
99
+ "id": "/properties/dependencies/items/properties/routes/items/properties/retry_policy",
100
+ "additionalProperties": false,
101
+ "required": [
102
+ "retry_on",
103
+ "num_retries",
104
+ "per_try_timeout_ms"
105
+ ],
106
+ "properties": {
107
+ "retry_on": {
108
+ "type": "string",
109
+ "id": "/properties/dependencies/items/properties/routes/items/properties/retry_policy/properties/retry_on",
110
+ "default": "5xx,connect-failure,refused-stream"
111
+ },
112
+ "num_retries": {
113
+ "type": "integer",
114
+ "id": "/properties/dependencies/items/properties/routes/items/properties/retry_policy/properties/num_retries",
115
+ "default": 3
116
+ },
117
+ "per_try_timeout_ms": {
118
+ "type": "integer",
119
+ "id": "/properties/dependencies/items/properties/routes/items/properties/retry_policy/properties/per_try_timeout_ms",
120
+ "default": 1000
121
+ }
122
+ }
123
+ }
124
+ }
125
+ }
126
+ }
127
+ }
128
+ }
129
+ }
130
+ }
131
+ }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kumonos
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Taiki Ono
@@ -126,7 +126,7 @@ files:
126
126
  - Rakefile
127
127
  - bin/console
128
128
  - bin/setup
129
- - bump.rb
129
+ - bump
130
130
  - example/book.yml
131
131
  - example/kumonos.json
132
132
  - exe/kumonos
@@ -136,6 +136,7 @@ files:
136
136
  - lib/kumonos/schemas.rb
137
137
  - lib/kumonos/version.rb
138
138
  - lib/schemas/kumonos_config.json
139
+ - lib/schemas/service_definition.json
139
140
  homepage: https://github.com/taiki45/kumonos
140
141
  licenses:
141
142
  - MIT