dapp 0.13.8 → 0.13.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/config/en/net_status.yml +4 -0
  3. data/lib/dapp.rb +16 -3
  4. data/lib/dapp/cli/command/update.rb +2 -0
  5. data/lib/dapp/dapp/dapp_config.rb +1 -1
  6. data/lib/dapp/deployment/kubernetes.rb +1 -1
  7. data/lib/dapp/dimg/build/stage/base.rb +1 -1
  8. data/lib/dapp/dimg/config/directive/docker/artifact.rb +5 -0
  9. data/lib/dapp/helper/yaml.rb +23 -0
  10. data/lib/dapp/kube/cli/command/kube.rb +3 -1
  11. data/lib/dapp/kube/cli/command/kube/chart_create.rb +19 -0
  12. data/lib/dapp/kube/cli/command/kube/secret_edit.rb +24 -0
  13. data/lib/dapp/kube/dapp/command/chart_create.rb +104 -0
  14. data/lib/dapp/kube/dapp/command/common.rb +21 -2
  15. data/lib/dapp/kube/dapp/command/deploy.rb +50 -25
  16. data/lib/dapp/kube/dapp/command/secret_edit.rb +45 -0
  17. data/lib/dapp/kube/dapp/command/secret_extract.rb +1 -2
  18. data/lib/dapp/kube/dapp/command/secret_generate.rb +1 -2
  19. data/lib/dapp/kube/dapp/command/secret_regenerate.rb +2 -3
  20. data/lib/dapp/kube/dapp/dapp.rb +4 -0
  21. data/lib/dapp/kube/kubernetes.rb +6 -0
  22. data/lib/dapp/kube/kubernetes/client.rb +255 -0
  23. data/lib/dapp/kube/{client → kubernetes/client}/error.rb +8 -4
  24. data/lib/dapp/kube/kubernetes/client/resource/base.rb +21 -0
  25. data/lib/dapp/kube/kubernetes/client/resource/job.rb +27 -0
  26. data/lib/dapp/kube/kubernetes/client/resource/pod.rb +49 -0
  27. data/lib/dapp/kube/kubernetes/manager/base.rb +15 -0
  28. data/lib/dapp/kube/kubernetes/manager/container.rb +88 -0
  29. data/lib/dapp/kube/kubernetes/manager/job.rb +65 -0
  30. data/lib/dapp/kube/kubernetes/manager/pod.rb +35 -0
  31. data/lib/dapp/version.rb +1 -1
  32. metadata +17 -4
  33. data/lib/dapp/kube/client.rb +0 -241
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4fa2488a50074d7d9e8fe4f203cd8e6f20029aea
4
- data.tar.gz: ae116aebb7ee348914e388e989f417f6f3d23567
3
+ metadata.gz: 3b002b0baef639d31484f8a6dc71dfacaa786683
4
+ data.tar.gz: a19fc91d6667e26f4a64b4b232583553c5c16e9f
5
5
  SHA512:
6
- metadata.gz: b48cf76b9e22b0af9aa9ba8de0fd11f8af0eb97d257877b0d8e15fb0640bbb6b389013338276ceefa93d6e81f1a854b9aa486006dd21ccf403c86c10920446e6
7
- data.tar.gz: 016ac3f9bab694d8142b385fc55387d210069616d515aa43662b0487cfec5838457c1fad2ffe9a5f493808a8fedf1e8027e6472bf591e92afdb09aff2ca885b1
6
+ metadata.gz: 2b776834a1dbef3450b0d61d7bbefdb0afac5ee4cf80df121520e3fb540b9fcc0d3dc5567ac66ba2161df5880083ac687468c157200da64e6807f208bd401bdf
7
+ data.tar.gz: bed8a4f7b6fd98cb8b0dcbd7f3dfb357d61a05cb32a0c9b6173e6e5f013839ce0e3a3172d7653945c5339edb2168b2078c3594140c191a50a5887d0532196190
@@ -39,6 +39,7 @@ en:
39
39
  secret_values_file_not_found: "Secret values file `%{path}` not found!"
