minfra-cli 1.5.1 → 1.6.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4e01ddd1aab00b59e77cca198cb41188270b77202f900afef2ea693029cc25bf
4
- data.tar.gz: 44e3c6eb7d60db3a8cd3d55bb60793117bed96e0cc4b07c664275fc71bf38b49
3
+ metadata.gz: 0cee136b8311f1099c78490bfcf6da7be65e5fd8dc0cb029e8dc3828646e6631
4
+ data.tar.gz: 46d3929cc27282bc0ed1ac63c4db00c64a7e55e6dbd311319a29dff7d68ab403
5
5
  SHA512:
6
- metadata.gz: 9d76c1b520371c53b90988283a19979f773ad955520ba82a7500de27918f6b52744c091305422a66ea96a982dd21052738344b799b300604b04bd52b2302a5dd
7
- data.tar.gz: 437a304792db570235878164058a6cd12433d75e644ddec7f058fe5154bf9b955bf9613113d354e21b445a1bc96966b547f58ca7556d6ee0ba19154893905730
6
+ metadata.gz: 469d14ac4671707412d214cd24d7c682bbd5ea62a1ee23dc87d0512eab1ec4ca51223751cfab73c2e96f96ccdba20f25f1394b32d61dd57a231862c1ff3fa25b
7
+ data.tar.gz: 70f3bc9ea2ec6f6509d709a6c68969453335f47063086063194cb616aa5db6131b8af69377fe935c329f25df8cbd0096e9fbb9ae44fbfd9035c8be1640b1982a
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ # 1.6.1
2
+ * adding minfra_path to hiera scope
3
+ * fixing state preparation when state dir not yet there
4
+ # 1.6.0
5
+ * collecting things in used_vars
6
+ * no overwriting of values.yaml between each char (as the helm template dir is shared)
1
7
  # 1.5.1
2
8
  * fixing hiera lookup caching error
3
9
  # 1.5.0
data/bin/runner ADDED
@@ -0,0 +1,13 @@
1
+ #!/bin/bash
2
+
3
+ if [[ -f "$MINFRA_PATH/config/env_setup" ]]; then
4
+ source $MINFRA_PATH/config/env_setup
5
+ fi
6
+
7
+ MINFRA_SHELL=${MINFRA_SHELL:-"/bin/bash"}
8
+ CMD=${@:-$MINFRA_SHELL}
9
+
10
+ echo "running: '$CMD'"
11
+
12
+ exec $CMD
13
+
@@ -1,5 +1,5 @@
1
1
  module Minfra
2
2
  module Cli
3
- VERSION = '1.5.1'.freeze
3
+ VERSION = '1.6.1'.freeze
4
4
  end
5
5
  end
data/lib/minfra/cli.rb CHANGED
@@ -2,10 +2,10 @@ require 'thor'
2
2
  require 'open3'
3
3
  require 'json'
4
4
  require 'ostruct'
5
- require 'orchparty'
6
5
  require 'hiera'
7
6
 
8
7
  require_relative 'cli/logging'
8
+ require 'orchparty'
9
9
  require_relative 'cli/config'
10
10
  require_relative 'cli/version'
11
11
  require_relative 'cli/hook'
@@ -79,7 +79,7 @@ module Minfra
79
79
  hiera_main_path=@hiera_root.join("hieradata/#{config.project.minfra.hiera.env_path}/#{env}.eyaml")
80
80
  raise("unknown environment #{env}, I expact a file at #{hiera_main_path}") unless hiera_main_path.exist?
81
81
 
82
- scope={ "hieraroot" => @hiera_root.to_s, "env" => env}
82
+ scope={ "minfra_path" => ENV["MINFRA_PATH"], "hieraroot" => @hiera_root.to_s, "env" => env}
83
83
  special_lookups=hiera.lookup("lookup_options", {}, scope, nil, :priority)
84
84
 
85
85
  node_scope=hiera.lookup("env", {}, scope, nil, :deeper)
data/lib/orchparty/ast.rb CHANGED
@@ -12,6 +12,18 @@ module Orchparty
12
12
  def get_binding
13
13
  binding
14
14
  end
15
+
16
+ def inspect(indent=0)
17
+ start="\n"
18
+ each_pair do |name, ast|
19
+ begin
20
+ start << "#{' ' * indent}#{name}: #{ast.inspect(indent+1)}\n"
21
+ rescue ArgumentError
22
+ start << "#{' ' * indent}#{name}: #{ast.inspect}\n"
23
+ end
24
+ end
25
+ start
26
+ end
15
27
  end
16
28
 
17
29
  def self.hash(args = {})
@@ -49,5 +61,6 @@ module Orchparty
49
61
  def self.chart(args = {})
50
62
  Node.new(_mix:[], _variables: {}, _services: []).merge(args)
51
63
  end
64
+
52
65
  end
53
66
  end
@@ -10,6 +10,8 @@ require 'active_support/core_ext'
10
10
  module Orchparty
11
11
  module Services
12
12
  class Context
