dapp 0.13.8 → 0.13.9

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.
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