40
40
  user_containers_detected: "User containers have been using images!\n%{ids}"
41
41
  incorrect_yaml_structure: "Incorrect YAML structure in `%{path}`!"
42
+ editor_not_found: "Editor Not found!"
42
43
  dapp:
43
44
  no_such_dimg: "No such dimg: `%{dimgs_patterns}`!"
44
45
  no_such_app: "No such app: `%{apps_patterns}`!"
@@ -48,6 +49,8 @@ en:
48
49
  docker_not_found: "Docker not found!"
49
50
  docker_version: "Required docker version: >= %{version}!"
50
51
  dapp_config_file_incorrect: "%{message}"
52
+ yaml_file_incorrect: "Yaml file `%{file}`: `%{message}`"
53
+ yaml_incorrect: "`%{message}`"
51
54
  incorrect_dapp_config_option: ".dapp_config includes option `%{option}` with incorrect value `%{value}`: expected one of the following types [%{expected}]"
52
55
  incorrect_dapp_config_option_color: ".dapp_config includes option `color` with incorrect value `%{value}`: expected one of the following values [%{expected}]"
53
56
  config:
@@ -66,6 +69,7 @@ en:
66
69
  mount_from_type_required: "Mount: `from` directive expect `build_dir` or `tmp_dir` type!"
67
70
  builder_type_conflict: 'Conflict between builder types!'
68
71
  docker_from_incorrect: "`docker.from` has incorrect value `%{name}`!"
72
+ docker_artifact_unsupported_directive: "`artifact.docker` supports only `from` subdirective!"
69
73
  stage_artifact_not_associated: "Artifact not associated with any stage: expected `before` or `after` attribute!"
70
74
  stage_artifact_double_associate: "Cannot use `%{stage}` stage for artifact, already used in `%{conflict_stage}` stage!"
71
75
  stage_artifact_not_supported_associated_stage: "Bad artifact stage `%{stage}`!"
data/lib/dapp.rb CHANGED
@@ -32,6 +32,7 @@ require 'dapp/helper/trivia'
32
32
  require 'dapp/helper/sha256'
33
33
  require 'dapp/helper/net_status'
34
34
  require 'dapp/helper/tar'
35
+ require 'dapp/helper/yaml'
35
36
  require 'dapp/prctl'
36
37
  require 'dapp/error/base'
37
38
  require 'dapp/error/dapp'
@@ -105,8 +106,17 @@ require 'dapp/kube'
105
106
  require 'dapp/kube/error/base'
106
107
  require 'dapp/kube/error/command'
107
108
  require 'dapp/kube/error/kubernetes'
108
- require 'dapp/kube/client'
109
- require 'dapp/kube/client/error'
109
+ require 'dapp/kube/secret'
110
+ require 'dapp/kube/kubernetes'
111
+ require 'dapp/kube/kubernetes/client'
112
+ require 'dapp/kube/kubernetes/client/error'
113
+ require 'dapp/kube/kubernetes/client/resource/base'
114
+ require 'dapp/kube/kubernetes/client/resource/pod'
115
+ require 'dapp/kube/kubernetes/client/resource/job'
116
+ require 'dapp/kube/kubernetes/manager/base'
117
+ require 'dapp/kube/kubernetes/manager/pod'
118
+ require 'dapp/kube/kubernetes/manager/container'
119
+ require 'dapp/kube/kubernetes/manager/job'
110
120
  require 'dapp/kube/cli/command/base'
111
121
  require 'dapp/kube/cli/command/kube'
112
122
  require 'dapp/kube/cli/command/kube/deploy'
@@ -115,7 +125,9 @@ require 'dapp/kube/cli/command/kube/secret_key_generate'
115
125
  require 'dapp/kube/cli/command/kube/secret_generate'
116
126
  require 'dapp/kube/cli/command/kube/secret_extract'
117
127
  require 'dapp/kube/cli/command/kube/secret_regenerate'
128
+ require 'dapp/kube/cli/command/kube/secret_edit'
118
129
  require 'dapp/kube/cli/command/kube/minikube_setup'
