minfra-cli 1.12.0 → 1.13.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/CHANGELOG.md +6 -0
- data/Gemfile.lock +23 -29
- data/README.md +1 -1
- data/lib/minfra/cli/version.rb +1 -1
- data/lib/orchparty/dsl_parser_kubernetes.rb +28 -1
- data/lib/orchparty/kubernetes_application.rb +149 -137
- data/minfra-cli.gemspec +1 -1
- metadata +7 -7
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 013e2aad3df9fffb13eaceeac4ccc3306ac4dfedb9ef7f0019251ee4238e9dbf
|
|
4
|
+
data.tar.gz: 266a3cbfbcbc27eda6411806a20c1f3d5547d4b02fda404531861eb538f1be2b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ab2a2990bec284c339aaee8b49998cbf93c5cc53179a70ac6ddc6c6d557eb30b3b5b594877d744875bbeb200b90533630e61d60a84b016dab044e128b74aa6b0
|
|
7
|
+
data.tar.gz: b2e7767759e9c2eb7391974a46d1c1bec649f5247f580a7f7aef3b3bbc98e451d1ef882bdae0fc52fbfa12ad2d572a3d8daefb0a7a05f774909bf1aab1e2f129
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
# 1.13.0
|
|
2
|
+
* secrets can be rendered with apply (currently hardcoded)
|
|
3
|
+
* moved most output to debug level
|
|
4
|
+
# 1.12.1
|
|
5
|
+
* replaced all relevant system calls with new runners (fixed apply and
|
|
6
|
+
generic_secrets)
|
|
1
7
|
# 1.12.0
|
|
2
8
|
* refactoring Runner
|
|
3
9
|
* adding runner type system (popen is default)
|
data/Gemfile.lock
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
minfra-cli (1.
|
|
5
|
-
activesupport (
|
|
4
|
+
minfra-cli (1.12.0)
|
|
5
|
+
activesupport (= 7.0.7.2)
|
|
6
6
|
erubis (~> 2.7)
|
|
7
7
|
hashie (~> 3.5)
|
|
8
8
|
hiera (= 3.9.0)
|
|
@@ -15,16 +15,14 @@ PATH
|
|
|
15
15
|
GEM
|
|
16
16
|
remote: https://rubygems.org/
|
|
17
17
|
specs:
|
|
18
|
-
activesupport (
|
|
18
|
+
activesupport (7.0.7.2)
|
|
19
19
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
|
20
20
|
i18n (>= 1.6, < 2)
|
|
21
21
|
minitest (>= 5.1)
|
|
22
22
|
tzinfo (~> 2.0)
|
|
23
|
-
|
|
24
|
-
concurrent-ruby (1.2.0)
|
|
23
|
+
concurrent-ruby (1.2.2)
|
|
25
24
|
diff-lcs (1.5.0)
|
|
26
|
-
domain_name (0.
|
|
27
|
-
unf (>= 0.0.5, < 1.0.0)
|
|
25
|
+
domain_name (0.6.20231109)
|
|
28
26
|
erubis (2.7.0)
|
|
29
27
|
hashie (3.6.0)
|
|
30
28
|
hiera (3.9.0)
|
|
@@ -37,42 +35,38 @@ GEM
|
|
|
37
35
|
http-accept (1.7.0)
|
|
38
36
|
http-cookie (1.0.5)
|
|
39
37
|
domain_name (~> 0.5)
|
|
40
|
-
i18n (1.
|
|
38
|
+
i18n (1.14.1)
|
|
41
39
|
concurrent-ruby (~> 1.0)
|
|
42
|
-
mime-types (3.
|
|
40
|
+
mime-types (3.5.1)
|
|
43
41
|
mime-types-data (~> 3.2015)
|
|
44
|
-
mime-types-data (3.
|
|
45
|
-
minitest (5.
|
|
42
|
+
mime-types-data (3.2023.1205)
|
|
43
|
+
minitest (5.20.0)
|
|
46
44
|
netrc (0.11.0)
|
|
47
|
-
optimist (3.0
|
|
45
|
+
optimist (3.1.0)
|
|
48
46
|
rake (12.3.3)
|
|
49
47
|
rest-client (2.1.0)
|
|
50
48
|
http-accept (>= 1.7.0, < 2.0)
|
|
51
49
|
http-cookie (>= 1.0.2, < 2.0)
|
|
52
50
|
mime-types (>= 1.16, < 4.0)
|
|
53
51
|
netrc (~> 0.8)
|
|
54
|
-
rspec (3.
|
|
55
|
-
rspec-core (~> 3.
|
|
56
|
-
rspec-expectations (~> 3.
|
|
57
|
-
rspec-mocks (~> 3.
|
|
58
|
-
rspec-core (3.
|
|
59
|
-
rspec-support (~> 3.
|
|
60
|
-
rspec-expectations (3.
|
|
52
|
+
rspec (3.12.0)
|
|
53
|
+
rspec-core (~> 3.12.0)
|
|
54
|
+
rspec-expectations (~> 3.12.0)
|
|
55
|
+
rspec-mocks (~> 3.12.0)
|
|
56
|
+
rspec-core (3.12.2)
|
|
57
|
+
rspec-support (~> 3.12.0)
|
|
58
|
+
rspec-expectations (3.12.3)
|
|
61
59
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
62
|
-
rspec-support (~> 3.
|
|
63
|
-
rspec-mocks (3.
|
|
60
|
+
rspec-support (~> 3.12.0)
|
|
61
|
+
rspec-mocks (3.12.6)
|
|
64
62
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
65
|
-
rspec-support (~> 3.
|
|
66
|
-
rspec-support (3.
|
|
63
|
+
rspec-support (~> 3.12.0)
|
|
64
|
+
rspec-support (3.12.1)
|
|
67
65
|
table_print (1.5.6)
|
|
68
|
-
thor (1.
|
|
69
|
-
timecop (0.9.
|
|
66
|
+
thor (1.3.0)
|
|
67
|
+
timecop (0.9.8)
|
|
70
68
|
tzinfo (2.0.6)
|
|
71
69
|
concurrent-ruby (~> 1.0)
|
|
72
|
-
unf (0.1.4)
|
|
73
|
-
unf_ext
|
|
74
|
-
unf_ext (0.0.8.2)
|
|
75
|
-
zeitwerk (2.6.6)
|
|
76
70
|
|
|
77
71
|
PLATFORMS
|
|
78
72
|
ruby
|
data/README.md
CHANGED
data/lib/minfra/cli/version.rb
CHANGED
|
@@ -378,12 +378,39 @@ module Orchparty
|
|
|
378
378
|
self
|
|
379
379
|
end
|
|
380
380
|
|
|
381
|
-
|
|
381
|
+
# secrets can be aprt of the helm chart or we write them to
|
|
382
|
+
# a file and later apply it
|
|
383
|
+
# apiVersion: v1
|
|
384
|
+
# kind: Secret
|
|
385
|
+
# metadata:
|
|
386
|
+
# name: dotfile-secret
|
|
387
|
+
# data:
|
|
388
|
+
# key: base64_encoded_value
|
|
389
|
+
|
|
390
|
+
def secrets(name, deploy: :helm, &block)
|
|
391
|
+
case deploy
|
|
392
|
+
when :helm
|
|
382
393
|
result = ServiceBuilder.build(name, "chart-secret", block)
|
|
383
394
|
@application.services[name] = result
|
|
384
395
|
@application._service_order << name
|
|
385
396
|
@node._services << name
|
|
386
397
|
self
|
|
398
|
+
when :apply
|
|
399
|
+
result = ServiceBuilder.build(name, "apply", block)
|
|
400
|
+
file = Tempfile.create(name)
|
|
401
|
+
result.tmp_file=file.path
|
|
402
|
+
file.puts "apiVersion: v1\nkind: Secret\nmetadata:\n name: #{name}\ntype: Opaque\ndata:"
|
|
403
|
+
result._.each do |key, value|
|
|
404
|
+
file.puts " #{key}: #{Base64.strict_encode64(value.respond_to?(:call) ? value.call : value)}"
|
|
405
|
+
end
|
|
406
|
+
file.close
|
|
407
|
+
@application.services[name] = result
|
|
408
|
+
@application._service_order << name
|
|
409
|
+
when :none
|
|
410
|
+
|
|
411
|
+
else
|
|
412
|
+
raise "unknown secret type: #{type}, known tpyes: [helm, apply]"
|
|
413
|
+
end
|
|
387
414
|
end
|
|
388
415
|
|
|
389
416
|
end
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'English'
|
|
1
4
|
require 'erb'
|
|
2
5
|
require 'erubis'
|
|
3
6
|
require 'open3'
|
|
@@ -10,34 +13,32 @@ require 'active_support/core_ext'
|
|
|
10
13
|
module Orchparty
|
|
11
14
|
module Services
|
|
12
15
|
class Context
|
|
13
|
-
include ::Minfra::Cli::Logging
|
|
16
|
+
include ::Minfra::Cli::Logging
|
|
14
17
|
|
|
15
|
-
attr_accessor :cluster_name
|
|
16
|
-
attr_accessor :namespace
|
|
17
|
-
attr_accessor :dir_path
|
|
18
|
-
attr_accessor :app_config
|
|
19
|
-
attr_accessor :options
|
|
18
|
+
attr_accessor :cluster_name, :namespace, :dir_path, :app_config, :options, :service
|
|
20
19
|
|
|
21
|
-
def initialize(cluster_name
|
|
20
|
+
def initialize(cluster_name:, namespace:, file_path:, app_config:, app:, service:, out_io: $stdout)
|
|
22
21
|
self.cluster_name = cluster_name
|
|
23
22
|
self.namespace = namespace
|
|
24
23
|
self.dir_path = file_path
|
|
25
24
|
self.app_config = app_config
|
|
26
25
|
@app = app
|
|
27
26
|
@out_io = out_io
|
|
28
|
-
self.
|
|
27
|
+
self.service = service # ugly naming, should be 'context'?
|
|
28
|
+
self.options = options
|
|
29
29
|
end
|
|
30
30
|
|
|
31
|
-
def template(file_path, helm, flag:
|
|
32
|
-
return
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
31
|
+
def template(file_path, helm, flag: '-f ', fix_file_path: nil)
|
|
32
|
+
return '' unless file_path
|
|
33
|
+
|
|
34
|
+
debug "Rendering: #{file_path}"
|
|
35
|
+
file_path = File.join(dir_path, file_path) unless file_path.start_with?('/')
|
|
36
|
+
if file_path.end_with?('.erb')
|
|
36
37
|
helm.application = OpenStruct.new(cluster_name: cluster_name, namespace: namespace)
|
|
37
38
|
template = Erubis::Eruby.new(File.read(file_path))
|
|
38
39
|
template.filename = file_path
|
|
39
40
|
yaml = template.result(helm.get_binding)
|
|
40
|
-
file = Tempfile.new(
|
|
41
|
+
file = Tempfile.new('kube-deploy.yaml')
|
|
41
42
|
file.write(yaml)
|
|
42
43
|
file.close
|
|
43
44
|
file_path = file.path
|
|
@@ -45,108 +46,125 @@ module Orchparty
|
|
|
45
46
|
"#{flag}#{fix_file_path || file_path}"
|
|
46
47
|
end
|
|
47
48
|
|
|
48
|
-
def print_install
|
|
49
|
-
@out_io.puts
|
|
50
|
-
@out_io.puts install_cmd(
|
|
51
|
-
@out_io.puts upgrade_cmd(
|
|
52
|
-
@out_io.puts
|
|
53
|
-
@out_io.puts File.read(template(value_path
|
|
49
|
+
def print_install
|
|
50
|
+
@out_io.puts '---'
|
|
51
|
+
@out_io.puts install_cmd(value_path).cmd
|
|
52
|
+
@out_io.puts upgrade_cmd(value_path).cmd
|
|
53
|
+
@out_io.puts '---'
|
|
54
|
+
@out_io.puts File.read(template(value_path, service, flag: '')) if value_path
|
|
55
|
+
cleanup
|
|
54
56
|
end
|
|
55
57
|
|
|
56
58
|
# On 05.02.2021 we have decided that it would be best to print both commands.
|
|
57
59
|
# This way it would be possible to debug both upgrade and install and also people would not see git diffs all the time.
|
|
58
|
-
def print_upgrade
|
|
59
|
-
print_install
|
|
60
|
+
def print_upgrade
|
|
61
|
+
print_install
|
|
60
62
|
end
|
|
61
63
|
|
|
62
|
-
def upgrade
|
|
63
|
-
@out_io.puts upgrade_cmd
|
|
64
|
+
def upgrade
|
|
65
|
+
@out_io.puts upgrade_cmd.run.stdout
|
|
66
|
+
cleanup if respond_to?(:cleanup)
|
|
64
67
|
end
|
|
65
68
|
|
|
66
|
-
def install
|
|
67
|
-
@out_io.puts install_cmd
|
|
69
|
+
def install
|
|
70
|
+
@out_io.puts install_cmd.run.stdout
|
|
71
|
+
cleanup if respond_to?(:cleanup)
|
|
68
72
|
end
|
|
69
73
|
end
|
|
70
74
|
|
|
71
75
|
class Helm < Context
|
|
72
|
-
def value_path
|
|
73
|
-
|
|
76
|
+
def value_path
|
|
77
|
+
service[:values]
|
|
74
78
|
end
|
|
75
79
|
|
|
76
|
-
def upgrade_cmd(
|
|
77
|
-
Minfra::Cli::HelmRunner.new("upgrade --namespace #{namespace} --kube-context #{cluster_name} --version #{
|
|
80
|
+
def upgrade_cmd(fix_file_path = nil)
|
|
81
|
+
Minfra::Cli::HelmRunner.new("upgrade --namespace #{namespace} --kube-context #{cluster_name} --version #{service.version} #{service.name} #{service.chart} #{template(
|
|
82
|
+
value_path, service, fix_file_path: fix_file_path
|
|
83
|
+
)}")
|
|
78
84
|
end
|
|
79
85
|
|
|
80
|
-
def install_cmd(
|
|
81
|
-
Minfra::Cli::HelmRunner.new("install --create-namespace --namespace #{namespace} --kube-context #{cluster_name} --version #{
|
|
86
|
+
def install_cmd(fix_file_path = nil)
|
|
87
|
+
Minfra::Cli::HelmRunner.new("install --create-namespace --namespace #{namespace} --kube-context #{cluster_name} --version #{service.version} #{service.name} #{service.chart} #{template(
|
|
88
|
+
value_path, service, fix_file_path: fix_file_path
|
|
89
|
+
)}")
|
|
82
90
|
end
|
|
83
91
|
end
|
|
84
92
|
|
|
85
93
|
class Apply < Context
|
|
86
|
-
def value_path
|
|
87
|
-
|
|
94
|
+
def value_path
|
|
95
|
+
service[:tmp_file] || service[:name]
|
|
88
96
|
end
|
|
89
97
|
|
|
90
|
-
def upgrade_cmd(
|
|
91
|
-
"
|
|
98
|
+
def upgrade_cmd(fix_file_path = nil)
|
|
99
|
+
Minfra::Cli::KubeCtlRunner.new("apply --namespace #{namespace} --context #{cluster_name} #{template(value_path,
|
|
100
|
+
service, fix_file_path: fix_file_path)}")
|
|
92
101
|
end
|
|
93
102
|
|
|
94
|
-
def install_cmd(
|
|
95
|
-
"
|
|
103
|
+
def install_cmd(fix_file_path = nil)
|
|
104
|
+
Minfra::Cli::KubeCtlRunner.new("apply --namespace #{namespace} --context #{cluster_name} #{template(value_path,
|
|
105
|
+
service, fix_file_path: fix_file_path)}")
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def cleanup
|
|
109
|
+
File.unlink(service[:tmp_file]) if service[:tmp_file]
|
|
96
110
|
end
|
|
97
111
|
end
|
|
98
112
|
|
|
99
113
|
class SecretGeneric < Context
|
|
100
|
-
def value_path
|
|
101
|
-
|
|
114
|
+
def value_path
|
|
115
|
+
service[:from_file]
|
|
102
116
|
end
|
|
103
117
|
|
|
104
|
-
def upgrade_cmd(
|
|
105
|
-
"kubectl --namespace #{namespace} --context #{cluster_name} create secret generic --dry-run -o yaml #{
|
|
118
|
+
def upgrade_cmd(fix_file_path = nil)
|
|
119
|
+
"kubectl --namespace #{namespace} --context #{cluster_name} create secret generic --dry-run -o yaml #{service[:name]} #{template(
|
|
120
|
+
value_path, service, flag: '--from-file=', fix_file_path: fix_file_path
|
|
121
|
+
)} | kubectl --context #{cluster_name} apply -f -"
|
|
106
122
|
end
|
|
107
123
|
|
|
108
|
-
def install_cmd(
|
|
109
|
-
"kubectl --namespace #{namespace} --context #{cluster_name} create secret generic --dry-run -o yaml #{
|
|
124
|
+
def install_cmd(fix_file_path = nil)
|
|
125
|
+
"kubectl --namespace #{namespace} --context #{cluster_name} create secret generic --dry-run -o yaml #{service[:name]} #{template(
|
|
126
|
+
value_path, service, flag: '--from-file=', fix_file_path: fix_file_path
|
|
127
|
+
)} | kubectl --context #{cluster_name} apply -f -"
|
|
110
128
|
end
|
|
111
129
|
end
|
|
112
130
|
|
|
113
131
|
class Label < Context
|
|
114
|
-
def print_install
|
|
115
|
-
@out_io.puts
|
|
116
|
-
@out_io.puts install_cmd
|
|
132
|
+
def print_install
|
|
133
|
+
@out_io.puts '---'
|
|
134
|
+
@out_io.puts install_cmd
|
|
117
135
|
end
|
|
118
136
|
|
|
119
|
-
def print_upgrade
|
|
120
|
-
@out_io.puts
|
|
121
|
-
@out_io.puts upgrade_cmd
|
|
137
|
+
def print_upgrade
|
|
138
|
+
@out_io.puts '---'
|
|
139
|
+
@out_io.puts upgrade_cmd
|
|
122
140
|
end
|
|
123
141
|
|
|
124
|
-
def upgrade_cmd
|
|
125
|
-
"kubectl --namespace #{namespace} --context #{cluster_name} label --overwrite #{
|
|
142
|
+
def upgrade_cmd
|
|
143
|
+
"kubectl --namespace #{namespace} --context #{cluster_name} label --overwrite #{service[:resource]} #{service[:name]} #{service['value']}"
|
|
126
144
|
end
|
|
127
145
|
|
|
128
|
-
def install_cmd
|
|
129
|
-
"kubectl --namespace #{namespace} --context #{cluster_name} label --overwrite #{
|
|
146
|
+
def install_cmd
|
|
147
|
+
"kubectl --namespace #{namespace} --context #{cluster_name} label --overwrite #{service[:resource]} #{service[:name]} #{service['value']}"
|
|
130
148
|
end
|
|
131
149
|
end
|
|
132
150
|
|
|
133
151
|
class Wait < Context
|
|
134
|
-
def print_install
|
|
135
|
-
@out_io.puts
|
|
136
|
-
@out_io.puts
|
|
152
|
+
def print_install
|
|
153
|
+
@out_io.puts '---'
|
|
154
|
+
@out_io.puts service.cmd
|
|
137
155
|
end
|
|
138
156
|
|
|
139
|
-
def print_upgrade
|
|
140
|
-
@out_io.puts
|
|
141
|
-
@out_io.puts
|
|
157
|
+
def print_upgrade
|
|
158
|
+
@out_io.puts '---'
|
|
159
|
+
@out_io.puts service.cmd
|
|
142
160
|
end
|
|
143
161
|
|
|
144
|
-
def upgrade
|
|
145
|
-
eval(
|
|
162
|
+
def upgrade
|
|
163
|
+
eval(service.cmd)
|
|
146
164
|
end
|
|
147
165
|
|
|
148
|
-
def install
|
|
149
|
-
eval(
|
|
166
|
+
def install
|
|
167
|
+
eval(service.cmd)
|
|
150
168
|
end
|
|
151
169
|
end
|
|
152
170
|
|
|
@@ -159,75 +177,70 @@ module Orchparty
|
|
|
159
177
|
end
|
|
160
178
|
end
|
|
161
179
|
|
|
180
|
+
def print_install
|
|
181
|
+
build_chart do |chart_path|
|
|
182
|
+
cmd = "helm template --namespace #{namespace} --debug --kube-context #{cluster_name} --output-dir #{chart_path.join(
|
|
183
|
+
'..', 'helm_expanded'
|
|
184
|
+
)} #{service.name} #{chart_path}"
|
|
185
|
+
@out_io.puts `$cmd`
|
|
186
|
+
if system("#{cmd} > /dev/null")
|
|
162
187
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
build_chart(chart) do |chart_path|
|
|
166
|
-
cmd="helm template --namespace #{namespace} --debug --kube-context #{cluster_name} --output-dir #{chart_path.join('..','helm_expanded')} #{chart.name} #{chart_path}"
|
|
167
|
-
@out_io.puts `$cmd`
|
|
168
|
-
if system("#{cmd} > /dev/null")
|
|
169
|
-
|
|
170
|
-
info("helm template check: OK")
|
|
188
|
+
debug('Helm: template check: OK')
|
|
171
189
|
else
|
|
172
|
-
error(
|
|
173
|
-
end
|
|
190
|
+
error('Helm: template check: FAIL')
|
|
191
|
+
end
|
|
174
192
|
end
|
|
175
|
-
|
|
176
193
|
end
|
|
177
194
|
|
|
178
|
-
def print_upgrade
|
|
179
|
-
print_install
|
|
195
|
+
def print_upgrade
|
|
196
|
+
print_install
|
|
180
197
|
end
|
|
181
198
|
|
|
182
|
-
def install
|
|
183
|
-
|
|
184
|
-
build_chart
|
|
185
|
-
res=Minfra::Cli::HelmRunner.new("install --create-namespace --namespace #{namespace} --kube-context #{cluster_name} #{
|
|
199
|
+
def install
|
|
200
|
+
debug("Install: #{service.name}")
|
|
201
|
+
build_chart do |chart_path|
|
|
202
|
+
res = Minfra::Cli::HelmRunner.new("install --create-namespace --namespace #{namespace} --kube-context #{cluster_name} #{service.name} #{chart_path}").run
|
|
186
203
|
@out_io.puts res.stdout
|
|
187
204
|
end
|
|
188
205
|
end
|
|
189
206
|
|
|
190
|
-
def upgrade
|
|
191
|
-
|
|
192
|
-
build_chart
|
|
193
|
-
res=Minfra::Cli::HelmRunner.new("upgrade --namespace #{namespace} --kube-context #{cluster_name} #{
|
|
207
|
+
def upgrade
|
|
208
|
+
debug("Upgrade: #{service.name}: #{service._services.join(', ')}")
|
|
209
|
+
build_chart do |chart_path|
|
|
210
|
+
res = Minfra::Cli::HelmRunner.new("upgrade --namespace #{namespace} --kube-context #{cluster_name} #{service.name} #{chart_path}").run
|
|
194
211
|
@out_io.puts res.stdout
|
|
195
212
|
end
|
|
196
213
|
end
|
|
214
|
+
|
|
197
215
|
private
|
|
198
|
-
|
|
199
|
-
def build_chart
|
|
216
|
+
|
|
217
|
+
def build_chart
|
|
200
218
|
dir = @app.status_dir.join('helm') # duplication
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
219
|
+
params = service._services.map { |s| app_config.services[s.to_sym] }.map { |s| [s.name, s] }.to_h
|
|
220
|
+
run(templates_path: File.expand_path(service.template, dir_path), params: params, output_chart_path: dir,
|
|
221
|
+
chart: service)
|
|
204
222
|
yield dir
|
|
205
223
|
end
|
|
206
224
|
|
|
207
|
-
|
|
208
|
-
|
|
209
225
|
# remember:
|
|
210
226
|
# this is done for an app
|
|
211
227
|
# that app can have multiple charts with multiple services!
|
|
212
|
-
|
|
213
|
-
def run(templates_path:, params:, output_chart_path:, chart: )
|
|
214
228
|
|
|
215
|
-
|
|
216
|
-
File.open(File.join(output_chart_path, 'values.yaml'),'a') do |helm_values|
|
|
229
|
+
def run(templates_path:, params:, output_chart_path:, chart:)
|
|
230
|
+
File.open(File.join(output_chart_path, 'values.yaml'), 'a') do |helm_values|
|
|
217
231
|
params.each do |app_name, subparams|
|
|
218
232
|
subparams[:chart] = chart
|
|
219
|
-
used_vars=generate_documents_from_erbs(
|
|
233
|
+
used_vars = generate_documents_from_erbs(
|
|
220
234
|
templates_path: templates_path,
|
|
221
235
|
app_name: app_name,
|
|
222
236
|
params: subparams,
|
|
223
237
|
output_chart_path: output_chart_path
|
|
224
238
|
)
|
|
225
|
-
used_vars.each do |variable,value|
|
|
239
|
+
used_vars.each do |variable, value|
|
|
226
240
|
helm_values.puts "#{variable}: \"#{value}\""
|
|
227
241
|
end
|
|
228
242
|
end
|
|
229
243
|
end
|
|
230
|
-
|
|
231
244
|
end
|
|
232
245
|
|
|
233
246
|
def generate_documents_from_erbs(templates_path:, app_name:, params:, output_chart_path:)
|
|
@@ -237,13 +250,13 @@ module Orchparty
|
|
|
237
250
|
end
|
|
238
251
|
|
|
239
252
|
kind = params.fetch(:kind)
|
|
240
|
-
params._used_vars = {} #here we'll collect all used vars
|
|
253
|
+
params._used_vars = {} # here we'll collect all used vars
|
|
241
254
|
|
|
242
255
|
Dir[File.join(templates_path, kind, '*.erb')].each do |template_path|
|
|
243
|
-
|
|
256
|
+
debug("Rendering Template: #{template_path}")
|
|
244
257
|
template_name = File.basename(template_path, '.erb')
|
|
245
258
|
output_path = File.join(output_chart_path, 'templates', "#{app_name}-#{template_name}")
|
|
246
|
-
|
|
259
|
+
|
|
247
260
|
template = Erubis::Eruby.new(File.read(template_path))
|
|
248
261
|
template.filename = template_path
|
|
249
262
|
|
|
@@ -253,14 +266,13 @@ module Orchparty
|
|
|
253
266
|
begin
|
|
254
267
|
document = template.result(CleanBinding.new.get_binding(params))
|
|
255
268
|
rescue Exception
|
|
256
|
-
error "#{template_path} has a problem: #{
|
|
269
|
+
error "#{template_path} has a problem: #{$ERROR_INFO.inspect}"
|
|
257
270
|
raise
|
|
258
271
|
end
|
|
259
272
|
File.write(output_path, document)
|
|
260
273
|
end
|
|
261
274
|
params._used_vars
|
|
262
275
|
end
|
|
263
|
-
|
|
264
276
|
end
|
|
265
277
|
end
|
|
266
278
|
end
|
|
@@ -268,19 +280,16 @@ end
|
|
|
268
280
|
class KubernetesApplication
|
|
269
281
|
include Minfra::Cli::Logging
|
|
270
282
|
|
|
271
|
-
attr_accessor :cluster_name
|
|
272
|
-
attr_accessor :file_path
|
|
273
|
-
attr_accessor :namespace
|
|
274
|
-
attr_accessor :app_config
|
|
283
|
+
attr_accessor :cluster_name, :file_path, :namespace, :app_config
|
|
275
284
|
attr_reader :status_dir
|
|
276
285
|
|
|
277
|
-
def initialize(
|
|
278
|
-
self.file_path = Pathname.new(file_name).parent.expand_path #path of the stack
|
|
286
|
+
def initialize(namespace:, cluster_name:, file_name:, status_dir:, app_config: [], out_io: $stdout)
|
|
287
|
+
self.file_path = Pathname.new(file_name).parent.expand_path # path of the stack
|
|
279
288
|
self.cluster_name = cluster_name
|
|
280
289
|
self.namespace = namespace
|
|
281
290
|
self.app_config = app_config
|
|
282
291
|
@status_dir = status_dir
|
|
283
|
-
@out_io= out_io
|
|
292
|
+
@out_io = out_io
|
|
284
293
|
end
|
|
285
294
|
|
|
286
295
|
def install
|
|
@@ -296,45 +305,47 @@ class KubernetesApplication
|
|
|
296
305
|
end
|
|
297
306
|
|
|
298
307
|
private
|
|
308
|
+
|
|
299
309
|
def prepare
|
|
300
|
-
|
|
301
310
|
output_chart_path = @status_dir.join('helm')
|
|
302
311
|
output_chart_path.rmtree if output_chart_path.exist?
|
|
303
312
|
output_chart_path.mkpath
|
|
304
|
-
templates_path = file_path.join('../../chart-templates').expand_path #don't ask. the whole concept of multiple charts in an app stinks...
|
|
305
|
-
|
|
313
|
+
templates_path = file_path.join('../../chart-templates').expand_path # don't ask. the whole concept of multiple charts in an app stinks...
|
|
314
|
+
|
|
306
315
|
generate_chart_yaml(
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
316
|
+
templates_path: templates_path,
|
|
317
|
+
output_chart_path: output_chart_path,
|
|
318
|
+
chart_name: namespace
|
|
310
319
|
)
|
|
311
320
|
|
|
312
|
-
|
|
321
|
+
debug("Minfra: generating base helm structure from: #{output_chart_path} from #{templates_path}")
|
|
313
322
|
system("mkdir -p #{File.join(output_chart_path, 'templates')}")
|
|
314
323
|
|
|
315
324
|
system("cp #{File.join(templates_path, 'values.yaml')} #{File.join(output_chart_path, 'values.yaml')}")
|
|
316
325
|
system("cp #{File.join(templates_path, '.helmignore')} #{File.join(output_chart_path, '.helmignore')}")
|
|
317
|
-
system("cp #{File.join(templates_path,
|
|
318
|
-
|
|
326
|
+
system("cp #{File.join(templates_path,
|
|
327
|
+
'templates/_helpers.tpl')} #{File.join(output_chart_path, 'templates/_helpers.tpl')}")
|
|
319
328
|
end
|
|
320
329
|
|
|
321
|
-
def generate_chart_yaml(templates_path:, output_chart_path:, chart_name:
|
|
330
|
+
def generate_chart_yaml(templates_path:, output_chart_path:, chart_name:)
|
|
322
331
|
template_path = File.join(templates_path, 'Chart.yaml.erb')
|
|
323
332
|
output_path = File.join(output_chart_path, 'Chart.yaml')
|
|
324
333
|
|
|
325
|
-
res=Minfra::Cli::Templater.read(template_path, params: {chart_name: chart_name})
|
|
334
|
+
res = Minfra::Cli::Templater.read(template_path, params: { chart_name: chart_name })
|
|
326
335
|
File.write(output_path, res)
|
|
327
336
|
end
|
|
328
|
-
|
|
337
|
+
|
|
329
338
|
def combine_charts(app_config)
|
|
330
339
|
services = app_config._service_order.map(&:to_s)
|
|
331
340
|
app_config._service_order.each do |name|
|
|
332
341
|
current_service = app_config[:services][name]
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
342
|
+
next unless current_service._type == 'chart'
|
|
343
|
+
|
|
344
|
+
current_service._services.each do |n|
|
|
345
|
+
services.delete n.to_s
|
|
337
346
|
end
|
|
347
|
+
# else
|
|
348
|
+
# puts "unkown service: #{name}: #{current_service._type}"
|
|
338
349
|
end
|
|
339
350
|
services
|
|
340
351
|
end
|
|
@@ -342,18 +353,19 @@ class KubernetesApplication
|
|
|
342
353
|
def each_service(method)
|
|
343
354
|
prepare
|
|
344
355
|
services = combine_charts(app_config)
|
|
356
|
+
|
|
345
357
|
services.each do |name|
|
|
346
358
|
service = app_config[:services][name]
|
|
347
|
-
|
|
348
|
-
deployable_class="::Orchparty::Services::#{service._type.classify}".constantize
|
|
349
|
-
deployable=deployable_class.new(cluster_name: cluster_name,
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
deployable.send(method
|
|
359
|
+
debug("Generating Service: #{name}(#{service._type}) #{method}")
|
|
360
|
+
deployable_class = "::Orchparty::Services::#{service._type.classify}".constantize
|
|
361
|
+
deployable = deployable_class.new(cluster_name: cluster_name,
|
|
362
|
+
namespace: namespace,
|
|
363
|
+
file_path: file_path,
|
|
364
|
+
app_config: app_config,
|
|
365
|
+
out_io: @out_io,
|
|
366
|
+
app: self,
|
|
367
|
+
service: service)
|
|
368
|
+
deployable.send(method)
|
|
357
369
|
end
|
|
358
370
|
end
|
|
359
371
|
end
|
data/minfra-cli.gemspec
CHANGED
|
@@ -31,7 +31,7 @@ Gem::Specification.new do |spec|
|
|
|
31
31
|
spec.add_runtime_dependency "table_print", "1.5.6"
|
|
32
32
|
spec.add_runtime_dependency "rest-client", "~>2.0"
|
|
33
33
|
spec.add_runtime_dependency "hashie", "~>3.5"
|
|
34
|
-
spec.add_runtime_dependency "activesupport", "
|
|
34
|
+
spec.add_runtime_dependency "activesupport", "= 7.0.7.2"
|
|
35
35
|
spec.add_runtime_dependency "erubis", "~> 2.7"
|
|
36
36
|
spec.add_runtime_dependency "hiera", "3.9.0"
|
|
37
37
|
spec.add_runtime_dependency "hiera-eyaml", "3.3.0"
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: minfra-cli
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.13.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Peter Schrammel
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-
|
|
11
|
+
date: 2023-12-10 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: thor
|
|
@@ -76,16 +76,16 @@ dependencies:
|
|
|
76
76
|
name: activesupport
|
|
77
77
|
requirement: !ruby/object:Gem::Requirement
|
|
78
78
|
requirements:
|
|
79
|
-
- -
|
|
79
|
+
- - '='
|
|
80
80
|
- !ruby/object:Gem::Version
|
|
81
|
-
version:
|
|
81
|
+
version: 7.0.7.2
|
|
82
82
|
type: :runtime
|
|
83
83
|
prerelease: false
|
|
84
84
|
version_requirements: !ruby/object:Gem::Requirement
|
|
85
85
|
requirements:
|
|
86
|
-
- -
|
|
86
|
+
- - '='
|
|
87
87
|
- !ruby/object:Gem::Version
|
|
88
|
-
version:
|
|
88
|
+
version: 7.0.7.2
|
|
89
89
|
- !ruby/object:Gem::Dependency
|
|
90
90
|
name: erubis
|
|
91
91
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -239,7 +239,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
239
239
|
- !ruby/object:Gem::Version
|
|
240
240
|
version: '0'
|
|
241
241
|
requirements: []
|
|
242
|
-
rubygems_version: 3.
|
|
242
|
+
rubygems_version: 3.3.7
|
|
243
243
|
signing_key:
|
|
244
244
|
specification_version: 4
|
|
245
245
|
summary: A cli framework for k8s based development and deployment.
|