mkit 0.10.4 → 0.10.6
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/README.md +4 -0
- data/db/migrate/008_create_resources.rb +17 -0
- data/db/migrate/009_migrate_resources.rb +16 -0
- data/lib/mkit/app/helpers/docker_helper.rb +15 -0
- data/lib/mkit/app/model/resource.rb +61 -0
- data/lib/mkit/app/model/service.rb +6 -15
- data/lib/mkit/app/templates/docker/docker_run.sh.erb +10 -1
- data/lib/mkit/cmd_runner.rb +1 -1
- data/lib/mkit/version.rb +1 -1
- data/lib/mkit.rb +17 -4
- data/mkit.gemspec +9 -6
- data/samples/apps/httpbin.yml +4 -0
- data/samples/apps/swiss-army-knife.yml +38 -0
- metadata +68 -46
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c8da623d478674392719514f75c4f217b965ae74672da8a9fa95dc3fcdd32e8c
|
|
4
|
+
data.tar.gz: 7a8ef046090f61775f7bbccac7e9196c449f1bbb430548a0e6e18e055e424062
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 46e920ccb46d920bf57ba45eced556ae592c201b8d1da9556cb20fe40a699e18d97600165e3874366c1f7346a8bd44076e5bc52539535f71abd854022c01bf03
|
|
7
|
+
data.tar.gz: 6a09c07ae387bb6b8592213e5620e2230825e8e0c87e7a917784cea2a4536a5ba08090872fb53e723dc6fb79799b7a04342af3fdea0d44af9227146d29d9ef07
|
data/README.md
CHANGED
|
@@ -176,6 +176,10 @@ service:
|
|
|
176
176
|
resources:
|
|
177
177
|
min_replicas: 1 # default value. Pods will be available on internal DNS as '<service_name>.internal'
|
|
178
178
|
max_replicas: 1 # default value
|
|
179
|
+
limits:
|
|
180
|
+
cpu: 250m # cpu limit - 1000m represents 1 cpu core. minimum 10m. default is empty
|
|
181
|
+
memory: 250m # memory limit - default is empty
|
|
182
|
+
memory_swap: 250m # memory + swap limit - default is empty
|
|
179
183
|
volumes:
|
|
180
184
|
- docker://mkit_rabbitmq_data:/var/lib/rabbitmq # a docker volume - it will be created if it does not exists
|
|
181
185
|
- /var/log/rabbitmq/logs:/var/log/rabbitmq # a local volume
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class CreateResources < ActiveRecord::Migration[5.1]
|
|
4
|
+
def up
|
|
5
|
+
create_table :resources do |t|
|
|
6
|
+
t.string :service_id
|
|
7
|
+
t.string :version
|
|
8
|
+
t.integer :min_replicas, default: 1
|
|
9
|
+
t.integer :max_replicas, default: 1
|
|
10
|
+
t.string :cpu_limits
|
|
11
|
+
t.string :memory_limits
|
|
12
|
+
t.string :memory_swap_limits
|
|
13
|
+
t.timestamp :created_at
|
|
14
|
+
t.timestamp :updated_at
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class MigrateResources < ActiveRecord::Migration[5.1]
|
|
4
|
+
|
|
5
|
+
#
|
|
6
|
+
# migrate the resource data from service
|
|
7
|
+
#
|
|
8
|
+
def up
|
|
9
|
+
Service.all.each do |service|
|
|
10
|
+
resource = Resource.new
|
|
11
|
+
resource.max_replicas = service.max_replicas
|
|
12
|
+
resource.min_replicas = service.min_replicas
|
|
13
|
+
service.resource = resource
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -87,5 +87,20 @@ module MKIt
|
|
|
87
87
|
x = MKIt::CmdRunner.run("docker volume inspect #{volume_name}")
|
|
88
88
|
JSON.parse(x).first
|
|
89
89
|
end
|
|
90
|
+
|
|
91
|
+
##
|
|
92
|
+
# cpu limits
|
|
93
|
+
def to_docker_cpu_limit(k8s_cpu_limits)
|
|
94
|
+
if k8s_cpu_limits.nil?
|
|
95
|
+
nil
|
|
96
|
+
else
|
|
97
|
+
cpu_limit = k8s_cpu_limits.to_s
|
|
98
|
+
if cpu_limit.include?('m')
|
|
99
|
+
cpu_limit = cpu_limit.delete_suffix('m')
|
|
100
|
+
cpu_limit = (cpu_limit.to_f / 1000).to_s
|
|
101
|
+
end
|
|
102
|
+
cpu_limit
|
|
103
|
+
end
|
|
104
|
+
end
|
|
90
105
|
end
|
|
91
106
|
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Resource < ActiveRecord::Base
|
|
4
|
+
belongs_to :service
|
|
5
|
+
|
|
6
|
+
def self.create(yaml)
|
|
7
|
+
resource = Resource.new
|
|
8
|
+
if yaml.nil?
|
|
9
|
+
resource.max_replicas = 1
|
|
10
|
+
resource.min_replicas = 1
|
|
11
|
+
else
|
|
12
|
+
validate(yaml)
|
|
13
|
+
if yaml["min_replicas"]
|
|
14
|
+
resource.min_replicas = yaml["min_replicas"]
|
|
15
|
+
else
|
|
16
|
+
resource.min_replicas = 1
|
|
17
|
+
end
|
|
18
|
+
if yaml["max_replicas"]
|
|
19
|
+
resource.max_replicas = yaml["max_replicas"]
|
|
20
|
+
else
|
|
21
|
+
resource.max_replicas = resource.min_replicas
|
|
22
|
+
end
|
|
23
|
+
resource.cpu_limits = yaml["limits"]["cpu"] if yaml["limits"] && yaml["limits"]["cpu"]
|
|
24
|
+
resource.memory_limits = yaml["limits"]["memory"] if yaml["limits"] && yaml["limits"]["memory"]
|
|
25
|
+
resource.memory_swap_limits = yaml["limits"]["memory_swap"] if yaml["limits"] && yaml["limits"]["memory_swap"]
|
|
26
|
+
end
|
|
27
|
+
resource
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def self.validate(yaml)
|
|
31
|
+
unless yaml.nil?
|
|
32
|
+
raise_bad_configuration "resource min_replicas must be bigger or equal than 1" if yaml["min_replicas"] && yaml["min_replicas"] < 1
|
|
33
|
+
raise_bad_configuration "resource max_replicas must be bigger or equal than 1" if yaml["max_replicas"] && yaml["max_replicas"] < 1
|
|
34
|
+
if yaml["min_replicas"] && yaml["max_replicas"]
|
|
35
|
+
raise_bad_configuration "resource max_replicas must be bigger or equal than min_replicas" if yaml["min_replicas"] > yaml["max_replicas"]
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
# validate limits
|
|
39
|
+
unless yaml.nil? || yaml["limits"].nil?
|
|
40
|
+
resources = yaml["limits"]
|
|
41
|
+
raise_bad_configuration "resource cpu limits must match '\\d+m'" if resources["cpu"] && resources["cpu"] !~ /\d+m$/
|
|
42
|
+
raise_bad_configuration "resource memory limits must match '\\d+m'" if resources["memory"] && resources["memory"] !~ /\d+m$/
|
|
43
|
+
raise_bad_configuration "resource memory_swap limits must match '\\d+m'" if resources["memory_swap"] && resources["memory_swap"] !~ /\d+m$/
|
|
44
|
+
end
|
|
45
|
+
true
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def to_h(options = {})
|
|
49
|
+
hash = {
|
|
50
|
+
min_replicas: self.min_replicas,
|
|
51
|
+
max_replicas: self.max_replicas
|
|
52
|
+
}
|
|
53
|
+
if self.cpu_limits || self.memory_limits || self.memory_swap_limits
|
|
54
|
+
hash[:limits] = {}
|
|
55
|
+
hash[:limits][:cpu] = self.cpu_limits if self.cpu_limits
|
|
56
|
+
hash[:limits][:memory] = self.memory_limits if self.memory_limits
|
|
57
|
+
hash[:limits][:memory_swap] = self.memory_swap_limits if self.memory_swap_limits
|
|
58
|
+
end
|
|
59
|
+
hash.remove_symbols_from_keys
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
require 'mkit/app/model/volume'
|
|
2
2
|
require 'mkit/app/model/ingress'
|
|
3
|
+
require 'mkit/app/model/resource'
|
|
3
4
|
require 'mkit/app/model/service_port'
|
|
4
5
|
require 'mkit/app/model/service_config'
|
|
5
6
|
require 'mkit/app/model/pod'
|
|
@@ -23,6 +24,7 @@ class Service < ActiveRecord::Base
|
|
|
23
24
|
has_one :lease, dependent: :destroy
|
|
24
25
|
has_one :dns_host, dependent: :destroy
|
|
25
26
|
has_one :ingress, dependent: :destroy
|
|
27
|
+
has_one :resource, dependent: :destroy
|
|
26
28
|
|
|
27
29
|
before_destroy :clean_up
|
|
28
30
|
|
|
@@ -64,7 +66,7 @@ class Service < ActiveRecord::Base
|
|
|
64
66
|
srv.save!
|
|
65
67
|
data = { service_id: srv.id, version: srv.version }
|
|
66
68
|
# create pod
|
|
67
|
-
(1..srv.min_replicas).each { |i|
|
|
69
|
+
(1..srv.resource.min_replicas).each { |i|
|
|
68
70
|
pd = Pod.new( status: MKIt::Status::CREATED, name: SecureRandom.uuid.gsub('-','')[0..11])
|
|
69
71
|
srv.pod << pd
|
|
70
72
|
MkitJob.publish(topic: :create_pod_saga, data: {pod_name: pd.name})
|
|
@@ -77,14 +79,7 @@ class Service < ActiveRecord::Base
|
|
|
77
79
|
self.image = config.image if config.image != self.image
|
|
78
80
|
self.command = config.command if config.command != self.command
|
|
79
81
|
|
|
80
|
-
|
|
81
|
-
self.max_replicas = config.resources.max_replicas unless config.resources.max_replicas.nil? || config.resources.max_replicas < 1
|
|
82
|
-
self.min_replicas = config.resources.min_replicas unless config.resources.min_replicas.nil? || config.resources.min_replicas < 1
|
|
83
|
-
else
|
|
84
|
-
self.min_replicas = 1
|
|
85
|
-
self.max_replicas = 1
|
|
86
|
-
end
|
|
87
|
-
self.max_replicas = self.min_replicas if self.min_replicas > self.max_replicas
|
|
82
|
+
self.resource = Resource.create(config.resources)
|
|
88
83
|
|
|
89
84
|
# docker network
|
|
90
85
|
if config.network.nil? || config.network.empty?
|
|
@@ -122,8 +117,7 @@ class Service < ActiveRecord::Base
|
|
|
122
117
|
# destroy old pods...
|
|
123
118
|
self.pod.destroy_all
|
|
124
119
|
# create pod
|
|
125
|
-
|
|
126
|
-
(1..self.min_replicas).each { |i|
|
|
120
|
+
(1..self.resource.min_replicas).each { |i|
|
|
127
121
|
pd = Pod.new( status: MKIt::Status::CREATED, name: SecureRandom.uuid.gsub('-','')[0..11])
|
|
128
122
|
self.pod << pd
|
|
129
123
|
MkitJob.publish(topic: :create_pod_saga, data: {pod_name: pd.name})
|
|
@@ -276,12 +270,9 @@ class Service < ActiveRecord::Base
|
|
|
276
270
|
}
|
|
277
271
|
end
|
|
278
272
|
|
|
279
|
-
# ingress
|
|
280
273
|
srv['ingress'] = self.ingress.to_h(options)
|
|
274
|
+
srv['resources'] = self.resource.to_h
|
|
281
275
|
|
|
282
|
-
srv['resources'] = {}
|
|
283
|
-
srv['resources']['min_replicas'] = self.min_replicas
|
|
284
|
-
srv['resources']['max_replicas'] = self.max_replicas
|
|
285
276
|
srv['volumes'] = []
|
|
286
277
|
self.volume.each { |v|
|
|
287
278
|
if v.ctype == MKIt::CType::DOCKER_STORAGE.to_s
|
|
@@ -1 +1,10 @@
|
|
|
1
|
-
docker run -d --name <%=name%>
|
|
1
|
+
docker run -d --name <%=name%> \
|
|
2
|
+
<%service.service_config&.select{ |x| x.ctype == MKIt::CType::ENVIRONMENT.to_s }.each { |env|%><%=" -e #{env.key}=\"#{env.value}\""%><%}%> \
|
|
3
|
+
<%service.volume&.each { |vol|%><%=" -v \"#{vol.name}:#{vol.path}\""%><%}%> \
|
|
4
|
+
--network <%=service.pods_network%> \
|
|
5
|
+
--dns <%=service.my_dns%> \
|
|
6
|
+
<%="--cpus #{to_docker_cpu_limit(service.resource.cpu_limits)}" unless service.resource.cpu_limits.nil?%> \
|
|
7
|
+
<%="--memory #{service.resource.memory_limits}" unless service.resource.memory_limits.nil?%> \
|
|
8
|
+
<%="--memory-swap #{service.resource.memory_swap_limits}" unless service.resource.memory_swap_limits.nil?%> \
|
|
9
|
+
<%=service.image%> \
|
|
10
|
+
<%=service.command unless service.command.nil?%>
|
data/lib/mkit/cmd_runner.rb
CHANGED
|
@@ -19,7 +19,7 @@ module MKIt
|
|
|
19
19
|
rescue PTY::ChildExited
|
|
20
20
|
# nothing
|
|
21
21
|
end
|
|
22
|
-
raise CmdRunnerException.new("command '#{cmd[0..30]}...' returned an error
|
|
22
|
+
raise CmdRunnerException.new("command '#{cmd[0..30]}...' returned an error [#{result}] (#{$?})") if !$?.nil? && $?.exitstatus != 0
|
|
23
23
|
result
|
|
24
24
|
end
|
|
25
25
|
end
|
data/lib/mkit/version.rb
CHANGED
data/lib/mkit.rb
CHANGED
|
@@ -138,13 +138,26 @@ module MKIt
|
|
|
138
138
|
MKItLogger.info 'restoring operations...'
|
|
139
139
|
# create interfaces of deployed apps otherwise haproxy won't start
|
|
140
140
|
Service.all.each do |srv|
|
|
141
|
-
|
|
142
|
-
|
|
141
|
+
begin
|
|
142
|
+
srv.deploy_network
|
|
143
|
+
srv.update_status!
|
|
144
|
+
rescue => e
|
|
145
|
+
MKItLogger.warn "Error restoring service #{srv.name}: #{e.message}"
|
|
146
|
+
end
|
|
143
147
|
end
|
|
144
148
|
# daemontools would eventually start haproxy; systemd does not.
|
|
145
149
|
# so, restart here.
|
|
146
|
-
|
|
147
|
-
|
|
150
|
+
Thread.new do
|
|
151
|
+
begin
|
|
152
|
+
MKItLogger.debug 'restarting proxy...'
|
|
153
|
+
MKIt::HAProxy.stop
|
|
154
|
+
sleep 10
|
|
155
|
+
MKIt::HAProxy.restart
|
|
156
|
+
MKItLogger.debug 'restarting proxy done.'
|
|
157
|
+
rescue => e
|
|
158
|
+
MKItLogger.error "Error in restart_proxy thread: #{e.message}"
|
|
159
|
+
end
|
|
160
|
+
end
|
|
148
161
|
end
|
|
149
162
|
|
|
150
163
|
def self.startup(options: {})
|
data/mkit.gemspec
CHANGED
|
@@ -21,7 +21,9 @@ Gem::Specification.new do |s|
|
|
|
21
21
|
end
|
|
22
22
|
s.executables << 'mkitd'
|
|
23
23
|
s.executables << 'mkit'
|
|
24
|
-
s.add_runtime_dependency 'async
|
|
24
|
+
s.add_runtime_dependency 'async', '= 1.32.1'
|
|
25
|
+
s.add_runtime_dependency 'async-dns', '= 1.3.0'
|
|
26
|
+
s.add_runtime_dependency 'async-io', '= 1.43.2'
|
|
25
27
|
s.add_runtime_dependency 'dry-container', '~> 0.9', '>= 0.9.0'
|
|
26
28
|
s.add_runtime_dependency 'net_http_unix', '~> 0.2', '>= 0.2.2'
|
|
27
29
|
s.add_runtime_dependency 'net-ping', '~> 2.0', '>= 2.0.8'
|
|
@@ -30,13 +32,14 @@ Gem::Specification.new do |s|
|
|
|
30
32
|
s.add_runtime_dependency 'rack-protection', '~> 3.0', '>= 3.0.5'
|
|
31
33
|
s.add_runtime_dependency 'rack-test', '~> 2.0', '>= 2.0.2'
|
|
32
34
|
s.add_runtime_dependency 'rubydns', '~> 2.0', '>= 2.0.2'
|
|
33
|
-
s.add_runtime_dependency 'sinatra', '
|
|
34
|
-
s.add_runtime_dependency 'sinatra-activerecord', '
|
|
35
|
-
s.add_runtime_dependency 'sinatra-websocket', '
|
|
35
|
+
s.add_runtime_dependency 'sinatra', '= 3.2.0'
|
|
36
|
+
s.add_runtime_dependency 'sinatra-activerecord', '= 2.0.28'
|
|
37
|
+
s.add_runtime_dependency 'sinatra-websocket', '= 0.3.1'
|
|
36
38
|
s.add_runtime_dependency 'sqlite3', '~> 1.5', '>= 1.5.4'
|
|
37
39
|
s.add_runtime_dependency 'standalone_migrations', '~> 7.1', '< 7.2.0'
|
|
38
|
-
s.add_runtime_dependency 'thin', '~> 1.8', '
|
|
40
|
+
s.add_runtime_dependency 'thin', '~> 1.8', '= 1.8.2'
|
|
39
41
|
s.add_runtime_dependency 'text-table', '~> 1.2', '>= 1.2.4'
|
|
40
|
-
s.add_runtime_dependency 'faye-websocket', '
|
|
42
|
+
s.add_runtime_dependency 'faye-websocket', '= 0.11.3'
|
|
43
|
+
s.add_runtime_dependency 'json_schemer', '~> 2.5', '>= 2.5.0'
|
|
41
44
|
s.add_development_dependency 'rubocop', '~> 1.0'
|
|
42
45
|
end
|
data/samples/apps/httpbin.yml
CHANGED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
service:
|
|
3
|
+
name: swiss-army-knife
|
|
4
|
+
image: leodotcloud/swiss-army-knife
|
|
5
|
+
command: swiss-army-knife
|
|
6
|
+
network: bridge
|
|
7
|
+
ingress:
|
|
8
|
+
frontend:
|
|
9
|
+
- name: http-in
|
|
10
|
+
options:
|
|
11
|
+
- option httpclose
|
|
12
|
+
- option forwardfor
|
|
13
|
+
bind:
|
|
14
|
+
port: 80
|
|
15
|
+
mode: http
|
|
16
|
+
default_backend: server
|
|
17
|
+
backend:
|
|
18
|
+
- name: server
|
|
19
|
+
balance: round_robin
|
|
20
|
+
options:
|
|
21
|
+
- cookie JSESSIONID prefix
|
|
22
|
+
bind:
|
|
23
|
+
port: 8080
|
|
24
|
+
mode: http
|
|
25
|
+
options:
|
|
26
|
+
- cookie A
|
|
27
|
+
- check
|
|
28
|
+
resources:
|
|
29
|
+
min_replicas: 1
|
|
30
|
+
max_replicas: 1
|
|
31
|
+
limits:
|
|
32
|
+
cpu: 500m
|
|
33
|
+
memory: 512m
|
|
34
|
+
memory_swap: 512m
|
|
35
|
+
volumes: []
|
|
36
|
+
environment:
|
|
37
|
+
LOG4J_LEVEL: WARN
|
|
38
|
+
LOGGING_LEVEL_ROOT: WARN
|
metadata
CHANGED
|
@@ -1,35 +1,57 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: mkit
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.10.
|
|
4
|
+
version: 0.10.6
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Vasco Santos
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2026-05-23 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
|
-
name: async
|
|
14
|
+
name: async
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
|
16
16
|
requirements:
|
|
17
|
-
- -
|
|
17
|
+
- - '='
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version:
|
|
20
|
-
|
|
19
|
+
version: 1.32.1
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - '='
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: 1.32.1
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: async-dns
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - '='
|
|
21
32
|
- !ruby/object:Gem::Version
|
|
22
33
|
version: 1.3.0
|
|
23
34
|
type: :runtime
|
|
24
35
|
prerelease: false
|
|
25
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
26
37
|
requirements:
|
|
27
|
-
- -
|
|
28
|
-
- !ruby/object:Gem::Version
|
|
29
|
-
version: '1.3'
|
|
30
|
-
- - ">="
|
|
38
|
+
- - '='
|
|
31
39
|
- !ruby/object:Gem::Version
|
|
32
40
|
version: 1.3.0
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: async-io
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - '='
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: 1.43.2
|
|
48
|
+
type: :runtime
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - '='
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: 1.43.2
|
|
33
55
|
- !ruby/object:Gem::Dependency
|
|
34
56
|
name: dry-container
|
|
35
57
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -194,60 +216,42 @@ dependencies:
|
|
|
194
216
|
name: sinatra
|
|
195
217
|
requirement: !ruby/object:Gem::Requirement
|
|
196
218
|
requirements:
|
|
197
|
-
- -
|
|
198
|
-
- !ruby/object:Gem::Version
|
|
199
|
-
version: '3.0'
|
|
200
|
-
- - ">="
|
|
219
|
+
- - '='
|
|
201
220
|
- !ruby/object:Gem::Version
|
|
202
|
-
version: 3.0
|
|
221
|
+
version: 3.2.0
|
|
203
222
|
type: :runtime
|
|
204
223
|
prerelease: false
|
|
205
224
|
version_requirements: !ruby/object:Gem::Requirement
|
|
206
225
|
requirements:
|
|
207
|
-
- -
|
|
226
|
+
- - '='
|
|
208
227
|
- !ruby/object:Gem::Version
|
|
209
|
-
version:
|
|
210
|
-
- - ">="
|
|
211
|
-
- !ruby/object:Gem::Version
|
|
212
|
-
version: 3.0.5
|
|
228
|
+
version: 3.2.0
|
|
213
229
|
- !ruby/object:Gem::Dependency
|
|
214
230
|
name: sinatra-activerecord
|
|
215
231
|
requirement: !ruby/object:Gem::Requirement
|
|
216
232
|
requirements:
|
|
217
|
-
- -
|
|
218
|
-
- !ruby/object:Gem::Version
|
|
219
|
-
version: '2.0'
|
|
220
|
-
- - ">="
|
|
233
|
+
- - '='
|
|
221
234
|
- !ruby/object:Gem::Version
|
|
222
|
-
version: 2.0.
|
|
235
|
+
version: 2.0.28
|
|
223
236
|
type: :runtime
|
|
224
237
|
prerelease: false
|
|
225
238
|
version_requirements: !ruby/object:Gem::Requirement
|
|
226
239
|
requirements:
|
|
227
|
-
- -
|
|
228
|
-
- !ruby/object:Gem::Version
|
|
229
|
-
version: '2.0'
|
|
230
|
-
- - ">="
|
|
240
|
+
- - '='
|
|
231
241
|
- !ruby/object:Gem::Version
|
|
232
|
-
version: 2.0.
|
|
242
|
+
version: 2.0.28
|
|
233
243
|
- !ruby/object:Gem::Dependency
|
|
234
244
|
name: sinatra-websocket
|
|
235
245
|
requirement: !ruby/object:Gem::Requirement
|
|
236
246
|
requirements:
|
|
237
|
-
- -
|
|
238
|
-
- !ruby/object:Gem::Version
|
|
239
|
-
version: '0.3'
|
|
240
|
-
- - ">="
|
|
247
|
+
- - '='
|
|
241
248
|
- !ruby/object:Gem::Version
|
|
242
249
|
version: 0.3.1
|
|
243
250
|
type: :runtime
|
|
244
251
|
prerelease: false
|
|
245
252
|
version_requirements: !ruby/object:Gem::Requirement
|
|
246
253
|
requirements:
|
|
247
|
-
- -
|
|
248
|
-
- !ruby/object:Gem::Version
|
|
249
|
-
version: '0.3'
|
|
250
|
-
- - ">="
|
|
254
|
+
- - '='
|
|
251
255
|
- !ruby/object:Gem::Version
|
|
252
256
|
version: 0.3.1
|
|
253
257
|
- !ruby/object:Gem::Dependency
|
|
@@ -297,9 +301,9 @@ dependencies:
|
|
|
297
301
|
- - "~>"
|
|
298
302
|
- !ruby/object:Gem::Version
|
|
299
303
|
version: '1.8'
|
|
300
|
-
- -
|
|
304
|
+
- - '='
|
|
301
305
|
- !ruby/object:Gem::Version
|
|
302
|
-
version: 1.8.
|
|
306
|
+
version: 1.8.2
|
|
303
307
|
type: :runtime
|
|
304
308
|
prerelease: false
|
|
305
309
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -307,9 +311,9 @@ dependencies:
|
|
|
307
311
|
- - "~>"
|
|
308
312
|
- !ruby/object:Gem::Version
|
|
309
313
|
version: '1.8'
|
|
310
|
-
- -
|
|
314
|
+
- - '='
|
|
311
315
|
- !ruby/object:Gem::Version
|
|
312
|
-
version: 1.8.
|
|
316
|
+
version: 1.8.2
|
|
313
317
|
- !ruby/object:Gem::Dependency
|
|
314
318
|
name: text-table
|
|
315
319
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -332,24 +336,38 @@ dependencies:
|
|
|
332
336
|
version: 1.2.4
|
|
333
337
|
- !ruby/object:Gem::Dependency
|
|
334
338
|
name: faye-websocket
|
|
339
|
+
requirement: !ruby/object:Gem::Requirement
|
|
340
|
+
requirements:
|
|
341
|
+
- - '='
|
|
342
|
+
- !ruby/object:Gem::Version
|
|
343
|
+
version: 0.11.3
|
|
344
|
+
type: :runtime
|
|
345
|
+
prerelease: false
|
|
346
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
347
|
+
requirements:
|
|
348
|
+
- - '='
|
|
349
|
+
- !ruby/object:Gem::Version
|
|
350
|
+
version: 0.11.3
|
|
351
|
+
- !ruby/object:Gem::Dependency
|
|
352
|
+
name: json_schemer
|
|
335
353
|
requirement: !ruby/object:Gem::Requirement
|
|
336
354
|
requirements:
|
|
337
355
|
- - "~>"
|
|
338
356
|
- !ruby/object:Gem::Version
|
|
339
|
-
version: '
|
|
357
|
+
version: '2.5'
|
|
340
358
|
- - ">="
|
|
341
359
|
- !ruby/object:Gem::Version
|
|
342
|
-
version:
|
|
360
|
+
version: 2.5.0
|
|
343
361
|
type: :runtime
|
|
344
362
|
prerelease: false
|
|
345
363
|
version_requirements: !ruby/object:Gem::Requirement
|
|
346
364
|
requirements:
|
|
347
365
|
- - "~>"
|
|
348
366
|
- !ruby/object:Gem::Version
|
|
349
|
-
version: '
|
|
367
|
+
version: '2.5'
|
|
350
368
|
- - ">="
|
|
351
369
|
- !ruby/object:Gem::Version
|
|
352
|
-
version:
|
|
370
|
+
version: 2.5.0
|
|
353
371
|
- !ruby/object:Gem::Dependency
|
|
354
372
|
name: rubocop
|
|
355
373
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -393,6 +411,8 @@ files:
|
|
|
393
411
|
- db/migrate/005_create_frontend.rb
|
|
394
412
|
- db/migrate/006_create_backend.rb
|
|
395
413
|
- db/migrate/007_migrate_schema.rb
|
|
414
|
+
- db/migrate/008_create_resources.rb
|
|
415
|
+
- db/migrate/009_migrate_resources.rb
|
|
396
416
|
- db/schema.rb
|
|
397
417
|
- lib/mkit.rb
|
|
398
418
|
- lib/mkit/app/controllers/mkit_controller.rb
|
|
@@ -416,6 +436,7 @@ files:
|
|
|
416
436
|
- lib/mkit/app/model/mkit_job.rb
|
|
417
437
|
- lib/mkit/app/model/pod.rb
|
|
418
438
|
- lib/mkit/app/model/pool.rb
|
|
439
|
+
- lib/mkit/app/model/resource.rb
|
|
419
440
|
- lib/mkit/app/model/service.rb
|
|
420
441
|
- lib/mkit/app/model/service_config.rb
|
|
421
442
|
- lib/mkit/app/model/service_port.rb
|
|
@@ -476,6 +497,7 @@ files:
|
|
|
476
497
|
- samples/apps/rabbitmq.yml
|
|
477
498
|
- samples/apps/redis-sentinel.yml
|
|
478
499
|
- samples/apps/redis.yml
|
|
500
|
+
- samples/apps/swiss-army-knife.yml
|
|
479
501
|
- samples/daemontools/log/run
|
|
480
502
|
- samples/daemontools/run
|
|
481
503
|
- samples/systemd/mkitd.service
|