dapp 0.13.4 → 0.13.5

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
  SHA1:
3
- metadata.gz: 6570b7b1469e193e6f8ff6f6af3aa14b209859e7
4
- data.tar.gz: d3c5e800a04f70a35ca60a5a91dd83c026c5862a
3
+ metadata.gz: 19d9262efa88dcc95e63826c17a15ceaeabcf417
4
+ data.tar.gz: edd444ed3ee8f5c2f3360fa00f81cb4ee54704fc
5
5
  SHA512:
6
- metadata.gz: b9ce968a3bb3bcb5ae8e41a1baa09a6f60b62600aca223887aa007a90ca3fbdf90ba2990c2b3e24c87a2ff0c77491d7a2a0d6e1e5ccb3e01eb88e352550be68f
7
- data.tar.gz: 4fd1fae4d99bec6b86f818c0e43991d4d14354db0fa30a1e177820cbbba43e12f430128aa06594a4ec2ce5713eed695d97beea4d5407bead8923b678b790dd06
6
+ metadata.gz: 5f33daa8ff9806a7fcf8772daa91c4293f1376463dd60a491d50e27606b472280a881eda12c352f5adc5b9cd14ab45bd8c90731d3629c1533368c18a03311243
7
+ data.tar.gz: 161dad188386797eb8882af58119778b166ebc476a2bb4023ea5cfb6a745dd2847f53ad61b76671f4ff2cdccae28f69bba084de489fc9b78af6df7c569ef3262
@@ -38,6 +38,7 @@ en:
38
38
  values_file_not_found: "Values file `%{path}` not found!"
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
+ incorrect_yaml_structure: "Incorrect YAML structure in `%{path}`!"
41
42
  dapp:
42
43
  no_such_dimg: "No such dimg: `%{dimgs_patterns}`!"
43
44
  no_such_app: "No such app: `%{apps_patterns}`!"
@@ -40,6 +40,8 @@ require 'dapp/error/shellout'
40
40
  require 'dapp/exception/base'
41
41
  require 'dapp/cli'
42
42
  require 'dapp/cli/command/base'
43
+ require 'dapp/cli/command/update'
44
+ require 'dapp/cli/cli'
43
45
  require 'dapp/config/directive/base'
44
46
  require 'dapp/config/config'
45
47
  require 'dapp/config/error/config'
@@ -112,6 +114,7 @@ require 'dapp/kube/cli/command/kube/dismiss'
112
114
  require 'dapp/kube/cli/command/kube/secret_key_generate'
113
115
  require 'dapp/kube/cli/command/kube/secret_generate'
114
116
  require 'dapp/kube/cli/command/kube/secret_extract'
117
+ require 'dapp/kube/cli/command/kube/secret_regenerate'
115
118
  require 'dapp/kube/cli/command/kube/minikube_setup'
116
119
  require 'dapp/kube/cli/cli'
117
120
  require 'dapp/kube/dapp/command/common'
@@ -120,6 +123,7 @@ require 'dapp/kube/dapp/command/dismiss'
120
123
  require 'dapp/kube/dapp/command/secret_key_generate'
121
124
  require 'dapp/kube/dapp/command/secret_generate'
122
125
  require 'dapp/kube/dapp/command/secret_extract'
126
+ require 'dapp/kube/dapp/command/secret_regenerate'
123
127
  require 'dapp/kube/dapp/command/minikube_setup'
124
128
  require 'dapp/kube/dapp/dapp'
125
129
  require 'dapp/kube/secret'
@@ -5,7 +5,7 @@ module Dapp
5
5
  extend Helper::Cli
6
6
  include Helper::Trivia
7
7
 
8
- SUBCOMMANDS = ['dimg', 'deployment', 'kube'].freeze
8
+ SUBCOMMANDS = ['dimg', 'deployment', 'kube', 'update'].freeze
9
9
 
10
10
  banner <<BANNER.freeze
11
11
  Usage: dapp subcommand [subcommand options]
@@ -15,6 +15,7 @@ Available subcommands: (for details, dapp SUB-COMMAND --help)
15
15
  dapp dimg
16
16
  dapp deployment
17
17
  dapp kube
18
+ dapp update
18
19
 
19
20
  Options:
20
21
  BANNER
@@ -0,0 +1 @@
1
+ ::Dapp::CLI.send(:include, ::Dapp::CLI::Command)
@@ -0,0 +1,14 @@
1
+ module Dapp
2
+ class CLI
3
+ module Command
4
+ class Update < ::Dapp::CLI
5
+ def run(_argv)
6
+ spec = Gem::Specification.find do |s|
7
+ File.fnmatch(File.join(s.full_gem_path, '*'), __FILE__)
8
+ end
9
+ Gem.install(spec.name, spec.version.approximate_recommendation)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -46,9 +46,7 @@ module Dapp
46
46
 
47
47
  def log_step_with_indent(step)
48
48
  log_step(step)
49
- with_log_indent do
50
- yield
51
- end
49
+ with_log_indent { yield }
52
50
  end
53
51
 
54
52
  def log_step(*args, **kwargs)
@@ -96,12 +94,6 @@ module Dapp
96
94
  end.join
97
95
  end
98
96
 
99
- def log_with_indent(message = '', **kwargs)
100
- with_log_indent do
101
- log(message, **kwargs)
102
- end
103
- end
104
-
105
97
  def with_log_indent(with = true)
106
98
  log_indent_next if with
107
99
  yield
@@ -80,7 +80,7 @@ module Dapp
80
80
  log info, inline: inline
81
81
  message = success_message
82
82
  start = Time.now
83
- yield
83
+ with_log_indent { yield }
84
84
  rescue Error::Base, SignalException, StandardError => _e
85
85
  message = failed_message
86
86
  raise
@@ -11,66 +11,54 @@ module Dapp
11
11
  validate_tag_name!(image_version)
12
12
 
13
13
  log_process("Applying deployment #{deployment.name}") do
14
- with_log_indent do
15
- deployment.kube.delete_unknown_resources!
14
+ deployment.kube.delete_unknown_resources!
16
15
 
