kumonos 0.1.0 → 0.2.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/.gitignore +1 -0
- data/.rubocop.yml +13 -0
- data/.travis.yml +5 -3
- data/Gemfile +2 -2
- data/README.md +4 -20
- data/Rakefile +3 -3
- data/bin/console +4 -11
- data/bump.rb +35 -0
- data/example/book.yml +5 -1
- data/example/kumonos.json +37 -0
- data/exe/kumonos +50 -4
- data/kumonos.gemspec +3 -1
- data/lib/kumonos/configuration.rb +27 -0
- data/lib/kumonos/schemas.rb +23 -0
- data/lib/kumonos/version.rb +1 -1
- data/lib/kumonos.rb +45 -21
- data/lib/schemas/kumonos_config.json +174 -0
- metadata +36 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 981d08ab41459f0b6974d1e9db66bf36298319cd
|
4
|
+
data.tar.gz: a8f4fbb16ebb30de0b587a5820a37beb1d6e4da6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ecec920e45a4165cb2774c3e8b8b5d21990da3da8b0077ae8f18c0158800623faa95570d7f610dc54510444b192c8a93096516bf15ec58da482223a26b4c1496
|
7
|
+
data.tar.gz: 4ef6d9a17b3ee7fc7b1307cf0d5b11a2092b7ee75a4468629e6683e4f0ccec664bba8b6b8f3c8bc391a298f9ddbcf705ef1a758de37eb2e615927685dfae9d7f
|
data/.gitignore
CHANGED
data/.rubocop.yml
ADDED
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
source
|
1
|
+
source 'https://rubygems.org'
|
2
2
|
|
3
|
-
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
|
3
|
+
git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
|
4
4
|
|
5
5
|
# Specify your gem's dependencies in kumonos.gemspec
|
6
6
|
gemspec
|
data/README.md
CHANGED
@@ -1,39 +1,23 @@
|
|
1
1
|
# Kumonos
|
2
|
+
[](https://travis-ci.org/taiki45/kumonos)
|
3
|
+
[](https://badge.fury.io/rb/kumonos)
|
2
4
|
|
3
|
-
|
4
|
-
|
5
|
-
TODO: Delete this and the text above, and describe your gem
|
5
|
+
Manage and build a Service Mesh for Microservices.
|
6
6
|
|
7
7
|
## Installation
|
8
8
|
|
9
|
-
Add this line to your application's Gemfile:
|
10
|
-
|
11
|
-
```ruby
|
12
|
-
gem 'kumonos'
|
13
|
-
```
|
14
|
-
|
15
|
-
And then execute:
|
16
|
-
|
17
|
-
$ bundle
|
18
|
-
|
19
|
-
Or install it yourself as:
|
20
|
-
|
21
9
|
$ gem install kumonos
|
22
10
|
|
23
11
|
## Usage
|
24
|
-
|
25
12
|
TODO: Write usage instructions here
|
26
13
|
|
27
14
|
## Development
|
28
|
-
|
29
15
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
30
16
|
|
31
17
|
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
32
18
|
|
33
19
|
## Contributing
|
34
|
-
|
35
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/kumonos.
|
20
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/taiki45/kumonos.
|
36
21
|
|
37
22
|
## License
|
38
|
-
|
39
23
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
CHANGED
data/bin/console
CHANGED
@@ -1,14 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'kumonos'
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require "pry"
|
11
|
-
# Pry.start
|
12
|
-
|
13
|
-
require "irb"
|
14
|
-
IRB.start(__FILE__)
|
6
|
+
require 'pry'
|
7
|
+
Pry.start
|
data/bump.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
level = ARGV.first
|
2
|
+
if level.nil?
|
3
|
+
warn "Example: ruby #{__FILE__} (tiny|minor|major)"
|
4
|
+
exit 1
|
5
|
+
end
|
6
|
+
|
7
|
+
path = 'lib/kumonos/version.rb'
|
8
|
+
regexp = /VERSION = '(.+)'.freeze$/
|
9
|
+
version = File.read(path).scan(regexp)[0][0]
|
10
|
+
version_strs = version.split('.')
|
11
|
+
|
12
|
+
if version_strs.size > 3
|
13
|
+
warn "Current version includes a prelease suffix, drop it: #{version}"
|
14
|
+
version_strs = version_strs[0..2]
|
15
|
+
end
|
16
|
+
|
17
|
+
case level
|
18
|
+
when 'tiny'
|
19
|
+
version_strs[2] = version_strs[2].to_i + 1
|
20
|
+
when 'minor'
|
21
|
+
version_strs[1] = version_strs[1].to_i + 1
|
22
|
+
version_strs[2] = 0
|
23
|
+
when 'major'
|
24
|
+
version_strs[0] = version_strs[0].to_i + 1
|
25
|
+
version_strs[1] = 0
|
26
|
+
version_strs[2] = 0
|
27
|
+
else
|
28
|
+
warn "Example: ruby #{__FILE__} (tiny|minor|major)"
|
29
|
+
exit 1
|
30
|
+
end
|
31
|
+
|
32
|
+
next_version = version_strs.join('.')
|
33
|
+
File.write(path, File.read(path).gsub(regexp, "VERSION = '#{next_version}'.freeze"))
|
34
|
+
system('git', 'add', path)
|
35
|
+
system('git', 'commit', '-m', "v#{next_version}")
|
data/example/book.yml
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# A
|
1
|
+
# A definition for book service.
|
2
2
|
# The book service uses user service and ab-testing service.
|
3
3
|
version: 1
|
4
4
|
services:
|
@@ -19,6 +19,10 @@ services:
|
|
19
19
|
- name: 'ab-testing'
|
20
20
|
lb: 'ab-testing:8080'
|
21
21
|
connect_timeout_ms: 250
|
22
|
+
circuit_breaker:
|
23
|
+
max_connections: 64
|
24
|
+
max_pending_requests: 128
|
25
|
+
max_retries: 3
|
22
26
|
routes:
|
23
27
|
- prefix: '/'
|
24
28
|
timeout_ms: 3000
|
@@ -0,0 +1,37 @@
|
|
1
|
+
{
|
2
|
+
"version": 1,
|
3
|
+
"ds": {
|
4
|
+
"name": "nginx",
|
5
|
+
"refresh_delay_ms": 30000,
|
6
|
+
"cluster": {
|
7
|
+
"name": "nginx",
|
8
|
+
"type": "strict_dns",
|
9
|
+
"connect_timeout_ms": 250,
|
10
|
+
"lb_type": "round_robin",
|
11
|
+
"hosts": [
|
12
|
+
{
|
13
|
+
"url": "tcp://nginx:80"
|
14
|
+
}
|
15
|
+
]
|
16
|
+
}
|
17
|
+
},
|
18
|
+
"statsd": {
|
19
|
+
"name": "statsd",
|
20
|
+
"connect_timeout_ms": 250,
|
21
|
+
"type": "strict_dns",
|
22
|
+
"lb_type": "round_robin",
|
23
|
+
"hosts": [
|
24
|
+
{
|
25
|
+
"url": "tcp://socat:2000"
|
26
|
+
}
|
27
|
+
]
|
28
|
+
},
|
29
|
+
"listener": {
|
30
|
+
"address": "tcp://0.0.0.0:9211",
|
31
|
+
"access_log_path": "/dev/stdout"
|
32
|
+
},
|
33
|
+
"admin": {
|
34
|
+
"address": "tcp://0.0.0.0:9901",
|
35
|
+
"access_log_path": "/dev/stdout"
|
36
|
+
}
|
37
|
+
}
|
data/exe/kumonos
CHANGED
@@ -1,9 +1,55 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
4
|
+
$LOAD_PATH.unshift(File.expand_path('../lib', __dir__))
|
5
5
|
require 'kumonos'
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
require 'pathname'
|
8
|
+
require 'thor'
|
9
|
+
|
10
|
+
# KumonosCli
|
11
|
+
class KumonosCli < Thor
|
12
|
+
desc 'envoy SERVIVE_NAME', 'Generate envoy configuration'
|
13
|
+
method_option :config, aliases: '-c', desc: 'Configuration file for kumonos'
|
14
|
+
def envoy(service_name)
|
15
|
+
h = JSON.parse(File.read(options[:config]))
|
16
|
+
result = Kumonos::Schemas.validate_kumonos_config(h)
|
17
|
+
unless result.empty?
|
18
|
+
warn("#{options[:config]} has invalid format:")
|
19
|
+
warn(result)
|
20
|
+
warn("A schema file for kumonos-configuration is #{Kumonos::Schemas::CONFIG_SCHEMA_PATH}")
|
21
|
+
exit 1
|
22
|
+
end
|
23
|
+
|
24
|
+
config = Kumonos::Configuration.from_hash(h)
|
25
|
+
puts JSON.dump(Kumonos.generate(config, service_name))
|
26
|
+
end
|
27
|
+
|
28
|
+
desc 'clusters FILEPATH OUT', 'Generate clusters configuration'
|
29
|
+
def clusters(filepath, output_dir)
|
30
|
+
name = File.basename(filepath, '.*')
|
31
|
+
definition = YAML.load_file(filepath)
|
32
|
+
out = JSON.dump(Kumonos.generate_clusters(definition))
|
33
|
+
|
34
|
+
output_dir = Pathname.new(output_dir)
|
35
|
+
target = output_dir.join('v1', 'clusters', name, name)
|
36
|
+
target.parent.mkpath unless target.parent.exist?
|
37
|
+
target.write(out)
|
38
|
+
puts target
|
39
|
+
end
|
40
|
+
|
41
|
+
desc 'routes FILEPATH OUT', 'Generate routes configuration'
|
42
|
+
def routes(filepath, output_dir)
|
43
|
+
name = File.basename(filepath, '.*')
|
44
|
+
definition = YAML.load_file(filepath)
|
45
|
+
out = JSON.dump(Kumonos.generate_routes(definition))
|
46
|
+
|
47
|
+
output_dir = Pathname.new(output_dir)
|
48
|
+
target = output_dir.join('v1', 'routes', name, name, name)
|
49
|
+
target.parent.mkpath unless target.parent.exist?
|
50
|
+
target.write(out)
|
51
|
+
puts target
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
KumonosCli.start(ARGV)
|
data/kumonos.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.authors = ['Taiki Ono']
|
9
9
|
spec.email = ['taiks.4559@gmail.com']
|
10
10
|
|
11
|
-
spec.summary =
|
11
|
+
spec.summary = 'Manage configuration for Service Mesh.'
|
12
12
|
spec.description = spec.summary
|
13
13
|
spec.homepage = 'https://github.com/taiki45/kumonos'
|
14
14
|
spec.license = 'MIT'
|
@@ -20,9 +20,11 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
21
21
|
spec.require_paths = ['lib']
|
22
22
|
|
23
|
+
spec.add_dependency 'json-schema'
|
23
24
|
spec.add_development_dependency 'bundler'
|
24
25
|
spec.add_development_dependency 'pry'
|
25
26
|
spec.add_development_dependency 'rake'
|
26
27
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
27
28
|
spec.add_development_dependency 'rspec-json_matcher'
|
29
|
+
spec.add_development_dependency 'rubocop', '~> 0.51.0'
|
28
30
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Kumonos
|
2
|
+
Configuration = Struct.new(:version, :ds, :statsd, :listener, :admin) do
|
3
|
+
class << self
|
4
|
+
def from_hash(h)
|
5
|
+
new(
|
6
|
+
h.fetch('version'),
|
7
|
+
symbolize_keys(h.fetch('ds')),
|
8
|
+
symbolize_keys(h.fetch('statsd')),
|
9
|
+
symbolize_keys(h.fetch('listener')),
|
10
|
+
symbolize_keys(h.fetch('admin'))
|
11
|
+
)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def symbolize_keys(hash)
|
17
|
+
new = hash.map do |k, v|
|
18
|
+
[
|
19
|
+
k.to_sym,
|
20
|
+
v.is_a?(Hash) ? symbolize_keys(v) : v
|
21
|
+
]
|
22
|
+
end
|
23
|
+
new.to_h
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require 'json-schema'
|
3
|
+
|
4
|
+
module Kumonos
|
5
|
+
# Schemas
|
6
|
+
module Schemas
|
7
|
+
ROOT = Pathname.new(File.expand_path('../schemas', __dir__))
|
8
|
+
CONFIG_SCHEMA_PATH = ROOT.join('kumonos_config.json')
|
9
|
+
|
10
|
+
class << self
|
11
|
+
def validate_kumonos_config(hash)
|
12
|
+
schema = load_schema(CONFIG_SCHEMA_PATH)
|
13
|
+
JSON::Validator.fully_validate(schema, hash)
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def load_schema(path)
|
19
|
+
JSON.parse(File.read(path))
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/kumonos/version.rb
CHANGED
data/lib/kumonos.rb
CHANGED
@@ -1,41 +1,64 @@
|
|
1
1
|
require 'json'
|
2
2
|
require 'yaml'
|
3
|
+
|
3
4
|
require 'kumonos/version'
|
5
|
+
require 'kumonos/schemas'
|
6
|
+
require 'kumonos/configuration'
|
4
7
|
|
8
|
+
# Kumonos
|
5
9
|
module Kumonos
|
6
10
|
class << self
|
7
|
-
def generate(config)
|
8
|
-
virtual_hosts = config['services'].map {|s| service_to_vhost(s) }
|
9
|
-
clusters = config['services'].map {|s| service_to_cluster(s) }
|
11
|
+
def generate(config, name)
|
10
12
|
{
|
11
13
|
listeners: [
|
12
14
|
{
|
13
|
-
address:
|
15
|
+
address: config.listener.fetch(:address),
|
14
16
|
filters: [
|
15
17
|
type: 'read',
|
16
18
|
name: 'http_connection_manager',
|
17
19
|
config: {
|
18
20
|
codec_type: 'auto',
|
19
21
|
stat_prefix: 'ingress_http',
|
20
|
-
access_log: [{ path:
|
21
|
-
|
22
|
-
|
22
|
+
access_log: [{ path: config.listener.fetch(:access_log_path) }],
|
23
|
+
rds: {
|
24
|
+
cluster: config.ds.fetch(:name),
|
25
|
+
route_config_name: name,
|
26
|
+
refresh_delay_ms: config.ds.fetch(:refresh_delay_ms)
|
23
27
|
},
|
24
|
-
filters: [{ type: 'decoder', name: 'router', config: {} }]
|
28
|
+
filters: [{ type: 'decoder', name: 'router', config: {} }]
|
25
29
|
}
|
26
|
-
]
|
30
|
+
]
|
27
31
|
}
|
28
32
|
],
|
29
33
|
admin: {
|
30
|
-
access_log_path:
|
31
|
-
address:
|
34
|
+
access_log_path: config.admin.fetch(:access_log_path),
|
35
|
+
address: config.admin.fetch(:address)
|
32
36
|
},
|
37
|
+
statsd_tcp_cluster_name: config.statsd.fetch(:name),
|
33
38
|
cluster_manager: {
|
34
|
-
clusters:
|
39
|
+
clusters: [config.statsd],
|
40
|
+
cds: {
|
41
|
+
cluster: config.ds.fetch(:cluster),
|
42
|
+
refresh_delay_ms: config.ds.fetch(:refresh_delay_ms)
|
43
|
+
}
|
35
44
|
}
|
36
45
|
}
|
37
46
|
end
|
38
47
|
|
48
|
+
def generate_routes(definition)
|
49
|
+
virtual_hosts = definition['services'].map { |s| service_to_vhost(s) }
|
50
|
+
{
|
51
|
+
validate_clusters: false,
|
52
|
+
virtual_hosts: virtual_hosts
|
53
|
+
}
|
54
|
+
end
|
55
|
+
|
56
|
+
def generate_clusters(definition)
|
57
|
+
{
|
58
|
+
clusters: definition['services'].map { |s| service_to_cluster(s) }
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
39
62
|
private
|
40
63
|
|
41
64
|
def service_to_vhost(service)
|
@@ -44,34 +67,35 @@ module Kumonos
|
|
44
67
|
{
|
45
68
|
name: name,
|
46
69
|
domains: [name],
|
47
|
-
routes: service['routes'].flat_map {|r| split_route(r, name) }
|
70
|
+
routes: service['routes'].flat_map { |r| split_route(r, name) }
|
48
71
|
}
|
49
72
|
end
|
50
73
|
|
51
|
-
# Split route
|
74
|
+
# Split route definition to apply retry definition only to GET/HEAD requests.
|
52
75
|
def split_route(route, name)
|
53
76
|
base = {
|
54
77
|
prefix: route['prefix'],
|
55
78
|
timeout_ms: route['timeout_ms'],
|
56
|
-
cluster: name
|
79
|
+
cluster: name
|
57
80
|
}
|
58
81
|
with_retry = base.merge(
|
59
82
|
retry_policy: route['retry_policy'],
|
60
|
-
headers: [{ name: ':method', value: '(GET|HEAD)', regex: true }]
|
83
|
+
headers: [{ name: ':method', value: '(GET|HEAD)', regex: true }]
|
61
84
|
)
|
62
85
|
[with_retry, base]
|
63
86
|
end
|
64
87
|
|
65
88
|
def service_to_cluster(service)
|
66
|
-
|
89
|
+
{
|
67
90
|
name: service['name'],
|
68
91
|
connect_timeout_ms: service['connect_timeout_ms'],
|
69
|
-
type: '
|
92
|
+
type: 'strict_dns',
|
70
93
|
lb_type: 'round_robin',
|
71
|
-
hosts: [
|
94
|
+
hosts: [{ url: "tcp://#{service['lb']}" }],
|
95
|
+
circuit_breakers: {
|
96
|
+
default: service['circuit_breaker']
|
97
|
+
}
|
72
98
|
}
|
73
|
-
out.merge(circuit_breakers: [default: service['circuit_breaker']]) if service['circuit_breaker']
|
74
|
-
out
|
75
99
|
end
|
76
100
|
end
|
77
101
|
end
|
@@ -0,0 +1,174 @@
|
|
1
|
+
{
|
2
|
+
"definitions": {},
|
3
|
+
"$schema": "http://json-schema.org/draft-04/schema#",
|
4
|
+
"type": "object",
|
5
|
+
"id": "kumonos-configuration",
|
6
|
+
"additionalProperties": false,
|
7
|
+
"required": [
|
8
|
+
"version",
|
9
|
+
"ds",
|
10
|
+
"statsd",
|
11
|
+
"listener",
|
12
|
+
"admin"
|
13
|
+
],
|
14
|
+
"properties": {
|
15
|
+
"version": {
|
16
|
+
"type": "integer",
|
17
|
+
"id": "/properties/version"
|
18
|
+
},
|
19
|
+
"ds": {
|
20
|
+
"type": "object",
|
21
|
+
"id": "/properties/ds",
|
22
|
+
"additionalProperties": false,
|
23
|
+
"required": [
|
24
|
+
"name",
|
25
|
+
"refresh_delay_ms",
|
26
|
+
"cluster"
|
27
|
+
],
|
28
|
+
"properties": {
|
29
|
+
"name": {
|
30
|
+
"type": "string",
|
31
|
+
"id": "/properties/ds/properties/name"
|
32
|
+
},
|
33
|
+
"refresh_delay_ms": {
|
34
|
+
"type": "integer",
|
35
|
+
"id": "/properties/ds/properties/refresh_delay_ms"
|
36
|
+
},
|
37
|
+
"cluster": {
|
38
|
+
"type": "object",
|
39
|
+
"id": "/properties/ds/properties/cluster",
|
40
|
+
"additionalProperties": false,
|
41
|
+
"required": [
|
42
|
+
"name",
|
43
|
+
"type",
|
44
|
+
"connect_timeout_ms",
|
45
|
+
"lb_type",
|
46
|
+
"hosts"
|
47
|
+
],
|
48
|
+
"properties": {
|
49
|
+
"name": {
|
50
|
+
"type": "string",
|
51
|
+
"id": "/properties/ds/properties/cluster/properties/name"
|
52
|
+
},
|
53
|
+
"type": {
|
54
|
+
"type": "string",
|
55
|
+
"id": "/properties/ds/properties/cluster/properties/type"
|
56
|
+
},
|
57
|
+
"connect_timeout_ms": {
|
58
|
+
"type": "integer",
|
59
|
+
"id": "/properties/ds/properties/cluster/properties/connect_timeout_ms"
|
60
|
+
},
|
61
|
+
"lb_type": {
|
62
|
+
"type": "string",
|
63
|
+
"id": "/properties/ds/properties/cluster/properties/lb_type"
|
64
|
+
},
|
65
|
+
"hosts": {
|
66
|
+
"type": "array",
|
67
|
+
"id": "/properties/ds/properties/cluster/properties/hosts",
|
68
|
+
"items": {
|
69
|
+
"type": "object",
|
70
|
+
"id": "/properties/ds/properties/cluster/properties/hosts/items",
|
71
|
+
"additionalProperties": false,
|
72
|
+
"required": [
|
73
|
+
"url"
|
74
|
+
],
|
75
|
+
"properties": {
|
76
|
+
"url": {
|
77
|
+
"type": "string",
|
78
|
+
"id": "/properties/ds/properties/cluster/properties/hosts/items/properties/url"
|
79
|
+
}
|
80
|
+
}
|
81
|
+
}
|
82
|
+
}
|
83
|
+
}
|
84
|
+
}
|
85
|
+
}
|
86
|
+
},
|
87
|
+
"statsd": {
|
88
|
+
"type": "object",
|
89
|
+
"id": "/properties/statsd",
|
90
|
+
"additionalProperties": false,
|
91
|
+
"required": [
|
92
|
+
"name",
|
93
|
+
"connect_timeout_ms",
|
94
|
+
"type",
|
95
|
+
"lb_type",
|
96
|
+
"hosts"
|
97
|
+
],
|
98
|
+
"properties": {
|
99
|
+
"name": {
|
100
|
+
"type": "string",
|
101
|
+
"id": "/properties/statsd/properties/name"
|
102
|
+
},
|
103
|
+
"connect_timeout_ms": {
|
104
|
+
"type": "integer",
|
105
|
+
"id": "/properties/statsd/properties/connect_timeout_ms"
|
106
|
+
},
|
107
|
+
"type": {
|
108
|
+
"type": "string",
|
109
|
+
"id": "/properties/statsd/properties/type"
|
110
|
+
},
|
111
|
+
"lb_type": {
|
112
|
+
"type": "string",
|
113
|
+
"id": "/properties/statsd/properties/lb_type"
|
114
|
+
},
|
115
|
+
"hosts": {
|
116
|
+
"type": "array",
|
117
|
+
"id": "/properties/statsd/properties/hosts",
|
118
|
+
"items": {
|
119
|
+
"type": "object",
|
120
|
+
"id": "/properties/statsd/properties/hosts/items",
|
121
|
+
"additionalProperties": false,
|
122
|
+
"required": [
|
123
|
+
"url"
|
124
|
+
],
|
125
|
+
"properties": {
|
126
|
+
"url": {
|
127
|
+
"type": "string",
|
128
|
+
"id": "/properties/statsd/properties/hosts/items/properties/url"
|
129
|
+
}
|
130
|
+
}
|
131
|
+
}
|
132
|
+
}
|
133
|
+
}
|
134
|
+
},
|
135
|
+
"listener": {
|
136
|
+
"type": "object",
|
137
|
+
"id": "/properties/listener",
|
138
|
+
"additionalProperties": false,
|
139
|
+
"required": [
|
140
|
+
"address",
|
141
|
+
"access_log_path"
|
142
|
+
],
|
143
|
+
"properties": {
|
144
|
+
"address": {
|
145
|
+
"type": "string",
|
146
|
+
"id": "/properties/listener/properties/address"
|
147
|
+
},
|
148
|
+
"access_log_path": {
|
149
|
+
"type": "string",
|
150
|
+
"id": "/properties/listener/properties/access_log_path"
|
151
|
+
}
|
152
|
+
}
|
153
|
+
},
|
154
|
+
"admin": {
|
155
|
+
"type": "object",
|
156
|
+
"id": "/properties/admin",
|
157
|
+
"additionalProperties": false,
|
158
|
+
"required": [
|
159
|
+
"address",
|
160
|
+
"access_log_path"
|
161
|
+
],
|
162
|
+
"properties": {
|
163
|
+
"address": {
|
164
|
+
"type": "string",
|
165
|
+
"id": "/properties/admin/properties/address"
|
166
|
+
},
|
167
|
+
"access_log_path": {
|
168
|
+
"type": "string",
|
169
|
+
"id": "/properties/admin/properties/access_log_path"
|
170
|
+
}
|
171
|
+
}
|
172
|
+
}
|
173
|
+
}
|
174
|
+
}
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kumonos
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Taiki Ono
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-11-
|
11
|
+
date: 2017-11-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: json-schema
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: bundler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,6 +94,20 @@ dependencies:
|
|
80
94
|
- - ">="
|
81
95
|
- !ruby/object:Gem::Version
|
82
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rubocop
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 0.51.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.51.0
|
83
111
|
description: Manage configuration for Service Mesh.
|
84
112
|
email:
|
85
113
|
- taiks.4559@gmail.com
|
@@ -90,6 +118,7 @@ extra_rdoc_files: []
|
|
90
118
|
files:
|
91
119
|
- ".gitignore"
|
92
120
|
- ".rspec"
|
121
|
+
- ".rubocop.yml"
|
93
122
|
- ".travis.yml"
|
94
123
|
- Gemfile
|
95
124
|
- LICENSE.txt
|
@@ -97,11 +126,16 @@ files:
|
|
97
126
|
- Rakefile
|
98
127
|
- bin/console
|
99
128
|
- bin/setup
|
129
|
+
- bump.rb
|
100
130
|
- example/book.yml
|
131
|
+
- example/kumonos.json
|
101
132
|
- exe/kumonos
|
102
133
|
- kumonos.gemspec
|
103
134
|
- lib/kumonos.rb
|
135
|
+
- lib/kumonos/configuration.rb
|
136
|
+
- lib/kumonos/schemas.rb
|
104
137
|
- lib/kumonos/version.rb
|
138
|
+
- lib/schemas/kumonos_config.json
|
105
139
|
homepage: https://github.com/taiki45/kumonos
|
106
140
|
licenses:
|
107
141
|
- MIT
|