130
+ require 'dapp/kube/cli/command/kube/chart_create'
119
131
  require 'dapp/kube/cli/cli'
120
132
  require 'dapp/kube/dapp/command/common'
121
133
  require 'dapp/kube/dapp/command/deploy'
@@ -124,9 +136,10 @@ require 'dapp/kube/dapp/command/secret_key_generate'
124
136
  require 'dapp/kube/dapp/command/secret_generate'
125
137
  require 'dapp/kube/dapp/command/secret_extract'
126
138
  require 'dapp/kube/dapp/command/secret_regenerate'
139
+ require 'dapp/kube/dapp/command/secret_edit'
127
140
  require 'dapp/kube/dapp/command/minikube_setup'
141
+ require 'dapp/kube/dapp/command/chart_create'
128
142
  require 'dapp/kube/dapp/dapp'
129
- require 'dapp/kube/secret'
130
143
  require 'dapp/dimg'
131
144
  require 'dapp/dimg/builder'
132
145
  require 'dapp/dimg/builder/base'
@@ -7,6 +7,8 @@ module Dapp
7
7
  File.fnmatch(File.join(s.full_gem_path, '*'), __FILE__)
8
8
  end
9
9
  Gem.install(spec.name, approximate_recommendation(spec.version))
10
+ rescue Gem::FilePermissionError => e
11
+ raise Errno::EACCES, e.message
10
12
  end
11
13
 
12
14
  # get latest beta-version
@@ -42,7 +42,7 @@ module Dapp
42
42
  config_search_paths.reduce({}) do |options, dir|
43
43
  if (config_options_path = make_path(dir, '.dapp_config')).file?
44
44
  config_options = begin
45
- YAML.load_file(config_options_path).tap do |c_options|
45
+ yaml_load_file(config_options_path).tap do |c_options|
46
46
  c_options.merge!(c_options.in_depth_merge(c_options['ci'] || {})) if ENV['GITLAB_CI'] || ENV['TRAVIS']
47
47
  c_options.delete('ci')
48
48
  end
@@ -163,7 +163,7 @@ module Dapp
163
163
  def kube_config
164
164
  @kube_config ||= begin
165
165
  if File.exist?((kube_config_path = File.join(ENV['HOME'], '.kube/config')))
166
- YAML.load_file(kube_config_path)
166
+ yaml_load_file(kube_config_path)
167
167
  else
168
168
  raise Error::Base, code: :kube_config_not_found, data: { path: kube_config_path }
169
169
  end
@@ -231,7 +231,7 @@ module Dapp
231
231
  end
232
232
 
233
233
  def image_should_be_prepared?
234
- !image.built? && !should_be_not_present? || image_should_be_introspected?
234
+ (!image.built? && !should_be_not_present? || image_should_be_introspected?) && !dimg.dapp.dry_run?
235
235
  end
236
236
 
237
237
  def should_be_not_present?
@@ -4,6 +4,11 @@ module Dapp
4
4
  module Directive
5
5
  module Docker
6
6
  class Artifact < Base
7
+ def method_missing(m, *args)
8
+ raise Error::Config, code: :docker_artifact_unsupported_directive if Dimg.instance_methods.include?(m)
9
+ super
10
+ end
11
+
7
12
  def _change_options
8
13
  {}
9
14
  end
@@ -0,0 +1,23 @@
1
+ module Dapp
2
+ module Helper
3
+ module YAML
4
+ def yaml_load_file(file_path, hash: true)
5
+ yaml_load(File.read(file_path), hash: hash)
6
+ rescue ::Dapp::Error::Dapp => e
7
+ raise ::Dapp::Error::Dapp, code: :yaml_file_incorrect, data: { file: file_path, message: e.net_status[:data][:message] }
8
+ end
9
+
10
+ def yaml_load(string, hash: true)
11
+ ::YAML::load(string).tap do |res|
12
+ if hash && !res.is_a?(Hash)
13
+ raise ::Dapp::Error::Dapp,
14
+ code: :yaml_incorrect,
15
+ data: { message: "unexpected json data \n>>> START YAML\n#{string.strip}\n>>> END YAML\n" }
16
+ end
17
+ end
18
+ rescue Psych::SyntaxError => e
19
+ raise ::Dapp::Error::Dapp, code: :yaml_incorrect, data: { message: e.message }
20
+ end
21
+ end
22
+ end # Helper
23
+ end # Dapp
@@ -1,7 +1,7 @@
1
1
  module Dapp::Kube::CLI