17
- deployment.to_kube_bootstrap_pods(repo, image_version).each do |name, spec|
18
- next if deployment.kube.pod_succeeded?(name)
19
- deployment.kube.delete_pod!(name) if deployment.kube.pod_exist?(name)
20
- log_process(:bootstrap) do
21
- with_log_indent do
22
- deployment.kube.run_job!(spec, name)
23
- end
24
- end
16
+ deployment.to_kube_bootstrap_pods(repo, image_version).each do |name, spec|
17
+ next if deployment.kube.pod_succeeded?(name)
18
+ deployment.kube.delete_pod!(name) if deployment.kube.pod_exist?(name)
19
+ log_process(:bootstrap) do
20
+ deployment.kube.run_job!(spec, name)
25
21
  end
22
+ end
26
23
 
27
- deployment.to_kube_before_apply_job_pods(repo, image_version).each do |name, spec|
28
- log_process(:before_apply_job) do
29
- deployment.kube.delete_pod!(name) if deployment.kube.pod_exist?(name)
30
- with_log_indent do
31
- deployment.kube.run_job!(spec, name)
32
- end
33
- end
24
+ deployment.to_kube_before_apply_job_pods(repo, image_version).each do |name, spec|
25
+ log_process(:before_apply_job) do
26
+ deployment.kube.delete_pod!(name) if deployment.kube.pod_exist?(name)
27
+ deployment.kube.run_job!(spec, name)
34
28
  end
29
+ end
35
30
 
36
- deployment.apps.each do |app|
37
- log_process("Applying app #{app.name}") do
38
- with_log_indent do
39
- (app.kube.existing_deployments_names - app.to_kube_deployments(repo, image_version).keys).each do |deployment_name|
40
- app.kube.delete_deployment!(deployment_name)
41
- end
31
+ deployment.apps.each do |app|
32
+ log_process("Applying app #{app.name}") do
33
+ (app.kube.existing_deployments_names - app.to_kube_deployments(repo, image_version).keys).each do |deployment_name|
34
+ app.kube.delete_deployment!(deployment_name)
35
+ end
42
36
 
43
- (app.kube.existing_services_names - app.to_kube_services.keys).each do |service_name|
44
- app.kube.delete_service!(service_name)
45
- end
37
+ (app.kube.existing_services_names - app.to_kube_services.keys).each do |service_name|
38
+ app.kube.delete_service!(service_name)
39
+ end
46
40
 
47
- app.to_kube_bootstrap_pods(repo, image_version).each do |name, spec|
48
- next if app.kube.pod_succeeded?(name)
49
- app.kube.delete_pod!(name) if app.kube.pod_exist?(name)
50
- log_process(:bootstrap) do
51
- with_log_indent do
52
- app.kube.run_job!(spec, name)
53
- end
54
- end
55
- end
41
+ app.to_kube_bootstrap_pods(repo, image_version).each do |name, spec|
42
+ next if app.kube.pod_succeeded?(name)
43
+ app.kube.delete_pod!(name) if app.kube.pod_exist?(name)
44
+ log_process(:bootstrap) do
45
+ app.kube.run_job!(spec, name)
46
+ end
47
+ end
56
48
 
57
- app.to_kube_before_apply_job_pods(repo, image_version).each do |name, spec|
58
- log_process(:before_apply_job) do
59
- app.kube.delete_pod!(name) if app.kube.pod_exist?(name)
60
- with_log_indent do
61
- app.kube.run_job!(spec, name)
62
- end
63
- end
64
- end
49
+ app.to_kube_before_apply_job_pods(repo, image_version).each do |name, spec|
50
+ log_process(:before_apply_job) do
51
+ app.kube.delete_pod!(name) if app.kube.pod_exist?(name)
52
+ app.kube.run_job!(spec, name)
53
+ end
54
+ end
65
55
 
66
- app.to_kube_deployments(repo, image_version).each do |name, spec|
67
- app.kube.apply_deployment!(name, spec)
68
- end
56
+ app.to_kube_deployments(repo, image_version).each do |name, spec|
57
+ app.kube.apply_deployment!(name, spec)
58
+ end
69
59
 
70
- app.to_kube_services.each do |name, spec|
71
- app.kube.apply_service!(name, spec)
72
- end
73
- end
60
+ app.to_kube_services.each do |name, spec|
61
+ app.kube.apply_service!(name, spec)
74
62
  end
75
63
  end
76
64
  end
@@ -75,16 +75,14 @@ module Dapp
75
75
  end
76
76
 
77
77
  def _dump_service_info(srv)
78
- app.deployment.dapp.with_log_indent do
79
- app.deployment.dapp.log_info("type: #{srv['spec']['type']}")
80
- app.deployment.dapp.log_info("clusterIP: #{srv['spec']['clusterIP']}")
78
+ app.deployment.dapp.log_info("type: #{srv['spec']['type']}")
79
+ app.deployment.dapp.log_info("clusterIP: #{srv['spec']['clusterIP']}")
81
80
 
82
- srv['spec'].fetch('ports', []).each do |port|
83
- app.deployment.dapp.log_info("Port #{port['port']}:")
84
- app.deployment.dapp.with_log_indent do
85
- %w(protocol targetPort nodePort).each do |field_name|
86
- app.deployment.dapp.log_info("#{field_name}: #{_field_value_for_log(port[field_name])}")
87
- end
81
+ srv['spec'].fetch('ports', []).each do |port|
82
+ app.deployment.dapp.log_info("Port #{port['port']}:")
83
+ app.deployment.dapp.with_log_indent do
84
+ %w(protocol targetPort nodePort).each do |field_name|
85
+ app.deployment.dapp.log_info("#{field_name}: #{_field_value_for_log(port[field_name])}")
88
86
  end
89
87
  end
90
88
  end
@@ -118,125 +116,123 @@ module Dapp
118
116
  # NOTICE: является одним из критериев завершения ожидания на данный момент.
119
117
  def _wait_for_deployment(d, old_d_revision: nil)
120
118
  app.deployment.dapp.log_process("Waiting for kubernetes Deployment #{d['metadata']['name']} readiness") do
121
- app.deployment.dapp.with_log_indent do
122
- known_events_by_pod = {}
119
+ known_events_by_pod = {}
123
120
 
124
- loop do
125
- d_revision = d.fetch('metadata', {}).fetch('annotations', {}).fetch('deployment.kubernetes.io/revision', nil)
121
+ loop do
122
+ d_revision = d.fetch('metadata', {}).fetch('annotations', {}).fetch('deployment.kubernetes.io/revision', nil)
126
123
 
