mkit 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +19 -11
- data/bin/mkitc +142 -15
- data/lib/mkit/app/helpers/docker_helper.rb +3 -3
- data/lib/mkit/app/model/pool.rb +8 -9
- data/lib/mkit/app/model/service.rb +9 -11
- data/lib/mkit/version.rb +1 -1
- data/samples/apps/rabbitmq.yml +1 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6ef8c74fea9d69b3a25c80713f13f4878f590560356a3e588502838500228ceb
|
4
|
+
data.tar.gz: 1c653195f19a36c429387daec3c12153e9394424b5dd0d1edad62f1f9b4fdcea
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7e37a8161aa15681ce9097f900187f8cb77726210466223773d52c311a8acda2936ec8f13f2885d5605222c1dce27f82e700c4a5d31598274acdc10e54b82104
|
7
|
+
data.tar.gz: e53bf5e0a7cd37e703ae0f8600c81085b3ad8617f4fddb261a6f122bea2a959019ba61a6d7408f923e95d349e73600c631899a4f17c547e60d65bb3bdccd5692
|
data/README.md
CHANGED
@@ -16,9 +16,16 @@ The daemon is responsible for HAProxy pods routing configuration. It also provid
|
|
16
16
|
* Docker
|
17
17
|
* Linux (iproute2 package)
|
18
18
|
|
19
|
+
## Install
|
20
|
+
|
21
|
+
This is a simple ruby gem, so to install run
|
22
|
+
```
|
23
|
+
# gem install mkit
|
24
|
+
```
|
25
|
+
|
19
26
|
## Running
|
20
27
|
|
21
|
-
The `daemon` requires `root` user, you can run it directly on the repository root...
|
28
|
+
The `daemon` requires `root` user (due to `ip` and `haproxy`), you can run it directly on the repository root...
|
22
29
|
|
23
30
|
```
|
24
31
|
# ./mkitd --help
|
@@ -47,22 +54,23 @@ There's also samples on the samples dir, for daemontools and systemd.
|
|
47
54
|
### Accessing the API
|
48
55
|
|
49
56
|
* Create new service
|
50
|
-
* `mkitc
|
57
|
+
* `mkitc create samples/apps/rabbitmq.yml`
|
51
58
|
* Update service
|
52
|
-
* `mkitc
|
53
|
-
* Get
|
54
|
-
* `mkitc
|
59
|
+
* `mkitc update samples/apps/rabbitmq.yml`
|
60
|
+
* Get service
|
61
|
+
* `mkitc ps {id|service_name}`
|
55
62
|
* Delete service
|
56
|
-
* `mkitc
|
63
|
+
* `mkitc rm {id|service_name}`
|
57
64
|
* List services
|
58
|
-
* `mkitc
|
65
|
+
* `mkitc ps [-v (verbose)]`
|
59
66
|
* Control service
|
60
|
-
* `mkitc
|
61
|
-
* `mkitc
|
67
|
+
* `mkitc start {id|service_name}`
|
68
|
+
* `mkitc stop {id|service_name}`
|
62
69
|
|
63
70
|
Example:
|
64
71
|
|
65
72
|
```
|
73
|
+
$ mkitc ps postgres
|
66
74
|
id name addr ports status
|
67
75
|
4 postgres 10.210.198.10 tcp/5432 RUNNING
|
68
76
|
pods
|
@@ -98,7 +106,7 @@ CONFIG="/etc/haproxy/haproxy.d"
|
|
98
106
|
service:
|
99
107
|
name: rabbitmq # unique
|
100
108
|
image: rabbitmq:3-management-alpine # image
|
101
|
-
network: bridge # docker network
|
109
|
+
network: bridge # docker network - it will be created if it does not exists
|
102
110
|
ports: # haproxy port mapping: <external_port>|<internal_port>|<tcp|http>|round_robin
|
103
111
|
- 5672:5672:tcp:round_robin
|
104
112
|
- 80:15672:http:round_robin
|
@@ -106,7 +114,7 @@ service:
|
|
106
114
|
max_replicas: 1
|
107
115
|
min_replicas: 1
|
108
116
|
volumes:
|
109
|
-
- docker://mkit_rabbitmq_data:/var/lib/rabbitmq # a docker volume
|
117
|
+
- docker://mkit_rabbitmq_data:/var/lib/rabbitmq # a docker volume - it will be created if it does not exists
|
110
118
|
- /var/log/rabbitmq/logs:/var/log/rabbitmq # a local volume
|
111
119
|
environment:
|
112
120
|
RABBITMQ_DEFAULT_USER: admin
|
data/bin/mkitc
CHANGED
@@ -2,30 +2,157 @@
|
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
require 'rubygems'
|
5
|
+
require 'optparse'
|
6
|
+
require 'yaml'
|
7
|
+
require 'net/http'
|
8
|
+
require 'json'
|
9
|
+
require 'net_http_unix'
|
10
|
+
require 'securerandom'
|
5
11
|
|
6
12
|
class MKItClient
|
7
13
|
|
8
|
-
|
9
|
-
|
10
|
-
puts
|
11
|
-
puts "usage: mkitc <verb> <path>"
|
12
|
-
puts " where <verb> is one of GET | POST | PUT | DELETE"
|
13
|
-
puts "e.g."
|
14
|
-
puts " mkitc GET applications"
|
15
|
-
puts
|
14
|
+
def initialize
|
15
|
+
@client = NetX::HTTPUnix.new("localhost",4567)
|
16
16
|
end
|
17
17
|
|
18
|
-
def
|
19
|
-
|
20
|
-
|
21
|
-
|
18
|
+
def parse_args(args)
|
19
|
+
request = nil
|
20
|
+
case args[0]
|
21
|
+
when /^ps$/
|
22
|
+
if args.include?('-v')
|
23
|
+
params = {verbose: 'true'}
|
24
|
+
args.delete('-v')
|
25
|
+
else
|
26
|
+
params = {}
|
27
|
+
end
|
28
|
+
case args.size
|
29
|
+
when 1
|
30
|
+
#mkitc ps [-v] GET services[?verbose=true]
|
31
|
+
request = { verb: :get, uri: '/services', params: params }
|
32
|
+
when 2
|
33
|
+
#mkitc ps {id} GET services/{id}
|
34
|
+
id = args[1]
|
35
|
+
request = { verb: :get, uri: "/services/#{id}" }
|
36
|
+
else
|
37
|
+
raise 'invalid parameters'
|
38
|
+
end
|
39
|
+
when /^config:show$/
|
40
|
+
#mkitc config:show {id} => GET services/{id}/config
|
41
|
+
#TODO
|
42
|
+
when /^stop$/
|
43
|
+
#mkitc stop {id} => PUT services/{id}/stop
|
44
|
+
case args.size
|
45
|
+
when 2
|
46
|
+
id = args[1]
|
47
|
+
request = { verb: :put, uri: "/services/#{id}/stop" }
|
48
|
+
else
|
49
|
+
raise 'invalid parameters'
|
50
|
+
end
|
51
|
+
when /^start$/
|
52
|
+
#mkitc start {id} => PUT services/{id}/start
|
53
|
+
case args.size
|
54
|
+
when 2
|
55
|
+
id = args[1]
|
56
|
+
request = { verb: :put, uri: "/services/#{id}/start" }
|
57
|
+
else
|
58
|
+
raise 'invalid parameters'
|
59
|
+
end
|
60
|
+
when /^rm$/
|
61
|
+
#mkitc rm {id} => DELETE services/{id}
|
62
|
+
case args.size
|
63
|
+
when 2
|
64
|
+
id = args[1]
|
65
|
+
request = { verb: :delete, uri: "/services/#{id}" }
|
66
|
+
else
|
67
|
+
raise 'invalid parameters'
|
68
|
+
end
|
69
|
+
when /^create$/
|
70
|
+
#mkitc create service.yaml => POST services service.yaml
|
71
|
+
case args.size
|
72
|
+
when 2
|
73
|
+
file = args[1]
|
74
|
+
request = { verb: :post, uri: "/services", file: file }
|
75
|
+
else
|
76
|
+
raise 'invalid parameters'
|
77
|
+
end
|
78
|
+
when /^update$/
|
79
|
+
#mkitc update service.yaml => PUT services/{id} service.yaml
|
80
|
+
case args.size
|
81
|
+
when 2
|
82
|
+
file = args[1]
|
83
|
+
yaml = YAML.load_file(file)
|
84
|
+
if yaml["service"].nil?
|
85
|
+
raise 'invalid configuration file'
|
86
|
+
else
|
87
|
+
id = yaml["service"]["name"]
|
88
|
+
request = { verb: :put, uri: "/services/#{id}", file: file }
|
89
|
+
end
|
90
|
+
else
|
91
|
+
raise 'invalid parameters'
|
92
|
+
end
|
93
|
+
else
|
94
|
+
raise "Usage: invalid parameters"
|
22
95
|
end
|
96
|
+
request
|
97
|
+
end
|
98
|
+
|
99
|
+
def doIt(args)
|
100
|
+
operation = parse_args(args)
|
101
|
+
puts request(operation).body
|
102
|
+
end
|
103
|
+
|
104
|
+
def request(request)
|
105
|
+
req = nil
|
106
|
+
uri = request[:uri]
|
107
|
+
unless request[:params].nil? || request[:params].empty?
|
108
|
+
uri = uri + '?' + request[:params].map{|k,v| "#{k}=#{v}"}.join('&')
|
109
|
+
end
|
110
|
+
case request[:verb]
|
111
|
+
when :post
|
112
|
+
req = Net::HTTP::Post.new(uri)
|
113
|
+
unless request[:file].nil?
|
114
|
+
(body, boundary) = attach(request[:file])
|
115
|
+
req.body = body
|
116
|
+
req["Content-Type"] = "multipart/form-data, boundary=#{boundary}"
|
117
|
+
end
|
118
|
+
when :put
|
119
|
+
req = Net::HTTP::Put.new(uri)
|
120
|
+
unless request[:file].nil?
|
121
|
+
(body, boundary) = attach(request[:file])
|
122
|
+
req.body = body
|
123
|
+
req["Content-Type"] = "multipart/form-data, boundary=#{boundary}"
|
124
|
+
end
|
125
|
+
when :patch
|
126
|
+
req = Net::HTTP::Patch.new(uri)
|
127
|
+
when :get
|
128
|
+
req = Net::HTTP::Get.new(uri)
|
129
|
+
when :delete
|
130
|
+
req = Net::HTTP::Delete.new(uri)
|
131
|
+
end
|
132
|
+
@client.request(req)
|
133
|
+
end
|
23
134
|
|
24
|
-
|
25
|
-
|
135
|
+
def attach(file)
|
136
|
+
boundary=SecureRandom.alphanumeric
|
137
|
+
body = []
|
138
|
+
body << "--#{boundary}\r\n"
|
139
|
+
body << "Content-Disposition: form-data; name=file; filename='#{File.basename(file)}'\r\n"
|
140
|
+
body << "Content-Type: text/plain\r\n"
|
141
|
+
body << "\r\n"
|
142
|
+
body << File.read(file)
|
143
|
+
body << "\r\n--#{boundary}--\r\n"
|
144
|
+
[ body.join, boundary]
|
26
145
|
end
|
27
146
|
end
|
28
147
|
|
148
|
+
#
|
149
|
+
# go
|
150
|
+
#
|
29
151
|
client = MKItClient.new
|
30
|
-
client.
|
152
|
+
client.doIt(ARGV.dup)
|
153
|
+
#
|
154
|
+
# if ARGV.any?
|
155
|
+
# parse args
|
156
|
+
# host, socket, config file
|
157
|
+
# end
|
31
158
|
|
@@ -38,9 +38,9 @@ module MKIt
|
|
38
38
|
MKIt::CmdRunner.run("docker network create #{network_name}")
|
39
39
|
end
|
40
40
|
|
41
|
-
def
|
42
|
-
x = MKIt::CmdRunner.run("docker network
|
43
|
-
|
41
|
+
def network_exists?(network_name)
|
42
|
+
x = MKIt::CmdRunner.run("docker network ls")
|
43
|
+
x.match(/\b#{network_name}\b/)
|
44
44
|
end
|
45
45
|
|
46
46
|
def dettach_network(network_id, instance_id)
|
data/lib/mkit/app/model/pool.rb
CHANGED
@@ -16,21 +16,20 @@ class Pool < ActiveRecord::Base
|
|
16
16
|
ips = range.split('-')
|
17
17
|
next_ip = ips[0]
|
18
18
|
next_ip = next_ip.to_i
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
19
|
+
ip_add = self.ip.split('.')
|
20
|
+
while next_ip <= ips[1].to_i + 1 do
|
21
|
+
if (lease.select{|l| l.ip == "#{ip_add[0]}.#{ip_add[1]}.#{ip_add[2]}.#{next_ip}"}.size == 0)
|
22
|
+
break
|
23
|
+
else
|
24
|
+
next_ip+=1
|
24
25
|
end
|
25
|
-
|
26
|
+
end
|
27
|
+
|
26
28
|
if next_ip > ips[1].to_i
|
27
29
|
self.status = MKIt::PoolStatus::EXAUSTED
|
28
30
|
self.save
|
29
31
|
raise PoolExaustedException.new
|
30
32
|
end
|
31
|
-
|
32
|
-
ip_add = self.ip.split('.')
|
33
|
-
|
34
33
|
"#{ip_add[0]}.#{ip_add[1]}.#{ip_add[2]}.#{next_ip}"
|
35
34
|
end
|
36
35
|
|
@@ -46,13 +46,6 @@ class Service < ActiveRecord::Base
|
|
46
46
|
status: MKIt::Status::CREATING
|
47
47
|
)
|
48
48
|
|
49
|
-
# docker network
|
50
|
-
if config.network.nil? || config.network.empty?
|
51
|
-
srv.pods_network="mkit"
|
52
|
-
else
|
53
|
-
srv.pods_network=config.network
|
54
|
-
end
|
55
|
-
|
56
49
|
# reserve pool ip
|
57
50
|
srv.lease = Pool.find_by_name(MKIt::Utils.me).reserve_for(srv)
|
58
51
|
|
@@ -91,6 +84,14 @@ class Service < ActiveRecord::Base
|
|
91
84
|
end
|
92
85
|
self.max_replicas = self.min_replicas if self.min_replicas > self.max_replicas
|
93
86
|
|
87
|
+
# docker network
|
88
|
+
if config.network.nil? || config.network.empty?
|
89
|
+
self.pods_network="mkit"
|
90
|
+
else
|
91
|
+
self.pods_network=config.network
|
92
|
+
end
|
93
|
+
self.create_pods_network
|
94
|
+
|
94
95
|
# haproxy ports
|
95
96
|
self.service_port = []
|
96
97
|
config.ports&.each do |p|
|
@@ -130,16 +131,13 @@ class Service < ActiveRecord::Base
|
|
130
131
|
end
|
131
132
|
|
132
133
|
def create_pods_network
|
133
|
-
|
134
|
-
create_network(self.pods_network) if netw.nil?
|
134
|
+
create_network(self.pods_network) if !network_exists?(self.pods_network)
|
135
135
|
end
|
136
136
|
|
137
137
|
def deploy_network
|
138
138
|
# create service interface...
|
139
139
|
self.lease.confirm
|
140
140
|
self.lease.up
|
141
|
-
# ...and pods network
|
142
|
-
self.create_pods_network
|
143
141
|
end
|
144
142
|
|
145
143
|
def add_volume(volume_config)
|
data/lib/mkit/version.rb
CHANGED
data/samples/apps/rabbitmq.yml
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mkit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vasco Santos
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-01-
|
11
|
+
date: 2024-01-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: net-ping
|
@@ -371,7 +371,7 @@ homepage: http://vars.pt
|
|
371
371
|
licenses:
|
372
372
|
- Apache-2.0
|
373
373
|
metadata: {}
|
374
|
-
post_install_message:
|
374
|
+
post_install_message:
|
375
375
|
rdoc_options: []
|
376
376
|
require_paths:
|
377
377
|
- lib
|
@@ -386,8 +386,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
386
386
|
- !ruby/object:Gem::Version
|
387
387
|
version: '0'
|
388
388
|
requirements: []
|
389
|
-
rubygems_version: 3.
|
390
|
-
signing_key:
|
389
|
+
rubygems_version: 3.4.10
|
390
|
+
signing_key:
|
391
391
|
specification_version: 4
|
392
392
|
summary: micro kubernets
|
393
393
|
test_files: []
|