2
2
  module Command
3
3
  class Kube < ::Dapp::CLI
4
- SUBCOMMANDS = ['secret generate', 'secret key generate', 'secret regenerate', 'deploy', 'dismiss', 'secret extract', 'minikube setup'].freeze
4
+ SUBCOMMANDS = ['secret generate', 'secret key generate', 'secret regenerate', 'deploy', 'dismiss', 'secret extract', 'secret edit', 'minikube setup', 'chart create'].freeze
5
5
 
6
6
  banner <<BANNER.freeze
7
7
  Usage: dapp kube subcommand [subcommand options]
@@ -14,7 +14,9 @@ Available subcommands: (for details, dapp kube SUB-COMMAND --help)
14
14
  dapp kube secret generate [FILE_PATH] [options]
15
15
  dapp kube secret extract [FILE_PATH] [options]
16
16
  dapp kube secret regenerate [SECRET_VALUES_FILE_PATH ...] [options]
17
+ dapp kube secret edit [FILE_PATH] [options]
17
18
  dapp kube minikube setup
19
+ dapp kube chart create [options]
18
20
 
19
21
  Options:
20
22
  BANNER
@@ -0,0 +1,19 @@
1
+ module Dapp::Kube::CLI::Command
2
+ class Kube < ::Dapp::CLI
3
+ class ChartCreate < Base
4
+ banner <<BANNER.freeze
5
+ Usage:
6
+
7
+ dapp kube chart create [options]
8
+
9
+ Options:
10
+ BANNER
11
+
12
+ option :force,
13
+ long: '--force',
14
+ short: '-f',
15
+ description: 'Delete existing chart',
16
+ default: false
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,24 @@
1
+ module Dapp::Kube::CLI::Command
2
+ class Kube < ::Dapp::CLI
3
+ class SecretEdit < Base
4
+ banner <<BANNER.freeze
5
+ Usage:
6
+
7
+ dapp kube secret edit [FILE_PATH] [options]
8
+
9
+ Options:
10
+ BANNER
11
+
12
+ option :values,
13
+ long: '--values',
14
+ description: 'Edit secret values file',
15
+ default: false
16
+
17
+ def run(argv = ARGV)
18
+ self.class.parse_options(self, argv)
19
+ file_path = self.class.required_argument(self, 'FILE_PATH')
20
+ ::Dapp::Dapp.new(options: cli_options).public_send(run_method, file_path)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,104 @@
1
+ module Dapp
2
+ module Kube
3
+ module Dapp
4
+ module Command
5
+ module ChartCreate
6
+ def kube_chart_create
7
+ with_kube_tmp_chart_dir do
8
+ FileUtils.cp_r kube_chart_path, kube_tmp_chart_path(name) if kube_chart_path.directory? && !options[:force]
9
+
10
+ shellout!("helm create #{name}", cwd: kube_tmp_chart_path)
11
+ kube_create_chart_samples
12
+
13
+ FileUtils.rm_rf kube_chart_path
14
+ FileUtils.mv kube_tmp_chart_path(name), kube_chart_path
15
+ end
16
+ end
17
+
18
+ def kube_create_chart_samples
19
+ kube_tmp_chart_path(name, 'secret-values.yaml').tap { |f| FileUtils.touch(f) unless f.file? }
20
+ kube_tmp_chart_path(name, kube_chart_secret_dir_name).tap { |dir| FileUtils.mkdir(dir) unless dir.directory? }
21
+ kube_tmp_chart_path(name, 'templates', '_envs.tpl').tap do |f|
22
+ f.write begin
23
+ <<-EOF
24
+ {{- define "common_envs" }}
25
+ - name: A
26
+ value: value
27
+ {{- if eq .Values.global.env "production" }}
28
+ - name: B
29
+ value: value
30
+ {{- else }}
31
+ - name: B
32
+ value: value2
33
+ {{- if or (eq .Values.global.env "staging") (eq .Values.global.env "testing") }}
34
+ - name: C
35
+ value: value3
36
+ {{- end }}
37
+ {{- end }}
38
+ {{- end }}
39
+ EOF
40
+ end unless f.file?
41
+ end
42
+ kube_tmp_chart_path(name, 'templates', 'backend.yaml').tap do |f|
43
+ f.write begin
44
+ <<-EOF
45
+ apiVersion: extensions/v1beta1
46
+ kind: Deployment
47
+ metadata:
48
+ name: {{ .Chart.Name }}-backend
49
+ labels:
50
+ service: {{ .Chart.Name }}-backend
51
+ spec:
52
+ minReadySeconds: 60
53
+ strategy:
54
+ type: RollingUpdate
55
+ replicas: 2
56
+ template:
57
+ metadata:
58
+ labels:
59
+ service: {{ .Chart.Name }}-backend
60
+ spec:
61
+ volumes:
62
+ - name: {{ .Chart.Name }}-backend
63
+ secret:
64
+ secretName: {{ .Chart.Name }}-backend
65
+ containers:
66
+ - command: [ '/bin/bash', '-l', '-c', 'bundle exec ctl start' ]
67
+ image: {{ tuple . 'specific_name' | include "dimg" }} # or nameless dimg {{ tuple . | include "dimg" }}
68
+ imagePullPolicy: Always
69
+ name: {{ .Chart.Name }}-backend
70
+ livenessProbe:
71
+ httpGet:
72
+ path: /assets/logo.png
73
+ port: 8080
74
+ scheme: HTTP
75
+ initialDelaySeconds: 10
76
+ periodSeconds: 3
77
+ ports:
78
+ - containerPort: 8080
79
+ name: http
80
+ protocol: TCP
81
+ env:
82
+ {{- include "common_envs" . | indent 8 }}
83
+ ---
84
+ apiVersion: v1
85
+ kind: Service
86
+ metadata:
87
+ name: {{ .Chart.Name }}-backend
88
+ spec:
89
+ type: ClusterIP
90
+ selector:
91
+ service: {{ .Chart.Name }}-backend
92
+ ports:
93
+ - name: http
94
+ port: 8080
95
+ protocol: TCP
96
+ EOF
97
+ end unless f.file?
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
@@ -46,13 +46,32 @@ module Dapp
46
46
  ) if secret.nil?