127
- app.deployment.dapp.log_step("[#{Time.now}] Poll kubernetes Deployment status")
128
- app.deployment.dapp.with_log_indent do
129
- app.deployment.dapp.log_info("Target replicas: #{_field_value_for_log(d['spec']['replicas'])}")
130
- app.deployment.dapp.log_info("Updated replicas: #{_field_value_for_log(d['status']['updatedReplicas'])} / #{_field_value_for_log(d['spec']['replicas'])}")
131
- app.deployment.dapp.log_info("Available replicas: #{_field_value_for_log(d['status']['availableReplicas'])} / #{_field_value_for_log(d['spec']['replicas'])}")
132
- app.deployment.dapp.log_info("Ready replicas: #{_field_value_for_log(d['status']['readyReplicas'])} / #{_field_value_for_log(d['spec']['replicas'])}")
133
- app.deployment.dapp.log_info("Old deployment.kubernetes.io/revision: #{_field_value_for_log(old_d_revision)}")
134
- app.deployment.dapp.log_info("Current deployment.kubernetes.io/revision: #{_field_value_for_log(d_revision)}")
135
- end
124
+ app.deployment.dapp.log_step("[#{Time.now}] Poll kubernetes Deployment status")
125
+ app.deployment.dapp.with_log_indent do
126
+ app.deployment.dapp.log_info("Target replicas: #{_field_value_for_log(d['spec']['replicas'])}")
127
+ app.deployment.dapp.log_info("Updated replicas: #{_field_value_for_log(d['status']['updatedReplicas'])} / #{_field_value_for_log(d['spec']['replicas'])}")
128
+ app.deployment.dapp.log_info("Available replicas: #{_field_value_for_log(d['status']['availableReplicas'])} / #{_field_value_for_log(d['spec']['replicas'])}")
129
+ app.deployment.dapp.log_info("Ready replicas: #{_field_value_for_log(d['status']['readyReplicas'])} / #{_field_value_for_log(d['spec']['replicas'])}")
130
+ app.deployment.dapp.log_info("Old deployment.kubernetes.io/revision: #{_field_value_for_log(old_d_revision)}")
131
+ app.deployment.dapp.log_info("Current deployment.kubernetes.io/revision: #{_field_value_for_log(d_revision)}")
132
+ end
136
133
 
137
- rs = nil
138
- if d_revision
139
- # Находим актуальный, текущий ReplicaSet.
140
- # Если такая ситуация, когда есть несколько подходящих по revision ReplicaSet, то берем старейший по дате создания.
141
- # Также делает kubectl: https://github.com/kubernetes/kubernetes/blob/d86a01570ba243e8d75057415113a0ff4d68c96b/pkg/controller/deployment/util/deployment_util.go#L664
142
- rs = app.deployment.kubernetes.replicaset_list['items']
143
- .select do |_rs|
144
- Array(_rs['metadata']['ownerReferences']).any? do |owner_reference|
145
- owner_reference['uid'] == d['metadata']['uid']
146
- end
134
+ rs = nil
135
+ if d_revision
136
+ # Находим актуальный, текущий ReplicaSet.
137
+ # Если такая ситуация, когда есть несколько подходящих по revision ReplicaSet, то берем старейший по дате создания.
138
+ # Также делает kubectl: https://github.com/kubernetes/kubernetes/blob/d86a01570ba243e8d75057415113a0ff4d68c96b/pkg/controller/deployment/util/deployment_util.go#L664
139
+ rs = app.deployment.kubernetes.replicaset_list['items']
140
+ .select do |_rs|
141
+ Array(_rs['metadata']['ownerReferences']).any? do |owner_reference|
142
+ owner_reference['uid'] == d['metadata']['uid']
147
143
  end
148
- .select do |_rs|
149
- rs_revision = _rs.fetch('metadata', {}).fetch('annotations', {}).fetch('deployment.kubernetes.io/revision', nil)
150
- (rs_revision and (d_revision == rs_revision))
151
- end
152
- .sort_by do |_rs|
153
- Time.parse _rs['metadata']['creationTimestamp']
154
- end.first
155
- end
144
+ end
145
+ .select do |_rs|
146
+ rs_revision = _rs.fetch('metadata', {}).fetch('annotations', {}).fetch('deployment.kubernetes.io/revision', nil)
147
+ (rs_revision and (d_revision == rs_revision))
148
+ end
149
+ .sort_by do |_rs|
150
+ Time.parse _rs['metadata']['creationTimestamp']
151
+ end.first
152
+ end
156
153
 
157
- if rs
158
- # Pod'ы связанные с активным ReplicaSet
159
- rs_pods = app.deployment.kubernetes
160
- .pod_list(labelSelector: labels.map{|k, v| "#{k}=#{v}"}.join(','))['items']
161
- .select do |pod|
162
- Array(pod['metadata']['ownerReferences']).any? do |owner_reference|
163
- owner_reference['uid'] == rs['metadata']['uid']
164
- end
154
+ if rs
155
+ # Pod'ы связанные с активным ReplicaSet
156
+ rs_pods = app.deployment.kubernetes
157
+ .pod_list(labelSelector: labels.map{|k, v| "#{k}=#{v}"}.join(','))['items']
158
+ .select do |pod|
159
+ Array(pod['metadata']['ownerReferences']).any? do |owner_reference|
160
+ owner_reference['uid'] == rs['metadata']['uid']
165
161
  end
162
+ end
166
163
 
167
- app.deployment.dapp.with_log_indent do
168
- app.deployment.dapp.log_info("Pods:") if rs_pods.any?
169
-
170
- rs_pods.each do |pod|
171
- app.deployment.dapp.with_log_indent do
172
- app.deployment.dapp.log_info("* #{pod['metadata']['name']}")
164
+ app.deployment.dapp.with_log_indent do
165
+ app.deployment.dapp.log_info("Pods:") if rs_pods.any?
173
166
 
174
- known_events_by_pod[pod['metadata']['name']] ||= []
175
- pod_events = app.deployment.kubernetes
176
- .event_list(fieldSelector: "involvedObject.uid=#{pod['metadata']['uid']}")['items']
177
- .reject do |event|
178
- known_events_by_pod[pod['metadata']['name']].include? event['metadata']['uid']
179
- end
167
+ rs_pods.each do |pod|
168
+ app.deployment.dapp.with_log_indent do
169
+ app.deployment.dapp.log_info("* #{pod['metadata']['name']}")
180
170
 
