mkit 0.4.1 → 0.4.2
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/.rubocop.yml +10 -0
- data/Gemfile +12 -10
- data/Gemfile.lock +3 -0
- data/README.md +32 -21
- data/Rakefile +16 -15
- data/bin/mkitc +249 -84
- data/bin/mkitd +3 -6
- data/config/mkit_config.yml +5 -5
- data/db/migrate/001_setup.rb +5 -5
- data/db/migrate/002_mkit_jobs.rb +2 -3
- data/db/schema.rb +76 -75
- data/lib/mkit/app/controllers/mkit_controller.rb +25 -0
- data/lib/mkit/app/controllers/mkitjobs_controller.rb +4 -5
- data/lib/mkit/app/controllers/pods_controller.rb +4 -5
- data/lib/mkit/app/controllers/services_controller.rb +19 -13
- data/lib/mkit/app/helpers/docker_helper.rb +4 -3
- data/lib/mkit/app/helpers/erb_helper.rb +4 -2
- data/lib/mkit/app/helpers/services_helper.rb +17 -41
- data/lib/mkit/app/mkit_server.rb +2 -0
- data/lib/mkit/version.rb +1 -1
- data/lib/mkit.rb +46 -47
- data/mkit.gemspec +33 -35
- metadata +54 -52
data/db/migrate/001_setup.rb
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
class Setup < ActiveRecord::Migration[5.1]
|
|
3
4
|
def up
|
|
4
5
|
create_table :services do |t|
|
|
5
6
|
t.string :name
|
|
@@ -16,7 +17,7 @@ class Setup < ActiveRecord::Migration[5.1]
|
|
|
16
17
|
t.timestamp :updated_at
|
|
17
18
|
end
|
|
18
19
|
|
|
19
|
-
add_index
|
|
20
|
+
add_index 'services', ['name'], name: 'services_name_id'
|
|
20
21
|
|
|
21
22
|
create_table :service_configs do |t|
|
|
22
23
|
t.string :service_id
|
|
@@ -82,10 +83,10 @@ class Setup < ActiveRecord::Migration[5.1]
|
|
|
82
83
|
end
|
|
83
84
|
|
|
84
85
|
# mkit configs
|
|
85
|
-
# e.g.
|
|
86
|
+
# e.g.
|
|
86
87
|
# default network pool
|
|
87
88
|
# rabbitmq address
|
|
88
|
-
# haproxy
|
|
89
|
+
# haproxy
|
|
89
90
|
# config.d path
|
|
90
91
|
# reload command - pq quero usar o daemontools
|
|
91
92
|
# stop
|
|
@@ -102,4 +103,3 @@ class Setup < ActiveRecord::Migration[5.1]
|
|
|
102
103
|
drop_table :services
|
|
103
104
|
end
|
|
104
105
|
end
|
|
105
|
-
|
data/db/migrate/002_mkit_jobs.rb
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
class MkitJobs < ActiveRecord::Migration[5.1]
|
|
3
4
|
def up
|
|
4
5
|
create_table :mkit_jobs do |t|
|
|
5
6
|
t.string :topic
|
|
@@ -12,6 +13,4 @@ class MkitJobs < ActiveRecord::Migration[5.1]
|
|
|
12
13
|
t.timestamp :updated_at
|
|
13
14
|
end
|
|
14
15
|
end
|
|
15
|
-
|
|
16
16
|
end
|
|
17
|
-
|
data/db/schema.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
# This file is auto-generated from the current state of the database. Instead
|
|
2
4
|
# of editing this file, please use the migrations feature of Active Record to
|
|
3
5
|
# incrementally modify your database, and then regenerate this schema definition.
|
|
@@ -11,98 +13,97 @@
|
|
|
11
13
|
# It's strongly recommended that you check this file into your version control system.
|
|
12
14
|
|
|
13
15
|
ActiveRecord::Schema[7.0].define(version: 2) do
|
|
14
|
-
create_table
|
|
15
|
-
t.string
|
|
16
|
-
t.string
|
|
17
|
-
t.string
|
|
18
|
-
t.string
|
|
19
|
-
t.string
|
|
16
|
+
create_table 'dns_hosts', force: :cascade do |t|
|
|
17
|
+
t.string 'service_id'
|
|
18
|
+
t.string 'pod_id'
|
|
19
|
+
t.string 'name'
|
|
20
|
+
t.string 'ip'
|
|
21
|
+
t.string 'ipv6'
|
|
20
22
|
end
|
|
21
23
|
|
|
22
|
-
create_table
|
|
23
|
-
t.string
|
|
24
|
-
t.string
|
|
25
|
-
t.string
|
|
26
|
-
t.string
|
|
27
|
-
t.string
|
|
28
|
-
t.string
|
|
29
|
-
t.datetime
|
|
24
|
+
create_table 'leases', force: :cascade do |t|
|
|
25
|
+
t.string 'pool_id'
|
|
26
|
+
t.string 'service_id'
|
|
27
|
+
t.string 'interface_name'
|
|
28
|
+
t.string 'interface_type'
|
|
29
|
+
t.string 'status'
|
|
30
|
+
t.string 'ip'
|
|
31
|
+
t.datetime 'expires_at', precision: nil
|
|
30
32
|
end
|
|
31
33
|
|
|
32
|
-
create_table
|
|
33
|
-
t.string
|
|
34
|
-
t.string
|
|
35
|
-
t.string
|
|
36
|
-
t.string
|
|
37
|
-
t.string
|
|
38
|
-
t.string
|
|
39
|
-
t.datetime
|
|
40
|
-
t.datetime
|
|
34
|
+
create_table 'mkit_jobs', force: :cascade do |t|
|
|
35
|
+
t.string 'topic'
|
|
36
|
+
t.string 'service_id'
|
|
37
|
+
t.string 'pod_id'
|
|
38
|
+
t.string 'status'
|
|
39
|
+
t.string 'retries'
|
|
40
|
+
t.string 'payload'
|
|
41
|
+
t.datetime 'created_at', precision: nil
|
|
42
|
+
t.datetime 'updated_at', precision: nil
|
|
41
43
|
end
|
|
42
44
|
|
|
43
|
-
create_table
|
|
44
|
-
t.string
|
|
45
|
-
t.string
|
|
46
|
-
t.string
|
|
47
|
-
t.string
|
|
48
|
-
t.string
|
|
49
|
-
t.string
|
|
45
|
+
create_table 'pods', force: :cascade do |t|
|
|
46
|
+
t.string 'service_id'
|
|
47
|
+
t.string 'pod_id'
|
|
48
|
+
t.string 'name'
|
|
49
|
+
t.string 'ip'
|
|
50
|
+
t.string 'image'
|
|
51
|
+
t.string 'status'
|
|
50
52
|
end
|
|
51
53
|
|
|
52
|
-
create_table
|
|
53
|
-
t.string
|
|
54
|
-
t.string
|
|
55
|
-
t.string
|
|
56
|
-
t.string
|
|
57
|
-
t.string
|
|
58
|
-
t.boolean
|
|
54
|
+
create_table 'pools', force: :cascade do |t|
|
|
55
|
+
t.string 'name'
|
|
56
|
+
t.string 'ip'
|
|
57
|
+
t.string 'range'
|
|
58
|
+
t.string 'netmask'
|
|
59
|
+
t.string 'status'
|
|
60
|
+
t.boolean 'preferred', default: false
|
|
59
61
|
end
|
|
60
62
|
|
|
61
|
-
create_table
|
|
62
|
-
t.string
|
|
63
|
-
t.string
|
|
64
|
-
t.string
|
|
65
|
-
t.string
|
|
66
|
-
t.string
|
|
63
|
+
create_table 'service_configs', force: :cascade do |t|
|
|
64
|
+
t.string 'service_id'
|
|
65
|
+
t.string 'key'
|
|
66
|
+
t.string 'value'
|
|
67
|
+
t.string 'ctype'
|
|
68
|
+
t.string 'version'
|
|
67
69
|
end
|
|
68
70
|
|
|
69
|
-
create_table
|
|
70
|
-
t.string
|
|
71
|
-
t.string
|
|
72
|
-
t.string
|
|
73
|
-
t.string
|
|
74
|
-
t.string
|
|
75
|
-
t.string
|
|
71
|
+
create_table 'service_ports', force: :cascade do |t|
|
|
72
|
+
t.string 'service_id'
|
|
73
|
+
t.string 'internal_port'
|
|
74
|
+
t.string 'external_port'
|
|
75
|
+
t.string 'mode'
|
|
76
|
+
t.string 'load_bal'
|
|
77
|
+
t.string 'version'
|
|
76
78
|
end
|
|
77
79
|
|
|
78
|
-
create_table
|
|
79
|
-
t.string
|
|
80
|
-
t.string
|
|
81
|
-
t.string
|
|
82
|
-
t.string
|
|
83
|
-
t.integer
|
|
84
|
-
t.integer
|
|
85
|
-
t.string
|
|
86
|
-
t.string
|
|
87
|
-
t.string
|
|
88
|
-
t.string
|
|
89
|
-
t.datetime
|
|
90
|
-
t.datetime
|
|
91
|
-
t.index [
|
|
80
|
+
create_table 'services', force: :cascade do |t|
|
|
81
|
+
t.string 'name'
|
|
82
|
+
t.string 'image'
|
|
83
|
+
t.string 'qdm'
|
|
84
|
+
t.string 'command'
|
|
85
|
+
t.integer 'max_replicas', default: 1
|
|
86
|
+
t.integer 'min_replicas', default: 1
|
|
87
|
+
t.string 'lease_id'
|
|
88
|
+
t.string 'pods_network', default: 'mkit'
|
|
89
|
+
t.string 'version'
|
|
90
|
+
t.string 'status'
|
|
91
|
+
t.datetime 'created_at', precision: nil, default: '2023-12-28 12:41:59'
|
|
92
|
+
t.datetime 'updated_at', precision: nil
|
|
93
|
+
t.index ['name'], name: 'services_name_id'
|
|
92
94
|
end
|
|
93
95
|
|
|
94
|
-
create_table
|
|
95
|
-
t.string
|
|
96
|
-
t.string
|
|
96
|
+
create_table 'settings', force: :cascade do |t|
|
|
97
|
+
t.string 'key'
|
|
98
|
+
t.string 'value'
|
|
97
99
|
end
|
|
98
100
|
|
|
99
|
-
create_table
|
|
100
|
-
t.string
|
|
101
|
-
t.string
|
|
102
|
-
t.string
|
|
103
|
-
t.string
|
|
104
|
-
t.string
|
|
105
|
-
t.string
|
|
101
|
+
create_table 'volumes', force: :cascade do |t|
|
|
102
|
+
t.string 'service_id'
|
|
103
|
+
t.string 'name'
|
|
104
|
+
t.string 'path'
|
|
105
|
+
t.string 'ctype'
|
|
106
|
+
t.string 'status'
|
|
107
|
+
t.string 'version'
|
|
106
108
|
end
|
|
107
|
-
|
|
108
109
|
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'mkit/version'
|
|
4
|
+
|
|
5
|
+
class MkitController < MKIt::Server
|
|
6
|
+
get '/mkit/version' do
|
|
7
|
+
"MKIt version #{MKIt::VERSION}\n"
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
put '/mkit/proxy/restart' do
|
|
11
|
+
MKIt::HAProxy.restart
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
put '/mkit/proxy/start' do
|
|
15
|
+
MKIt::HAProxy.start
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
put '/mkit/proxy/stop' do
|
|
19
|
+
MKIt::HAProxy.stop
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
get '/mkit/proxy/status' do
|
|
23
|
+
MKIt::HAProxy.status
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'mkit/app/model/mkit_job'
|
|
2
4
|
|
|
3
5
|
class MkitJobsController < MKIt::Server
|
|
4
|
-
|
|
5
6
|
# curl localhost:4567/mkitjobs
|
|
6
7
|
get '/mkitjobs' do
|
|
7
8
|
JSON.pretty_generate(JSON.parse(MkitJob.all.to_json))
|
|
@@ -24,14 +25,12 @@ class MkitJobsController < MKIt::Server
|
|
|
24
25
|
end
|
|
25
26
|
|
|
26
27
|
post '/mkitjobs' do
|
|
27
|
-
xx =
|
|
28
|
+
xx = 'no file'
|
|
28
29
|
if params[:file]
|
|
29
30
|
tempfile = params[:file][:tempfile]
|
|
30
|
-
xx= YAML.
|
|
31
|
+
xx = YAML.safe_load(tempfile.read)
|
|
31
32
|
puts xx
|
|
32
33
|
end
|
|
33
34
|
JSON.pretty_generate(JSON.parse(xx.to_json))
|
|
34
35
|
end
|
|
35
|
-
|
|
36
36
|
end
|
|
37
|
-
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
class PodsController < MKIt::Server
|
|
3
4
|
get '/services/:service_id/pods' do
|
|
4
5
|
"Not implemented\n"
|
|
5
6
|
end
|
|
@@ -17,14 +18,12 @@ class PodsController < MKIt::Server
|
|
|
17
18
|
end
|
|
18
19
|
|
|
19
20
|
post '/services/:service_id/pods' do
|
|
20
|
-
xx =
|
|
21
|
+
xx = 'no file'
|
|
21
22
|
if params[:file]
|
|
22
23
|
tempfile = params[:file][:tempfile]
|
|
23
|
-
xx= YAML.
|
|
24
|
+
xx = YAML.safe_load(tempfile.read)
|
|
24
25
|
puts xx
|
|
25
26
|
end
|
|
26
27
|
JSON.pretty_generate(JSON.parse(xx.to_json))
|
|
27
28
|
end
|
|
28
|
-
|
|
29
29
|
end
|
|
30
|
-
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'mkit/app/model/service'
|
|
2
4
|
require 'mkit/app/helpers/services_helper'
|
|
3
5
|
|
|
@@ -6,11 +8,8 @@ class ServicesController < MKIt::Server
|
|
|
6
8
|
|
|
7
9
|
# curl localhost:4567/services
|
|
8
10
|
get '/services' do
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
else
|
|
12
|
-
verbose = false
|
|
13
|
-
end
|
|
11
|
+
verbose = params[:verbose] == 'true'
|
|
12
|
+
|
|
14
13
|
if params[:id]
|
|
15
14
|
redirect "/services/#{params[:id]}"
|
|
16
15
|
elsif params[:name]
|
|
@@ -24,11 +23,11 @@ class ServicesController < MKIt::Server
|
|
|
24
23
|
|
|
25
24
|
get '/services/:id' do
|
|
26
25
|
srv = find_by_id_or_name
|
|
27
|
-
if request.env['CONTENT_TYPE'] == 'application/json'
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
26
|
+
resp = if request.env['CONTENT_TYPE'] == 'application/json'
|
|
27
|
+
srv.to_json
|
|
28
|
+
else
|
|
29
|
+
format_response(srv)
|
|
30
|
+
end
|
|
32
31
|
resp
|
|
33
32
|
end
|
|
34
33
|
|
|
@@ -37,7 +36,7 @@ class ServicesController < MKIt::Server
|
|
|
37
36
|
srv = find_by_id_or_name
|
|
38
37
|
if params[:file]
|
|
39
38
|
tempfile = params[:file][:tempfile]
|
|
40
|
-
yaml = YAML.
|
|
39
|
+
yaml = YAML.safe_load(tempfile.read)
|
|
41
40
|
srv.update!(yaml.to_o)
|
|
42
41
|
end
|
|
43
42
|
format_response(srv)
|
|
@@ -52,10 +51,10 @@ class ServicesController < MKIt::Server
|
|
|
52
51
|
|
|
53
52
|
# curl -X POST localhost:4567/services -F "file=@mkit/samples/mkit.yml"
|
|
54
53
|
post '/services' do
|
|
55
|
-
srv =
|
|
54
|
+
srv = 'no file'
|
|
56
55
|
if params[:file]
|
|
57
56
|
tempfile = params[:file][:tempfile]
|
|
58
|
-
yaml = YAML.
|
|
57
|
+
yaml = YAML.safe_load(tempfile.read)
|
|
59
58
|
srv = Service.create(yaml.to_o)
|
|
60
59
|
end
|
|
61
60
|
format_response(srv)
|
|
@@ -77,4 +76,11 @@ class ServicesController < MKIt::Server
|
|
|
77
76
|
MkitJob.publish(topic: :stop_service, service_id: srv.id)
|
|
78
77
|
format_response(srv)
|
|
79
78
|
end
|
|
79
|
+
|
|
80
|
+
put '/services/:id/restart' do
|
|
81
|
+
srv = find_by_id_or_name
|
|
82
|
+
MkitJob.publish(topic: :stop_service, service_id: srv.id)
|
|
83
|
+
MkitJob.publish(topic: :start_service, service_id: srv.id)
|
|
84
|
+
format_response(srv)
|
|
85
|
+
end
|
|
80
86
|
end
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'mkit/cmd_runner'
|
|
2
4
|
|
|
3
5
|
module MKIt
|
|
4
6
|
module DockerHelper
|
|
5
|
-
|
|
6
7
|
# from ERB template
|
|
7
8
|
def create_instance(cmd)
|
|
8
9
|
MKIt::CmdRunner.run(cmd)
|
|
@@ -22,7 +23,7 @@ module MKIt
|
|
|
22
23
|
|
|
23
24
|
def inspect_instance(instance_id)
|
|
24
25
|
# this one does not work on ubunto MKIt::CmdRunner.run("docker inspect #{instance_id}")
|
|
25
|
-
x =
|
|
26
|
+
x = `docker inspect #{instance_id}`
|
|
26
27
|
JSON.parse(x).first
|
|
27
28
|
end
|
|
28
29
|
|
|
@@ -39,7 +40,7 @@ module MKIt
|
|
|
39
40
|
end
|
|
40
41
|
|
|
41
42
|
def network_exists?(network_name)
|
|
42
|
-
x = MKIt::CmdRunner.run(
|
|
43
|
+
x = MKIt::CmdRunner.run('docker network ls')
|
|
43
44
|
x.match(/\b#{network_name}\b/)
|
|
44
45
|
end
|
|
45
46
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'mkit/utils'
|
|
2
4
|
|
|
3
5
|
module MKIt
|
|
@@ -6,9 +8,9 @@ module MKIt
|
|
|
6
8
|
root = MKIt::Utils.root
|
|
7
9
|
File.read("#{root}/lib/mkit/app/templates/#{template}.erb")
|
|
8
10
|
end
|
|
9
|
-
|
|
11
|
+
|
|
10
12
|
def parse_template(template, data = {})
|
|
11
|
-
|
|
13
|
+
ERB.new(read_template(template)).result_with_hash(data)
|
|
12
14
|
end
|
|
13
15
|
|
|
14
16
|
def parse_model(template)
|
|
@@ -1,54 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'text-table'
|
|
1
4
|
module MKIt
|
|
2
5
|
module ServicesHelper
|
|
3
|
-
def
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
template % data
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def format_response(data, verbose = false)
|
|
16
|
-
resp = []
|
|
17
|
-
header = _format(str_template, header_template)
|
|
18
|
-
resp << header
|
|
19
|
-
if data.respond_to?"each"
|
|
20
|
-
data.each { | srv |
|
|
21
|
-
ports = srv.service_port&.each.map { |p| "#{p.mode}/#{p.external_port}"}.join(",")
|
|
22
|
-
resp << _format(str_template, [srv.id, srv.name, srv.lease&.ip, ports, srv.status])
|
|
23
|
-
resp+=service_pods(srv) if verbose
|
|
24
|
-
}
|
|
6
|
+
def format_response(data, _verbose = false)
|
|
7
|
+
table = Text::Table.new
|
|
8
|
+
table.head = %w[id name addr ports pods status]
|
|
9
|
+
if data.respond_to? 'each'
|
|
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]
|
|
14
|
+
end
|
|
25
15
|
else
|
|
26
|
-
ports = data.service_port&.each.map { |p| "#{p.mode}/#{p.external_port}"}.join(
|
|
27
|
-
|
|
28
|
-
|
|
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]
|
|
29
19
|
end
|
|
30
|
-
|
|
31
|
-
resp.join("\n")
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def service_pods(srv)
|
|
35
|
-
resp=[]
|
|
36
|
-
resp << " pods"
|
|
37
|
-
resp << _format(" %-5s %-15s %-15s %-15s %-10s", ["id", "pod_id", "pod_name", "pod_ip", "status"])
|
|
38
|
-
srv.pod.each { |pod|
|
|
39
|
-
name = pod.name.nil? ? "" : pod.name[0..11]
|
|
40
|
-
pod_id = pod.pod_id.nil? ? "" : pod.pod_id[0..11]
|
|
41
|
-
resp << _format(" %-5s %-15s %-15s %-15s %-10s", [pod.id, pod_id, name, pod.ip, pod.status])
|
|
42
|
-
}
|
|
43
|
-
resp
|
|
20
|
+
table.to_s
|
|
44
21
|
end
|
|
45
22
|
|
|
46
23
|
def find_by_id_or_name
|
|
47
24
|
srv = Service.find_by_id(params[:id])
|
|
48
|
-
srv
|
|
25
|
+
srv ||= Service.find_by_name(params[:id])
|
|
49
26
|
error 404, "Couldn't find Service '#{params[:id]}'\n" unless srv
|
|
50
27
|
srv
|
|
51
28
|
end
|
|
52
|
-
|
|
53
29
|
end
|
|
54
30
|
end
|
data/lib/mkit/app/mkit_server.rb
CHANGED
data/lib/mkit/version.rb
CHANGED