mkit 0.4.2 → 0.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 56a055d0f918142de3df69c4855efe29d91eb31aa708bdd2750686b8bdb80c47
4
- data.tar.gz: 4060c899e719dad8dcd11a587e2b34f40caf0d4929a5e3d587d4e51b8a133a82
3
+ metadata.gz: fc469f170acb4204c99a3c5d5b42d474e68d3541dca30920068b5b7d1c56c526
4
+ data.tar.gz: 97bd822d57128df2a7e3ae584af116aa09a250b41fed9f1dd362aa29bd3d49fb
5
5
  SHA512:
6
- metadata.gz: 7834b888e1474e287e7466443be8ac139bbd96d89e17f787d688aee5f308f076aab408de600acee6dc4f94a145fda9edb8574e7828b1d20ae8fcb46700c96e85
7
- data.tar.gz: 91130b1307fb43d0ac3dc590bf01727dab106c5b726210ef9fe67057dcb7454434f514beee94c4d265ee7351b802d4797ecb8084965f0c07975c4f17e96c3b4e
6
+ metadata.gz: d03fa8ceeb3668ef280fa558ce5e5002110f98cdc8bb30fef4ab299e55b532ed6faee2ddb1203925567bec8657daddcbe7eaa9cc63440350b11aca321b8c3fec
7
+ data.tar.gz: 26087de2da9a6c65a3c42c92714a83419f91c7832549b04b39f5900d47d6a574e8cb180d42d62d09e5263b56eba3ea7858e2b8b0fcf6788609be30a7e8e62ddb
@@ -0,0 +1,22 @@
1
+ name: Publish Gem
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - v[0-9]*.[0-9]*.[0-9]*
7
+
8
+ jobs:
9
+ build:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v3
13
+ - name: Publish to RubyGems
14
+ run: |
15
+ mkdir -p $HOME/.gem
16
+ touch $HOME/.gem/credentials
17
+ chmod 0600 $HOME/.gem/credentials
18
+ printf -- "---\n:rubygems_api_key: ${RUBYGEMS_API_KEY}\n" > $HOME/.gem/credentials
19
+ gem build *.gemspec
20
+ gem push *.gem
21
+ env:
22
+ RUBYGEMS_API_KEY: "${{secrets.RUBYGEMS_API_KEY}}"
data/README.md CHANGED
@@ -49,13 +49,13 @@ or after the `gem install mkit-<version>.gem`. The server and client will be ins
49
49
  0.65s info: MKIt is up and running! [ec=0xbe0] [pid=45804] [2023-12-29 15:46:04 +0000]
50
50
  ```
51
51
 
52
- There's also samples on the samples dir, for daemontools and systemd.
52
+ There's also samples on the samples dir, for `daemontools` and `systemd`.
53
53
 
54
54
  ### Accessing the API
55
55
 
56
- A client is provided to interact with mkit server.
56
+ A client is provided to interact with `mkit server`.
57
57
 
58
- Run `mkitc help` to list current supported commands.
58
+ Run `mkitc help` for a list of current supported commands.
59
59
 
60
60
  ```
61
61
  Usage: mkitc <command> [options]
@@ -66,6 +66,7 @@ Commands:
66
66
 
67
67
  ps show services status (alias for status)
68
68
  status show services status
69
+ logs prints service logs
69
70
  start start service
70
71
  stop stop service
71
72
  restart restart service
@@ -74,6 +75,7 @@ update update service
74
75
  rm remove service
75
76
  version prints mkit server version
76
77
  proxy haproxy status and control
78
+ profile mkit client configuration profile
77
79
 
78
80
  Run 'mkitc help <command>' for specific command information.