181
- if pod_events.any?
182
- pod_events.each do |event|
183
- app.deployment.dapp.with_log_indent do
184
- app.deployment.dapp.log_info("[#{event['metadata']['creationTimestamp']}] #{event['message']}")
185
- end
186
- known_events_by_pod[pod['metadata']['name']] << event['metadata']['uid']
187
- end
171
+ known_events_by_pod[pod['metadata']['name']] ||= []
172
+ pod_events = app.deployment.kubernetes
173
+ .event_list(fieldSelector: "involvedObject.uid=#{pod['metadata']['uid']}")['items']
174
+ .reject do |event|
175
+ known_events_by_pod[pod['metadata']['name']].include? event['metadata']['uid']
188
176
  end
189
177
 
190
- ready_condition = pod['status'].fetch('conditions', {}).find {|condition| condition['type'] == 'Ready'}
191
- next if (not ready_condition) or (ready_condition['status'] == 'True')
192
-
193
- if ready_condition['reason'] == 'ContainersNotReady'
194
- Array(pod['status']['containerStatuses']).each do |container_status|
195
- next if container_status['ready']
196
-
197
- waiting_reason = container_status.fetch('state', {}).fetch('waiting', {}).fetch('reason', nil)
198
- case waiting_reason
199
- when 'ImagePullBackOff', 'ErrImagePull'
200
- raise Error::Base,
201
- code: :image_not_found,
202
- data: {app: app.name,
203
- pod_name: pod['metadata']['name'],
204
- reason: container_status['state']['waiting']['reason'],
205
- message: container_status['state']['waiting']['message']}
206
- when 'CrashLoopBackOff'
207
- raise Error::Base,
208
- code: :container_crash,
209
- data: {app: app.name,
210
- pod_name: pod['metadata']['name'],
211
- reason: container_status['state']['waiting']['reason'],
212
- message: container_status['state']['waiting']['message']}
213
- end
214
- end
215
- else
178
+ if pod_events.any?
179
+ pod_events.each do |event|
216
180
  app.deployment.dapp.with_log_indent do
217
- app.deployment.dapp.log_warning("Unknown pod readiness condition reason '#{ready_condition['reason']}': #{ready_condition}")
181
+ app.deployment.dapp.log_info("[#{event['metadata']['creationTimestamp']}] #{event['message']}")
218
182
  end
183
+ known_events_by_pod[pod['metadata']['name']] << event['metadata']['uid']
219
184
  end
220
- end # with_log_indent
221
- end # rs_pods.each
222
- end # with_log_indent
223
- end
185
+ end
224
186
 
225
- break if begin
226
- d_revision and
227
- d['spec']['replicas'] and
228
- d['status']['updatedReplicas'] and
229
- d['status']['availableReplicas'] and
230
- d['status']['readyReplicas'] and
231
- (d['status']['updatedReplicas'] >= d['spec']['replicas']) and
232
- (d['status']['availableReplicas'] >= d['spec']['replicas']) and
233
- (d['status']['readyReplicas'] >= d['spec']['replicas'])
234
- end
187
+ ready_condition = pod['status'].fetch('conditions', {}).find {|condition| condition['type'] == 'Ready'}
188
+ next if (not ready_condition) or (ready_condition['status'] == 'True')
189
+
190
+ if ready_condition['reason'] == 'ContainersNotReady'
191
+ Array(pod['status']['containerStatuses']).each do |container_status|
192
+ next if container_status['ready']
193
+
194
+ waiting_reason = container_status.fetch('state', {}).fetch('waiting', {}).fetch('reason', nil)
195
+ case waiting_reason
196
+ when 'ImagePullBackOff', 'ErrImagePull'
197
+ raise Error::Base,
198
+ code: :image_not_found,
199
+ data: {app: app.name,
200
+ pod_name: pod['metadata']['name'],
201
+ reason: container_status['state']['waiting']['reason'],
202
+ message: container_status['state']['waiting']['message']}
203
+ when 'CrashLoopBackOff'
204
+ raise Error::Base,
205
+ code: :container_crash,
206
+ data: {app: app.name,
207
+ pod_name: pod['metadata']['name'],
208
+ reason: container_status['state']['waiting']['reason'],
209
+ message: container_status['state']['waiting']['message']}
210
+ end
211
+ end
212
+ else
213
+ app.deployment.dapp.with_log_indent do
214
+ app.deployment.dapp.log_warning("Unknown pod readiness condition reason '#{ready_condition['reason']}': #{ready_condition}")
215
+ end
216
+ end
217
+ end # with_log_indent
218
+ end # rs_pods.each
219
+ end # with_log_indent
220
+ end
235
221
 
236
- sleep 1
237
- d = app.deployment.kubernetes.deployment(d['metadata']['name'])
222
+ break if begin
223
+ d_revision and
224
+ d['spec']['replicas'] and
225
+ d['status']['updatedReplicas'] and
226
+ d['status']['availableReplicas'] and
227
+ d['status']['readyReplicas'] and
228
+ (d['status']['updatedReplicas'] >= d['spec']['replicas']) and
229
+ (d['status']['availableReplicas'] >= d['spec']['replicas']) and
230
+ (d['status']['readyReplicas'] >= d['spec']['replicas'])
238
231
  end
239
- end # with_log_indent
232
+
233
+ sleep 1
234
+ d = app.deployment.kubernetes.deployment(d['metadata']['name'])
235
+ end
240
236
  end
241
237
  end
242
238
 
@@ -50,11 +50,7 @@ module Dapp
50
50
  def artifacts_dimgs_build!
51
51
  artifacts.each do |artifact|
52
52
  process = dimg.dapp.t(code: 'process.artifact_building', data: { name: artifact[:name] })
53
- dimg.dapp.log_secondary_process(process) do
54
- dimg.dapp.with_log_indent do
55
- artifact[:dimg].build!
56
- end
57
- end
53
+ dimg.dapp.log_secondary_process(process) { artifact[:dimg].build! }
58
54
  end
59
55
  end
60
56
 
@@ -6,10 +6,8 @@ module Dapp
6
6
  module Export
7
7
  def build_context_export
8
8
  log_process(:'export context') do
9
- with_log_indent do
10
- export_build_context_image_tar
11
- export_build_context_build_tar
12
- end
9
+ export_build_context_image_tar
10
+ export_build_context_build_tar
13
11
  end
14
12
  end
15
13
 
