harbr 0.0.36 → 0.0.37
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/exe/harbr +1 -6
- data/lib/harbr/container.rb +2 -4
- data/lib/harbr/job.rb +90 -92
- data/lib/harbr/pool.rb +25 -27
- data/lib/harbr/version.rb +1 -1
- data/lib/harbr.rb +5 -6
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0deb1db9d12d5db8012da650e94a8e00e42e22d2a737e7c72d8643f3639eb90e
|
4
|
+
data.tar.gz: 2244f98cb5d649fb3a3d69aebfb8f149afed4a0721bbe4ed6fb868086f46880b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 00d9d014e5ea856653de68efbe0b3f1d71660d809142f29acb52a1faa7a63edf681ca8550b7f86da5dfb14d845fd202b370da1b939380c39b8bca9bade0b4f8e
|
7
|
+
data.tar.gz: dc33ac266549d27ae583bf3b1338599f1ef22132fb87f7f06776dbe46324e8b5c6cf6de8a430d8fedacc4aa6bd66ccc8d5e27a1830ae93462d65d1ad00396cdd
|
data/exe/harbr
CHANGED
@@ -2,12 +2,7 @@
|
|
2
2
|
require_relative "../lib/harbr"
|
3
3
|
|
4
4
|
class HarbrCLI < Thor
|
5
|
-
|
6
|
-
DEFAULT_DIRECTORY_DATA_DIR = "#{DEFAULT_DIRECTORY}/.data"
|
7
|
-
Dddr.configure do |config|
|
8
|
-
config.data_dir = DEFAULT_DIRECTORY_DATA_DIR
|
9
|
-
end
|
10
|
-
|
5
|
+
|
11
6
|
no_commands do
|
12
7
|
def load_manifest(container, version)
|
13
8
|
manifest_path = "/var/harbr/#{container}/versions/#{version}/config/manifest.yml"
|
data/lib/harbr/container.rb
CHANGED
@@ -2,15 +2,13 @@ module Harbr
|
|
2
2
|
class Container
|
3
3
|
include Dddr::Entity
|
4
4
|
attr_accessor :name, :host_header, :ip, :port
|
5
|
+
|
5
6
|
queries do
|
6
7
|
def find_by_header(host_header)
|
7
8
|
all.find { |container| container.host_header.downcase == host_header.downcase }
|
8
9
|
end
|
9
10
|
end
|
10
|
-
|
11
|
-
def number
|
12
|
-
port
|
13
|
-
end
|
11
|
+
|
14
12
|
|
15
13
|
end
|
16
14
|
end
|
data/lib/harbr/job.rb
CHANGED
@@ -1,118 +1,116 @@
|
|
1
1
|
module Harbr
|
2
|
-
class
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
"
|
8
|
-
"
|
9
|
-
"
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
"services" => {}
|
15
|
-
}
|
2
|
+
class Job
|
3
|
+
include SuckerPunch::Job
|
4
|
+
def create_traefik_config(containers)
|
5
|
+
config = {
|
6
|
+
"http" => {
|
7
|
+
"routers" => {
|
8
|
+
"traefik-dashboard" => {
|
9
|
+
"rule" => "Host(`traefik.harbr.zero2one.ee`)",
|
10
|
+
"service" => "api@internal"
|
11
|
+
}
|
12
|
+
},
|
13
|
+
"services" => {}
|
16
14
|
}
|
15
|
+
}
|
17
16
|
|
18
|
-
|
19
|
-
|
17
|
+
containers.each do |container|
|
18
|
+
container.ip = "127.0.0.1"
|
20
19
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
}
|
20
|
+
config["http"]["routers"]["#{container.name}-router"] = {
|
21
|
+
"rule" => "Host(`#{container.host_header}`)",
|
22
|
+
"service" => "#{container.name}-service"
|
23
|
+
}
|
24
|
+
config["http"]["services"]["#{container.name}-service"] = {
|
25
|
+
"loadBalancer" => {
|
26
|
+
"servers" => [{"url" => "http://#{container.ip}:#{container.port}"}]
|
29
27
|
}
|
30
|
-
|
31
|
-
|
32
|
-
File.write("/etc/traefik/harbr.toml", TomlRB.dump(config))
|
33
|
-
puts "Traefik configuration written to /etc/traefik/harbr.toml"
|
28
|
+
}
|
34
29
|
end
|
35
30
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
puts "Directory already exists: #{service_dir}"
|
40
|
-
return
|
41
|
-
end
|
42
|
-
|
43
|
-
script_template = <<~SCRIPT
|
44
|
-
#!/bin/sh
|
45
|
-
exec 2>&1
|
46
|
-
cd /var/harbr/#{container_name}/current
|
47
|
-
exec bundle exec puma -p #{port}
|
48
|
-
SCRIPT
|
49
|
-
|
50
|
-
service_dir = "/etc/sv/harbr/#{container_name}"
|
51
|
-
FileUtils.mkdir_p(service_dir)
|
52
|
-
|
53
|
-
File.write("#{service_dir}/run", script_template)
|
54
|
-
FileUtils.chmod("+x", "#{service_dir}/run")
|
55
|
-
puts "Run script created and made executable for container: #{container_name}"
|
56
|
-
end
|
31
|
+
File.write("/etc/traefik/harbr.toml", TomlRB.dump(config))
|
32
|
+
puts "Traefik configuration written to /etc/traefik/harbr.toml"
|
33
|
+
end
|
57
34
|
|
58
|
-
|
59
|
-
|
35
|
+
def create_run_script(container_name, port)
|
36
|
+
service_dir = "/etc/sv/harbr/#{container_name}"
|
37
|
+
if File.directory?(service_dir)
|
38
|
+
puts "Directory already exists: #{service_dir}"
|
39
|
+
return
|
40
|
+
end
|
60
41
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
42
|
+
script_template = <<~SCRIPT
|
43
|
+
#!/bin/sh
|
44
|
+
exec 2>&1
|
45
|
+
cd /var/harbr/#{container_name}/current
|
46
|
+
exec bundle exec puma -p #{port}
|
47
|
+
SCRIPT
|
65
48
|
|
66
|
-
|
49
|
+
service_dir = "/etc/sv/harbr/#{container_name}"
|
50
|
+
FileUtils.mkdir_p(service_dir)
|
67
51
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
52
|
+
File.write("#{service_dir}/run", script_template)
|
53
|
+
FileUtils.chmod("+x", "#{service_dir}/run")
|
54
|
+
puts "Run script created and made executable for container: #{container_name}"
|
55
|
+
end
|
72
56
|
|
73
|
-
|
74
|
-
|
57
|
+
def create_log_script(container_name)
|
58
|
+
log_dir = "/var/log/harbr/#{container_name}"
|
75
59
|
|
76
|
-
|
77
|
-
|
78
|
-
|
60
|
+
if File.directory?(log_dir)
|
61
|
+
puts "Directory already exists: #{log_dir}"
|
62
|
+
return
|
79
63
|
end
|
80
64
|
|
81
|
-
|
82
|
-
create_run_script(container_name, port)
|
83
|
-
create_log_script(container_name)
|
84
|
-
system("ln -s /etc/sv/harbr/#{container_name} /etc/service/#{container_name}") unless File.exist?("/etc/service/#{container_name}")
|
85
|
-
end
|
65
|
+
FileUtils.mkdir_p(log_dir)
|
86
66
|
|
87
|
-
|
88
|
-
|
67
|
+
script_template = <<~SCRIPT
|
68
|
+
#!/bin/sh
|
69
|
+
exec svlogd -tt #{log_dir}/
|
70
|
+
SCRIPT
|
89
71
|
|
90
|
-
|
91
|
-
|
92
|
-
end
|
72
|
+
dir_path = "/etc/sv/harbr/#{container_name}/log"
|
73
|
+
FileUtils.mkdir_p(dir_path)
|
93
74
|
|
94
|
-
|
95
|
-
|
75
|
+
File.write("#{dir_path}/run", script_template)
|
76
|
+
FileUtils.chmod("+x", "#{dir_path}/run")
|
77
|
+
puts "Log script created and made executable for container: #{container_name}"
|
78
|
+
end
|
96
79
|
|
97
|
-
|
80
|
+
def create_a_service(container_name, port)
|
81
|
+
create_run_script(container_name, port)
|
82
|
+
create_log_script(container_name)
|
83
|
+
system("ln -s /etc/sv/harbr/#{container_name} /etc/service/#{container_name}") unless File.exist?("/etc/service/#{container_name}")
|
84
|
+
end
|
98
85
|
|
99
|
-
|
100
|
-
|
86
|
+
def run_container(manifest)
|
87
|
+
puts "Starting container: #{manifest.name}"
|
101
88
|
|
102
|
-
|
103
|
-
|
104
|
-
container.ip = manifest.ip.nil?
|
105
|
-
container.port = port.number
|
106
|
-
containers.add(container) unless containers.find_by_header(manifest.host)
|
107
|
-
system("cd /var/harbr/#{manifest.name}/current && bundle install")
|
108
|
-
system("sv restart #{manifest.name}")
|
109
|
-
puts "Started container: #{manifest.name}"
|
110
|
-
create_traefik_config(containers.all)
|
89
|
+
Dddr.configure do |config|
|
90
|
+
config.data_dir = Harbr::DEFAULT_DIRECTORY_DATA_DIR
|
111
91
|
end
|
112
92
|
|
113
|
-
|
114
|
-
|
115
|
-
|
93
|
+
pool = Harbr::Pool.new
|
94
|
+
port = pool.get_port(manifest.host)
|
95
|
+
|
96
|
+
create_a_service(manifest.name, port.number)
|
97
|
+
|
98
|
+
container = Container.new
|
99
|
+
containers = Container::Repository.new
|
100
|
+
|
101
|
+
container.name = manifest.name
|
102
|
+
container.host_header = manifest.host
|
103
|
+
container.ip = manifest.ip.nil?
|
104
|
+
container.port = port.number
|
105
|
+
containers.add(container) unless containers.find_by_header(manifest.host)
|
106
|
+
system("cd /var/harbr/#{manifest.name}/current && bundle install")
|
107
|
+
system("sv restart #{manifest.name}")
|
108
|
+
puts "Started container: #{manifest.name}"
|
109
|
+
create_traefik_config(containers.all)
|
110
|
+
end
|
111
|
+
|
112
|
+
def perform(manifest)
|
113
|
+
run_container(manifest)
|
116
114
|
end
|
117
115
|
end
|
118
116
|
end
|
data/lib/harbr/pool.rb
CHANGED
@@ -1,39 +1,37 @@
|
|
1
1
|
module Harbr
|
2
|
-
class
|
3
|
-
|
4
|
-
|
5
|
-
@repository = Port::Repository.new
|
2
|
+
class Pool # rubocop:disable Style/Documentation
|
3
|
+
def initialize(port_range = 50000..51000)
|
4
|
+
@repository = Port::Repository.new
|
6
5
|
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
port_range.each do |number|
|
7
|
+
port = Port.new
|
8
|
+
port.number = number
|
10
9
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
end
|
10
|
+
unless @repository.has_port_number? number
|
11
|
+
@repository.add(port)
|
12
|
+
puts port.number.to_s + " added!"
|
15
13
|
end
|
16
14
|
end
|
15
|
+
end
|
17
16
|
|
18
|
-
|
19
|
-
|
20
|
-
|
17
|
+
def get_port(host_header)
|
18
|
+
port = @repository.assigned_a_port?(host_header)
|
19
|
+
return port unless port.nil?
|
21
20
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
21
|
+
port = ports.shuffle.sample
|
22
|
+
port.host_header = host_header
|
23
|
+
@repository.update(port)
|
24
|
+
port
|
25
|
+
end
|
27
26
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
27
|
+
def return_port(port)
|
28
|
+
port.host_header = nil
|
29
|
+
@repository.update(port)
|
30
|
+
port.host_header.nil?
|
31
|
+
end
|
33
32
|
|
34
|
-
|
35
|
-
|
36
|
-
end
|
33
|
+
def ports
|
34
|
+
@repository.all
|
37
35
|
end
|
38
36
|
end
|
39
37
|
end
|
data/lib/harbr/version.rb
CHANGED
data/lib/harbr.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require "thor"
|
2
2
|
require "dddr"
|
3
|
-
require "harbr"
|
4
3
|
require "terminal-table"
|
5
4
|
require "yaml"
|
6
5
|
require "toml-rb"
|
@@ -18,10 +17,10 @@ require_relative "harbr/pool"
|
|
18
17
|
module Harbr
|
19
18
|
DEFAULT_DIRECTORY = "/var/harbr"
|
20
19
|
DEFAULT_DIRECTORY_DATA_DIR = "#{DEFAULT_DIRECTORY}/.data"
|
21
|
-
|
22
|
-
Dddr.configure do |config|
|
23
|
-
config.data_dir = DEFAULT_DIRECTORY_DATA_DIR
|
24
|
-
end
|
25
|
-
|
26
20
|
class Error < StandardError; end
|
27
21
|
end
|
22
|
+
|
23
|
+
Dddr.configure do |config|
|
24
|
+
config.data_dir = Harbr::DEFAULT_DIRECTORY_DATA_DIR
|
25
|
+
end
|
26
|
+
|