minfra-cli 1.12.0 → 1.12.1
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 +3 -0
- data/lib/minfra/cli/version.rb +1 -1
- data/lib/orchparty/kubernetes_application.rb +97 -88
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ca90567af36553b84c7a69020e85970c56591d65f7546d1c22c1969cc9bd58f3
|
4
|
+
data.tar.gz: 451949094ac8fe4a3bc502b10ad1f8924f2cb5688da1297594061ab4c4e4780d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6007ef02b33c582bb9bd002cb4b22adda6dd4e5ec32cf7646beb9597ef03181b8944a463fe5db943c84d19c6ed50c8b324a5bb383cfa975b0f4301e1ffb214d5
|
7
|
+
data.tar.gz: 1908c4e6f95565dc3ebdf2bf371808021166997691c0fcb3514a89b2d47cf379d551b1f5f1934032cfe08afcc180f6f4d75b39d694c584d036f46a5f86aa8f05
|
data/CHANGELOG.md
CHANGED
data/lib/minfra/cli/version.rb
CHANGED
@@ -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
|
20
19
|
|
21
|
-
def initialize(cluster_name
|
20
|
+
def initialize(cluster_name:, namespace:, file_path:, app_config:, app:, 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.options=options
|
27
|
+
self.options = options
|
29
28
|
end
|
30
29
|
|
31
|
-
def template(file_path, helm, flag:
|
32
|
-
return
|
30
|
+
def template(file_path, helm, flag: '-f ', fix_file_path: nil)
|
31
|
+
return '' unless file_path
|
32
|
+
|
33
33
|
puts "Rendering: #{file_path}"
|
34
|
-
file_path = File.join(
|
35
|
-
|
34
|
+
file_path = File.join(dir_path, file_path)
|
35
|
+
|
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
|
@@ -46,11 +47,11 @@ module Orchparty
|
|
46
47
|
end
|
47
48
|
|
48
49
|
def print_install(helm)
|
49
|
-
@out_io.puts
|
50
|
+
@out_io.puts '---'
|
50
51
|
@out_io.puts install_cmd(helm, value_path(helm)).cmd
|
51
52
|
@out_io.puts upgrade_cmd(helm, value_path(helm)).cmd
|
52
|
-
@out_io.puts
|
53
|
-
@out_io.puts File.read(template(value_path(helm), helm, flag:
|
53
|
+
@out_io.puts '---'
|
54
|
+
@out_io.puts File.read(template(value_path(helm), helm, flag: '')) if value_path(helm)
|
54
55
|
end
|
55
56
|
|
56
57
|
# On 05.02.2021 we have decided that it would be best to print both commands.
|
@@ -74,11 +75,15 @@ module Orchparty
|
|
74
75
|
end
|
75
76
|
|
76
77
|
def upgrade_cmd(helm, fix_file_path = nil)
|
77
|
-
Minfra::Cli::HelmRunner.new("upgrade --namespace #{namespace} --kube-context #{cluster_name} --version #{helm.version} #{helm.name} #{helm.chart} #{template(
|
78
|
+
Minfra::Cli::HelmRunner.new("upgrade --namespace #{namespace} --kube-context #{cluster_name} --version #{helm.version} #{helm.name} #{helm.chart} #{template(
|
79
|
+
value_path(helm), helm, fix_file_path: fix_file_path
|
80
|
+
)}")
|
78
81
|
end
|
79
82
|
|
80
83
|
def install_cmd(helm, fix_file_path = nil)
|
81
|
-
Minfra::Cli::HelmRunner.new("install --create-namespace --namespace #{namespace} --kube-context #{cluster_name} --version #{helm.version} #{helm.name} #{helm.chart} #{template(
|
84
|
+
Minfra::Cli::HelmRunner.new("install --create-namespace --namespace #{namespace} --kube-context #{cluster_name} --version #{helm.version} #{helm.name} #{helm.chart} #{template(
|
85
|
+
value_path(helm), helm, fix_file_path: fix_file_path
|
86
|
+
)}")
|
82
87
|
end
|
83
88
|
end
|
84
89
|
|
@@ -88,11 +93,15 @@ module Orchparty
|
|
88
93
|
end
|
89
94
|
|
90
95
|
def upgrade_cmd(apply, fix_file_path = nil)
|
91
|
-
"
|
96
|
+
Minfra::Cli::KubeCtlRunner.new("apply --namespace #{namespace} --context #{cluster_name} #{template(
|
97
|
+
value_path(apply), apply, fix_file_path: fix_file_path
|
98
|
+
)}")
|
92
99
|
end
|
93
100
|
|
94
101
|
def install_cmd(apply, fix_file_path = nil)
|
95
|
-
"
|
102
|
+
Minfra::Cli::KubeCtlRunner.new("apply --namespace #{namespace} --context #{cluster_name} #{template(
|
103
|
+
value_path(apply), apply, fix_file_path: fix_file_path
|
104
|
+
)}")
|
96
105
|
end
|
97
106
|
end
|
98
107
|
|
@@ -101,43 +110,51 @@ module Orchparty
|
|
101
110
|
secret[:from_file]
|
102
111
|
end
|
103
112
|
|
104
|
-
def upgrade_cmd(secret, fix_file_path=nil)
|
105
|
-
"
|
113
|
+
def upgrade_cmd(secret, fix_file_path = nil)
|
114
|
+
Minfra::Cli::KubeCtlRunner.new("--namespace #{namespace} --context #{cluster_name} create secret generic --dry-run -o yaml #{secret[:name]} #{template(
|
115
|
+
value_path(secret), secret, flag: '--from-file=', fix_file_path: fix_file_path
|
116
|
+
)} | #{apply_cmd(cluster_name).cmd}")
|
106
117
|
end
|
107
118
|
|
108
|
-
def install_cmd(secret, fix_file_path=nil)
|
109
|
-
"
|
119
|
+
def install_cmd(secret, fix_file_path = nil)
|
120
|
+
Minfra::Cli::KubeCtlRunner.new("--namespace #{namespace} --context #{cluster_name} create secret generic --dry-run -o yaml #{secret[:name]} #{template(
|
121
|
+
value_path(secret), secret, flag: '--from-file=', fix_file_path: fix_file_path
|
122
|
+
)} | #{apply_cmd(cluster_name).cmd}")
|
123
|
+
end
|
124
|
+
|
125
|
+
def apply_cmd(cluster_name)
|
126
|
+
Minfra::Cli::KubeCtlRunner.new("--context #{cluster_name} apply -f -")
|
110
127
|
end
|
111
128
|
end
|
112
129
|
|
113
130
|
class Label < Context
|
114
131
|
def print_install(label)
|
115
|
-
@out_io.puts
|
132
|
+
@out_io.puts '---'
|
116
133
|
@out_io.puts install_cmd(label)
|
117
134
|
end
|
118
135
|
|
119
136
|
def print_upgrade(label)
|
120
|
-
@out_io.puts
|
137
|
+
@out_io.puts '---'
|
121
138
|
@out_io.puts upgrade_cmd(label)
|
122
139
|
end
|
123
140
|
|
124
141
|
def upgrade_cmd(label)
|
125
|
-
"
|
142
|
+
Minfra::Cli::KubeCtlRunner.new("--namespace #{namespace} --context #{cluster_name} label --overwrite #{label[:resource]} #{label[:name]} #{label['value']}")
|
126
143
|
end
|
127
144
|
|
128
145
|
def install_cmd(label)
|
129
|
-
"
|
146
|
+
Minfra::Cli::KubeCtlRunner.new("--namespace #{namespace} --context #{cluster_name} label --overwrite #{label[:resource]} #{label[:name]} #{label['value']}")
|
130
147
|
end
|
131
148
|
end
|
132
149
|
|
133
150
|
class Wait < Context
|
134
151
|
def print_install(wait)
|
135
|
-
@out_io.puts
|
152
|
+
@out_io.puts '---'
|
136
153
|
@out_io.puts wait.cmd
|
137
154
|
end
|
138
155
|
|
139
156
|
def print_upgrade(wait)
|
140
|
-
@out_io.puts
|
157
|
+
@out_io.puts '---'
|
141
158
|
@out_io.puts wait.cmd
|
142
159
|
end
|
143
160
|
|
@@ -159,20 +176,19 @@ module Orchparty
|
|
159
176
|
end
|
160
177
|
end
|
161
178
|
|
162
|
-
|
163
179
|
def print_install(chart)
|
164
|
-
|
165
180
|
build_chart(chart) do |chart_path|
|
166
|
-
|
167
|
-
|
168
|
-
|
181
|
+
cmd = "helm template --namespace #{namespace} --debug --kube-context #{cluster_name} --output-dir #{chart_path.join(
|
182
|
+
'..', 'helm_expanded'
|
183
|
+
)} #{chart.name} #{chart_path}"
|
184
|
+
@out_io.puts `$cmd`
|
185
|
+
if system("#{cmd} > /dev/null")
|
169
186
|
|
170
|
-
info(
|
187
|
+
info('helm template check: OK')
|
171
188
|
else
|
172
|
-
error(
|
173
|
-
end
|
189
|
+
error('helm template check: FAIL')
|
190
|
+
end
|
174
191
|
end
|
175
|
-
|
176
192
|
end
|
177
193
|
|
178
194
|
def print_upgrade(chart)
|
@@ -182,7 +198,7 @@ module Orchparty
|
|
182
198
|
def install(chart)
|
183
199
|
info("Install: #{chart.name}")
|
184
200
|
build_chart(chart) do |chart_path|
|
185
|
-
res=Minfra::Cli::HelmRunner.new("install --create-namespace --namespace #{namespace} --kube-context #{cluster_name} #{chart.name} #{chart_path}").run
|
201
|
+
res = Minfra::Cli::HelmRunner.new("install --create-namespace --namespace #{namespace} --kube-context #{cluster_name} #{chart.name} #{chart_path}").run
|
186
202
|
@out_io.puts res.stdout
|
187
203
|
end
|
188
204
|
end
|
@@ -190,44 +206,41 @@ module Orchparty
|
|
190
206
|
def upgrade(chart)
|
191
207
|
info("Upgrade: #{chart}")
|
192
208
|
build_chart(chart) do |chart_path|
|
193
|
-
res=Minfra::Cli::HelmRunner.new("upgrade --namespace #{namespace} --kube-context #{cluster_name} #{chart.name} #{chart_path}").run
|
209
|
+
res = Minfra::Cli::HelmRunner.new("upgrade --namespace #{namespace} --kube-context #{cluster_name} #{chart.name} #{chart_path}").run
|
194
210
|
@out_io.puts res.stdout
|
195
211
|
end
|
196
212
|
end
|
213
|
+
|
197
214
|
private
|
198
|
-
|
215
|
+
|
199
216
|
def build_chart(chart)
|
200
217
|
dir = @app.status_dir.join('helm') # duplication
|
201
|
-
|
202
|
-
params = chart._services.map {|s| app_config.services[s.to_sym] }.map{|s| [s.name, s]}.to_h
|
203
|
-
run(templates_path: File.expand_path(chart.template,
|
218
|
+
|
219
|
+
params = chart._services.map { |s| app_config.services[s.to_sym] }.map { |s| [s.name, s] }.to_h
|
220
|
+
run(templates_path: File.expand_path(chart.template, dir_path), params: params, output_chart_path: dir,
|
221
|
+
chart: chart)
|
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
|
info("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,17 +305,17 @@ 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
|
info("generating base helm structure from: #{output_chart_path} from #{templates_path}")
|
@@ -314,26 +323,26 @@ class KubernetesApplication
|
|
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
|
338
347
|
end
|
339
348
|
services
|
@@ -345,14 +354,14 @@ class KubernetesApplication
|
|
345
354
|
services.each do |name|
|
346
355
|
service = app_config[:services][name]
|
347
356
|
info "Service: #{name}(#{service._type}) #{method}"
|
348
|
-
deployable_class="::Orchparty::Services::#{service._type.classify}".constantize
|
349
|
-
deployable=deployable_class.new(cluster_name: cluster_name,
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
357
|
+
deployable_class = "::Orchparty::Services::#{service._type.classify}".constantize
|
358
|
+
deployable = deployable_class.new(cluster_name: cluster_name,
|
359
|
+
namespace: namespace,
|
360
|
+
file_path: file_path,
|
361
|
+
app_config: app_config,
|
362
|
+
out_io: @out_io,
|
363
|
+
app: self)
|
364
|
+
|
356
365
|
deployable.send(method, service)
|
357
366
|
end
|
358
367
|
end
|
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.12.
|
4
|
+
version: 1.12.1
|
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-09-
|
11
|
+
date: 2023-09-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -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.
|