@@ -9,10 +9,8 @@ module Dapp
9
9
  data: { path: build_context_path } unless build_context_path.exist?
10
10
 
11
11
  log_process(:'import context') do
12
- with_log_indent do
13
- import_build_context_build_tar
14
- import_build_context_image_tar
15
- end
12
+ import_build_context_build_tar
13
+ import_build_context_image_tar
16
14
  end
17
15
  end
18
16
 
@@ -85,9 +85,7 @@ module Dapp
85
85
  dapp.lock("image.#{hashsum image_name}") do
86
86
  ::Dapp::Dimg::Image::Stage.cache_reset(image_name)
87
87
  dapp.log_process(image_name, process: dapp.t(code: 'status.process.pushing')) do
88
- dapp.with_log_indent do
89
- image.export!(image_name)
90
- end
88
+ image.export!(image_name)
91
89
  end
92
90
  end
93
91
  end
@@ -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', 'deploy', 'dismiss', 'secret extract', 'minikube setup'].freeze
4
+ SUBCOMMANDS = ['secret generate', 'secret key generate', 'secret regenerate', 'deploy', 'dismiss', 'secret extract', 'minikube setup'].freeze
5
5
 
6
6
  banner <<BANNER.freeze
7
7
  Usage: dapp kube subcommand [subcommand options]
@@ -13,6 +13,7 @@ Available subcommands: (for details, dapp kube SUB-COMMAND --help)
13
13
  dapp kube secret key generate [options]
14
14
  dapp kube secret generate [FILE_PATH] [options]
15
15
  dapp kube secret extract [FILE_PATH] [options]
16
+ dapp kube secret regenerate [SECRET_VALUES_FILE_PATH ...] [options]
16
17
  dapp kube minikube setup
17
18
 
18
19
  Options:
@@ -11,11 +11,21 @@ BANNER
11
11
 
12
12
  option :output_file_path,
13
13
  short: '-o OUTPUT_FILE_PATH',
14
+ description: 'Output file',
14
15
  required: false
15
16
 
17
+ option :values,
18
+ long: '--values',
19
+ description: 'Decode secret values file',
20
+ default: false
21
+
16
22
  def run(argv = ARGV)
17
23
  self.class.parse_options(self, argv)
18
- file_path = cli_arguments.empty? ? nil : cli_arguments.first
24
+ file_path = begin
25
+ if cli_options[:values] || !cli_arguments.empty?
26
+ self.class.required_argument(self, 'FILE_PATH')
27
+ end
28
+ end
19
29
  ::Dapp::Dapp.new(options: cli_options).public_send(run_method, file_path)
20
30
  end
21
31
  end
@@ -13,6 +13,11 @@ BANNER
13
13
  short: '-o OUTPUT_FILE_PATH',
14
14
  required: false
15
15
 
16
+ option :values,
17
+ long: '--values',
18
+ description: 'Decode secret values file',
19
+ default: false
20
+
16
21
  def run(argv = ARGV)
17
22
  self.class.parse_options(self, argv)
18
23
  file_path = cli_arguments.empty? ? nil : cli_arguments.first
@@ -0,0 +1,23 @@
1
+ module Dapp::Kube::CLI::Command
2
+ class Kube < ::Dapp::CLI
3
+ class SecretRegenerate < Base
4
+ banner <<BANNER.freeze
5
+ Usage:
6
+
7
+ dapp kube secret regenerate [SECRET_VALUES_FILE_PATH ...] [options]
8
+
9
+ Options:
10
+ BANNER
11
+
12
+ option :old_secret_key,
13
+ long: '--old-secret-key KEY',
14
+ description: 'Old secret key',
15
+ required: true
16
+
17
+ def run(argv = ARGV)
18
+ self.class.parse_options(self, argv)
19
+ ::Dapp::Dapp.new(options: cli_options).public_send(run_method, *cli_arguments)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -15,6 +15,30 @@ module Dapp
15
15
  kubernetes.namespace
16
16
  end
17
17
 
18
+ def kube_helm_encode_json(secret, json)
19
+ encode_json = proc do |value|
20
+ case value
21
+ when Array then value.map { |v| encode_json.call(v) }
22
+ when Hash then kube_helm_encode_json(secret,value)
23
+ else
24
+ secret.nil? ? '' : secret.generate(value)
25
+ end
26
+ end
27
+ json.each { |k, v| json[k] = encode_json.call(v) }
28
+ end
29
+
30
+ def kube_helm_decode_json(secret, json)
31
+ decode_value = proc do |value|
32
+ case value
33
+ when Array then value.map { |v| decode_value.call(v) }
34
+ when Hash then kube_helm_decode_json(secret,value)
35
+ else
36
+ secret.nil? ? '' : secret.extract(value)
37
+ end
38
+ end
39
+ json.each { |k, v| json[k] = decode_value.call(v) }
40
+ end
41
+
18
42
  def secret_key_should_exist!
19
43
  raise(Error::Command,
20
44
  code: :secret_key_not_found,
@@ -22,6 +46,10 @@ module Dapp
22
46
  ) if secret.nil?
23
47
  end
24
48
 
49
+ def kube_chart_path(*path)
50
+ self.path('.helm', *path).expand_path
51
+ end
52
+
25
53
  def secret
26
54
  @secret ||= begin
27
55
  unless secret_key = ENV['DAPP_SECRET_KEY']
@@ -54,23 +54,11 @@ module Dapp
54
54
 
55
55
  def kube_helm_decode_secret_values
56
56
  kube_secret_values_paths.each_with_index do |secret_values_file, index|
57
- decoded_data = kube_helm_decode_json(YAML::load(secret_values_file.read))
57
+ decoded_data = kube_helm_decode_json(secret, YAML::load(secret_values_file.read))
58
58
  kube_tmp_chart_secret_values_paths[index].write(decoded_data.to_yaml)
59
59
  end
60
60
  end
61
61
 
62
- def kube_helm_decode_json(json)
63
- decode_value = proc do |value|
64
- case value
65
- when Array then value.map { |v| decode_value.call(v) }
66
- when Hash then kube_helm_decode_json(value)
67
- else
68
- secret.nil? ? '' : secret.extract(value)
69
- end
70
- end
71
- json.each { |k, v| json[k] = decode_value.call(v) }
72
- end
73
-
74
62
  def kube_helm_decode_secret_files
75
63
  return unless kube_chart_secret_path.directory?
