dry-stack 0.0.7 → 0.0.8

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: 2ab4e5cc474243867d1902215d9e0c8f691637f385a3def0cc38e95eb77130ae
4
- data.tar.gz: 10cfa1a70397061a5d7a7ed3a6d37eb4b130efa63c2410910bbf691c3fe85d8e
3
+ metadata.gz: 7966c8d4d90e8f6c2b7b9f011d59392c043e8349bdfaf32af64533d0ac8363e3
4
+ data.tar.gz: c20e78cc4176fecbe03803089933b8cbb6ce5424e66156c7db0a24ab14ae27d8
5
5
  SHA512:
6
- metadata.gz: 363dfb68ec8bd172a5e44f553f7393952f7c0aff11f55c81b0062a573a18a63f7a4262404e13cce1c7da34de804cde9da676a9074837d9eb4b758dc355e8876a
7
- data.tar.gz: a236bdec6ff3f622212d3b01e524b4ae939d09a826a989563fab76355ce08e9aa3347cfa05f3fe10b86ce7592d590a49c600ee74ab044e0213293a450a386ec0
6
+ metadata.gz: 65c0854dcde519ad3fbb577c9a5098e92c436a349bab23af6a79fc0db28957391879feed79eacdd13f0e410ff54bfa34754ed8279a7d429ab2d1b280c5645b1e
7
+ data.tar.gz: 695bfe12d7747d476500a6f927d99ff3bc6d1a86d18e5eb44aec532eb4f9ca1811d0d7a563b9d93492b335e5b7014ff1549a67c2981a8d7d427e8f03d063987e
@@ -1,8 +1,8 @@
1
1
  require_relative 'command_line'
2
2
 
3
3
  Dry::CommandLine::COMMANDS[:to_compose] = Class.new do
4
- def run(stack, params, args)
5
- yaml = stack.to_compose.lines[1..].join
4
+ def run(stack, params)
5
+ yaml = stack.to_compose(params).lines[1..].join
6
6
 
7
7
  # substitute ENV variables
8
8
  params[:'no-env'] ? $stdout.puts(yaml) : system("echo \"#{yaml}\"")
@@ -38,6 +38,8 @@ module Dry
38
38
  # in all caps are required
39
39
  o.on('-s', '--stack STACK_NAME', 'Stack file')
40
40
  o.on('-e', '--env', 'Load .env file') { load_env }
41
+ o.on('', '--ingress', 'Generate ingress labels') { true }
42
+ o.on('', '--traefik', 'Generate traefik labels') { true }
41
43
  o.on('-n', '--no-env', 'Do not process env variables') { true }
42
44
  o.on('-h', '--help') { puts o; exit }
43
45
  o.parse! args, into: params
@@ -49,10 +51,10 @@ module Dry
49
51
 
50
52
  stack_text = $stdin.tty? ? File.read(params[:stack]) : STDIN.read
51
53
  Dry::Stack() { eval stack_text }
52
- COMMANDS[command.to_sym].run Stack.last_stack, params, args
53
- rescue => e
54
- puts e.message
55
- exit 1
54
+ COMMANDS[command.to_sym].run Stack.last_stack, params
55
+ # rescue => e
56
+ # puts e.message
57
+ # exit 1
56
58
  end
57
59
  end
58
60
  end
@@ -27,7 +27,7 @@ module Dry
27
27
  end
28
28
 
29
29
  def initialize(name)
30
- @name = name
30
+ @name = name || 'stack'
31
31
  @services = {}
32
32
  @networks = {}
33
33
  @publish_ports = {}
@@ -36,11 +36,17 @@ module Dry
36
36
 
37
37
  def stringify(hash) = hash.to_h { |k, v| [k.to_s, v.is_a?(Hash) ? stringify(v) : v] }
38
38
 
39
- def to_compose
40
- compose = {name: @name,
41
- services: YAML.load(@services.to_yaml),
42
- networks: YAML.load(@networks.to_yaml),
39
+ def nginx_host2regexp(str)
40
+ str.to_s.gsub('.', '\.').gsub('*', '.*')
41
+ end
42
+
43
+ def to_compose(opts = {})
44
+ compose = {
45
+ name: @name.to_s, # https://docs.docker.com/compose/compose-file/#configs-top-level-element
46
+ services: YAML.load(@services.to_yaml),
47
+ networks: YAML.load(@networks.to_yaml),
43
48
  }
49
+
44
50
  if @ingress.any?
45
51
  compose[:networks].merge! ingress_routing: {external: true, name: 'ingress-routing'}
46
52
  end
@@ -48,13 +54,28 @@ module Dry
48
54
  compose[:services].each do |name, service|
49
55
  @ingress[name][:port] ||= service[:ports]&.first if @ingress[name]
50
56
  service[:deploy] ||= {}
51
- service[:deploy][:labels] = @ingress[name]&.map { |k, v| "ingress.#{k}=#{v}" }
52
- if @ingress[name]
57
+ service[:deploy][:labels] ||= []
58
+
59
+ if @ingress[name] && (opts[:ingress] || opts[:traefik])
53
60
  service[:networks] ||= []
54
61
  service[:networks] << 'default' if service[:networks].empty?
55
62
  service[:networks] << 'ingress_routing'
56
63
  end
57
64
 
65
+ if @ingress[name] && opts[:ingress]
66
+ service[:deploy][:labels] = @ingress[name]&.map { |k, v| "ingress.#{k}=#{v}" }
67
+ end
68
+
69
+ if @ingress[name] && opts[:traefik]
70
+ service_name = "#{@name}_#{name}"
71
+ service[:deploy][:labels] += [
72
+ 'traefik.enable=true',
73
+ "traefik.http.routers.nginx.service=#{service_name}",
74
+ "traefik.http.services.#{service_name}.loadbalancer.server.port=#{@ingress[name][:port]}",
75
+ "traefik.http.routers.nginx.rule=HostRegexp(`{name:#{nginx_host2regexp @ingress[name][:host]}}`)"
76
+ ]
77
+ end
78
+
58
79
  service[:ports] = @publish_ports[name]&.zip(service[:ports] || @publish_ports[name])&.map { _1.join ':' }
59
80
  end
60
81
 
data/lib/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Dry
2
2
  class Stack
3
- VERSION = '0.0.7'
3
+ VERSION = '0.0.8'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dry-stack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Artyom B
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-11-08 00:00:00.000000000 Z
11
+ date: 2022-11-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake