mkit 0.2.0 → 0.3.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 +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: []
|