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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e92750155ba497c89a362cbc4549b77b7171e2728cc161b1ee9242ad84b8efd3
4
- data.tar.gz: ef0adefd3151c12ffa2de7e0ea66aeed4bf8dca8c6aa37e19b499c4b2dde5b70
3
+ metadata.gz: c8da623d478674392719514f75c4f217b965ae74672da8a9fa95dc3fcdd32e8c
4
+ data.tar.gz: 7a8ef046090f61775f7bbccac7e9196c449f1bbb430548a0e6e18e055e424062
5
5
  SHA512:
6
- metadata.gz: 38fcbd65bc17525a23c60c21e3a53b329c00b62b6138d2cf42ab792c1e6aaf9ec286f6bd681b0c16c3e7cecf696d9e311f8a9d866cdb7d86078d87ad63d8d7b4
7
- data.tar.gz: bbff36ce8233420aa63a5b73eb0e4c6c5e1fd8799c2f13fa0d8d079aa780ecc0c6f1e568cd96cee3f715993b04a83ed949ffd0666419a04b7b1e7b163f1501e0
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
- unless config.resources.nil?
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
- data = { service_id: self.id, version: self.version }
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%> <%service.service_config&.select{ |x| x.ctype == MKIt::CType::ENVIRONMENT.to_s }.each { |env|%><%=" -e #{env.key}=\"#{env.value}\""%><%}%> <%service.volume&.each { |vol|%><%=" -v \"#{vol.name}:#{vol.path}\""%><%}%> --network <%=service.pods_network%> --dns <%=service.my_dns%> <%=service.image%> <%=service.command unless service.command.nil?%>
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?%>
@@ -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 response") if !$?.nil? && $?.exitstatus != 0
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
@@ -1,4 +1,4 @@
1
1
  module MKIt
2
- VERSION = "0.10.4"
2
+ VERSION = "0.10.6"
3
3
  end
4
4
 
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
- srv.deploy_network
142
- srv.update_status!
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
- MKItLogger.debug 'restarting proxy...'
147
- MKIt::HAProxy.restart
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-dns', '~> 1.3', '>= 1.3.0'
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', '~> 3.0', '>= 3.0.5'
34
- s.add_runtime_dependency 'sinatra-activerecord', '~> 2.0', '>= 2.0.26'
35
- s.add_runtime_dependency 'sinatra-websocket', '~> 0.3', '>= 0.3.1'
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', '>= 1.8.1'
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', '~> 0.11', '>= 0.11.3'
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
@@ -40,6 +40,10 @@ service:
40
40
  resources:
41
41
  min_replicas: 1
42
42
  max_replicas: 1
43
+ limits:
44
+ cpu: 250m
45
+ memory: 250m
46
+ memory_swap: 250m
43
47
  volumes: []
44
48
  environment:
45
49
  LOG4J_LEVEL: WARN
@@ -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
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: 2025-03-11 00:00:00.000000000 Z
11
+ date: 2026-05-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: async-dns
14
+ name: async
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: '1.3'
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.5
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: '3.0'
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.26
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.26
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.1
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.1
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: '0.11'
357
+ version: '2.5'
340
358
  - - ">="
341
359
  - !ruby/object:Gem::Version
342
- version: 0.11.3
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: '0.11'
367
+ version: '2.5'
350
368
  - - ">="
351
369
  - !ruby/object:Gem::Version
352
- version: 0.11.3
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