79
81
  ```
@@ -92,7 +94,40 @@ The service `postgres` is available on IP `10.210.198.10:5432`
92
94
 
93
95
  ## Configuration
94
96
 
95
- On startup, configuration files on `config` directory will be copied to `/etc/mkit`. HAProxy config directory and control commands are defined on `mkit_config.yml`
97
+ ### Server configuration
98
+
99
+ On startup, configuration files on `config` directory will be copied to `/etc/mkit`.
100
+
101
+ The server is available by default on `http://localhost:4567` but you can configure server startup parameters on `/etc/mkit/mkitd_config.sh`
102
+
103
+ Please check `samples/systemd` or `samples/daemontools` directories for more details.
104
+
105
+ ```
106
+ # /etc/mkit/mkitd_config.sh
107
+ #
108
+ # mkitd server options (for systemd unit | daemontools)
109
+ #
110
+ OPTIONS=""
111
+ # e.g. OPTIONS="-b 0.0.0.0"
112
+ ```
113
+ HAProxy config directory and control commands are defined on `mkit_config.yml`
114
+
115
+ ```
116
+ # /etc/mkit/mkit_config.yml - mkit server configuration file.
117
+ mkit:
118
+ my_network:
119
+ ip: 10.210.198.1
120
+ haproxy:
121
+ config_dir: /etc/haproxy/haproxy.d
122
+ ctrl:
123
+ start: systemctl start haproxy
124
+ stop: systemctl stop haproxy
125
+ reload: systemctl reload haproxy
126
+ restart: systemctl restart haproxy
127
+ status: systemctl status haproxy
128
+ database:
129
+ env: development
130
+ ```
96
131
 
97
132
  You must configure `haproxy` to use config directory. e.g. on Ubuntu
98
133
 
@@ -110,6 +145,20 @@ CONFIG="/etc/haproxy/haproxy.d"
110
145
  # Add extra flags here, see haproxy(1) for a few options
111
146
  #EXTRAOPTS="-de -m 16"
