mkit 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +21 -0
- data/Gemfile.lock +137 -0
- data/LICENSE +21 -0
- data/README.md +126 -0
- data/Rakefile +54 -0
- data/bin/mkitc +31 -0
- data/bin/mkitd +55 -0
- data/config/database.yml +5 -0
- data/config/mkit_config.yml +15 -0
- data/config/mkitd_config.sh +5 -0
- data/db/migrate/001_setup.rb +105 -0
- data/db/migrate/002_mkit_jobs.rb +17 -0
- data/db/schema.rb +108 -0
- data/lib/mkit/app/controllers/mkitjobs_controller.rb +37 -0
- data/lib/mkit/app/controllers/pods_controller.rb +30 -0
- data/lib/mkit/app/controllers/services_controller.rb +87 -0
- data/lib/mkit/app/helpers/docker_helper.rb +75 -0
- data/lib/mkit/app/helpers/erb_helper.rb +18 -0
- data/lib/mkit/app/helpers/haproxy.rb +41 -0
- data/lib/mkit/app/helpers/interface_helper.rb +17 -0
- data/lib/mkit/app/helpers/services_helper.rb +54 -0
- data/lib/mkit/app/mkit_server.rb +8 -0
- data/lib/mkit/app/model/dns_host.rb +11 -0
- data/lib/mkit/app/model/lease.rb +26 -0
- data/lib/mkit/app/model/mkit_job.rb +48 -0
- data/lib/mkit/app/model/pod.rb +95 -0
- data/lib/mkit/app/model/pool.rb +60 -0
- data/lib/mkit/app/model/service.rb +266 -0
- data/lib/mkit/app/model/service_config.rb +16 -0
- data/lib/mkit/app/model/service_port.rb +30 -0
- data/lib/mkit/app/model/setting.rb +1 -0
- data/lib/mkit/app/model/volume.rb +53 -0
- data/lib/mkit/app/templates/docker/docker_run.sh.erb +1 -0
- data/lib/mkit/app/templates/haproxy/0000_defaults.cfg +23 -0
- data/lib/mkit/app/templates/haproxy/xapp_haproxy.cfg.erb +30 -0
- data/lib/mkit/cmd_runner.rb +27 -0
- data/lib/mkit/config/config.rb +18 -0
- data/lib/mkit/config/environment.rb +26 -0
- data/lib/mkit/config/initializers/001_hash.rb +11 -0
- data/lib/mkit/config/initializers/002_openstruct.rb +7 -0
- data/lib/mkit/config/load_default_configs.rb +29 -0
- data/lib/mkit/config/the_config.yml +3 -0
- data/lib/mkit/ctypes.rb +31 -0
- data/lib/mkit/docker_listener.rb +97 -0
- data/lib/mkit/exceptions.rb +30 -0
- data/lib/mkit/haproxy.rb +48 -0
- data/lib/mkit/job_manager.rb +53 -0
- data/lib/mkit/mkit_dns.rb +54 -0
- data/lib/mkit/mkit_interface.rb +31 -0
- data/lib/mkit/sagas/asaga.rb +11 -0
- data/lib/mkit/sagas/create_pod_saga.rb +28 -0
- data/lib/mkit/sagas/saga_manager.rb +10 -0
- data/lib/mkit/status.rb +47 -0
- data/lib/mkit/utils.rb +51 -0
- data/lib/mkit/version.rb +4 -0
- data/lib/mkit/workers/aworker.rb +11 -0
- data/lib/mkit/workers/haproxy_worker.rb +35 -0
- data/lib/mkit/workers/pod_worker.rb +39 -0
- data/lib/mkit/workers/service_worker.rb +27 -0
- data/lib/mkit/workers/worker_manager.rb +14 -0
- data/lib/mkit.rb +158 -0
- data/mkit.gemspec +40 -0
- data/mkitd +10 -0
- data/samples/apps/postgres.yml +22 -0
- data/samples/apps/rabbitmq.yml +19 -0
- data/samples/daemontools/log/run +44 -0
- data/samples/daemontools/run +42 -0
- data/samples/systemd/mkitd.service +12 -0
- metadata +393 -0
data/db/schema.rb
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
# This file is auto-generated from the current state of the database. Instead
|
2
|
+
# of editing this file, please use the migrations feature of Active Record to
|
3
|
+
# incrementally modify your database, and then regenerate this schema definition.
|
4
|
+
#
|
5
|
+
# This file is the source Rails uses to define your schema when running `bin/rails
|
6
|
+
# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to
|
7
|
+
# be faster and is potentially less error prone than running all of your
|
8
|
+
# migrations from scratch. Old migrations may fail to apply correctly if those
|
9
|
+
# migrations use external dependencies or application code.
|
10
|
+
#
|
11
|
+
# It's strongly recommended that you check this file into your version control system.
|
12
|
+
|
13
|
+
ActiveRecord::Schema[7.0].define(version: 2) do
|
14
|
+
create_table "dns_hosts", force: :cascade do |t|
|
15
|
+
t.string "service_id"
|
16
|
+
t.string "pod_id"
|
17
|
+
t.string "name"
|
18
|
+
t.string "ip"
|
19
|
+
t.string "ipv6"
|
20
|
+
end
|
21
|
+
|
22
|
+
create_table "leases", force: :cascade do |t|
|
23
|
+
t.string "pool_id"
|
24
|
+
t.string "service_id"
|
25
|
+
t.string "interface_name"
|
26
|
+
t.string "interface_type"
|
27
|
+
t.string "status"
|
28
|
+
t.string "ip"
|
29
|
+
t.datetime "expires_at", precision: nil
|
30
|
+
end
|
31
|
+
|
32
|
+
create_table "mkit_jobs", force: :cascade do |t|
|
33
|
+
t.string "topic"
|
34
|
+
t.string "service_id"
|
35
|
+
t.string "pod_id"
|
36
|
+
t.string "status"
|
37
|
+
t.string "retries"
|
38
|
+
t.string "payload"
|
39
|
+
t.datetime "created_at", precision: nil
|
40
|
+
t.datetime "updated_at", precision: nil
|
41
|
+
end
|
42
|
+
|
43
|
+
create_table "pods", force: :cascade do |t|
|
44
|
+
t.string "service_id"
|
45
|
+
t.string "pod_id"
|
46
|
+
t.string "name"
|
47
|
+
t.string "ip"
|
48
|
+
t.string "image"
|
49
|
+
t.string "status"
|
50
|
+
end
|
51
|
+
|
52
|
+
create_table "pools", force: :cascade do |t|
|
53
|
+
t.string "name"
|
54
|
+
t.string "ip"
|
55
|
+
t.string "range"
|
56
|
+
t.string "netmask"
|
57
|
+
t.string "status"
|
58
|
+
t.boolean "preferred", default: false
|
59
|
+
end
|
60
|
+
|
61
|
+
create_table "service_configs", force: :cascade do |t|
|
62
|
+
t.string "service_id"
|
63
|
+
t.string "key"
|
64
|
+
t.string "value"
|
65
|
+
t.string "ctype"
|
66
|
+
t.string "version"
|
67
|
+
end
|
68
|
+
|
69
|
+
create_table "service_ports", force: :cascade do |t|
|
70
|
+
t.string "service_id"
|
71
|
+
t.string "internal_port"
|
72
|
+
t.string "external_port"
|
73
|
+
t.string "mode"
|
74
|
+
t.string "load_bal"
|
75
|
+
t.string "version"
|
76
|
+
end
|
77
|
+
|
78
|
+
create_table "services", force: :cascade do |t|
|
79
|
+
t.string "name"
|
80
|
+
t.string "image"
|
81
|
+
t.string "qdm"
|
82
|
+
t.string "command"
|
83
|
+
t.integer "max_replicas", default: 1
|
84
|
+
t.integer "min_replicas", default: 1
|
85
|
+
t.string "lease_id"
|
86
|
+
t.string "pods_network", default: "mkit"
|
87
|
+
t.string "version"
|
88
|
+
t.string "status"
|
89
|
+
t.datetime "created_at", precision: nil, default: "2023-12-28 12:41:59"
|
90
|
+
t.datetime "updated_at", precision: nil
|
91
|
+
t.index ["name"], name: "services_name_id"
|
92
|
+
end
|
93
|
+
|
94
|
+
create_table "settings", force: :cascade do |t|
|
95
|
+
t.string "key"
|
96
|
+
t.string "value"
|
97
|
+
end
|
98
|
+
|
99
|
+
create_table "volumes", force: :cascade do |t|
|
100
|
+
t.string "service_id"
|
101
|
+
t.string "name"
|
102
|
+
t.string "path"
|
103
|
+
t.string "ctype"
|
104
|
+
t.string "status"
|
105
|
+
t.string "version"
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'mkit/app/model/mkit_job'
|
2
|
+
|
3
|
+
class MkitJobsController < MKIt::Server
|
4
|
+
|
5
|
+
# curl localhost:4567/mkitjobs
|
6
|
+
get '/mkitjobs' do
|
7
|
+
JSON.pretty_generate(JSON.parse(MkitJob.all.to_json))
|
8
|
+
end
|
9
|
+
|
10
|
+
get '/mkitjobs/:id' do
|
11
|
+
JSON.pretty_generate(JSON.parse(MkitJob.find(params[:id]).to_json))
|
12
|
+
end
|
13
|
+
|
14
|
+
put '/mkitjobs/:id' do
|
15
|
+
"Not impleemnted\n"
|
16
|
+
end
|
17
|
+
|
18
|
+
delete '/mkitjobs/:id' do
|
19
|
+
JSON.pretty_generate(JSON.parse(MkitJob.destroy(params[:id]).to_json))
|
20
|
+
end
|
21
|
+
|
22
|
+
delete '/mkitjobs/clean/all' do
|
23
|
+
MkitJob.destroy_all
|
24
|
+
end
|
25
|
+
|
26
|
+
post '/mkitjobs' do
|
27
|
+
xx = "no file"
|
28
|
+
if params[:file]
|
29
|
+
tempfile = params[:file][:tempfile]
|
30
|
+
xx= YAML.load(tempfile.read)
|
31
|
+
puts xx
|
32
|
+
end
|
33
|
+
JSON.pretty_generate(JSON.parse(xx.to_json))
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class PodsController < MKIt::Server
|
2
|
+
|
3
|
+
get '/services/:service_id/pods' do
|
4
|
+
"Not implemented\n"
|
5
|
+
end
|
6
|
+
|
7
|
+
get '/services/:service_id/pods/:pod_id' do
|
8
|
+
"Not implemented\n"
|
9
|
+
end
|
10
|
+
|
11
|
+
put '/services/:service_id/pods/:pod_id' do
|
12
|
+
"Not implemented\n"
|
13
|
+
end
|
14
|
+
|
15
|
+
delete '/services/:service_id/pods/:pod_id' do
|
16
|
+
"Not implemented\n"
|
17
|
+
end
|
18
|
+
|
19
|
+
post '/services/:service_id/pods' do
|
20
|
+
xx = "no file"
|
21
|
+
if params[:file]
|
22
|
+
tempfile = params[:file][:tempfile]
|
23
|
+
xx= YAML.load(tempfile.read)
|
24
|
+
puts xx
|
25
|
+
end
|
26
|
+
JSON.pretty_generate(JSON.parse(xx.to_json))
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'mkit/app/model/service'
|
2
|
+
require 'mkit/app/helpers/services_helper'
|
3
|
+
|
4
|
+
class ServicesController < MKIt::Server
|
5
|
+
helpers MKIt::ServicesHelper
|
6
|
+
|
7
|
+
# curl localhost:4567/services
|
8
|
+
get '/services' do
|
9
|
+
if params[:verbose]
|
10
|
+
verbose = params[:verbose] == 'true'
|
11
|
+
else
|
12
|
+
verbose = false
|
13
|
+
end
|
14
|
+
if params[:id]
|
15
|
+
redirect "/services/#{params[:id]}"
|
16
|
+
elsif params[:name]
|
17
|
+
srv = find_by_id_or_name
|
18
|
+
format_response(srv, verbose)
|
19
|
+
else
|
20
|
+
services = Service.all
|
21
|
+
format_response(services, verbose)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
get '/services/:id' do
|
26
|
+
srv = find_by_id_or_name
|
27
|
+
if request.env['CONTENT_TYPE'] == 'application/json'
|
28
|
+
resp = srv.to_json
|
29
|
+
else
|
30
|
+
resp = format_response(srv)
|
31
|
+
end
|
32
|
+
resp
|
33
|
+
end
|
34
|
+
|
35
|
+
# curl -X PUT localhost:4567/services/1 -F "file=@mkit/samples/mkit.yml"
|
36
|
+
put '/services/:id' do
|
37
|
+
srv = find_by_id_or_name
|
38
|
+
if params[:file]
|
39
|
+
tempfile = params[:file][:tempfile]
|
40
|
+
yaml = YAML.load(tempfile.read)
|
41
|
+
srv.update!(yaml.to_o)
|
42
|
+
end
|
43
|
+
format_response(srv)
|
44
|
+
rescue MKIt::BaseException => e
|
45
|
+
MKItLogger.debug e
|
46
|
+
error e.error_code, e.message
|
47
|
+
end
|
48
|
+
|
49
|
+
# curl -X DELETE localhost:4567/services/1
|
50
|
+
delete '/services/:id' do
|
51
|
+
srv = find_by_id_or_name
|
52
|
+
MkitJob.publish(topic: :delete_service, service_id: srv.id)
|
53
|
+
format_response(srv)
|
54
|
+
end
|
55
|
+
|
56
|
+
# curl -X POST localhost:4567/services -F "file=@mkit/samples/mkit.yml"
|
57
|
+
post '/services' do
|
58
|
+
srv = "no file"
|
59
|
+
if params[:file]
|
60
|
+
tempfile = params[:file][:tempfile]
|
61
|
+
yaml = YAML.load(tempfile.read)
|
62
|
+
srv = Service.create(yaml.to_o)
|
63
|
+
end
|
64
|
+
format_response(srv)
|
65
|
+
rescue MKIt::BaseException => e
|
66
|
+
MKItLogger.debug e
|
67
|
+
error e.error_code, e.message
|
68
|
+
end
|
69
|
+
|
70
|
+
#
|
71
|
+
# operations
|
72
|
+
#
|
73
|
+
# curl -X PUT localhost:4567/services/1/start
|
74
|
+
put '/services/:id/start' do
|
75
|
+
srv = find_by_id_or_name
|
76
|
+
MkitJob.publish(topic: :start_service, service_id: srv.id)
|
77
|
+
format_response(srv)
|
78
|
+
end
|
79
|
+
|
80
|
+
# curl -X PUT localhost:4567/services/1/stop
|
81
|
+
put '/services/:id/stop' do
|
82
|
+
srv = find_by_id_or_name
|
83
|
+
MkitJob.publish(topic: :stop_service, service_id: srv.id)
|
84
|
+
format_response(srv)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'mkit/cmd_runner'
|
2
|
+
|
3
|
+
module MKIt
|
4
|
+
module DockerHelper
|
5
|
+
|
6
|
+
# from ERB template
|
7
|
+
def create_instance(cmd)
|
8
|
+
MKIt::CmdRunner.run(cmd)
|
9
|
+
end
|
10
|
+
|
11
|
+
def start_instance(instance_id)
|
12
|
+
MKIt::CmdRunner.run("docker start #{instance_id}")
|
13
|
+
end
|
14
|
+
|
15
|
+
def stop_instance(instance_id)
|
16
|
+
MKIt::CmdRunner.run("docker stop #{instance_id}")
|
17
|
+
end
|
18
|
+
|
19
|
+
def remove_instance(instance)
|
20
|
+
MKIt::CmdRunner.run("docker rm -f #{instance}")
|
21
|
+
end
|
22
|
+
|
23
|
+
def inspect_instance(instance_id)
|
24
|
+
# this one does not work on ubunto MKIt::CmdRunner.run("docker inspect #{instance_id}")
|
25
|
+
x = %x{docker inspect #{instance_id}}
|
26
|
+
JSON.parse(x).first
|
27
|
+
end
|
28
|
+
|
29
|
+
def execute_local(instance_id, cmd)
|
30
|
+
MKIt::CmdRunner.run("docker exec -it #{instance_id} #{cmd}")
|
31
|
+
end
|
32
|
+
|
33
|
+
#
|
34
|
+
# network
|
35
|
+
#
|
36
|
+
|
37
|
+
def create_network(network_name)
|
38
|
+
MKIt::CmdRunner.run("docker network create #{network_name}")
|
39
|
+
end
|
40
|
+
|
41
|
+
def inspect_network(network_name)
|
42
|
+
x = MKIt::CmdRunner.run("docker network inspect #{network_name}")
|
43
|
+
JSON.parse(x).first
|
44
|
+
end
|
45
|
+
|
46
|
+
def dettach_network(network_id, instance_id)
|
47
|
+
MKIt::CmdRunner.run("docker network disconnect #{network_id} #{instance_id}")
|
48
|
+
end
|
49
|
+
|
50
|
+
def attach_network(network_id, instance_id)
|
51
|
+
MKIt::CmdRunner.run("docker network connect #{network_id} #{instance_id}")
|
52
|
+
end
|
53
|
+
|
54
|
+
def remove_network(network_id)
|
55
|
+
MKIt::CmdRunner.run("docker network rm #{network_id}")
|
56
|
+
end
|
57
|
+
|
58
|
+
#
|
59
|
+
# volumes
|
60
|
+
#
|
61
|
+
|
62
|
+
def create_volume(volume_name)
|
63
|
+
MKIt::CmdRunner.run("docker volume create #{volume_name}")
|
64
|
+
end
|
65
|
+
|
66
|
+
def delete_volume(volume_name)
|
67
|
+
MKIt::CmdRunner.run("docker volume rm #{volume_name}")
|
68
|
+
end
|
69
|
+
|
70
|
+
def inspect_volume(volume_name)
|
71
|
+
x = MKIt::CmdRunner.run("docker volume inspect #{volume_name}")
|
72
|
+
JSON.parse(x).first
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'mkit/utils'
|
2
|
+
|
3
|
+
module MKIt
|
4
|
+
module ERBHelper
|
5
|
+
def read_template(template)
|
6
|
+
root = MKIt::Utils.root
|
7
|
+
File.read("#{root}/lib/mkit/app/templates/#{template}.erb")
|
8
|
+
end
|
9
|
+
|
10
|
+
def parse_template(template, data = {})
|
11
|
+
ERB.new(read_template(template)).result_with_hash(data)
|
12
|
+
end
|
13
|
+
|
14
|
+
def parse_model(template)
|
15
|
+
ERB.new(read_template(template))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'mkit/app/model/setting'
|
2
|
+
require 'mkit/config/config'
|
3
|
+
|
4
|
+
module MKIt
|
5
|
+
module HAProxy
|
6
|
+
module_function
|
7
|
+
|
8
|
+
def start
|
9
|
+
%x{#{MKIt::Config.mkit.haproxy.ctrl.start}}
|
10
|
+
end
|
11
|
+
|
12
|
+
def stop
|
13
|
+
%x{#{MKIt::Config.mkit.haproxy.ctrl.stop}}
|
14
|
+
end
|
15
|
+
|
16
|
+
def restart
|
17
|
+
stop
|
18
|
+
start
|
19
|
+
end
|
20
|
+
|
21
|
+
def status
|
22
|
+
%x{#{MKIt::Config.mkit.haproxy.ctrl.status}}
|
23
|
+
end
|
24
|
+
|
25
|
+
def reload
|
26
|
+
%x{#{MKIt::Config.mkit.haproxy.ctrl.reload}}
|
27
|
+
end
|
28
|
+
|
29
|
+
def create_config_file(filename:, data:)
|
30
|
+
File.write("#{MKIt::Config.mkit.haproxy.config_dir}/#{filename}", data)
|
31
|
+
end
|
32
|
+
|
33
|
+
def delete_config_file(filename:)
|
34
|
+
begin
|
35
|
+
File.delete("#{MKIt::Config.mkit.haproxy.config_dir}/#{filename}")
|
36
|
+
rescue => e
|
37
|
+
puts e
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module MKIt
|
2
|
+
module InterfaceHelper
|
3
|
+
module_function
|
4
|
+
def create(name:, ctype:)
|
5
|
+
%x{ip tuntap add mode #{ctype} #{name}}
|
6
|
+
end
|
7
|
+
def remove(name:, ctype:)
|
8
|
+
%x{ip tuntap del mode #{ctype} #{name}}
|
9
|
+
end
|
10
|
+
def up(name:, ip:, mask:)
|
11
|
+
%x{ifconfig #{name} #{ip}/#{mask} up}
|
12
|
+
end
|
13
|
+
def down(name:)
|
14
|
+
%x{ifconfig #{name} 0.0.0.0 down}
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module MKIt
|
2
|
+
module ServicesHelper
|
3
|
+
def str_template
|
4
|
+
"%-5s %-18s %-15s %-25s %-10s"
|
5
|
+
end
|
6
|
+
|
7
|
+
def header_template
|
8
|
+
["id", "name", "addr", "ports", "status"]
|
9
|
+
end
|
10
|
+
|
11
|
+
def _format(template, data)
|
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
|
+
}
|
25
|
+
else
|
26
|
+
ports = data.service_port&.each.map { |p| "#{p.mode}/#{p.external_port}"}.join(",")
|
27
|
+
resp << _format(str_template, [data.id, data.name, data.lease&.ip, ports, data.status])
|
28
|
+
resp+=service_pods(data)
|
29
|
+
end
|
30
|
+
resp << ""
|
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
|
44
|
+
end
|
45
|
+
|
46
|
+
def find_by_id_or_name
|
47
|
+
srv = Service.find_by_id(params[:id])
|
48
|
+
srv = Service.find_by_name(params[:id]) unless srv
|
49
|
+
error 404, "Couldn't find Service '#{params[:id]}'\n" unless srv
|
50
|
+
srv
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'mkit/status'
|
2
|
+
require 'mkit/exceptions'
|
3
|
+
require 'mkit/app/helpers/interface_helper'
|
4
|
+
|
5
|
+
class Lease < ActiveRecord::Base
|
6
|
+
belongs_to :pool
|
7
|
+
belongs_to :service
|
8
|
+
|
9
|
+
before_destroy :down
|
10
|
+
|
11
|
+
def confirm
|
12
|
+
self.status = MKIt::PoolStatus::IN_USE
|
13
|
+
end
|
14
|
+
|
15
|
+
def up
|
16
|
+
MKIt::InterfaceHelper.create(name: interface_name, ctype: interface_type)
|
17
|
+
MKIt::InterfaceHelper.up(name: interface_name, ip: ip, mask: pool.netmask)
|
18
|
+
self.status = MKIt::PoolStatus::IN_USE
|
19
|
+
end
|
20
|
+
|
21
|
+
def down
|
22
|
+
MKIt::InterfaceHelper.down(name: interface_name)
|
23
|
+
MKIt::InterfaceHelper.remove(name: interface_name, ctype: interface_type)
|
24
|
+
self.status = MKIt::PoolStatus::RESERVED
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
|
2
|
+
require 'mkit/app/helpers/erb_helper'
|
3
|
+
require 'mkit/app/helpers/docker_helper'
|
4
|
+
require 'mkit/app/model/service'
|
5
|
+
require 'mkit/status'
|
6
|
+
|
7
|
+
class MkitJob < ActiveRecord::Base
|
8
|
+
before_destroy :clean_up
|
9
|
+
|
10
|
+
STATUS = %w{READY PROCESSING FAILED}
|
11
|
+
|
12
|
+
def self.take
|
13
|
+
MkitJob.where(status: 'READY').group(:service_id, :pod_id).take
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.publish(*args)
|
17
|
+
job = MkitJob.new(args[0])
|
18
|
+
job.status = 'READY'
|
19
|
+
job.save
|
20
|
+
job
|
21
|
+
end
|
22
|
+
|
23
|
+
def processing!
|
24
|
+
self.status='PROCESSING'
|
25
|
+
self.save
|
26
|
+
end
|
27
|
+
|
28
|
+
def error!
|
29
|
+
self.status='FAILED'
|
30
|
+
self.save
|
31
|
+
end
|
32
|
+
|
33
|
+
def data=(opt={})
|
34
|
+
self.payload=opt.to_json
|
35
|
+
end
|
36
|
+
|
37
|
+
def data
|
38
|
+
JSON.parse(self.payload)
|
39
|
+
end
|
40
|
+
|
41
|
+
def done!
|
42
|
+
self.destroy
|
43
|
+
end
|
44
|
+
|
45
|
+
def clean_up
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'mkit/app/helpers/erb_helper'
|
2
|
+
require 'mkit/app/helpers/docker_helper'
|
3
|
+
require 'mkit/app/model/service'
|
4
|
+
require 'mkit/status'
|
5
|
+
|
6
|
+
class Pod < ActiveRecord::Base
|
7
|
+
belongs_to :service
|
8
|
+
has_one :dns_host, dependent: :destroy
|
9
|
+
|
10
|
+
before_destroy :clean_up
|
11
|
+
|
12
|
+
include MKIt::ERBHelper
|
13
|
+
include MKIt::DockerHelper
|
14
|
+
|
15
|
+
def update_ip
|
16
|
+
new_ip = nil
|
17
|
+
tries = 5
|
18
|
+
while (new_ip.nil? && tries > 0) do
|
19
|
+
instance = self.properties.to_o
|
20
|
+
new_ip = instance.NetworkSettings.Networks[self.service.pods_network].IPAddress
|
21
|
+
sleep(1) if new_ip.nil?
|
22
|
+
tries = tries - 1
|
23
|
+
end
|
24
|
+
if self.ip != new_ip
|
25
|
+
self.ip = new_ip
|
26
|
+
self.update_dns
|
27
|
+
MkitJob.publish(topic: :pod_ip_updated, service_id: self.service.id, pod_id: self.id)
|
28
|
+
end
|
29
|
+
MKItLogger.info("docker ip updated [#{self.ip}]")
|
30
|
+
self.ip
|
31
|
+
end
|
32
|
+
|
33
|
+
def update_dns
|
34
|
+
self.dns_host ||= DnsHost.new(
|
35
|
+
service: self.service,
|
36
|
+
name: "#{name}.#{self.service.name}",
|
37
|
+
ip: self.ip
|
38
|
+
)
|
39
|
+
self.dns_host.ip = self.ip
|
40
|
+
self.dns_host.save
|
41
|
+
end
|
42
|
+
|
43
|
+
def properties
|
44
|
+
inspect_instance(self.name)
|
45
|
+
end
|
46
|
+
|
47
|
+
def set_status_from_docker
|
48
|
+
instance = self.properties
|
49
|
+
if self.properties
|
50
|
+
instance = instance.to_o
|
51
|
+
if instance.State.Running
|
52
|
+
self.status = MKIt::Status::RUNNING
|
53
|
+
else
|
54
|
+
self.status = MKIt::Status::STOPPED
|
55
|
+
end
|
56
|
+
else
|
57
|
+
self.status = MKIt::Status::PENDING
|
58
|
+
end
|
59
|
+
self.save
|
60
|
+
self.status
|
61
|
+
end
|
62
|
+
|
63
|
+
def parse
|
64
|
+
parse_model(MKIt::Templates::DOCKER_RUN).result(binding)
|
65
|
+
end
|
66
|
+
|
67
|
+
def start
|
68
|
+
if self.pod_id.nil?
|
69
|
+
docker_run = parse
|
70
|
+
MKItLogger.info("deploying docker pod, cmd [#{docker_run}]")
|
71
|
+
create_instance(docker_run)
|
72
|
+
else
|
73
|
+
pre_check
|
74
|
+
|
75
|
+
instance = self.properties.to_o
|
76
|
+
start_instance(self.name) unless instance.State.Running
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def stop
|
81
|
+
pre_check
|
82
|
+
stop_instance(self.name)
|
83
|
+
end
|
84
|
+
|
85
|
+
def pre_check
|
86
|
+
raise MKIt::PodNotFoundException.new('no pod_name found') if self.name.nil?
|
87
|
+
raise MKIt::PodNotFoundException.new("no properties found for #{self.name}") if self.properties.nil?
|
88
|
+
end
|
89
|
+
|
90
|
+
def clean_up
|
91
|
+
remove_instance(self.name) unless self.pod_id.nil?
|
92
|
+
MkitJob.publish(topic: :pod_destroyed, service_id: self.service.id, data: {pod_id: self.id})
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|