13
+ include ::Minfra::Cli::Logging
14
+
13
15
  attr_accessor :cluster_name
14
16
  attr_accessor :namespace
15
17
  attr_accessor :dir_path
@@ -157,35 +159,79 @@ module Orchparty
157
159
  end
158
160
  end
159
161
 
162
+
163
+ def print_install(chart)
164
+
165
+ build_chart(chart) do |chart_path|
166
+ cmd="helm template --namespace #{namespace} --kube-context #{cluster_name} #{chart.name} #{chart_path}"
167
+ @out_io.puts `$cmd`
168
+ if system("#{cmd} > /dev/null")
169
+ info("helm template check: OK")
170
+ else
171
+ error("helm template check: FAIL")
172
+ end
173
+ end
174
+
175
+ end
176
+
177
+ def print_upgrade(chart)
178
+ print_install(chart)
179
+ end
180
+
181
+ def install(chart)
182
+ info("Install: #{chart}")
183
+ build_chart(chart) do |chart_path|
184
+ @out_io.puts system("helm install --create-namespace --namespace #{namespace} --kube-context #{cluster_name} #{chart.name} #{chart_path}")
185
+ end
186
+ end
187
+
188
+ def upgrade(chart)
189
+ info("Upgrade: #{chart}")
190
+ build_chart(chart) do |chart_path|
191
+ @out_io.puts system("helm upgrade --namespace #{namespace} --kube-context #{cluster_name} #{chart.name} #{chart_path}")
192
+ end
193
+ end
194
+ private
195
+
160
196
  def build_chart(chart)
197
+
198
+
199
+ dir = @app.status_dir.join('helm') # duplication
200
+
161
201
  params = chart._services.map {|s| app_config.services[s.to_sym] }.map{|s| [s.name, s]}.to_h
162
- dir = @app.status_dir.join('helm')
163
- dir.mkpath
164
202
  run(templates_path: File.expand_path(chart.template, self.dir_path), params: params, output_chart_path: dir, chart: chart)
165
203
  yield dir
166
204
  end
167
205
 
168
- def run(templates_path:, params:, output_chart_path:, chart: )
169
- system("mkdir -p #{File.join(output_chart_path, 'templates')}")
170
206
 
171
- system("cp #{File.join(templates_path, 'values.yaml')} #{File.join(output_chart_path, 'values.yaml')}")
172
- system("cp #{File.join(templates_path, '.helmignore')} #{File.join(output_chart_path, '.helmignore')}")
173
- system("cp #{File.join(templates_path, 'templates/_helpers.tpl')} #{File.join(output_chart_path, 'templates/_helpers.tpl')}")
207
+
208
+ # remember:
209
+ # this is done for an app
210
+ # that app can have multiple charts with multiple services!
211
+
212
+ def run(templates_path:, params:, output_chart_path:, chart: )
174
213
 
175
214
  generate_chart_yaml(
176
215
  templates_path: templates_path,
177
216
  output_chart_path: output_chart_path,
178
217
  chart_name: chart.name,
179
218
  )
180
- params.each do |app_name, subparams|
181
- subparams[:chart] = chart
182
- generate_documents_from_erbs(
183
- templates_path: templates_path,
184
- app_name: app_name,
185
- params: subparams,
186
- output_chart_path: output_chart_path
187
- )
219
+
220
+ File.open(File.join(output_chart_path, 'values.yaml'),'a') do |helm_values|
221
+ params.each do |app_name, subparams|
222
+ subparams[:chart] = chart
223
+ used_vars=generate_documents_from_erbs(
224
+ templates_path: templates_path,
225
+ app_name: app_name,
226
+ params: subparams,
227
+ output_chart_path: output_chart_path
228
+ )
229
+ used_vars.each do |variable,value|
230
+ helm_values.puts "#{variable}: #{value}"
231
+ end
232
+ end
188
233
  end
234
+
189
235
  end
190
236
 
191
237
  def generate_documents_from_erbs(templates_path:, app_name:, params:, output_chart_path:)
@@ -195,23 +241,28 @@ module Orchparty
195
241
  end
196
242
 
197
243
  kind = params.fetch(:kind)
244
+ params._used_vars = {} #here we'll collect all used vars
245
+
198
246
  Dir[File.join(templates_path, kind, '*.erb')].each do |template_path|
199
- puts "Rendering Template: #{template_path}"
247
+ info("Rendering Template: #{template_path}")
200
248
  template_name = File.basename(template_path, '.erb')
201
249
  output_path = File.join(output_chart_path, 'templates', "#{app_name}-#{template_name}")
202
-
250
+
203
251
  template = Erubis::Eruby.new(File.read(template_path))
204
252
  template.filename = template_path
253
+
254
+ params.app = @app
205
255
  params.app_name = app_name
206
256
  params.templates_path = templates_path
207
257
  begin
208
258
  document = template.result(CleanBinding.new.get_binding(params))
209
259
  rescue Exception