112
147
  ```
148
+ ### Client configuration
149
+
150
+ On `mkitc` first call, default configuration will be copied to `$HOME/.mkit` with `local`default profile set.
151
+
152
+ You can add more servers and change active profile with `$mkitc profile set <profile_name>`, e.g. `$mkitc profile set server_2`
153
+
154
+ ```
155
+ # ~/.mkit/mkitc_config.yml
156
+ mkit:
157
+ local:
158
+ server.uri: http://localhost:4567
159
+ server_2: # you can add more servers. change the client active profile with mkitc profile command
160
+ server.uri: http://192.168.29.232:4567
161
+ ```
113
162
 
114
163
  ### Service
115
164
 
data/Rakefile CHANGED
@@ -9,6 +9,7 @@ require 'rubygems/specification'
9
9
  require 'rake/testtask'
10
10
  require 'pry'
11
11
  require 'fileutils'
12
+ require 'bundler'
12
13
  require 'bundler/setup'
13
14
  require 'dry-container'
14
15
  require 'sinatra/activerecord'
data/bin/mkitc CHANGED
@@ -9,25 +9,24 @@ require 'json'
9
9
  require 'net_http_unix'
10
10
  require 'securerandom'
11
11
  require 'erb'
12
+ require 'uri'
13
+ require 'fileutils'
12
14
 
13
- class InvalidParametersException < RuntimeError
15
+ class InvalidParametersException < Exception
14
16
  attr_reader :command
17
+
15
18
  def initialize(cause, command = nil)
16
19
  super(cause)
17
20
  @command = command
18
21
  end
19
22
  end
20
23
 
21
- class MKItClient
22
- def initialize
23
- @client = NetX::HTTPUnix.new('localhost', 4567)
24
- end
25
-
26
- def dict
24
+ class CommandPalette
25
+ def schema
27
26
  global_args = [
28
27
  { short: '-v', long: '--verbose', help: 'verbose', mandatory: false, value: nil }
29
28
  ]
30
- command_dict = [
29
+ [
31
30
  {
32
31
  cmd: 'ps',
33
32
  args: [
@@ -46,6 +45,15 @@ class MKItClient
46
45
  usage: ['[service_id_or_name]'],
47
46
  request: { verb: :get, uri: '/services' }
48
47
  },
48
+ {
49
+ cmd: 'logs',
50
+ args: [
51
+ { name: 'id', mandatory: true }
52
+ ],
53
+ help: 'prints service logs',
54
+ usage: ['<service_id_or_name>'],
55
+ request: { verb: :get, uri: '/services/<%=id%>/logs' }
56
+ },
49
57
  {
50
58
  cmd: 'start',
51
59
  args: [
@@ -131,69 +139,89 @@ class MKItClient
131
139
  ],
132
140
  help: 'haproxy status and control',
133
141
  usage: ['<start|stop|restart|status>']
142
+ },
143
+ {
144
+ cmd: 'profile',
145
+ options: [
146
+ {
147
+ cmd: 'set',
148
+ request: { verb: 'set' },
149
+ args: [
150
+ { name: 'profile_name', mandatory: true }
151
+ ],
152
+ help: 'set mkit client configuration profile'
153
+ },
154
+ {
155
+ cmd: 'show',
156
+ request: { verb: 'show' },
157
+ help: 'show mkit client current profile'
158
+ }
159
+ ],
160
+ help: 'mkit client configuration profile',
161
+ usage: ['<[set <profile_name>]|[show]>']
134
162
  }
135
163
  ]
136
- command_dict
137
164
  end
165
+ end
138
166
 
139
- def help(cause: nil, cmd: nil)
140
- msg = ''
141
- if cause.nil?
142
- my_cmd = cmd
143
- else
144
- msg += "MKItc: #{cause.message}\n"
145
- my_cmd = cause.command
146
- end
147
- if my_cmd.nil?
148
- msg += "\nUsage: mkitc <command> [options]\n\n"
149
- msg += "Micro k8s on Ruby - a simple tool to mimic a (very) minimalistic k8 cluster\n\n"
150
- msg += "Commands:\n\n"
151
- dict.each do |c|
152
- msg += format("%-10s %s\n", c[:cmd], c[:help])
153
- end
154
- msg += "\n"
155
- msg += "Run 'mkitc help <command>' for specific command information.\n\n"
156
- else
157
- msg += format("\nUsage: mkitc %s %s\n\n", my_cmd[:cmd], my_cmd[:usage].nil? ? '' : my_cmd[:usage].join(' '))
158
- msg += format("%s\n", my_cmd[:help])
159
- unless my_cmd[:options].nil?
160
- msg += "\nOptions:\n"
161
- my_cmd[:options].each do |c|
162
- msg += format("%-10s %s\n", c[:cmd], c[:help])
163
- end
164
- end
165
- msg += "\n"
166
- end
167
- puts msg
168
- exit 1
167
+ class MKItClient
168
+ def initialize
169
+ @root = File.expand_path('..', __dir__)
170
+ @config_dir = "#{ENV['HOME']}/.mkit"
171
+ @profile_file = "#{@config_dir}/current"
172
+ @commands = CommandPalette.new
173
+ create_default_config
169
174
  end
170
175
 
171
- def create(request, request_hash = nil)
172
- unless File.file?(request_hash[:file])
173
- raise InvalidParametersException.new('File not found.', c = dict.select { |k| k[:cmd] == 'create' }.first)
176
+ def create_default_config
177
+ unless File.exist?(@config_dir)
178
+ puts "Creating config directory on '#{@config_dir}'..."
179
+ FileUtils.mkdir_p(@config_dir)
174
180
  end
181
+ FileUtils.cp("#{@root}/config/mkitc_config.yml", @config_dir) unless File.exist?("#{@config_dir}/mkitc_config.yml")
182
+ profile({ verb: 'set' }, { profile_name: 'local' }) unless File.exist?(@profile_file)
183
+ end
175
184
 
176
- yaml = YAML.load_file(request_hash[:file])
177
- if yaml['service'].nil?
178
- raise InvalidParametersException.new('Invalid configuration file', c = dict.select { |k| k[:cmd] == 'create' }.first)
179
- else
180
- request(request, request_hash)
185
+ def read_configuration
186
+ current_profile = File.read(@profile_file)
187
+ if current_profile.nil? || current_profile.empty?
188
+ # force set default
189
+ profile({ verb: 'set' }, { profile_name: 'local' })
190
+ current_profile = 'local'
181
191
  end
182
- end
192
+ cfg = YAML.load_file("#{@config_dir}/mkitc_config.yml")
183
193
 
184
- def update(request, request_hash = nil)
185
- unless File.file?(request_hash[:file])
186
- raise InvalidParametersException.new('File not found.', c = dict.select { |k| k[:cmd] == 'update' }.first)
194
+ if cfg['mkit'].nil? || cfg['mkit'][current_profile.lstrip].nil?
195
+ raise InvalidParametersException, "invalid configuration found on '~/.mkit' or profile not found"
187
196
  end
188
197
 
189
- yaml = YAML.load_file(request_hash[:file])
190
- if yaml['service'].nil?
191
- raise InvalidParametersException.new('Invalid configuration file', c = dict.select { |k| k[:cmd] == 'update' }.first)
198
+ @configuration = cfg['mkit'][current_profile.lstrip]
199
+ end
200
+
201
+ def client
202
+ read_configuration
203
+ uri = URI(@configuration['server.uri'])
204
+ case uri.scheme
205
+ when 'https'
206
+ @client = NetX::HTTPUnix.new(uri.host, uri.port)
207
+ @client.use_ssl = true
208
+ @client.verify_mode = OpenSSL::SSL::VERIFY_NONE
209
+ when 'http'
210
+ @client = NetX::HTTPUnix.new(uri.host, uri.port)
211
+ when 'sock'
212
+ @client = NetX::HTTPUnix.new("unix://#{uri.path}")
192
213
  else
193
- id = yaml['service']['name']
194
- request_hash[:id] = id
195
- request(request, request_hash)
214
+ raise InvalidParametersException, 'Invalid mkit server uri. Please check configuration'
196
215
  end
216
+ @client
217
+ end
218
+
219
+ def dict
220
+ @commands.schema
221
+ end
222
+
223
+ def find_command(cmd)
224
+ dict.select { |k| k[:cmd] == cmd }.first
197
225
  end
198
226
 
199
227
  def parse_args(args)
@@ -202,55 +230,35 @@ class MKItClient
202
230
  # short circuit for help
203
231
  if cmd == 'help' || args.empty?
204
232
  if args.size > 1
205
- c = dict.select { |k| k[:cmd] == args[1] }.first
233
+ c = find_command(args[1])
206
234
  raise InvalidParametersException, "'#{args[1]}' is not a valid help topic." if c.nil?
207
235
  end
208
236
  return help(cmd: c)
209
237
  else
210
- c = dict.select { |k| k[:cmd] == cmd }.first
238
+ c = find_command(cmd)
211
239
  end
212
240
  raise InvalidParametersException, 'Command not found' if c.nil?
213
241
 
242
+ command = c
214
243
  myargs = args.dup
215
244
  myargs.delete(cmd)
216
245
 
217
- max_args_size = c[:args].nil? ? 0 : c[:args].size
218
- max_options_size = c[:options].nil? ? 0 : 1
219
- max_args_size += max_options_size
220
-
221
- min_args_size = c[:args].nil? ? 0 : c[:args].select { |a| a[:mandatory] == true }.size
222
- min_options_size = c[:options].nil? ? 0 : 1
223
- min_args_size += min_options_size
224
-
225
- if myargs.size > max_args_size || myargs.size < min_args_size
226
- raise InvalidParametersException.new('Invalid parameters found.', c)
227
- end
228
-
229
246
  request_hash = {}
230
- request = c[:request]
247
+ request = command[:request]
231
248
  unless myargs.empty?
232
- unless c[:args].nil?
233
- idx = 0
234
- c[:args].each do |a|
235
- request_hash[a[:name].to_sym] = myargs[idx]
236
- request[:uri] = request[:uri] + a[:uri] unless a[:uri].nil?
237
- idx += 1
238
- end
239
- end
240
249
  # options
241
250
  unless c[:options].nil?
242
- option = nil
243
- myargs.each do |s|
244
- option = c[:options].select { |o| o[:cmd] == s }.first
245
- raise InvalidParametersException.new('Invalid parameters found.', c) if option.nil? || option.empty?
246
- end
247
- raise InvalidParametersException.new('Invalid parameters found.', c) if option.nil? || option.empty?
251
+ command = c[:options].select { |o| o[:cmd] == myargs[0] }.first
252
+ raise InvalidParametersException.new('Invalid parameters found.', c) if command.nil? || command.empty?
248
253
 
249
- request = option[:request]
254
+ myargs.delete_at(0)
255
+ request = command[:request]
250
256
  end
257
+ fill_cmd_args(command[:args], myargs, request, request_hash)
251
258
  end
252
- raise InvalidParametersException, "Can't find request." if request.nil?
259
+ raise InvalidParametersException.new('Invalid command or parameters.', c) if request.nil?
253
260
 
261
+ validate_command(command, request_hash)
254
262
  if respond_to? c[:cmd]
255
263
  send(c[:cmd], request, request_hash)
256
264
  else
@@ -258,11 +266,25 @@ class MKItClient
258
266
  end
259
267
  end
260
268
 
261
- def doIt(args)
262
- result = parse_args(args)
263
- puts result
264
- rescue InvalidParametersException => e
265
- help(cause: e)
269
+ def fill_cmd_args(args, myargs, request, request_hash)
270
+ return if args.nil?
271
+
272
+ idx = 0
273
+ args.each do |a|
274
+ request_hash[a[:name].to_sym] = myargs[idx]
275
+ request[:uri] = request[:uri] + a[:uri] unless a[:uri].nil?
276
+ idx += 1
277
+ end
278
+ end
279
+
280
+ def validate_command(command, request_hash)
281
+ return if command[:args].nil?
282
+
283
+ command[:args].select { |a| a[:mandatory] == true }.each do |a|
284
+ if request_hash[a[:name].to_sym].nil?
285
+ raise InvalidParametersException.new("Missing mandatory parameter: #{a[:name]}", command)
286
+ end
287
+ end
266
288
  end
267
289
 
268
290
  def request(request, request_args = nil)
@@ -295,7 +317,7 @@ class MKItClient
295
317
  when :delete
296
318
  req = Net::HTTP::Delete.new(uri)
297
319
  end
298
- @client.request(req).body
320
+ client.request(req).body
299
321
  end
300
322
 
301
323
  def attach(file)
@@ -309,6 +331,106 @@ class MKItClient
309
331
  body << "\r\n--#{boundary}--\r\n"
310
332
  [body.join, boundary]
311
333
  end
334
+
335
+ def doIt(args)
336
+ result = parse_args(args)
337
+ puts result
338
+ rescue InvalidParametersException => e
339
+ help(cause: e)
340
+ end
341
+
342
+ def help(cause: nil, cmd: nil)
343
+ msg = ''
344
+ if cause.nil?
345
+ my_cmd = cmd
346
+ else
347
+ msg += "MKItc: #{cause.message}\n"
348
+ my_cmd = cause.command
349
+ end
350
+ if my_cmd.nil?
351
+ msg += "\nUsage: mkitc <command> [options]\n\n"
352
+ msg += "Micro k8s on Ruby - a simple tool to mimic a (very) minimalistic k8 cluster\n\n"
353
+ msg += "Commands:\n\n"
354
+ dict.each do |c|
355
+ msg += format("%-10s %s\n", c[:cmd], c[:help])
356
+ end
357
+ msg += "\n"
358
+ msg += "Run 'mkitc help <command>' for specific command information.\n\n"
359
+ else
360
+ msg += format("\nUsage: mkitc %s %s\n\n", my_cmd[:cmd], my_cmd[:usage].nil? ? '' : my_cmd[:usage].join(' '))
361
+ msg += format("%s\n", my_cmd[:help])
362
+ unless my_cmd[:options].nil?
363
+ msg += "\nOptions:\n"
364
+ my_cmd[:options].each do |c|
365
+ msg += format("%-10s %s\n", c[:cmd], c[:help])
366
+ end
367
+ end
368
+ msg += "\n"
369
+ end
370
+ puts msg
371
+ exit 1
372
+ end
373
+
374
+ def create(request, request_hash = nil)
375
+ unless File.file?(request_hash[:file])
376
+ raise InvalidParametersException.new('File not found.', find_command('create'))
377
+ end
378
+
379
+ yaml = YAML.load_file(request_hash[:file])
380
+ if yaml['service'].nil?
381
+ raise InvalidParametersException.new('Invalid configuration file', find_command('create'))
382
+ else
383
+ request(request, request_hash)
384
+ end
385
+ end
386
+
387
+ def update(request, request_hash = nil)
388
+ unless File.file?(request_hash[:file])
389
+ raise InvalidParametersException.new('File not found.', find_command('update'))
390
+ end
391
+
392
+ yaml = YAML.load_file(request_hash[:file])
393
+ if yaml['service'].nil?
394
+ raise InvalidParametersException.new('Invalid configuration file', find_command('update'))
395
+ else
396
+ id = yaml['service']['name']
397
+ request_hash[:id] = id
398
+ request(request, request_hash)
399
+ end
400
+ end
401
+
402
+ def profile(request, request_hash = {})
403
+ cfg = YAML.load_file("#{@config_dir}/mkitc_config.yml")
404
+ cmd = find_command('profile')
405
+ if cfg['mkit'].nil?
406
+ raise InvalidParametersException.new(
407
+ "Invalid configuration on '~/.mkit'\nPlease fix or clean up for defaults apply", cmd
408
+ )
409
+ end
410
+
411
+ case request[:verb]
412
+ when 'set'
413
+ profile = request_hash[:profile_name]
414
+ if cfg['mkit'][profile.lstrip].nil?
415
+ raise InvalidParametersException.new("Profile not found on '~/.mkit' configuration", cmd)
416
+ end
417
+
418
+ puts "Setting current profile to #{profile}."
419
+ File.write(@profile_file, request_hash[:profile_name])
420
+ ''
421
+ when 'show'
422
+ active = File.read("#{@config_dir}/current")
423
+ cfg['mkit'].map do |k, _v|
424
+ if k == active
425
+ "*#{k}"
426
+ else
427
+ k
428
+ end
429
+ end.join(' ')
430
+ else
431
+ raise InvalidParametersException.new("Invalid 'profile' operation", cmd)
432
+ end
433
+ end
312
434
  end
313
435
 
314
436
  #
@@ -0,0 +1,3 @@
1
+ mkit:
2
+ local:
3
+ server.uri: http://localhost:4567
@@ -1,5 +1,5 @@
1
1
  #
2
- # kidsd server options (for systemd unit | daemontools)
2
+ # mkitd server options (for systemd unit | daemontools)
3
3
  #
4
4
  OPTIONS=""
5
5
 
@@ -31,6 +31,11 @@ class ServicesController < MKIt::Server
31
31
  resp
32
32
  end
33
33
 
34
+ get '/services/:id/logs' do
35
+ srv = find_by_id_or_name
36
+ srv.log
37
+ end
38
+
34
39
  # curl -X PUT localhost:4567/services/1 -F "file=@mkit/samples/mkit.yml"
35
40
  put '/services/:id' do
36
41
  srv = find_by_id_or_name
@@ -31,6 +31,13 @@ module MKIt
31
31
  MKIt::CmdRunner.run("docker exec -it #{instance_id} #{cmd}")
32
32
  end
33
33
 
34
+ #
35
+ # logs
36
+ #
37
+ def logs(instance_id)
38
+ `docker logs -n 20 #{instance_id}`
39
+ end
40
+
34
41
  #