76
64
  Dir.glob(kube_chart_secret_path.join('**/*')).each do |entry|
@@ -206,10 +194,6 @@ module Dapp
206
194
  def kube_chart_secret_path(*path)
207
195
  kube_chart_path('secret', *path).expand_path
208
196
  end
209
-
210
- def kube_chart_path(*path)
211
- self.path('.helm', *path).expand_path
212
- end
213
197
  end
214
198
  end
215
199
  end
@@ -7,10 +7,8 @@ module Dapp
7
7
  kube_check_helm!
8
8
  kube_check_helm_release!
9
9
  log_process("Delete release #{kube_release_name}") do
10
- with_log_indent do
11
- shellout! "helm delete #{kube_release_name} --purge"
12
- kubernetes.delete_namespace!(kube_namespace) if options[:with_namespace]
13
- end
10
+ shellout! "helm delete #{kube_release_name} --purge"
11
+ kubernetes.delete_namespace!(kube_namespace) if options[:with_namespace]
14
12
  end
15
13
  end
16
14
 
@@ -55,7 +55,15 @@ module Dapp
55
55
  end
56
56
 
57
57
  def _minikube_run_daemon(name, &blk)
58
- pid_file_path = "/run/dapp_#{name}_daemon.pid"
58
+ uid = Process.euid
59
+ if uid != 0 && File.exists?("/run/user/#{uid}")
60
+ pid_file_path = "/run/user/#{uid}/dapp_#{name}_daemon.pid"
61
+ elsif uid != 0
62
+ pid_file_path = "/tmp/dapp_#{name}_daemon.pid"
63
+ else
64
+ pid_file_path = "/run/dapp_#{name}_daemon.pid"
65
+ end
66
+
59
67
  old_daemon_pid = begin
60
68
  File.open(pid_file_path, 'r').read.strip.to_i
61
69
  rescue Errno::ENOENT
@@ -126,99 +134,97 @@ module Dapp
126
134
  def _minikube_run_registry
127
135
  log_process("Run registry") do
128
136
  _minikube_kubernetes.with_query(gracePeriodSeconds: 0) do
129
- with_log_indent do
130
- if _minikube_kubernetes.replicationcontroller? _minikube_registry_replicationcontroller_spec['metadata']['name']
131
- _minikube_kubernetes.delete_replicationcontroller! _minikube_registry_replicationcontroller_spec['metadata']['name']
132
-
133
- shutdown_ok = false
134
- 600.times do
135
- unless _minikube_kubernetes.replicationcontroller? _minikube_registry_replicationcontroller_spec['metadata']['name']
136
- shutdown_ok = true
137
- break
138
- end
139
- sleep 1
140
- end
141
- raise MinikubeSetupError, code: :registry_replicationcontroller_shutdown_failed unless shutdown_ok
142
- end
137
+ if _minikube_kubernetes.replicationcontroller? _minikube_registry_replicationcontroller_spec['metadata']['name']
138
+ _minikube_kubernetes.delete_replicationcontroller! _minikube_registry_replicationcontroller_spec['metadata']['name']
143
139
 
144
- _minikube_kubernetes.delete_pods! labelSelector: 'k8s-app=kube-registry'
145
140
  shutdown_ok = false
146
141
  600.times do
147
- unless _minikube_find_registry_pod
142
+ unless _minikube_kubernetes.replicationcontroller? _minikube_registry_replicationcontroller_spec['metadata']['name']
148
143
  shutdown_ok = true
149
144
  break
150
145
  end
151
146
  sleep 1
152
147
  end
153
- raise MinikubeSetupError, code: :registry_pod_shutdown_failed unless shutdown_ok
148
+ raise MinikubeSetupError, code: :registry_replicationcontroller_shutdown_failed unless shutdown_ok
149
+ end
154
150
 
155
- if _minikube_kubernetes.service? _minikube_registry_service_spec['metadata']['name']
156
- _minikube_kubernetes.delete_service! _minikube_registry_service_spec['metadata']['name']
157
-
158
- shutdown_ok = false
159
- 600.times do
160
- unless _minikube_kubernetes.service? _minikube_registry_service_spec['metadata']['name']
161
- shutdown_ok = true
162
- break
163
- end
164
- sleep 1
165
- end
166
- raise MinikubeSetupError, code: :registry_service_shutdown_failed unless shutdown_ok
151
+ _minikube_kubernetes.delete_pods! labelSelector: 'k8s-app=kube-registry'
152
+ shutdown_ok = false
153
+ 600.times do
154
+ unless _minikube_find_registry_pod
155
+ shutdown_ok = true
156
+ break
167
157
  end
158
+ sleep 1
159
+ end
160
+ raise MinikubeSetupError, code: :registry_pod_shutdown_failed unless shutdown_ok
168
161
 
169
- if _minikube_kubernetes.pod? _minikube_registry_proxy_pod_spec['metadata']['name']
170
- _minikube_kubernetes.delete_pod! _minikube_registry_proxy_pod_spec['metadata']['name']
171
-
172
- shutdown_ok = false
173
- 600.times do
174
- unless _minikube_kubernetes.pod? _minikube_registry_proxy_pod_spec['metadata']['name']
175
- shutdown_ok = true
176
- break
177
- end
178
- sleep 1
179
- end
180
- raise MinikubeSetupError, code: :registry_proxy_pod_shutdown_failed unless shutdown_ok
181
- end
162
+ if _minikube_kubernetes.service? _minikube_registry_service_spec['metadata']['name']
163
+ _minikube_kubernetes.delete_service! _minikube_registry_service_spec['metadata']['name']
182
164
 
183
- _minikube_kubernetes.create_replicationcontroller!(_minikube_registry_replicationcontroller_spec)
184
- registry_pod_ok = false
165
+ shutdown_ok = false
185
166
  600.times do
186
- if registry_pod = _minikube_find_registry_pod
187
- if registry_pod['status']['phase'] == 'Running'
188
- registry_pod_ok = true
189
- @_minikube_registry_pod_name = registry_pod['metadata']['name']
190
- break
191
- end
167
+ unless _minikube_kubernetes.service? _minikube_registry_service_spec['metadata']['name']
168
+ shutdown_ok = true
169
+ break
192
170
  end
193
171
  sleep 1
194
172
  end
