mkit 0.7.1 → 0.8.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/README.md +5 -4
- data/bin/mkit +9 -9
- data/lib/mkit/app/controllers/mkit_controller.rb +1 -1
- data/lib/mkit/app/controllers/pods_controller.rb +35 -9
- data/lib/mkit/app/controllers/services_controller.rb +36 -2
- data/lib/mkit/app/helpers/params_helper.rb +15 -0
- data/lib/mkit/app/helpers/pods_helper.rb +14 -0
- data/lib/mkit/app/helpers/services_helper.rb +10 -7
- data/lib/mkit/app/model/pod.rb +1 -1
- data/lib/mkit/app/model/service.rb +5 -0
- data/lib/mkit/client/command_parser.rb +26 -2
- data/lib/mkit/client/commands.yaml +58 -14
- data/lib/mkit/client/console_websocket_client.rb +57 -0
- data/lib/mkit/client/log_websocket_client.rb +46 -0
- data/lib/mkit/client/mkitd_client.rb +3 -1
- data/lib/mkit/client/websocket_client.rb +11 -36
- data/lib/mkit/pods/docker_exec_command.rb +38 -0
- data/lib/mkit/{docker_log_listener.rb → pods/docker_log_listener.rb} +1 -0
- data/lib/mkit/version.rb +1 -1
- data/lib/mkit.rb +1 -2
- metadata +9 -4
- /data/lib/mkit/{docker_listener.rb → pods/docker_listener.rb} +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fa9363526eb6b57ea708a370424cfa71ede7d50f7d91d0d8700e1170f3af5930
|
4
|
+
data.tar.gz: 9c50d7cd862d5573b986f4c3231f76769ab4e5f930839c821232acd0bedf2923
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4c30c9847cdada9bbc87c059b1824430462e29d169498144d7e690d5848e30db29aee6008da4b09a59038355d20ee28688fce7a45d018f76b4afeee82ef3e660
|
7
|
+
data.tar.gz: 770e96f7cb6be72e5c0442c51b2f0229ccdb53a6611c8569a58fe370ec1f405a5d7cadd77a22dae8de1075f9202467a79b26c736f158fb661b5b50dd68aa6c66
|
data/README.md
CHANGED
@@ -9,7 +9,7 @@ The database is a simple sqlite3 db and the server is a Sinatra based applicatio
|
|
9
9
|
|
10
10
|
A client is also included to access the API, e.g. `mkit ps`.
|
11
11
|
|
12
|
-
The daemon is responsible for HAProxy pods routing configuration. It also provides the cluster DNS and manages the internal host interface and the
|
12
|
+
The daemon is responsible for HAProxy pods routing configuration. It also provides the cluster DNS and manages the internal host interface and the pod instances.
|
13
13
|
|
14
14
|
## Requirements
|
15
15
|
|
@@ -124,7 +124,7 @@ my_id: unique_id # this id is generated running mkit init
|
|
124
124
|
|
125
125
|
```
|
126
126
|
service:
|
127
|
-
name: rabbitmq # unique
|
127
|
+
name: rabbitmq # unique. Available on internal DNS as 'rabbitmq'
|
128
128
|
image: rabbitmq:3-management-alpine # image
|
129
129
|
network: bridge # docker network - it will be created if it does not exists
|
130
130
|
ports: # haproxy port mapping
|
@@ -140,7 +140,7 @@ service:
|
|
140
140
|
- 5672:5672:tcp:round_robin
|
141
141
|
- 80:15672:http:round_robin
|
142
142
|
resources:
|
143
|
-
min_replicas: 1 # default value
|
143
|
+
min_replicas: 1 # default value. Pods will be available on internal DNS as '<service_name>.internal'
|
144
144
|
max_replicas: 1 # default value
|
145
145
|
volumes:
|
146
146
|
- docker://mkit_rabbitmq_data:/var/lib/rabbitmq # a docker volume - it will be created if it does not exists
|
@@ -192,8 +192,9 @@ restart restart service
|
|
192
192
|
create create new service
|
193
193
|
update update service
|
194
194
|
rm remove service
|
195
|
+
exec execute a command in a running pod
|
195
196
|
logs view service logs
|
196
|
-
version prints mkit server version
|
197
|
+
version prints mkit client and server version
|
197
198
|
proxy haproxy status and control
|
198
199
|
profile mkit client configuration profile
|
199
200
|
|
data/bin/mkit
CHANGED
@@ -13,6 +13,7 @@ require 'uri'
|
|
13
13
|
require 'fileutils'
|
14
14
|
require 'mkit/client/command_parser'
|
15
15
|
require 'mkit/client/mkitd_client'
|
16
|
+
require 'mkit/version'
|
16
17
|
|
17
18
|
class InvalidConfigurationException < Exception
|
18
19
|
attr_reader :command
|
@@ -42,14 +43,14 @@ class MKItClient
|
|
42
43
|
FileUtils.mkdir_p(@config_dir)
|
43
44
|
end
|
44
45
|
FileUtils.cp("#{@root}/config/mkitc_config.yml", @config_dir) unless File.exist?(@config_file)
|
45
|
-
profile({ verb: 'set' }, {
|
46
|
+
profile({ verb: 'set' }, { profile: 'local' }) unless File.exist?(@profile_file)
|
46
47
|
end
|
47
48
|
|
48
49
|
def read_configuration(init_call = false)
|
49
50
|
current_profile = File.read(@profile_file)
|
50
51
|
if current_profile.nil? || current_profile.empty?
|
51
52
|
# force set default
|
52
|
-
profile({ verb: 'set' }, {
|
53
|
+
profile({ verb: 'set' }, { profile: 'local' })
|
53
54
|
current_profile = 'local'
|
54
55
|
end
|
55
56
|
cfg = YAML.load_file(@config_file)
|
@@ -91,6 +92,10 @@ class MKItClient
|
|
91
92
|
client.request(request, request_data)
|
92
93
|
end
|
93
94
|
|
95
|
+
def version(request, request_data)
|
96
|
+
puts "MKIt Client version #{MKIt::VERSION}"
|
97
|
+
request(request, request_data)
|
98
|
+
end
|
94
99
|
#
|
95
100
|
# commands
|
96
101
|
#
|
@@ -146,13 +151,13 @@ class MKItClient
|
|
146
151
|
|
147
152
|
case request[:verb]
|
148
153
|
when 'set'
|
149
|
-
profile = request_data[:
|
154
|
+
profile = request_data[:profile]
|
150
155
|
if cfg['mkit'][profile.lstrip].nil?
|
151
156
|
raise InvalidParametersException.new("Profile not found on '~/.mkit' configuration", cmd)
|
152
157
|
end
|
153
158
|
|
154
159
|
puts "Setting current profile to #{profile}."
|
155
|
-
File.write(@profile_file, request_data[:
|
160
|
+
File.write(@profile_file, request_data[:profile])
|
156
161
|
''
|
157
162
|
when 'show'
|
158
163
|
active = File.read("#{@config_dir}/current")
|
@@ -174,8 +179,3 @@ end
|
|
174
179
|
#
|
175
180
|
client = MKItClient.new
|
176
181
|
client.doIt(ARGV.dup)
|
177
|
-
#
|
178
|
-
# if ARGV.any?
|
179
|
-
# parse args
|
180
|
-
# host, socket, config file
|
181
|
-
# end
|
@@ -1,16 +1,42 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
require 'mkit/app/model/pod'
|
4
|
+
require 'mkit/app/helpers/pods_helper'
|
5
|
+
require 'mkit/app/helpers/params_helper'
|
6
|
+
require 'mkit/pods/docker_exec_command'
|
7
|
+
require 'mkit/exceptions'
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
|
9
|
+
class PodsController < MKIt::Server
|
10
|
+
helpers MKIt::PodsHelper
|
11
|
+
helpers MKIt::ParamsHelper
|
11
12
|
|
12
|
-
|
13
|
-
|
13
|
+
get '/pods/:id/exec' do
|
14
|
+
pod = find_by_id_or_name
|
15
|
+
if request.websocket?
|
16
|
+
options_parameter = build_options_hash(params: params, options: [:varargs])
|
17
|
+
raise MKIt::BaseException.new(400, "Missing parameters") unless options_parameter[:varargs]
|
18
|
+
options_parameter[:varargs] = JSON.parse(params['varargs'])
|
19
|
+
request.websocket do |ws|
|
20
|
+
listener = nil
|
21
|
+
ws.onopen do
|
22
|
+
settings.sockets << ws
|
23
|
+
listener = MKIt::DockerExecCommand.new(pod, ws, options: options_parameter)
|
24
|
+
settings.listeners << listener
|
25
|
+
listener.register
|
26
|
+
end
|
27
|
+
ws.onclose do
|
28
|
+
MKItLogger.info("websocket closed [#{listener}]")
|
29
|
+
settings.sockets.delete(ws)
|
30
|
+
if listener
|
31
|
+
MKItLogger.info("unregister [#{listener}]")
|
32
|
+
settings.listeners.delete(listener)
|
33
|
+
listener.unregister
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
else
|
38
|
+
raise MKIt::BaseException.new(400, "Bad request")
|
39
|
+
end
|
14
40
|
end
|
15
41
|
|
16
42
|
delete '/services/:service_id/pods/:pod_id' do
|
@@ -2,10 +2,13 @@
|
|
2
2
|
|
3
3
|
require 'mkit/app/model/service'
|
4
4
|
require 'mkit/app/helpers/services_helper'
|
5
|
-
require 'mkit/
|
5
|
+
require 'mkit/app/helpers/params_helper'
|
6
|
+
require 'mkit/pods/docker_log_listener'
|
7
|
+
require 'mkit/pods/docker_exec_command'
|
6
8
|
|
7
9
|
class ServicesController < MKIt::Server
|
8
10
|
helpers MKIt::ServicesHelper
|
11
|
+
helpers MKIt::ParamsHelper
|
9
12
|
|
10
13
|
# curl localhost:4567/services
|
11
14
|
get '/services' do
|
@@ -37,13 +40,14 @@ class ServicesController < MKIt::Server
|
|
37
40
|
if !request.websocket?
|
38
41
|
srv.log
|
39
42
|
else
|
43
|
+
pod = find_srv_pod_by_id_or_name(srv)
|
40
44
|
options_parameter = build_options_hash(params: params, options: [:nr_lines, :pods, :follow])
|
41
45
|
request.websocket do |ws|
|
42
46
|
listener = nil
|
43
47
|
ws.onopen do
|
44
48
|
settings.sockets << ws
|
45
49
|
ws.send("<<<< %s | %s >>>>\n" % [srv.name, srv.pod.first.name])
|
46
|
-
listener = MKIt::DockerLogListener.new(
|
50
|
+
listener = MKIt::DockerLogListener.new(pod, ws, options: options_parameter)
|
47
51
|
settings.listeners << listener
|
48
52
|
listener.register
|
49
53
|
end
|
@@ -115,4 +119,34 @@ class ServicesController < MKIt::Server
|
|
115
119
|
MkitJob.publish(topic: :start_service, service_id: srv.id)
|
116
120
|
format_response(srv)
|
117
121
|
end
|
122
|
+
|
123
|
+
get '/services/:id/pods/exec' do
|
124
|
+
srv = find_by_id_or_name
|
125
|
+
if request.websocket?
|
126
|
+
pod = find_srv_pod_by_id_or_name(srv)
|
127
|
+
options_parameter = build_options_hash(params: params, options: [:varargs, :interactive, :detached])
|
128
|
+
raise MKIt::BaseException.new(400, "Missing parameters") unless options_parameter[:varargs]
|
129
|
+
options_parameter[:varargs] = JSON.parse(params['varargs'])
|
130
|
+
request.websocket do |ws|
|
131
|
+
listener = nil
|
132
|
+
ws.onopen do
|
133
|
+
settings.sockets << ws
|
134
|
+
listener = MKIt::DockerExecCommand.new(pod, ws, options: options_parameter)
|
135
|
+
settings.listeners << listener
|
136
|
+
listener.register
|
137
|
+
end
|
138
|
+
ws.onclose do
|
139
|
+
MKItLogger.info("websocket closed [#{listener}]")
|
140
|
+
settings.sockets.delete(ws)
|
141
|
+
if listener
|
142
|
+
MKItLogger.info("unregister [#{listener}]")
|
143
|
+
settings.listeners.delete(listener)
|
144
|
+
listener.unregister
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
else
|
149
|
+
raise MKIt::BaseException.new(400, "Bad request")
|
150
|
+
end
|
151
|
+
end
|
118
152
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module MKIt
|
4
|
+
module PodsHelper
|
5
|
+
|
6
|
+
def find_by_id_or_name
|
7
|
+
pod = Pod.find_by_id(params[:id])
|
8
|
+
pod ||= Pod.find_by_name(params[:id])
|
9
|
+
error 404, "Couldn't find Pod '#{params[:id]}'\n" unless pod
|
10
|
+
pod
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
@@ -16,13 +16,6 @@ module MKIt
|
|
16
16
|
table.to_s
|
17
17
|
end
|
18
18
|
|
19
|
-
def build_options_hash(params:, options:)
|
20
|
-
hash = {}
|
21
|
-
options.each do |option|
|
22
|
-
hash[option] = params[option]
|
23
|
-
end
|
24
|
-
hash
|
25
|
-
end
|
26
19
|
def find_by_id_or_name
|
27
20
|
srv = Service.find_by_id(params[:id])
|
28
21
|
srv ||= Service.find_by_name(params[:id])
|
@@ -30,6 +23,16 @@ module MKIt
|
|
30
23
|
srv
|
31
24
|
end
|
32
25
|
|
26
|
+
def find_srv_pod_by_id_or_name(srv)
|
27
|
+
if params[:pod_id]
|
28
|
+
pod = srv.find_pod_by_id_or_name(params[:pod_id])
|
29
|
+
error 404, "Service pod not found." unless pod
|
30
|
+
else
|
31
|
+
pod = srv.pod.first
|
32
|
+
end
|
33
|
+
pod
|
34
|
+
end
|
35
|
+
|
33
36
|
def build_table_row(data)
|
34
37
|
ports = data.service_port&.each.map { |p| build_port(p) }.join(',')
|
35
38
|
pods = data.pod.each.map { |p| p.name.to_s }.join(' ')
|
data/lib/mkit/app/model/pod.rb
CHANGED
@@ -222,6 +222,11 @@ class Service < ActiveRecord::Base
|
|
222
222
|
MkitJob.publish(topic: :destroy_proxy_config, data: {filename: filename})
|
223
223
|
end
|
224
224
|
|
225
|
+
def find_pod_by_id_or_name(pod_id)
|
226
|
+
pod = self.pod.find_by(id: pod_id)
|
227
|
+
pod = self.pod.find_by(name: pod_id) unless pod
|
228
|
+
pod
|
229
|
+
end
|
225
230
|
#
|
226
231
|
# ctrl
|
227
232
|
#
|
@@ -71,10 +71,22 @@ class CommandParser
|
|
71
71
|
# request_data = {}
|
72
72
|
def fill_cmd_args(args, argv, request, request_data)
|
73
73
|
return if args.nil?
|
74
|
-
# add to schema
|
75
74
|
args.each do |arg|
|
76
75
|
arg[:type] = 'value' unless arg[:type]
|
77
76
|
end
|
77
|
+
split = split_argv(argv)
|
78
|
+
argv = split[0]
|
79
|
+
varargs = split[1]
|
80
|
+
varargs = nil if varargs.empty?
|
81
|
+
|
82
|
+
# find vararg and fill it
|
83
|
+
vararg = args.select { |arg| arg[:type].to_sym == :varargs }.first
|
84
|
+
if vararg
|
85
|
+
request_data[vararg[:name].to_sym] = varargs
|
86
|
+
request[:params] ||= []
|
87
|
+
request[:params] << ["#{vararg[:name].to_sym}", varargs ]
|
88
|
+
end
|
89
|
+
|
78
90
|
# flag and options
|
79
91
|
fill_flag_and_options_args(args, argv, request, request_data)
|
80
92
|
idx = 0
|
@@ -88,6 +100,18 @@ class CommandParser
|
|
88
100
|
end
|
89
101
|
end
|
90
102
|
|
103
|
+
def split_argv(argv)
|
104
|
+
separator_index = argv.index('--')
|
105
|
+
if separator_index
|
106
|
+
left_side = argv[0...separator_index]
|
107
|
+
right_side = argv[(separator_index + 1)..-1]
|
108
|
+
else
|
109
|
+
left_side = argv
|
110
|
+
right_side = []
|
111
|
+
end
|
112
|
+
[left_side, right_side]
|
113
|
+
end
|
114
|
+
|
91
115
|
def fill_flag_and_options_args(args, argv, request, request_data)
|
92
116
|
# flags
|
93
117
|
# checking flags first, avoids -n -f, with -f being the value of -n
|
@@ -122,7 +146,7 @@ class CommandParser
|
|
122
146
|
request[:uri] = request[:uri] + arg[:uri] unless arg[:uri].nil?
|
123
147
|
unless arg[:param].nil?
|
124
148
|
request[:params] ||= []
|
125
|
-
request[:params] << [
|
149
|
+
request[:params] << %W[#{arg[:name]} #{arg[:param]}]
|
126
150
|
end
|
127
151
|
end
|
128
152
|
|
@@ -108,9 +108,53 @@
|
|
108
108
|
request:
|
109
109
|
verb: delete
|
110
110
|
uri: "/services/<%=id%>"
|
111
|
+
- cmd: exec
|
112
|
+
usage:
|
113
|
+
- "<service_id_or_name> [options] -- <command> [args...]"
|
114
|
+
help: execute a command in a running pod
|
115
|
+
request:
|
116
|
+
verb: ws_console
|
117
|
+
uri: "/services/<%=id%>/pods/exec"
|
118
|
+
args:
|
119
|
+
- name: id
|
120
|
+
help:
|
121
|
+
- id
|
122
|
+
- Service id or name
|
123
|
+
mandatory: true
|
124
|
+
- name: pod_id
|
125
|
+
help:
|
126
|
+
- -p <pod_id>
|
127
|
+
- Execute command for specified pod (default first)
|
128
|
+
mandatory: false
|
129
|
+
param: "<%=pod_id%>"
|
130
|
+
type: option
|
131
|
+
switch:
|
132
|
+
- "-p"
|
133
|
+
- name: detached
|
134
|
+
help:
|
135
|
+
- -d
|
136
|
+
- Run command in background
|
137
|
+
mandatory: false
|
138
|
+
param: "<%=true%>"
|
139
|
+
type: flag
|
140
|
+
switch:
|
141
|
+
- "-d"
|
142
|
+
- name: separator
|
143
|
+
help:
|
144
|
+
- --
|
145
|
+
- Ends mkit options and starts the command
|
146
|
+
mandatory: false
|
147
|
+
type: separator
|
148
|
+
- name: varargs
|
149
|
+
help:
|
150
|
+
- command
|
151
|
+
- Command and options
|
152
|
+
mandatory: true
|
153
|
+
type: varargs
|
154
|
+
param: <%=varargs%>
|
111
155
|
- cmd: logs
|
112
156
|
usage:
|
113
|
-
- "<service_id_or_name> [-f] [-n <lines>]"
|
157
|
+
- "<service_id_or_name> [-p <pod_id>] [-f] [-n <lines>]"
|
114
158
|
help: view service logs
|
115
159
|
request:
|
116
160
|
verb: ws # new type
|
@@ -123,6 +167,15 @@
|
|
123
167
|
help:
|
124
168
|
- id
|
125
169
|
- Service id or name
|
170
|
+
- name: pod_id
|
171
|
+
help:
|
172
|
+
- -p <pod_id>
|
173
|
+
- Show logs for specified pod (default first)
|
174
|
+
mandatory: false
|
175
|
+
param: "<%=pod_id%>"
|
176
|
+
type: option
|
177
|
+
switch:
|
178
|
+
- "-p"
|
126
179
|
- name: follow
|
127
180
|
help:
|
128
181
|
- -f
|
@@ -134,24 +187,15 @@
|
|
134
187
|
- "-f"
|
135
188
|
- name: nr_lines
|
136
189
|
help:
|
137
|
-
- -n <
|
138
|
-
- Number of lines to show from the end of the logs
|
190
|
+
- -n <string>
|
191
|
+
- Number of lines to show from the end of the logs (default 10)
|
139
192
|
mandatory: false
|
140
193
|
param: "<%=nr_lines%>"
|
141
194
|
type: option
|
142
195
|
switch:
|
143
196
|
- "-n"
|
144
|
-
- name: pods
|
145
|
-
help:
|
146
|
-
- -p <[pods]>
|
147
|
-
- Show logs for specified logs, e.g. pod1, pod2 (default first)
|
148
|
-
mandatory: false
|
149
|
-
param: "<%=pods%>"
|
150
|
-
type: option
|
151
|
-
switch:
|
152
|
-
- "-n"
|
153
197
|
- cmd: version
|
154
|
-
help: prints mkit server version
|
198
|
+
help: prints mkit client and server version
|
155
199
|
request:
|
156
200
|
verb: get
|
157
201
|
uri: "/mkit/version"
|
@@ -182,7 +226,7 @@
|
|
182
226
|
uri: "/mkit/proxy/status"
|
183
227
|
- cmd: profile
|
184
228
|
usage:
|
185
|
-
- "<[set <
|
229
|
+
- "<[set <profile>]|[show]>"
|
186
230
|
help: mkit client configuration profile
|
187
231
|
options:
|
188
232
|
- cmd: set
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# # frozen_string_literal: true
|
2
|
+
require 'faye/websocket'
|
3
|
+
require 'eventmachine'
|
4
|
+
require 'json'
|
5
|
+
require 'io/console'
|
6
|
+
|
7
|
+
module MKIt
|
8
|
+
class ConsoleWebSocketClient
|
9
|
+
|
10
|
+
def initialize(uri, options)
|
11
|
+
@uri = uri
|
12
|
+
@options = options
|
13
|
+
end
|
14
|
+
|
15
|
+
def doIt
|
16
|
+
EM.run {
|
17
|
+
ws = Faye::WebSocket::Client.new(@uri, nil, @options)
|
18
|
+
|
19
|
+
ws.on :open do |_event|
|
20
|
+
puts "Connected to WebSocket server"
|
21
|
+
puts "\r\n"
|
22
|
+
end
|
23
|
+
|
24
|
+
ws.on :message do |event|
|
25
|
+
print event.data
|
26
|
+
end
|
27
|
+
|
28
|
+
ws.on :error do |event|
|
29
|
+
p [:error, event.message]
|
30
|
+
ws = nil
|
31
|
+
EventMachine.stop
|
32
|
+
end
|
33
|
+
|
34
|
+
ws.on :close do |_event|
|
35
|
+
ws = nil
|
36
|
+
puts "\r\n"
|
37
|
+
EventMachine.stop
|
38
|
+
end
|
39
|
+
|
40
|
+
Thread.new do
|
41
|
+
STDIN.raw do
|
42
|
+
loop do
|
43
|
+
input = STDIN.getc.chr
|
44
|
+
# if input == "\u0003" # Ctrl+C
|
45
|
+
# puts "bye..."
|
46
|
+
# EventMachine.stop
|
47
|
+
# break
|
48
|
+
# else
|
49
|
+
ws.send(input)
|
50
|
+
# end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
}
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# # frozen_string_literal: true
|
2
|
+
require 'faye/websocket'
|
3
|
+
require 'eventmachine'
|
4
|
+
require 'json'
|
5
|
+
require 'io/console'
|
6
|
+
|
7
|
+
module MKIt
|
8
|
+
class LogWebSocketClient
|
9
|
+
|
10
|
+
def initialize(uri, options)
|
11
|
+
@uri = uri
|
12
|
+
@options = options
|
13
|
+
trap("SIGINT") do
|
14
|
+
puts "Bye..."
|
15
|
+
EventMachine.stop
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def doIt
|
20
|
+
EM.run {
|
21
|
+
ws = Faye::WebSocket::Client.new(@uri, nil, @options)
|
22
|
+
|
23
|
+
ws.on :open do |_event|
|
24
|
+
puts "Connected to WebSocket server"
|
25
|
+
puts "\r\n"
|
26
|
+
end
|
27
|
+
|
28
|
+
ws.on :message do |event|
|
29
|
+
puts event.data
|
30
|
+
end
|
31
|
+
|
32
|
+
ws.on :error do |event|
|
33
|
+
p [:error, event.message]
|
34
|
+
ws = nil
|
35
|
+
EventMachine.stop
|
36
|
+
end
|
37
|
+
|
38
|
+
ws.on :close do |_event|
|
39
|
+
ws = nil
|
40
|
+
puts "\r\n"
|
41
|
+
EventMachine.stop
|
42
|
+
end
|
43
|
+
}
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -6,7 +6,7 @@ module MKIt
|
|
6
6
|
class MKItdClient
|
7
7
|
def initialize(request, server_url, my_id)
|
8
8
|
case request[:verb].to_sym
|
9
|
-
when :ws
|
9
|
+
when :ws, :ws_console
|
10
10
|
@client = MKIt::WebSocketClient.new(server_url, my_id)
|
11
11
|
else
|
12
12
|
@client = MKIt::HttpClient.new(server_url, my_id)
|
@@ -14,6 +14,8 @@ module MKIt
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def request(request, request_data)
|
17
|
+
# puts "Request: #{request}"
|
18
|
+
# puts "Request data: #{request_data}"
|
17
19
|
@client.request(request, request_data)
|
18
20
|
end
|
19
21
|
end
|
@@ -2,9 +2,13 @@
|
|
2
2
|
require 'faye/websocket'
|
3
3
|
require 'eventmachine'
|
4
4
|
require 'json'
|
5
|
+
require 'io/console'
|
6
|
+
require 'mkit/client/console_websocket_client'
|
7
|
+
require 'mkit/client/log_websocket_client'
|
5
8
|
|
6
9
|
module MKIt
|
7
10
|
class WebSocketClient
|
11
|
+
|
8
12
|
def initialize(server_url, my_id)
|
9
13
|
@server_url = server_url
|
10
14
|
@my_id = my_id
|
@@ -14,10 +18,6 @@ module MKIt
|
|
14
18
|
@options[:headers] = { 'X-API-KEY' => @my_id }
|
15
19
|
url_prefix = use_ssl ? "wss" : "ws"
|
16
20
|
@ws_url = "#{url_prefix}://#{uri.host}:#{uri.port}"
|
17
|
-
trap("SIGINT") do
|
18
|
-
puts "Bye..."
|
19
|
-
EventMachine.stop
|
20
|
-
end
|
21
21
|
end
|
22
22
|
|
23
23
|
def request(request, request_data)
|
@@ -26,40 +26,15 @@ module MKIt
|
|
26
26
|
uri = uri + '?' + request[:params].map { |k, v| "#{k}=#{v}" }.join('&')
|
27
27
|
end
|
28
28
|
uri = ERB.new("#{@ws_url}#{uri}").result_with_hash(request_data)
|
29
|
-
|
30
|
-
EM.run {
|
31
|
-
ws = Faye::WebSocket::Client.new(uri, nil, @options)
|
32
|
-
|
33
|
-
ws.on :open do |event|
|
34
|
-
# no op
|
35
|
-
end
|
36
29
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
return
|
45
|
-
end
|
46
|
-
|
47
|
-
ws.on :close do |event|
|
48
|
-
ws = nil
|
49
|
-
EventMachine.stop
|
50
|
-
end
|
30
|
+
case request[:verb].to_sym
|
31
|
+
when :ws_console
|
32
|
+
client = ConsoleWebSocketClient.new(uri, @options)
|
33
|
+
when :ws
|
34
|
+
client = LogWebSocketClient.new(uri, @options)
|
35
|
+
end
|
36
|
+
client.doIt
|
51
37
|
|
52
|
-
Thread.new do
|
53
|
-
loop do
|
54
|
-
input = STDIN.gets.chomp
|
55
|
-
if input == 'exit'
|
56
|
-
puts "bye..."
|
57
|
-
EventMachine.stop
|
58
|
-
break
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
}
|
63
38
|
end
|
64
39
|
end
|
65
40
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require "mkit/cmd/shell_client"
|
2
|
+
|
3
|
+
module MKIt
|
4
|
+
class DockerExecCommand < MKIt::ShellClient
|
5
|
+
|
6
|
+
def initialize(pod, ws, options: {})
|
7
|
+
puts "DockerExecCommand: #{options}"
|
8
|
+
@pod = pod
|
9
|
+
@ws = ws
|
10
|
+
command = "docker exec"
|
11
|
+
command += " -it" unless options[:detached] == 'true'
|
12
|
+
command += " -d" if options[:detached] == 'true'
|
13
|
+
command += " #{@pod.name}"
|
14
|
+
command += " #{options[:varargs].join(' ')}" if options[:varargs]
|
15
|
+
super(command: command)
|
16
|
+
end
|
17
|
+
|
18
|
+
def register
|
19
|
+
super do |stdout, stdin, pid|
|
20
|
+
@stdout_thread = Thread.new do
|
21
|
+
stdout.each_char { |line| @ws.send(line) }
|
22
|
+
end
|
23
|
+
|
24
|
+
@stdin_thread = Thread.new do
|
25
|
+
@ws.onmessage do |msg|
|
26
|
+
stdin.putc msg
|
27
|
+
end
|
28
|
+
end
|
29
|
+
@stdout_thread.join
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def close
|
34
|
+
@ws.close_websocket unless @ws.nil?
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
data/lib/mkit/version.rb
CHANGED
data/lib/mkit.rb
CHANGED
@@ -16,7 +16,7 @@ require 'mkit/config/load_default_configs'
|
|
16
16
|
require_relative 'mkit/version'
|
17
17
|
require_relative 'mkit/mkit_interface'
|
18
18
|
require_relative 'mkit/mkit_dns'
|
19
|
-
require_relative 'mkit/docker_listener'
|
19
|
+
require_relative 'mkit/pods/docker_listener'
|
20
20
|
require 'mkit/app/helpers/haproxy'
|
21
21
|
require 'mkit/app/controllers/services_controller'
|
22
22
|
require 'mkit/app/controllers/mkitjobs_controller'
|
@@ -26,7 +26,6 @@ require 'mkit/mkit_dns'
|
|
26
26
|
require 'mkit/job_manager'
|
27
27
|
require 'mkit/workers/worker_manager'
|
28
28
|
require 'mkit/sagas/saga_manager'
|
29
|
-
require 'mkit/docker_listener'
|
30
29
|
require 'mkit/app/helpers/haproxy'
|
31
30
|
require 'active_record/tasks/database_tasks'
|
32
31
|
require 'mkit/utils'
|
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.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vasco Santos
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-12-
|
11
|
+
date: 2024-12-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: async-dns
|
@@ -385,6 +385,8 @@ files:
|
|
385
385
|
- lib/mkit/app/helpers/erb_helper.rb
|
386
386
|
- lib/mkit/app/helpers/haproxy.rb
|
387
387
|
- lib/mkit/app/helpers/interface_helper.rb
|
388
|
+
- lib/mkit/app/helpers/params_helper.rb
|
389
|
+
- lib/mkit/app/helpers/pods_helper.rb
|
388
390
|
- lib/mkit/app/helpers/services_helper.rb
|
389
391
|
- lib/mkit/app/mkit_server.rb
|
390
392
|
- lib/mkit/app/model/dns_host.rb
|
@@ -402,7 +404,9 @@ files:
|
|
402
404
|
- lib/mkit/app/templates/haproxy/xapp_haproxy.cfg.erb
|
403
405
|
- lib/mkit/client/command_parser.rb
|
404
406
|
- lib/mkit/client/commands.yaml
|
407
|
+
- lib/mkit/client/console_websocket_client.rb
|
405
408
|
- lib/mkit/client/http_client.rb
|
409
|
+
- lib/mkit/client/log_websocket_client.rb
|
406
410
|
- lib/mkit/client/mkitd_client.rb
|
407
411
|
- lib/mkit/client/websocket_client.rb
|
408
412
|
- lib/mkit/cmd/shell_client.rb
|
@@ -414,12 +418,13 @@ files:
|
|
414
418
|
- lib/mkit/config/load_default_configs.rb
|
415
419
|
- lib/mkit/config/the_config.yml
|
416
420
|
- lib/mkit/ctypes.rb
|
417
|
-
- lib/mkit/docker_listener.rb
|
418
|
-
- lib/mkit/docker_log_listener.rb
|
419
421
|
- lib/mkit/exceptions.rb
|
420
422
|
- lib/mkit/job_manager.rb
|
421
423
|
- lib/mkit/mkit_dns.rb
|
422
424
|
- lib/mkit/mkit_interface.rb
|
425
|
+
- lib/mkit/pods/docker_exec_command.rb
|
426
|
+
- lib/mkit/pods/docker_listener.rb
|
427
|
+
- lib/mkit/pods/docker_log_listener.rb
|
423
428
|
- lib/mkit/sagas/asaga.rb
|
424
429
|
- lib/mkit/sagas/create_pod_saga.rb
|
425
430
|
- lib/mkit/sagas/saga_manager.rb
|
File without changes
|