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/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,10 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ $LOAD_PATH.unshift File.expand_path('lib')
5
+ #
6
+ ENV['SINATRA_ENV'] ||= "development"
7
+ ENV['RACK_ENV'] ||= "development"
8
+
9
+ load 'bin/mkitd'
10
+
@@ -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
@@ -0,0 +1,12 @@
1
+ [Unit]
2
+ Description=Kids kube
3
+ After=network-online.target
4
+
5
+ [Service]
6
+ EnvironmentFile=-/etc/mkit/mkitd_config.sh
7
+ ExecStart=mkitd $OPTIONS
8
+ Restart=always
9
+
10
+ [Install]
11
+ WantedBy=multi-user.target
12
+