47
47
  end
48
48
 
49
+ def kube_chart_secret_path(*path)
50
+ kube_chart_path(kube_chart_secret_dir_name, *path).expand_path
51
+ end
52
+
53
+ def kube_chart_secret_dir_name
54
+ 'secret'
55
+ end
56
+
49
57
  def kube_chart_path(*path)
50
58
  self.path('.helm', *path).expand_path
51
59
  end
52
60
 
61
+ def with_kube_tmp_chart_dir
62
+ yield if block_given?
63
+ ensure
64
+ FileUtils.rm_rf(kube_tmp_chart_path)
65
+ end
66
+
67
+ def kube_tmp_chart_path(*path)
68
+ @kube_tmp_path ||= Dir.mktmpdir('dapp-helm-chart-', tmp_base_dir)
69
+ make_path(@kube_tmp_path, *path).expand_path.tap { |p| p.parent.mkpath }
70
+ end
71
+
53
72
  def secret
54
73
  @secret ||= begin
55
- unless secret_key = ENV['DAPP_SECRET_KEY']
74
+ unless (secret_key = ENV['DAPP_SECRET_KEY'])
56
75
  secret_key_not_found_in << '`DAPP_SECRET_KEY`'
57
76
 
58
77
  if dappfile_exists?
@@ -76,7 +95,7 @@ module Dapp
76
95
  def kubernetes
