mkit 0.8.0 → 0.9.1
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 +1 -0
- data/lib/mkit/app/controllers/services_controller.rb +8 -4
- data/lib/mkit/app/helpers/docker_helper.rb +8 -0
- data/lib/mkit/app/helpers/services_helper.rb +1 -1
- data/lib/mkit/app/model/pod.rb +10 -1
- data/lib/mkit/app/model/service.rb +49 -0
- data/lib/mkit/client/command_parser.rb +17 -2
- data/lib/mkit/client/commands.yaml +70 -0
- data/lib/mkit/client/console_websocket_client.rb +1 -1
- data/lib/mkit/client/http_client.rb +4 -2
- data/lib/mkit/client/log_websocket_client.rb +1 -1
- data/lib/mkit/client/websocket_client.rb +1 -1
- data/lib/mkit/pods/docker_log_listener.rb +10 -0
- data/lib/mkit/version.rb +1 -1
- metadata +6 -7
- data/samples/soketi.yaml +0 -32
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5c7293226251f8d031a6b864f4ef7e9932a6046be6a7e78e07e203b1d9e4ff9a
|
4
|
+
data.tar.gz: 8a4993da20b730eb02f3f0605e257d255348861f84c3b8412e7b46b94316886c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bdd7a977df1915b70778fb7626836d0718563efc523cd128c2ee797ace0da1cb4c0f20e6b9dc2667bc1cfb03ec8efd0447b891a3a62179af68c01e6418c1d2de
|
7
|
+
data.tar.gz: e2783cd197695782478e29c075343a2bd6a1d5b84f5fe9d97ac7701a9329b1d26f874ab50a4493f85c629cbf2f3f2cf2761223700806d7c7adc322138e0d6cdc
|
data/README.md
CHANGED
@@ -27,8 +27,10 @@ class ServicesController < MKIt::Server
|
|
27
27
|
|
28
28
|
get '/services/:id' do
|
29
29
|
srv = find_by_id_or_name
|
30
|
-
resp = if
|
31
|
-
srv.
|
30
|
+
resp = if params[:format] == 'yaml'
|
31
|
+
srv.to_h({details: params[:details] == 'true'}).to_yaml
|
32
|
+
elsif params[:format] == 'json'
|
33
|
+
JSON.pretty_generate(srv.to_h({details: params[:details] == 'true'}))
|
32
34
|
else
|
33
35
|
format_response(srv)
|
34
36
|
end
|
@@ -41,12 +43,14 @@ class ServicesController < MKIt::Server
|
|
41
43
|
srv.log
|
42
44
|
else
|
43
45
|
pod = find_srv_pod_by_id_or_name(srv)
|
44
|
-
options_parameter = build_options_hash(params: params, options: [
|
46
|
+
options_parameter = build_options_hash(params: params, options: [
|
47
|
+
:nr_lines, :pods, :follow, :details, :timestamps, :clear
|
48
|
+
])
|
45
49
|
request.websocket do |ws|
|
46
50
|
listener = nil
|
47
51
|
ws.onopen do
|
48
52
|
settings.sockets << ws
|
49
|
-
ws.send("<<<< %s | %s >>>>\n" % [srv.name,
|
53
|
+
ws.send("<<<< %s | %s >>>>\n" % [srv.name, pod.name])
|
50
54
|
listener = MKIt::DockerLogListener.new(pod, ws, options: options_parameter)
|
51
55
|
settings.listeners << listener
|
52
56
|
listener.register
|
@@ -38,6 +38,14 @@ module MKIt
|
|
38
38
|
`docker logs -n 20 #{instance_id}`
|
39
39
|
end
|
40
40
|
|
41
|
+
def logfile(instance_id)
|
42
|
+
`docker inspect --format='{{.LogPath}}' #{instance_id}`
|
43
|
+
end
|
44
|
+
|
45
|
+
def clear_logs(instance_id)
|
46
|
+
`echo > #{logfile(instance_id)}`
|
47
|
+
end
|
48
|
+
|
41
49
|
#
|
42
50
|
# network
|
43
51
|
#
|
@@ -26,10 +26,10 @@ module MKIt
|
|
26
26
|
def find_srv_pod_by_id_or_name(srv)
|
27
27
|
if params[:pod_id]
|
28
28
|
pod = srv.find_pod_by_id_or_name(params[:pod_id])
|
29
|
-
error 404, "Service pod not found." unless pod
|
30
29
|
else
|
31
30
|
pod = srv.pod.first
|
32
31
|
end
|
32
|
+
error 404, "Service pod not found." unless pod
|
33
33
|
pod
|
34
34
|
end
|
35
35
|
|
data/lib/mkit/app/model/pod.rb
CHANGED
@@ -40,7 +40,7 @@ class Pod < ActiveRecord::Base
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def set_status_from_docker
|
43
|
-
if self.instance
|
43
|
+
if !self.instance.nil?
|
44
44
|
if instance.State.Running
|
45
45
|
self.status = MKIt::Status::RUNNING
|
46
46
|
else
|
@@ -85,5 +85,14 @@ class Pod < ActiveRecord::Base
|
|
85
85
|
end
|
86
86
|
MkitJob.publish(topic: :pod_destroyed, service_id: self.service.id, data: {pod_id: self.id})
|
87
87
|
end
|
88
|
+
|
89
|
+
def to_h
|
90
|
+
{
|
91
|
+
'name' => self.name,
|
92
|
+
'ip' => self.dns_host.nil? || self.dns_host.ip.nil? ? self.ip : self.dns_host.ip,
|
93
|
+
'dns' => self.dns_host.nil? || self.dns_host.name.nil? ? self.ip : self.dns_host.name,
|
94
|
+
'status' => self.status
|
95
|
+
}
|
96
|
+
end
|
88
97
|
end
|
89
98
|
|
@@ -250,6 +250,55 @@ class Service < ActiveRecord::Base
|
|
250
250
|
}
|
251
251
|
out
|
252
252
|
end
|
253
|
+
def to_h(options = {})
|
254
|
+
details = options[:details] || false
|
255
|
+
yaml = {}
|
256
|
+
yaml['service'] = {}
|
257
|
+
srv = yaml['service']
|
258
|
+
srv['name'] = self.name
|
259
|
+
srv['image'] = self.image
|
260
|
+
srv['command'] = self.command
|
261
|
+
srv['network'] = self.pods_network
|
262
|
+
if details
|
263
|
+
srv['status'] = self.status
|
264
|
+
srv['version'] = self.version
|
265
|
+
srv['ip'] = self.lease.ip
|
266
|
+
srv['dns'] = self.dns_host.name
|
267
|
+
srv['pods'] = []
|
268
|
+
self.pod.each { |p|
|
269
|
+
srv['pods'] << p.to_h
|
270
|
+
}
|
271
|
+
end
|
272
|
+
srv['ports'] = []
|
273
|
+
self.service_port.each { |p|
|
274
|
+
"#{p.external_port}:#{p.internal_port}:#{p.mode}:#{p.load_bal}".tap { |x|
|
275
|
+
if p.ssl == 'true'
|
276
|
+
x << ':ssl'
|
277
|
+
if !p.crt.nil? && p.crt != MKIt::Utils.proxy_cert
|
278
|
+
x << ":#{p.crt}"
|
279
|
+
end
|
280
|
+
end
|
281
|
+
srv['ports'] << x
|
282
|
+
}
|
283
|
+
}
|
284
|
+
srv['resources'] = {}
|
285
|
+
srv['resources']['min_replicas'] = self.min_replicas
|
286
|
+
srv['resources']['max_replicas'] = self.max_replicas
|
287
|
+
srv['volumes'] = []
|
288
|
+
self.volume.each { |v|
|
289
|
+
if v.ctype == MKIt::CType::DOCKER_STORAGE.to_s
|
290
|
+
srv['volumes'] << "docker://#{v.name}:#{v.path}"
|
291
|
+
elsif v.ctype == MKIt::CType::LOCAL_STORAGE.to_s
|
292
|
+
srv['volumes'] << "#{v.name}:#{v.path}"
|
293
|
+
end
|
294
|
+
}
|
295
|
+
srv['environment'] = {}
|
296
|
+
self.service_config.each { |c|
|
297
|
+
srv['environment'][c.key] = "#{c.value}"
|
298
|
+
}
|
299
|
+
yaml
|
300
|
+
end
|
301
|
+
|
253
302
|
def as_json(options = {})
|
254
303
|
srv = super
|
255
304
|
a=[:pod, :volume, :service_config, :service_port]
|
@@ -56,6 +56,8 @@ class CommandParser
|
|
56
56
|
end
|
57
57
|
raise InvalidParametersException.new('Invalid command or parameters.', c) if request.nil?
|
58
58
|
|
59
|
+
fill_request_defaults(request, request_data)
|
60
|
+
|
59
61
|
validate_command(command, request_data)
|
60
62
|
#
|
61
63
|
{
|
@@ -65,6 +67,18 @@ class CommandParser
|
|
65
67
|
}
|
66
68
|
end
|
67
69
|
|
70
|
+
def fill_request_defaults(request, request_data)
|
71
|
+
if !request.nil? && !request[:defaults].nil?
|
72
|
+
request[:defaults].each do |key, value|
|
73
|
+
request[:params] ||= []
|
74
|
+
unless request[:params].include?(key.to_sym)
|
75
|
+
request[:params] << key.to_sym
|
76
|
+
request_data[key.to_sym] = value
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
68
82
|
# args = command[:args]
|
69
83
|
# argv = ARGV.dup - cmd
|
70
84
|
# request = command[:request]
|
@@ -84,7 +98,8 @@ class CommandParser
|
|
84
98
|
if vararg
|
85
99
|
request_data[vararg[:name].to_sym] = varargs
|
86
100
|
request[:params] ||= []
|
87
|
-
request[:params] <<
|
101
|
+
request[:params] << vararg[:name].to_sym unless request[:params].include?(vararg[:name].to_sym)
|
102
|
+
request_data[vararg[:name].to_sym] = varargs
|
88
103
|
end
|
89
104
|
|
90
105
|
# flag and options
|
@@ -146,7 +161,7 @@ class CommandParser
|
|
146
161
|
request[:uri] = request[:uri] + arg[:uri] unless arg[:uri].nil?
|
147
162
|
unless arg[:param].nil?
|
148
163
|
request[:params] ||= []
|
149
|
-
request[:params] <<
|
164
|
+
request[:params] << arg[:name].to_sym unless request[:params].include?(arg[:name].to_sym)
|
150
165
|
end
|
151
166
|
end
|
152
167
|
|
@@ -95,6 +95,57 @@
|
|
95
95
|
request:
|
96
96
|
verb: put
|
97
97
|
uri: "/services/<%=id%>"
|
98
|
+
- cmd: get
|
99
|
+
request:
|
100
|
+
verb: get
|
101
|
+
uri: "/services/<%=id%>"
|
102
|
+
defaults:
|
103
|
+
format: yaml
|
104
|
+
usage:
|
105
|
+
- "<service_id_or_name> [options]"
|
106
|
+
help: print service configuration
|
107
|
+
args:
|
108
|
+
- name: id
|
109
|
+
help:
|
110
|
+
- id
|
111
|
+
- Service id or name
|
112
|
+
mandatory: true
|
113
|
+
- name: format
|
114
|
+
help:
|
115
|
+
- -y
|
116
|
+
- ...as yaml format (default)
|
117
|
+
mandatory: false
|
118
|
+
param: "yaml"
|
119
|
+
type: flag
|
120
|
+
switch:
|
121
|
+
- "-y"
|
122
|
+
- name: format
|
123
|
+
help:
|
124
|
+
- -j
|
125
|
+
- ...as json format
|
126
|
+
mandatory: false
|
127
|
+
param: "json"
|
128
|
+
type: flag
|
129
|
+
switch:
|
130
|
+
- "-j"
|
131
|
+
- name: format
|
132
|
+
help:
|
133
|
+
- -t
|
134
|
+
- ...as table format (i.e. status format)
|
135
|
+
mandatory: false
|
136
|
+
param: "table"
|
137
|
+
type: flag
|
138
|
+
switch:
|
139
|
+
- "-t"
|
140
|
+
- name: details
|
141
|
+
help:
|
142
|
+
- -d
|
143
|
+
- include service dynamic details
|
144
|
+
mandatory: false
|
145
|
+
param: "<%=true%>"
|
146
|
+
type: flag
|
147
|
+
switch:
|
148
|
+
- "-d"
|
98
149
|
- cmd: rm
|
99
150
|
usage:
|
100
151
|
- "<service_id_or_name>"
|
@@ -194,6 +245,25 @@
|
|
194
245
|
type: option
|
195
246
|
switch:
|
196
247
|
- "-n"
|
248
|
+
- name: timestamps
|
249
|
+
help:
|
250
|
+
- -t
|
251
|
+
- Show timestamps
|
252
|
+
mandatory: false
|
253
|
+
param: "<%=true%>"
|
254
|
+
type: flag
|
255
|
+
switch:
|
256
|
+
- "-t"
|
257
|
+
- "--timestamps"
|
258
|
+
- name: details
|
259
|
+
help:
|
260
|
+
- -d
|
261
|
+
- Show extra details
|
262
|
+
mandatory: false
|
263
|
+
param: "<%=true%>"
|
264
|
+
type: flag
|
265
|
+
switch:
|
266
|
+
- "-d"
|
197
267
|
- cmd: version
|
198
268
|
help: prints mkit client and server version
|
199
269
|
request:
|
@@ -38,15 +38,17 @@ module MKIt
|
|
38
38
|
@client.request(req)
|
39
39
|
end
|
40
40
|
|
41
|
-
def request(request, request_data =
|
41
|
+
def request(request, request_data = {})
|
42
42
|
req = nil
|
43
43
|
uri = request[:uri]
|
44
44
|
request[:file] = request_data[:file]
|
45
45
|
|
46
46
|
unless request[:params].nil? || request[:params].empty?
|
47
|
-
uri = uri + '?' + request[:params].map { |k
|
47
|
+
uri = uri + '?' + request[:params].map { |k| "#{k}=#{request_data[k]}" }.join('&')
|
48
48
|
end
|
49
49
|
uri = ERB.new(uri).result_with_hash(request_data)
|
50
|
+
# puts "Request URI: #{uri}"
|
51
|
+
|
50
52
|
case request[:verb].to_sym
|
51
53
|
when :post
|
52
54
|
req = Net::HTTP::Post.new(uri)
|
@@ -23,7 +23,7 @@ module MKIt
|
|
23
23
|
def request(request, request_data)
|
24
24
|
uri = request[:uri]
|
25
25
|
unless request[:params].nil? || request[:params].empty?
|
26
|
-
uri = uri + '?' + request[:params].map { |k
|
26
|
+
uri = uri + '?' + request[:params].map { |k| "#{k}=#{request_data[k]}" }.join('&')
|
27
27
|
end
|
28
28
|
uri = ERB.new("#{@ws_url}#{uri}").result_with_hash(request_data)
|
29
29
|
|
@@ -1,15 +1,25 @@
|
|
1
1
|
require "mkit/cmd/shell_client"
|
2
|
+
require "mkit/app/helpers/docker_helper"
|
2
3
|
|
3
4
|
module MKIt
|
4
5
|
class DockerLogListener < MKIt::ShellClient
|
5
6
|
|
7
|
+
include DockerHelper
|
8
|
+
|
6
9
|
def initialize(pod, ws, options: {})
|
10
|
+
if options[:clear]
|
11
|
+
clear_logs(pod.name)
|
12
|
+
end
|
7
13
|
@pod = pod
|
8
14
|
@ws = ws
|
9
15
|
command = "docker logs"
|
10
16
|
command += " -f" if options[:follow] == 'true'
|
11
17
|
command += " -n #{options[:nr_lines]}" if options[:nr_lines]
|
12
18
|
command += " -n 10" unless options[:nr_lines]
|
19
|
+
command += " -t" if options[:timestamps] == 'true'
|
20
|
+
command += " --since #{options[:since]}" if options[:since]
|
21
|
+
command += " --until #{options[:until]}" if options[:until]
|
22
|
+
command += " --details" if options[:details] == 'true'
|
13
23
|
command += " #{@pod.name}"
|
14
24
|
super(command: command)
|
15
25
|
end
|
data/lib/mkit/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mkit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vasco Santos
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2025-02-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: async-dns
|
@@ -452,13 +452,12 @@ files:
|
|
452
452
|
- samples/apps/redis.yml
|
453
453
|
- samples/daemontools/log/run
|
454
454
|
- samples/daemontools/run
|
455
|
-
- samples/soketi.yaml
|
456
455
|
- samples/systemd/mkitd.service
|
457
456
|
homepage: https://github.com/valexsantos/mkit
|
458
457
|
licenses:
|
459
458
|
- MIT
|
460
459
|
metadata: {}
|
461
|
-
post_install_message:
|
460
|
+
post_install_message:
|
462
461
|
rdoc_options: []
|
463
462
|
require_paths:
|
464
463
|
- lib
|
@@ -473,8 +472,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
473
472
|
- !ruby/object:Gem::Version
|
474
473
|
version: '0'
|
475
474
|
requirements: []
|
476
|
-
rubygems_version: 3.
|
477
|
-
signing_key:
|
475
|
+
rubygems_version: 3.4.20
|
476
|
+
signing_key:
|
478
477
|
specification_version: 4
|
479
478
|
summary: Micro Kubernets on Ruby
|
480
479
|
test_files: []
|
data/samples/soketi.yaml
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
service:
|
2
|
-
name: soketi
|
3
|
-
image: quay.io/soketi/soketi:0.17-16-alpine
|
4
|
-
# image: giovannedev/soketi:latest
|
5
|
-
ports:
|
6
|
-
#- 80:6001:http:round_robin
|
7
|
-
- 6001:6001:tcp:round_robin
|
8
|
-
- 6002:6001:tcp:round_robin:ssl
|
9
|
-
- 9601:9601:tcp:round_robin
|
10
|
-
resources:
|
11
|
-
max_replicas: 1
|
12
|
-
min_replicas: 1
|
13
|
-
environment:
|
14
|
-
SOKETI_PORT: 6001
|
15
|
-
SOKETI_METRICS_SERVER_PORT: 9601
|
16
|
-
SOKETI_DEBUG: 1
|
17
|
-
SOKETI_MODE: full
|
18
|
-
SOKETI_APP_ID: app-id
|
19
|
-
SOKETI_APP_KEY: app-key
|
20
|
-
SOKETI_APP_SECRET: app-secret
|
21
|
-
# PUSHER_HOST: 127.0.0.1
|
22
|
-
# PUSHER_PORT: 6001
|
23
|
-
# PUSHER_SCHEME: http # or https
|
24
|
-
SOKETI_PORT: 6001
|
25
|
-
SOKETI_SCHEME: http # or https
|
26
|
-
METRICS_SERVER_PORT: 9601
|
27
|
-
SOKETI_DEFAULT_APP_ENABLED: true
|
28
|
-
SOKETI_DEFAULT_APP_ENABLE_CLIENT_MESSAGES: true
|
29
|
-
DEFAULT_APP_ENABLE_CLIENT_MESSAGES: true
|
30
|
-
#SOKETI_DB_REDIS_HOST: redis
|
31
|
-
#SOKETI_DB_REDIS_PORT: 6379
|
32
|
-
#SOKETI_DB_REDIS_PASSWORD: password
|