35
42
  # network
36
43
  #
@@ -8,14 +8,10 @@ module MKIt
8
8
  table.head = %w[id name addr ports pods status]
9
9
  if data.respond_to? 'each'
10
10
  data.each do |srv|
11
- ports = srv.service_port&.each.map { |p| "#{p.mode}/#{p.external_port}" }.join(',')
12
- pods = srv.pod.each.map { |p| p.name.to_s }.join(' ')
13
- table.rows << [srv.id, srv.name, srv.lease&.ip, ports, pods, srv.status]
11
+ table.rows << build_table_row(srv)
14
12
  end
15
13
  else
16
- ports = data.service_port&.each.map { |p| "#{p.mode}/#{p.external_port}" }.join(',')
17
- pods = data.pod.each.map { |p| p.name.to_s }.join(' ')
18
- table.rows << [data.id, data.name, data.lease&.ip, ports, pods, data.status]
14
+ table.rows << build_table_row(data)
19
15
  end
20
16
  table.to_s
21
17
  end
@@ -26,5 +22,11 @@ module MKIt
26
22
  error 404, "Couldn't find Service '#{params[:id]}'\n" unless srv
27
23
  srv
28
24
  end
25
+
26
+ def build_table_row(data)
27
+ ports = data.service_port&.each.map { |p| "#{p.mode}/#{p.external_port}" }.join(',')
28
+ pods = data.pod.each.map { |p| p.name.to_s }.join(' ')
29
+ [data.id, data.name, data.lease&.ip, ports, pods, data.status]
30
+ end
29
31
  end