77
96
  @kubernetes ||= begin
78
97
  namespace = options[:namespace].nil? ? nil : options[:namespace].tr('_', '-')
79
- Client.new(namespace: namespace)
98
+ Kubernetes::Client.new(namespace: namespace)
80
99
  end
81
100
  end
82
101
  end
@@ -13,7 +13,7 @@ module Dapp
13
13
  validate_repo_name!(repo)
14
14
  validate_tag_name!(image_version)
15
15
 
16
- begin
16
+ with_kube_tmp_chart_dir do
17
17
  kube_copy_chart
18
18
  kube_helm_decode_secrets
19
19
  kube_generate_helm_chart_tpl
@@ -29,10 +29,11 @@ module Dapp
29
29
  options.concat(self.options[:helm_set_options].map { |opt| "--set #{opt}" })
30
30
  end
31
31
 
32
- kube_flush_hooks_jobs(additional_values, set_options)
33
- kube_run_deploy(additional_values, set_options)
34
- ensure
35
- FileUtils.rm_rf(kube_tmp_chart_path)
32
+ hooks_jobs = kube_helm_hooks_jobs(additional_values, set_options)
33
+
34
+ kube_flush_hooks_jobs(hooks_jobs)
35
+
36
+ kube_run_deploy(additional_values, set_options, hooks_jobs: hooks_jobs)
36
37
  end
37
38
  end
38
39
 
@@ -54,7 +55,7 @@ module Dapp
54
55
 
55
56
  def kube_helm_decode_secret_values
56
57
  kube_secret_values_paths.each_with_index do |secret_values_file, index|
57
- decoded_data = kube_helm_decode_json(secret, YAML::load(secret_values_file.read))
58
+ decoded_data = kube_helm_decode_json(secret, yaml_load_file(secret_values_file))
58
59
  kube_tmp_chart_secret_values_paths[index].write(decoded_data.to_yaml)
59
60
  end
60
61
  end
@@ -75,14 +76,14 @@ module Dapp
75
76
 
76
77
  {{- define "dimg" -}}
77
78
  {{- if (ge (len (index .)) 2) -}}
78
- {{- $name := index . 0 -}}
79
- {{- $context := index . 1 -}}
79
+ {{- $name := index . 0 -}}
80
+ {{- $context := index . 1 -}}
80
81
  {{- printf "%s:%s-%s" $context.Values.global.dapp.repo $name $context.Values.global.dapp.image_version -}}
81
82
  {{- else -}}
82
83
  {{- $context := index . 0 -}}
83
84
  {{- printf "%s:%s" $context.Values.global.dapp.repo $context.Values.global.dapp.image_version -}}
84
- {{- end -}}
85
- {{- end -}}
85
+ {{- end -}}
86
+ {{- end -}}
86
87
 
87
88
  {{- define "dapp_secret_file" -}}
88
89
  {{- $relative_file_path := index . 0 -}}
@@ -93,16 +94,16 @@ module Dapp
93
94
  kube_tmp_chart_path('templates/_dapp_helpers.tpl').write(cont)
94
95
  end
95
96
 
96
- def kube_flush_hooks_jobs(additional_values, set_options)
97
- return if (config_jobs_names = kube_helm_hooks_jobs_to_delete(additional_values, set_options).keys).empty?
97
+ def kube_flush_hooks_jobs(hooks_jobs)
98
+ return if (config_jobs_names = hooks_jobs.keys).empty?
98
99
  config_jobs_names.select { |name| kube_job_list.include? name }.each do |name|
99
100
  log_process("Delete hooks job `#{name}` for release #{kube_release_name} ", short: true) { kube_delete_job!(name) }
100
101
  end
101
102
  end
102
103
 
103
- def kube_helm_hooks_jobs_to_delete(additional_values, set_options)
104
+ def kube_helm_hooks_jobs(additional_values, set_options)
104
105
  generator = proc do |text|