195
- raise MinikubeSetupError, code: :registry_pod_not_ok unless registry_pod_ok
173
+ raise MinikubeSetupError, code: :registry_service_shutdown_failed unless shutdown_ok
174
+ end
175
+
176
+ if _minikube_kubernetes.pod? _minikube_registry_proxy_pod_spec['metadata']['name']
177
+ _minikube_kubernetes.delete_pod! _minikube_registry_proxy_pod_spec['metadata']['name']
196
178
 
197
- _minikube_kubernetes.create_service!(_minikube_registry_service_spec)
198
- registry_service_ok = false
179
+ shutdown_ok = false
199
180
  600.times do
200
- if _minikube_kubernetes.service? _minikube_registry_service_spec['metadata']['name']
201
- registry_service_ok = true
181
+ unless _minikube_kubernetes.pod? _minikube_registry_proxy_pod_spec['metadata']['name']
182
+ shutdown_ok = true
202
183
  break
203
184
  end
204
185
  sleep 1
205
186
  end
206
- raise MinikubeSetupError, code: :registry_service_not_ok unless registry_service_ok
187
+ raise MinikubeSetupError, code: :registry_proxy_pod_shutdown_failed unless shutdown_ok
188
+ end
207
189
 
208
- _minikube_kubernetes.create_pod! _minikube_registry_proxy_pod_spec
209
- registry_proxy_pod_ok = false
210
- 600.times do
211
- if _minikube_kubernetes.pod? _minikube_registry_proxy_pod_spec['metadata']['name']
212
- registry_proxy_pod = _minikube_kubernetes.pod(_minikube_registry_proxy_pod_spec['metadata']['name'])
213
- if registry_proxy_pod['status']['phase'] == 'Running'
214
- registry_proxy_pod_ok = true
215
- break
216
- end
190
+ _minikube_kubernetes.create_replicationcontroller!(_minikube_registry_replicationcontroller_spec)
191
+ registry_pod_ok = false
192
+ 600.times do
193
+ if registry_pod = _minikube_find_registry_pod
194
+ if registry_pod['status']['phase'] == 'Running'
195
+ registry_pod_ok = true
196
+ @_minikube_registry_pod_name = registry_pod['metadata']['name']
197
+ break
198
+ end
199
+ end
200
+ sleep 1
201
+ end
202
+ raise MinikubeSetupError, code: :registry_pod_not_ok unless registry_pod_ok
203
+
204
+ _minikube_kubernetes.create_service!(_minikube_registry_service_spec)
205
+ registry_service_ok = false
206
+ 600.times do
207
+ if _minikube_kubernetes.service? _minikube_registry_service_spec['metadata']['name']
208
+ registry_service_ok = true
209
+ break
210
+ end
211
+ sleep 1
212
+ end
213
+ raise MinikubeSetupError, code: :registry_service_not_ok unless registry_service_ok
214
+
215
+ _minikube_kubernetes.create_pod! _minikube_registry_proxy_pod_spec
216
+ registry_proxy_pod_ok = false
217
+ 600.times do
218
+ if _minikube_kubernetes.pod? _minikube_registry_proxy_pod_spec['metadata']['name']
219
+ registry_proxy_pod = _minikube_kubernetes.pod(_minikube_registry_proxy_pod_spec['metadata']['name'])
220
+ if registry_proxy_pod['status']['phase'] == 'Running'
221
+ registry_proxy_pod_ok = true
222
+ break
217
223
  end
218
- sleep 1
219
224
  end
220
- raise MinikubeSetupError, code: :registry_proxy_pod_not_ok unless registry_proxy_pod_ok
225
+ sleep 1
221
226
  end
227
+ raise MinikubeSetupError, code: :registry_proxy_pod_not_ok unless registry_proxy_pod_ok
222
228
  end
223
229
  end
224
230
  end
@@ -6,10 +6,25 @@ module Dapp
6
6
  def kube_secret_extract(file_path)
7
7
  secret_key_should_exist!
8
8
 
9
- if file_path.nil?
10
- kube_extract_secret
9
+ data = begin
10
+ if file_path
11
+ raise Error::Command, code: :file_not_exist, data: { path: File.expand_path(file_path) } unless File.exist?(file_path)
12
+
13
+ if options[:values]
14
+ kube_extract_secret_values(file_path)
15
+ else
16
+ kube_extract_secret_file(file_path)
17
+ end
18
+ else
19
+ kube_extract_secret
20
+ end
21
+ end
22
+
23
+ if (output_file_path = options[:output_file_path])
24
+ FileUtils.mkpath File.dirname(output_file_path)
25
+ IO.binwrite(output_file_path, "#{data}\n")
11
26
  else
12
- kube_extract_secret_file(file_path)
27
+ puts data
13
28
  end
14
29
  end
15
30
 
@@ -17,27 +32,26 @@ module Dapp
17
32
  data = begin
18
33
  if $stdin.tty?
19
34
  print 'Enter secret: '
20
- $stdin.noecho(&:gets).tap { print "\n" }
35
+ $stdin.gets
21
36
  else
22
37
  $stdin.read
23
- end
38
+ end.to_s.chomp
24
39
  end
25
40
 
26
- unless (data = data.to_s.chomp).empty?
27
- puts secret.extract(data)
41
+ if data.empty?
42
+ exit 0
43
+ else
44
+ secret.extract(data)
28
45
  end
29
46
  end
30
47
 
31
- def kube_extract_secret_file(file_path)
32
- raise Error::Command, code: :file_not_exist, data: { path: File.expand_path(file_path) } unless File.exist?(file_path)
48
+ def kube_extract_secret_values(file_path)
49
+ raise Error::Command, code: :incorrect_yaml_structure, data: { path: File.expand_path(file_path) } unless (json = YAML::load(File.read(file_path)))
50
+ kube_helm_decode_json(secret, json).to_yaml
51
+ end
33
52
 
34
- decrypted_data = secret.extract(IO.binread(file_path).chomp("\n"))
35
- if (output_file_path = options[:output_file_path]).nil?
36
- puts decrypted_data
37
- else
38
- FileUtils.mkpath File.dirname(output_file_path)
39
- IO.binwrite(output_file_path, "#{decrypted_data}\n")
40
- end
53
+ def kube_extract_secret_file(file_path)
54
+ secret.extract(IO.binread(file_path).chomp("\n"))
41
55
  end
42
56
  end
43
57
  end
@@ -6,10 +6,25 @@ module Dapp
6
6
  def kube_secret_generate(file_path)
