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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 03e23a426169a1815c4f92ef46461db9275e60aabe3ac62e9eb57d5a36e34ded
4
- data.tar.gz: f05140fed7e69015dcfe19e2f9d52498a7cf260da0ffb31fbcbaddf505f204f0
3
+ metadata.gz: 6ef8c74fea9d69b3a25c80713f13f4878f590560356a3e588502838500228ceb
4
+ data.tar.gz: 1c653195f19a36c429387daec3c12153e9394424b5dd0d1edad62f1f9b4fdcea
5
5
  SHA512:
6
- metadata.gz: dcfb2eca9b54bd5871c9899640abba32e6da653f3db94ba9701ccc7271225d0634c77361444c1683f1f71bb138afc4e3d86e416fb930a3f6bf74a6bd93449974
7
- data.tar.gz: 9d3efacb12c9dc6959501101d3f2ad31b8367909beb36eb139d7a702e57ad05046363330d253dc6f39c163541c24d62f42ce780aca900ca82754054b93ed4404
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 POST services -F "file=@samples/apps/rabbitmq.yml"`
57
+ * `mkitc create samples/apps/rabbitmq.yml`
51
58
  * Update service
52
- * `mkitc PUT services/{id|service_name} -F "file=@samples/apps/rabbitmq.yml"`
53
- * Get services
54
- * `mkitc GET services/{id|service_name}[?verbose=true]`
59
+ * `mkitc update samples/apps/rabbitmq.yml`
60
+ * Get service
61
+ * `mkitc ps {id|service_name}`
55
62
  * Delete service
56
- * `mkitc DELETE services/{id|service_name}`
63
+ * `mkitc rm {id|service_name}`
57
64
  * List services
58
- * `mkitc GET services?verbose=true`
65
+ * `mkitc ps [-v (verbose)]`
59
66
  * Control service
60
- * `mkitc PUT services/{id|service_name}/start`
61
- * `mkitc PUT services/{id|service_name}/stop`
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
- VERBS = %w{GET POST PUT DELETE}
9
- def usage
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 run
19
- if ARGV.size < 2 || VERBS.index(ARGV[0]).nil?
20
- usage
21
- exit 1
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
- response = %x{curl -sL -X #{ARGV[0]} http://localhost:4567/#{ARGV[1]} #{ARGV[2]} #{ARGV[3]} #{ARGV[4]} #{ARGV[5]} #{ARGV[6]} #{ARGV[7]}}
25
- puts response
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.run
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 inspect_network(network_name)
42
- x = MKIt::CmdRunner.run("docker network inspect #{network_name}")
43
- JSON.parse(x).first
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)
@@ -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
- lease.select(:status == MKIt::PoolStatus::IN_USE || :status == MKIt::PoolStatus::RESERVED).each { |l|
20
- leased_ip = l.ip.split('.')[3]
21
- leased_ip = leased_ip.to_i
22
- if leased_ip >= next_ip
23
- next_ip = leased_ip+1
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
- netw = inspect_network(self.pods_network)
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
@@ -1,4 +1,4 @@
1
1
  module MKIt
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
4
4
 
@@ -2,7 +2,7 @@
2
2
  service:
3
3
  name: rabbitmq
4
4
  image: rabbitmq:3-management-alpine
5
- network: bridge # docker network
5
+ network: rabbitmq # docker network
6
6
  ports:
7
7
  - 5672:5672:tcp:round_robin
8
8
  - 80:15672:http:round_robin
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.2.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-08 00:00:00.000000000 Z
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.3.5
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: []