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/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
+