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.
- 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/lib/mkit.rb
ADDED
@@ -0,0 +1,158 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
require 'json'
|
4
|
+
require 'yaml'
|
5
|
+
require 'optparse'
|
6
|
+
require 'ostruct'
|
7
|
+
require 'timeout'
|
8
|
+
require 'net/http'
|
9
|
+
require 'sinatra/base'
|
10
|
+
require 'mkit/config/environment'
|
11
|
+
require 'mkit/app/mkit_server'
|
12
|
+
require 'mkit/config/load_default_configs'
|
13
|
+
require_relative "mkit/version"
|
14
|
+
require_relative 'mkit/mkit_interface'
|
15
|
+
require_relative 'mkit/mkit_dns'
|
16
|
+
require_relative 'mkit/docker_listener'
|
17
|
+
require 'mkit/app/helpers/haproxy'
|
18
|
+
require 'mkit/app/controllers/services_controller'
|
19
|
+
require 'mkit/app/controllers/mkitjobs_controller'
|
20
|
+
require 'mkit/mkit_interface'
|
21
|
+
require 'mkit/mkit_dns'
|
22
|
+
require 'mkit/job_manager'
|
23
|
+
require 'mkit/workers/worker_manager'
|
24
|
+
require 'mkit/sagas/saga_manager'
|
25
|
+
require 'mkit/docker_listener'
|
26
|
+
require 'mkit/app/helpers/haproxy'
|
27
|
+
require 'active_record/tasks/database_tasks'
|
28
|
+
require 'mkit/utils'
|
29
|
+
|
30
|
+
MKItLogger = Console.logger
|
31
|
+
|
32
|
+
module MKIt
|
33
|
+
class Error < StandardError; end
|
34
|
+
include ActiveRecord::Tasks
|
35
|
+
|
36
|
+
System = Dry::Container.new
|
37
|
+
|
38
|
+
def self.configure(options:)
|
39
|
+
@root = MKIt::Utils.root
|
40
|
+
MKItLogger.debug!
|
41
|
+
#
|
42
|
+
# config dir
|
43
|
+
if ENV["RACK_ENV"] != "development"
|
44
|
+
@config_dir = options[:config_dir].nil? ? '/etc/mkit' : options[:config_dir]
|
45
|
+
else
|
46
|
+
@config_dir = options[:config_dir].nil? ? "#{@root}/config" : options[:config_dir]
|
47
|
+
end
|
48
|
+
MKIt::Utils.set_config_dir(@config_dir)
|
49
|
+
# create dirs
|
50
|
+
if ENV["RACK_ENV"] != "development" || !options[:config_dir].nil?
|
51
|
+
check_config_files = false
|
52
|
+
if ! File.exists?(@config_dir)
|
53
|
+
FileUtils.mkdir_p(@config_dir)
|
54
|
+
check_config_files = true
|
55
|
+
end
|
56
|
+
FileUtils.mkdir_p('/var/lib/mkitd') unless File.exists?('/var/lib/mkitd')
|
57
|
+
FileUtils.cp( "#{@root}/config/mkit_config.yml", @config_dir) unless File.exists?("#{@config_dir}/mkit_config.yml")
|
58
|
+
FileUtils.cp( "#{@root}/config/database.yml", @config_dir) unless File.exists?("#{@config_dir}/database.yml")
|
59
|
+
FileUtils.cp( "#{@root}/config/mkitd_config.sh", @config_dir) unless File.exists?("#{@config_dir}/mkitd_config.sh")
|
60
|
+
if check_config_files
|
61
|
+
MKItLogger.info "Configuration files copied to #{@config_dir}. Please check it and restart."
|
62
|
+
exit
|
63
|
+
end
|
64
|
+
end
|
65
|
+
#
|
66
|
+
# load configuration
|
67
|
+
MKIt::Initializers.load_my_configuration
|
68
|
+
#
|
69
|
+
# run config based tasks
|
70
|
+
FileUtils.mkdir_p(MKIt::Config.mkit.haproxy.config_dir)
|
71
|
+
# ...haproxy defaults file
|
72
|
+
FileUtils.cp(
|
73
|
+
"#{MKIt::Utils.root}/lib/mkit/app/templates/haproxy/0000_defaults.cfg",
|
74
|
+
MKIt::Config.mkit.haproxy.config_dir
|
75
|
+
) unless File.exists?("#{MKIt::Config.mkit.haproxy.config_dir}/0000_defaults.cfg")
|
76
|
+
#
|
77
|
+
# conn = { adapter: "sqlite3", database: ":memory:" }
|
78
|
+
# ActiveRecord::Base.establish_connection(conn)
|
79
|
+
# include ActiveRecord::Tasks
|
80
|
+
# DatabaseTasks.database_configuration = YAML.load_file('my_database_config.yml')
|
81
|
+
# DatabaseTasks.db_dir = 'db'
|
82
|
+
#
|
83
|
+
DatabaseTasks.database_configuration = MKIt::Utils.load_db_config
|
84
|
+
DatabaseTasks.env=MKIt::Config.mkit.database.env
|
85
|
+
DatabaseTasks.migrations_paths=[ "#{@root}/db/migrate" ]
|
86
|
+
DatabaseTasks.db_dir="db"
|
87
|
+
DatabaseTasks.root=@root
|
88
|
+
end
|
89
|
+
|
90
|
+
def self.establish_db_connection
|
91
|
+
#
|
92
|
+
ActiveRecord::Base.establish_connection(DatabaseTasks.database_configuration[DatabaseTasks.env])
|
93
|
+
ActiveRecord::Base.connection.migration_context.migrations_paths.clear
|
94
|
+
ActiveRecord::Base.connection.migration_context.migrations_paths << "#{@root}/db/migrate"
|
95
|
+
#
|
96
|
+
MKItLogger.debug "database_tasks migration paths #{DatabaseTasks.migrations_paths}"
|
97
|
+
MKItLogger.debug "active_record_base migration_paths #{ActiveRecord::Base.connection.migration_context.migrations_paths.inspect}"
|
98
|
+
MKItLogger.debug "active_record_base configurations #{ActiveRecord::Base.configurations.inspect}"
|
99
|
+
MKItLogger.debug "active_record_base conn_db_config #{ActiveRecord::Base.connection_db_config.inspect}"
|
100
|
+
end
|
101
|
+
|
102
|
+
def self.migrate
|
103
|
+
ActiveRecord::Base.connection.migration_context.migrate if ActiveRecord::Base.connection.migration_context.needs_migration?
|
104
|
+
end
|
105
|
+
|
106
|
+
def self.restore_operation
|
107
|
+
MKItLogger.info "restoring operations..."
|
108
|
+
# create interfaces of deployed apps otherwise haproxy won't start
|
109
|
+
Service.all.each { | srv |
|
110
|
+
srv.deploy_network
|
111
|
+
srv.update_status!
|
112
|
+
}
|
113
|
+
end
|
114
|
+
|
115
|
+
def self.startup(options: {})
|
116
|
+
self.configure(options: options)
|
117
|
+
self.establish_db_connection
|
118
|
+
self.migrate
|
119
|
+
|
120
|
+
MKIt::Initializers.load_default_configs
|
121
|
+
MKIt::Interface.up
|
122
|
+
|
123
|
+
System.register(:job_manager, memoize: true) {
|
124
|
+
MKIt::JobManager.new
|
125
|
+
}
|
126
|
+
System.register(:mkit_dns, memoize: true) {
|
127
|
+
Thread.new {
|
128
|
+
dns = MKIt::DNS.new
|
129
|
+
dns.run
|
130
|
+
}
|
131
|
+
}
|
132
|
+
System.register(:docker_listener, memoize: true) {
|
133
|
+
MKIt::DockerListener.new
|
134
|
+
}
|
135
|
+
# watchdog feature is to be re-evaluated
|
136
|
+
# System.register(:watchdog, memoize: true) {
|
137
|
+
# MKIt::WatchdogManager.new
|
138
|
+
# }
|
139
|
+
|
140
|
+
# register workers
|
141
|
+
WorkerManager.register_workers
|
142
|
+
SagaManager.register_workers
|
143
|
+
#
|
144
|
+
System[:job_manager].start
|
145
|
+
System[:docker_listener].start
|
146
|
+
# watchdog feature is to be re-evaluated
|
147
|
+
# System[:watchdog].start
|
148
|
+
System[:mkit_dns].run
|
149
|
+
#
|
150
|
+
self.restore_operation
|
151
|
+
#
|
152
|
+
MKItLogger.debug "restarting proxy..."
|
153
|
+
MKIt::HAProxy.restart
|
154
|
+
MKItLogger.info "MKIt is up and running!"
|
155
|
+
end
|
156
|
+
|
157
|
+
end
|
158
|
+
|
data/mkit.gemspec
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
lib = File.expand_path("../lib", __FILE__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
require "mkit/version"
|
6
|
+
|
7
|
+
Gem::Specification.new do |s|
|
8
|
+
s.name = 'mkit'
|
9
|
+
s.summary = 'micro kubernets'
|
10
|
+
s.bindir = 'bin'
|
11
|
+
s.homepage = 'http://vars.pt'
|
12
|
+
s.license = 'Apache-2.0'
|
13
|
+
s.rubyforge_project = ''
|
14
|
+
s.description = 'micro kubernets impl'
|
15
|
+
# s.require_paths = ["."]
|
16
|
+
s.author = 'Vasco Santos'
|
17
|
+
s.email = ['valexsantos@gmail.com']
|
18
|
+
s.version = MKIt::VERSION
|
19
|
+
s.platform = Gem::Platform::RUBY
|
20
|
+
s.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
21
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|TODO|db/development.sqlite)}) }
|
22
|
+
end
|
23
|
+
s.executables << 'mkitd'
|
24
|
+
s.executables << 'mkitc'
|
25
|
+
s.add_runtime_dependency 'net-ping', '~> 2.0', '>= 2.0.8'
|
26
|
+
s.add_runtime_dependency 'dry-container', '~> 0.9', '>= 0.9.0'
|
27
|
+
s.add_runtime_dependency 'sqlite3', '~> 1.5', '>= 1.5.4'
|
28
|
+
s.add_runtime_dependency 'standalone_migrations', '~> 7.1', '>= 7.1.0'
|
29
|
+
s.add_runtime_dependency 'sinatra-activerecord', '~> 2.0', '>= 2.0.26'
|
30
|
+
s.add_runtime_dependency 'rack', '~> 2.2', '>= 2.2.5'
|
31
|
+
s.add_runtime_dependency 'rack-protection', '~> 3.0', '>= 3.0.5'
|
32
|
+
s.add_runtime_dependency 'rack-test', '~> 2.0', '>= 2.0.2'
|
33
|
+
s.add_runtime_dependency 'pry', '~> 0.14', '>= 0.14.2'
|
34
|
+
s.add_runtime_dependency 'rubydns', '~> 2.0', '>= 2.0.2'
|
35
|
+
s.add_runtime_dependency 'async-dns', '~> 1.3', '>= 1.3.0'
|
36
|
+
s.add_runtime_dependency 'sinatra', '~> 3.0', '>= 3.0.5'
|
37
|
+
s.add_runtime_dependency 'thin', '~> 1.8', '>= 1.8.1'
|
38
|
+
s.add_runtime_dependency 'net_http_unix', '~> 0.2', '>= 0.2.2'
|
39
|
+
end
|
40
|
+
|
data/mkitd
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
#
|
2
|
+
service:
|
3
|
+
name: postgres
|
4
|
+
network: bridge
|
5
|
+
image: "postgres:14"
|
6
|
+
ports:
|
7
|
+
- 5432:5432:tcp:round_robin
|
8
|
+
environment:
|
9
|
+
POSTGRES_USER: postgres
|
10
|
+
POSTGRES_PASSWORD: postgres
|
11
|
+
POSTGRES_DB: postgres
|
12
|
+
volumes:
|
13
|
+
- docker://postgresql_14_data:/var/lib/postgresql/data
|
14
|
+
restart: always
|
15
|
+
resources:
|
16
|
+
max_replicas: 1
|
17
|
+
min_replicas: 1
|
18
|
+
limits:
|
19
|
+
cpu: 1000m
|
20
|
+
ram: 1Gi
|
21
|
+
|
22
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#
|
2
|
+
service:
|
3
|
+
name: rabbitmq
|
4
|
+
image: rabbitmq:3-management-alpine
|
5
|
+
network: bridge # docker network
|
6
|
+
ports:
|
7
|
+
- 5672:5672:tcp:round_robin
|
8
|
+
- 80:15672:http:round_robin
|
9
|
+
resources:
|
10
|
+
max_replicas: 1
|
11
|
+
min_replicas: 1
|
12
|
+
volumes:
|
13
|
+
- docker://mkit_rabbitmq_data:/var/lib/rabbitmq
|
14
|
+
- docker://mkit_rabbitmq_logs:/var/log/rabbitmq
|
15
|
+
environment:
|
16
|
+
RABBITMQ_DEFAULT_USER: admin
|
17
|
+
RABBITMQ_DEFAULT_PASS: admin
|
18
|
+
RABBITMQ_DEFAULT_VHOST: mkit
|
19
|
+
|
@@ -0,0 +1,44 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
# generic daemontools log run script
|
4
|
+
|
5
|
+
# Copyright 2017-2018 Vasco Santos <valexsantos[at]gmail[dot]com>
|
6
|
+
# All rights reserved.
|
7
|
+
#
|
8
|
+
# Redistribution and use of this script, with or without modification, is
|
9
|
+
# permitted provided that the following conditions are met:
|
10
|
+
#
|
11
|
+
# 1. Redistributions of this script must retain the above copyright
|
12
|
+
# notice, this list of conditions and the following disclaimer.
|
13
|
+
#
|
14
|
+
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR IMPLIED
|
15
|
+
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
16
|
+
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
17
|
+
# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
18
|
+
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
19
|
+
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
20
|
+
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
21
|
+
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
22
|
+
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
23
|
+
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
24
|
+
|
25
|
+
#
|
26
|
+
# cfgs
|
27
|
+
#
|
28
|
+
LOGUSER=nobody
|
29
|
+
APP=mkitd
|
30
|
+
LOGDIR=/var/log/$APP
|
31
|
+
LOG_FILE_HISTORY=20
|
32
|
+
LOG_FILE_SIZE=100000
|
33
|
+
##
|
34
|
+
# doit
|
35
|
+
##
|
36
|
+
PATH=/opt/daemontools/bin:/usr/local/bin:/usr/bin:/bin
|
37
|
+
export PATH
|
38
|
+
# create log dir
|
39
|
+
[ -d $LOGDIR ] || mkdir $LOGDIR
|
40
|
+
# set owner
|
41
|
+
chown -R $LOGUSER $LOGDIR
|
42
|
+
# go
|
43
|
+
exec 2>&1
|
44
|
+
exec setuidgid $LOGUSER multilog t s$LOG_FILE_SIZE n$LOG_FILE_HISTORY $LOGDIR
|
@@ -0,0 +1,42 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
# mkitd daemontools run script
|
4
|
+
|
5
|
+
# Copyright 2017-2018 Vasco Santos <valexsantos[at]gmail[dot]com>
|
6
|
+
# All rights reserved.
|
7
|
+
#
|
8
|
+
# Redistribution and use of this script, with or without modification, is
|
9
|
+
# permitted provided that the following conditions are met:
|
10
|
+
#
|
11
|
+
# 1. Redistributions of this script must retain the above copyright
|
12
|
+
# notice, this list of conditions and the following disclaimer.
|
13
|
+
#
|
14
|
+
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR IMPLIED
|
15
|
+
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
16
|
+
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
17
|
+
# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
18
|
+
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
19
|
+
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
20
|
+
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
21
|
+
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
22
|
+
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
23
|
+
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
24
|
+
|
25
|
+
exec 2>&1
|
26
|
+
|
27
|
+
source /etc/mkit/mkitd_config.sh
|
28
|
+
|
29
|
+
CMD="mkitd $OPTIONS"
|
30
|
+
echo "command-line $CMD"
|
31
|
+
|
32
|
+
##
|
33
|
+
# Doit
|
34
|
+
##
|
35
|
+
|
36
|
+
exec $CMD
|
37
|
+
|
38
|
+
##
|
39
|
+
# err
|
40
|
+
echo ERROR: command did not run correctly
|
41
|
+
sleep 5
|
42
|
+
exit 1
|