210
- puts "#{template_path} has a problem: #{$!.inspect}"
260
+ error "#{template_path} has a problem: #{$!.inspect}"
211
261
  raise
212
262
  end
213
263
  File.write(output_path, document)
214
264
  end
265
+ params._used_vars
215
266
  end
216
267
 
217
268
  def generate_chart_yaml(templates_path:, output_chart_path:, chart_name: )
@@ -224,34 +275,13 @@ module Orchparty
224
275
  document = template.result(CleanBinding.new.get_binding(params))
225
276
  File.write(output_path, document)
226
277
  end
227
-
228
- def print_install(chart)
229
- build_chart(chart) do |chart_path|
230
- @out_io.puts `helm template --namespace #{namespace} --kube-context #{cluster_name} #{chart.name} #{chart_path}`
231
- end
232
- end
233
-
234
- def print_upgrade(chart)
235
- print_install(chart)
236
- end
237
-
238
- def install(chart)
239
- build_chart(chart) do |chart_path|
240
- @out_io.puts system("helm install --create-namespace --namespace #{namespace} --kube-context #{cluster_name} #{chart.name} #{chart_path}")
241
- end
242
- end
243
-
244
- def upgrade(chart)
245
- build_chart(chart) do |chart_path|
246
- system("cp -a #{chart_path} /tmp/latest-chart")
247
- @out_io.puts system("helm upgrade --namespace #{namespace} --kube-context #{cluster_name} #{chart.name} #{chart_path}")
248
- end
249
- end
250
278
  end
251
279
  end
252
280
  end
253
281
 
254
282
  class KubernetesApplication
283
+ include Minfra::Cli::Logging
284
+
255
285
  attr_accessor :cluster_name
256
286
  attr_accessor :file_path
257
287
  attr_accessor :namespace
@@ -259,7 +289,7 @@ class KubernetesApplication
259
289
  attr_reader :status_dir
260
290
 
261
291
  def initialize(app_config: [], namespace:, cluster_name:, file_name:, status_dir:, out_io: STDOUT)
262
- self.file_path = Pathname.new(file_name).parent.expand_path
292
+ self.file_path = Pathname.new(file_name).parent.expand_path #path of the stack
263
293
  self.cluster_name = cluster_name
264
294
  self.namespace = namespace
265
295
  self.app_config = app_config
@@ -279,6 +309,22 @@ class KubernetesApplication
279
309
  each_service("print_#{method}".to_sym)
280
310
  end
281
311
 
312
+ private
313
+ def prepare
314
+ output_chart_path = @status_dir.join('helm')
315
+ output_chart_path.rmtree if output_chart_path.exist?
316
+ output_chart_path.mkpath
317
+ templates_path = file_path.join('../../chart-templates').expand_path #don't ask. the whole concept of multiple charts in an app stinks...
318
+
319
+ info("generating base helm structure from: #{output_chart_path} from #{templates_path}")
320
+ system("mkdir -p #{File.join(output_chart_path, 'templates')}")
321
+
322
+ system("cp #{File.join(templates_path, 'values.yaml')} #{File.join(output_chart_path, 'values.yaml')}")
323
+ system("cp #{File.join(templates_path, '.helmignore')} #{File.join(output_chart_path, '.helmignore')}")
324
+ system("cp #{File.join(templates_path, 'templates/_helpers.tpl')} #{File.join(output_chart_path, 'templates/_helpers.tpl')}")
325
+
326
+ end
327
+
282
328
  def combine_charts(app_config)
283
329
  services = app_config._service_order.map(&:to_s)
284
330
  app_config._service_order.each do |name|
@@ -293,11 +339,20 @@ class KubernetesApplication
293
339
  end
294
340
 
295
341
  def each_service(method)
342
+ prepare
296
343
  services = combine_charts(app_config)
297
344
  services.each do |name|
298
345
  service = app_config[:services][name]
299
- puts "Service: #{name}(#{service._type}) #{method}"
300
- "::Orchparty::Services::#{service._type.classify}".constantize.new(cluster_name: cluster_name, namespace: namespace, file_path: file_path, app_config: app_config, out_io: @out_io, app: self).send(method, service)
346
+ info "Service: #{name}(#{service._type}) #{method}"
347
+ deployable_class="::Orchparty::Services::#{service._type.classify}".constantize
348
+ deployable=deployable_class.new(cluster_name: cluster_name,
349
+ namespace: namespace,
350
+ file_path: file_path,
351
+ app_config: app_config,
352
+ out_io: @out_io,
353
+ app: self)
354
+
355
+ deployable.send(method, service)
301
356
  end
302
357
  end
303
358
  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.5.1
4
+ version: 1.6.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: 2022-11-24 00:00:00.000000000 Z
11
+ date: 2023-01-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -162,6 +162,7 @@ files:
162
162
  - bin/console
163
163
  - bin/container_exec
164
164
  - bin/run_tests
165
+ - bin/runner
165
166
  - bin/setup.sh
166
167
  - exe/minfra
167
168
  - lib/deep_merge.rb