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 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: []