mkit 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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
+