105
- text.split(/# Source.*|---/).reject {|c| c.strip.empty? }.map {|c| YAML::load(c) }.reduce({}) do |objects, c|
106
+ text.split(/# Source.*|---/).reject {|c| c.strip.empty? }.map {|c| yaml_load(c) }.reduce({}) do |objects, c|
106
107
  objects[c['kind']] ||= {}
107
108
  objects[c['kind']][(c['metadata'] || {})['name']] = c
108
109
  objects
@@ -114,7 +115,7 @@ module Dapp
114
115
 
115
116
  manifest_start_index = output.lines.index("MANIFEST:\n") + 1
116
117
  hook_start_index = output.lines.index("HOOKS:\n") + 1
117
- configs = generator.call(output.lines[hook_start_index..manifest_start_index-1].join)
118
+ configs = generator.call(output.lines[hook_start_index..manifest_start_index-2].join)
118
119
 
119
120
  (configs['Job'] || {}).reject do |_, c|
120
121
  c['metadata'] ||= {}
@@ -135,11 +136,44 @@ module Dapp
135
136
  end
136
137
  end
137
138
 
138
- def kube_run_deploy(additional_values, set_options)
139
+ def kube_run_deploy(additional_values, set_options, hooks_jobs: {})
139
140
  log_process("Deploy release #{kube_release_name}") do
141
+ release_exists = shellout("helm status #{kube_release_name}").status.success?
142
+
143
+ hooks_jobs_by_type = hooks_jobs
144
+ .reduce({}) do |res, (job_name, job_spec)|
145
+ job = Kubernetes::Client::Resource::Job.new(job_spec)
146
+
147
+ if job.annotations['dapp/watch-logs'].to_s == 'true'
148
+ job.annotations['helm.sh/hook'].to_s.split(',').each do |hook_type|
149
+ res[hook_type] ||= []
150
+ res[hook_type] << job
151
+ end
152
+ end
153
+
154
+ res
155
+ end
156
+ .tap do |res|
157
+ res.values.each do |jobs|
158
+ jobs.sort_by! {|job| job.annotations['helm.sh/hook-weight'].to_i}
159
+ end
160
+ end
161
+
162
+ watch_jobs = if release_exists
163
+ hooks_jobs_by_type['pre-upgrade'].to_a + hooks_jobs_by_type['post-upgrade'].to_a
164
+ else
165
+ hooks_jobs_by_type['pre-install'].to_a + hooks_jobs_by_type['post-install'].to_a
166
+ end
167
+
168
+ watch_thr = Thread.new do
169
+ watch_jobs.each {|job| Kubernetes::Manager::Job.new(self, job.name).watch_till_done!}
170
+ end
171
+
140
172
  args = [kube_release_name, kube_tmp_chart_path, additional_values, set_options, kube_helm_extra_options].flatten
141
173
  kubernetes.create_namespace!(kube_namespace) unless kubernetes.namespace?(kube_namespace)
142
174
  shellout! "helm upgrade #{args.join(' ')}", verbose: true
175
+
176
+ watch_thr.join
143
177
  end
144
178
  end
145
179
 
@@ -163,11 +197,6 @@ module Dapp
163
197
  kube_tmp_chart_path('decoded-secret', *path).tap { |p| p.parent.mkpath }
164
198
  end
165
199
 
166
- def kube_tmp_chart_path(*path)
167
- @kube_tmp_path ||= Dir.mktmpdir('dapp-helm-chart-', tmp_base_dir)
168
- make_path(@kube_tmp_path, *path).expand_path.tap { |p| p.parent.mkpath }
169
- end
170
-
171
200
  def kube_values_paths
172
201
  self.options[:helm_values_options].map { |p| Pathname(p).expand_path }.each do |f|
173
202
  raise Error::Command, code: :values_file_not_found, data: { path: f } unless f.file?
@@ -190,10 +219,6 @@ module Dapp
190
219
  def kube_chart_secret_values_path
191
220
  kube_chart_path('secret-values.yaml').expand_path
192
221
  end
193
-
194
- def kube_chart_secret_path(*path)
195
- kube_chart_path('secret', *path).expand_path
196
- end
197
222
  end
198
223
  end
199
224
  end