7
7
  secret_key_should_exist!
8
8
 
9
- if file_path.nil?
10
- kube_secret
9
+ data = begin
10
+ if file_path
11
+ raise Error::Command, code: :file_not_exist, data: { path: File.expand_path(file_path) } unless File.exist?(file_path)
12
+
13
+ if options[:values]
14
+ kube_secret_values(file_path)
15
+ else
16
+ kube_secret_file(file_path)
17
+ end
18
+ else
19
+ kube_secret
20
+ end
21
+ end
22
+
23
+ if (output_file_path = options[:output_file_path])
24
+ FileUtils.mkpath File.dirname(output_file_path)
25
+ IO.binwrite(output_file_path, "#{data}\n")
11
26
  else
12
- kube_secret_file(file_path)
27
+ puts data
13
28
  end
14
29
  end
15
30
 
@@ -20,24 +35,23 @@ module Dapp
20
35
  $stdin.noecho(&:gets).tap { print "\n" }
21
36
  else
22
37
  $stdin.read
23
- end
38
+ end.to_s.chomp
24
39
  end
25
40
 
26
- unless (data = data.to_s.chomp).empty?
27
- puts secret.generate(data)
41
+ if data.empty?
42
+ exit 0
43
+ else
44
+ secret.generate(data)
28
45
  end
29
46
  end
30
47
 
31
- def kube_secret_file(file_path)
32
- raise Error::Command, code: :file_not_exist, data: { path: File.expand_path(file_path) } unless File.exist?(file_path)
48
+ def kube_secret_values(file_path)
49
+ raise Error::Command, code: :incorrect_yaml_structure, data: { path: File.expand_path(file_path) } unless (json = YAML::load(File.read(file_path)))
50
+ kube_helm_encode_json(secret, json).to_yaml
51
+ end
33
52
 
34
- encrypted_data = secret.generate(IO.binread(file_path))
35
- if (output_file_path = options[:output_file_path]).nil?
36
- puts encrypted_data
37
- else
38
- FileUtils.mkpath File.dirname(output_file_path)
39
- IO.binwrite(output_file_path, "#{encrypted_data}\n")
40
- end
53
+ def kube_secret_file(file_path)
54
+ secret.generate(IO.binread(file_path))
41
55
  end
42
56
  end
43
57
  end
@@ -0,0 +1,39 @@
1
+ module Dapp
2
+ module Kube
3
+ module Dapp
4
+ module Command
5
+ module SecretRegenerate
6
+ def kube_secret_regenerate(*secret_values_paths)
7
+ regenerated_data = {}
8
+
9
+ secret_values_paths << kube_chart_path('secret-values.yaml') if kube_chart_path('secret-values.yaml').file?
10
+ secret_values_paths.each do |file_path|
11
+ raise Error::Command, code: :file_not_exist, data: { path: File.expand_path(file_path) } unless File.exist?(file_path)
12
+ regenerated_data[file_path] = kube_regenerate_secret_values(file_path)
13
+ end
14
+
15
+ Dir.glob(kube_chart_path('secret/**/*'), File::FNM_DOTMATCH).each do |file_path|
16
+ next if File.directory?(file_path)
17
+ regenerated_data[file_path] = kube_regenerate_secret_file(file_path)
18
+ end
19
+
20
+ regenerated_data.each { |file_path, data| IO.binwrite(file_path, "#{data}\n") }
21
+ end
22
+
23
+ def kube_regenerate_secret_file(file_path)
24
+ secret.generate(old_secret.extract(IO.binread(file_path).chomp("\n")))
25
+ end
26
+
27
+ def kube_regenerate_secret_values(file_path)
28
+ raise Error::Command, code: :incorrect_yaml_structure, data: { path: File.expand_path(file_path) } unless (json = YAML::load(File.read(file_path)))
29
+ kube_helm_encode_json(secret, kube_helm_decode_json(old_secret, json)).to_yaml
30
+ end
31
+
32
+ def old_secret
33
+ @old_secret ||= Secret.new(options[:old_secret_key])
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -7,6 +7,7 @@ module Dapp
7
7
  include Command::SecretKeyGenerate
8
8
  include Command::SecretGenerate
9
9
  include Command::SecretExtract
10
+ include Command::SecretRegenerate
10
11
  include Command::MinikubeSetup
11
12
  include Command::Common
12
13
  end
@@ -1,4 +1,4 @@
1
1
  module Dapp
2
- VERSION = '0.13.4'.freeze
2
+ VERSION = '0.13.5'.freeze
3
3
  BUILD_CACHE_VERSION = 15
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dapp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.4
4
+ version: 0.13.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dmitry Stolyarov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-28 00:00:00.000000000 Z
11
+ date: 2017-07-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mixlib-shellout
@@ -403,7 +403,9 @@ files:
403
403
  - config/en/net_status.yml
404
404
  - lib/dapp.rb
405
405
  - lib/dapp/cli.rb
406
+ - lib/dapp/cli/cli.rb
406
407
  - lib/dapp/cli/command/base.rb
408
+ - lib/dapp/cli/command/update.rb
407
409
  - lib/dapp/config/config.rb
408
410
  - lib/dapp/config/directive/base.rb
409
411
  - lib/dapp/config/error/config.rb
@@ -627,6 +629,7 @@ files:
627
629
  - lib/dapp/kube/cli/command/kube/secret_extract.rb
628
630
  - lib/dapp/kube/cli/command/kube/secret_generate.rb
629
631
  - lib/dapp/kube/cli/command/kube/secret_key_generate.rb
632
+ - lib/dapp/kube/cli/command/kube/secret_regenerate.rb
630
633
  - lib/dapp/kube/client.rb
631
634
  - lib/dapp/kube/client/error.rb
632
635
  - lib/dapp/kube/dapp/command/common.rb
@@ -636,6 +639,7 @@ files:
636
639
  - lib/dapp/kube/dapp/command/secret_extract.rb
637
640
  - lib/dapp/kube/dapp/command/secret_generate.rb
638
641
  - lib/dapp/kube/dapp/command/secret_key_generate.rb
642
+ - lib/dapp/kube/dapp/command/secret_regenerate.rb
639
643
  - lib/dapp/kube/dapp/dapp.rb
640
644
  - lib/dapp/kube/error/base.rb
641
645
  - lib/dapp/kube/error/command.rb