dapp 0.13.4 → 0.13.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml 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