mkit 0.2.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.
Files changed (70) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +21 -0
  3. data/Gemfile.lock +137 -0
  4. data/LICENSE +21 -0
  5. data/README.md +126 -0
  6. data/Rakefile +54 -0
  7. data/bin/mkitc +31 -0
  8. data/bin/mkitd +55 -0
  9. data/config/database.yml +5 -0
  10. data/config/mkit_config.yml +15 -0
  11. data/config/mkitd_config.sh +5 -0
  12. data/db/migrate/001_setup.rb +105 -0
  13. data/db/migrate/002_mkit_jobs.rb +17 -0
  14. data/db/schema.rb +108 -0
  15. data/lib/mkit/app/controllers/mkitjobs_controller.rb +37 -0
  16. data/lib/mkit/app/controllers/pods_controller.rb +30 -0
  17. data/lib/mkit/app/controllers/services_controller.rb +87 -0
  18. data/lib/mkit/app/helpers/docker_helper.rb +75 -0
  19. data/lib/mkit/app/helpers/erb_helper.rb +18 -0
  20. data/lib/mkit/app/helpers/haproxy.rb +41 -0
  21. data/lib/mkit/app/helpers/interface_helper.rb +17 -0
  22. data/lib/mkit/app/helpers/services_helper.rb +54 -0
  23. data/lib/mkit/app/mkit_server.rb +8 -0
  24. data/lib/mkit/app/model/dns_host.rb +11 -0
  25. data/lib/mkit/app/model/lease.rb +26 -0
  26. data/lib/mkit/app/model/mkit_job.rb +48 -0
  27. data/lib/mkit/app/model/pod.rb +95 -0
  28. data/lib/mkit/app/model/pool.rb +60 -0
  29. data/lib/mkit/app/model/service.rb +266 -0
  30. data/lib/mkit/app/model/service_config.rb +16 -0
  31. data/lib/mkit/app/model/service_port.rb +30 -0
  32. data/lib/mkit/app/model/setting.rb +1 -0
  33. data/lib/mkit/app/model/volume.rb +53 -0
  34. data/lib/mkit/app/templates/docker/docker_run.sh.erb +1 -0
  35. data/lib/mkit/app/templates/haproxy/0000_defaults.cfg +23 -0
  36. data/lib/mkit/app/templates/haproxy/xapp_haproxy.cfg.erb +30 -0
  37. data/lib/mkit/cmd_runner.rb +27 -0
  38. data/lib/mkit/config/config.rb +18 -0
  39. data/lib/mkit/config/environment.rb +26 -0
  40. data/lib/mkit/config/initializers/001_hash.rb +11 -0
  41. data/lib/mkit/config/initializers/002_openstruct.rb +7 -0
  42. data/lib/mkit/config/load_default_configs.rb +29 -0
  43. data/lib/mkit/config/the_config.yml +3 -0
  44. data/lib/mkit/ctypes.rb +31 -0
  45. data/lib/mkit/docker_listener.rb +97 -0
  46. data/lib/mkit/exceptions.rb +30 -0
  47. data/lib/mkit/haproxy.rb +48 -0
  48. data/lib/mkit/job_manager.rb +53 -0
  49. data/lib/mkit/mkit_dns.rb +54 -0
  50. data/lib/mkit/mkit_interface.rb +31 -0
  51. data/lib/mkit/sagas/asaga.rb +11 -0
  52. data/lib/mkit/sagas/create_pod_saga.rb +28 -0
  53. data/lib/mkit/sagas/saga_manager.rb +10 -0
  54. data/lib/mkit/status.rb +47 -0
  55. data/lib/mkit/utils.rb +51 -0
  56. data/lib/mkit/version.rb +4 -0
  57. data/lib/mkit/workers/aworker.rb +11 -0
  58. data/lib/mkit/workers/haproxy_worker.rb +35 -0
  59. data/lib/mkit/workers/pod_worker.rb +39 -0
  60. data/lib/mkit/workers/service_worker.rb +27 -0
  61. data/lib/mkit/workers/worker_manager.rb +14 -0
  62. data/lib/mkit.rb +158 -0
  63. data/mkit.gemspec +40 -0
  64. data/mkitd +10 -0
  65. data/samples/apps/postgres.yml +22 -0
  66. data/samples/apps/rabbitmq.yml +19 -0
  67. data/samples/daemontools/log/run +44 -0
  68. data/samples/daemontools/run +42 -0
  69. data/samples/systemd/mkitd.service +12 -0
  70. 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,8 @@
1
+ require 'mkit/exceptions'
2
+
3
+ module MKIt
4
+ class Server < Sinatra::Base
5
+ set :default_content_type, :json
6
+ # set :dump_errors, false
7
+ end
8
+ end
@@ -0,0 +1,11 @@
1
+ require 'mkit/status'
2
+ require 'mkit/exceptions'
3
+ require 'mkit/app/model/service'
4
+ require 'mkit/app/model/pod'
5
+ require 'mkit/app/helpers/interface_helper'
6
+
7
+ class DnsHost < ActiveRecord::Base
8
+ belongs_to :service
9
+ belongs_to :pod
10
+ end
11
+
@@ -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
+