30
32
  end
@@ -131,7 +131,7 @@ class Service < ActiveRecord::Base
131
131
  end
132
132
 
133
133
  def create_pods_network
134
- create_network(self.pods_network) if !network_exists?(self.pods_network)
134
+ create_network(self.pods_network) unless network_exists?(self.pods_network)
135
135
  end
136
136
 
137
137
  def deploy_network
@@ -237,6 +237,15 @@ class Service < ActiveRecord::Base
237
237
  }
238
238
  end
239
239
 
240
+ def log
241
+ out = ""
242
+ self.pod.each { |p|
243
+ out << "<<<< %s | %s >>>>\n" % [self.name, p.name]
244
+ puts logs(p.name)
245
+ out << logs(p.name)
246
+ }
247
+ out
248
+ end
240
249
  def as_json(options = {})
241
250
  srv = super
242
251
  a=[:pod, :volume, :service_config, :service_port]
data/lib/mkit/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module MKIt
2
- VERSION = "0.4.2"
2
+ VERSION = "0.5.0"
3
3
  end
4
4
 
data/mkit.gemspec CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
9
9
  s.summary = 'Micro Kubernets on Ruby'
10
10
  s.bindir = 'bin'
11
11
  s.homepage = 'https://github.com/valexsantos/mkit'
12
- s.license = 'Apache-2.0'
12
+ s.license = 'MIT'
13
13
  s.description = 'Micro k8s on Ruby - a simple tool to deploy containers to mimic a (very) minimalistic k8 cluster with a nice REST API'
14
14
  # s.require_paths = ["."]
15
15
  s.author = 'Vasco Santos'
@@ -0,0 +1,21 @@
1
+ #
2
+ service:
3
+ name: kafka-cluster
4
+ network: kafka-cluster
5
+ image: confluentinc/cp-kafka:7.1.6
6
+ ports:
7
+ - 9092:9092:tcp:round_robin
8
+ volumes:
9
+ - docker://kafka_cluster_secrets:/etc/kafka/secrets
10
+ - docker://kafka_cluster_data:/var/lib/kafka/data
11
+ environment:
12
+ KAFKA_BROKER_ID: 1
13
+ KAFKA_ZOOKEEPER_CONNECT: kafka-zookeeper:2181
14
+ KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"
15
+ KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-cluster:9092
16
+ KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT
17
+ # KAFKA_CONFLUENT_SCHEMA_REGISTRY_URL: http://kafka-schema-registry
18
+ KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
19
+ KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
20
+ KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
21
+
@@ -0,0 +1,16 @@
1
+ #
2
+ service:
3
+ name: kafka-magic
4
+ network: kafka-cluster
5
+ ports:
6
+ - 80:80:http:round_robin
7
+ image: digitsy/kafka-magic
8
+ environment:
9
+ KMAGIC_ALLOW_TOPIC_DELETE: "true"
10
+ KMAGIC_ALLOW_SCHEMA_DELETE: "true"
11
+ KMAGIC_CONFIG_STORE_TYPE: "file"
12
+ KMAGIC_CONFIG_STORE_CONNECTION: "Data Source=/config/KafkaMagicConfig.db;"
13
+ KMAGIC_CONFIG_ENCRYPTION_KEY: "123456"
14
+ volumes:
15
+ - docker://kafka_magic_config:/config
16
+
@@ -0,0 +1,15 @@
1
+ #
2
+ service:
3
+ name: kafka-zookeeper
4
+ image: confluentinc/cp-zookeeper:7.1.6
5
+ network: kafka-cluster
6
+ ports:
7
+ - 2181:2181:tcp:round_robin
8
+ volumes:
9
+ - docker://kafka_zookeeper_secrets:/etc/zookeeper/secrets
10
+ - docker://kafka_zookeeper_data:/var/lib/zookeeper/data
11
+ - docker://kafka_zookeeper_log:/var/lib/zookeeper/log
12
+ environment:
13
+ ZOOKEEPER_CLIENT_PORT: 2181
14
+ ZOOKEEPER_TICK_TIME: 2000
15
+
@@ -0,0 +1,16 @@
1
+ #
2
+ service:
3
+ name: minio
4
+ image: minio/minio
5
+ command: server /data --console-address ":9001"
6
+ network: bridge
7
+ ports:
8
+ - 9001:9001:http:round_robin
9
+ - 9000:9000:tcp:round_robin
10
+ environment:
11
+ MINIO_ACCESS_KEY: minio
12
+ MINIO_SECRET_KEY: minio123
13
+ volumes:
14
+ #- docker://minio_data:/data
15
+ - /tmp/minio_data:/data
16
+
@@ -0,0 +1,9 @@
1
+ #
2
+ service:
3
+ name: mongo
4
+ image: mongo:4.0
5
+ command: "--smallfiles"
6
+ network: bridge
7
+ ports:
8
+ - 27017:27017:tcp:round_robin
9
+
@@ -0,0 +1,13 @@
1
+ #
2
+ service:
3
+ name: nexus
4
+ image: sonatype/nexus3
5
+ network: bridge
6
+ ports:
7
+ - 80:8081:http:round_robin
8
+ resources:
9
+ max_replicas: 1
10
+ min_replicas: 1
11
+ volumes:
12
+ - docker://nexus_data:/nexus-data
13
+
@@ -0,0 +1,11 @@
1
+ #
2
+ service:
3
+ name: redis-sentinel
4
+ image: bitnami/redis-sentinel:latest
5
+ network: bridge
6
+ ports:
7
+ - 26379:26379:tcp:round_robin
8
+ environment:
9
+ REDIS_MASTER_HOST: redis
10
+
11
+
@@ -0,0 +1,9 @@
1
+ #
2
+ service:
3
+ name: redis
4
+ image: redis:4.0-alpine
5
+ network: bridge
6
+ ports:
7
+ - 6379:6379:tcp:round_robin
8
+
9
+
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.2
4
+ version: 0.5.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-02-02 00:00:00.000000000 Z
11
+ date: 2024-02-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async-dns
@@ -300,6 +300,7 @@ executables:
300
300
  extensions: []
301
301
  extra_rdoc_files: []
302
302
  files:
303
+ - ".github/workflows/publish.yml"
303
304
  - ".rubocop.yml"
304
305
  - Gemfile
305
306
  - Gemfile.lock
@@ -310,6 +311,7 @@ files:
310
311
  - bin/mkitd
311
312
  - config/database.yml
312
313
  - config/mkit_config.yml
314
+ - config/mkitc_config.yml
313
315
  - config/mkitd_config.sh
314
316
  - db/migrate/001_setup.rb
315
317
  - db/migrate/002_mkit_jobs.rb
@@ -365,14 +367,22 @@ files:
365
367
  - lib/mkit/workers/worker_manager.rb
366
368
  - mkit.gemspec
367
369
  - mkitd
370
+ - samples/apps/kafka-cluster.yml
371
+ - samples/apps/kafka-magic.yml
372
+ - samples/apps/kafka-zookeeper.yml
373
+ - samples/apps/minio.yml
374
+ - samples/apps/mongo.yml
375
+ - samples/apps/nexus.yml
368
376
  - samples/apps/postgres.yml
369
377
  - samples/apps/rabbitmq.yml
378
+ - samples/apps/redis-sentinel.yml
379
+ - samples/apps/redis.yml
370
380
  - samples/daemontools/log/run
371
381
  - samples/daemontools/run
372
382
  - samples/systemd/mkitd.service
373
383
  homepage: https://github.com/valexsantos/mkit
374
384
  licenses:
375
- - Apache-2.0
385
+ - MIT
376
386
  metadata: {}
377
387
  post_install_message:
378
388
  rdoc_options: []