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 +4 -4
- data/config/en/net_status.yml +1 -0
- data/lib/dapp.rb +4 -0
- data/lib/dapp/cli.rb +2 -1
- data/lib/dapp/cli/cli.rb +1 -0
- data/lib/dapp/cli/command/update.rb +14 -0
- data/lib/dapp/dapp/logging/base.rb +1 -9
- data/lib/dapp/dapp/logging/process.rb +1 -1
- data/lib/dapp/deployment/dapp/command/apply.rb +38 -50
- data/lib/dapp/deployment/kube_app.rb +107 -111
- data/lib/dapp/dimg/build/stage/artifact_base.rb +1 -5
- data/lib/dapp/dimg/dapp/command/build_context/export.rb +2 -4
- data/lib/dapp/dimg/dapp/command/build_context/import.rb +2 -4
- data/lib/dapp/dimg/dimg.rb +1 -3
- data/lib/dapp/kube/cli/command/kube.rb +2 -1
- data/lib/dapp/kube/cli/command/kube/secret_extract.rb +11 -1
- data/lib/dapp/kube/cli/command/kube/secret_generate.rb +5 -0
- data/lib/dapp/kube/cli/command/kube/secret_regenerate.rb +23 -0
- data/lib/dapp/kube/dapp/command/common.rb +28 -0
- data/lib/dapp/kube/dapp/command/deploy.rb +1 -17
- data/lib/dapp/kube/dapp/command/dismiss.rb +2 -4
- data/lib/dapp/kube/dapp/command/minikube_setup.rb +74 -68
- data/lib/dapp/kube/dapp/command/secret_extract.rb +30 -16
- data/lib/dapp/kube/dapp/command/secret_generate.rb +29 -15
- data/lib/dapp/kube/dapp/command/secret_regenerate.rb +39 -0
- data/lib/dapp/kube/dapp/dapp.rb +1 -0
- data/lib/dapp/version.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 19d9262efa88dcc95e63826c17a15ceaeabcf417
|
4
|
+
data.tar.gz: edd444ed3ee8f5c2f3360fa00f81cb4ee54704fc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5f33daa8ff9806a7fcf8772daa91c4293f1376463dd60a491d50e27606b472280a881eda12c352f5adc5b9cd14ab45bd8c90731d3629c1533368c18a03311243
|
7
|
+
data.tar.gz: 161dad188386797eb8882af58119778b166ebc476a2bb4023ea5cfb6a745dd2847f53ad61b76671f4ff2cdccae28f69bba084de489fc9b78af6df7c569ef3262
|
data/config/en/net_status.yml
CHANGED
@@ -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}`!"
|
data/lib/dapp.rb
CHANGED
@@ -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'
|
data/lib/dapp/cli.rb
CHANGED
@@ -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
|
data/lib/dapp/cli/cli.rb
ADDED
@@ -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
|
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
|
@@ -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
|
-
|
15
|
-
deployment.kube.delete_unknown_resources!
|
14
|
+
deployment.kube.delete_unknown_resources!
|
16
15
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
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
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
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
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
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
|
-
|
44
|
-
|
45
|
-
|
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
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
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
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
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
|
-
|
67
|
-
|
68
|
-
|
56
|
+
app.to_kube_deployments(repo, image_version).each do |name, spec|
|
57
|
+
app.kube.apply_deployment!(name, spec)
|
58
|
+
end
|
69
59
|
|
70
|
-
|
71
|
-
|
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.
|
79
|
-
|
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
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
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
|
-
|
122
|
-
known_events_by_pod = {}
|
119
|
+
known_events_by_pod = {}
|
123
120
|
|
124
|
-
|
125
|
-
|
121
|
+
loop do
|
122
|
+
d_revision = d.fetch('metadata', {}).fetch('annotations', {}).fetch('deployment.kubernetes.io/revision', nil)
|
126
123
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
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
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
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
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
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
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
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
|
-
|
168
|
-
|
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
|
-
|
175
|
-
|
176
|
-
|
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
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
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
|
-
|
191
|
-
|
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.
|
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
|
221
|
-
end # rs_pods.each
|
222
|
-
end # with_log_indent
|
223
|
-
end
|
185
|
+
end
|
224
186
|
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
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
|
-
|
237
|
-
|
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
|
-
|
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)
|
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
|
-
|
10
|
-
|
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
|
-
|
13
|
-
|
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
|
|
data/lib/dapp/dimg/dimg.rb
CHANGED
@@ -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
|
-
|
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 =
|
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
|
-
|
11
|
-
|
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
|
-
|
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
|
-
|
130
|
-
|
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
|
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: :
|
148
|
+
raise MinikubeSetupError, code: :registry_replicationcontroller_shutdown_failed unless shutdown_ok
|
149
|
+
end
|
154
150
|
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
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
|
-
|
170
|
-
|
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
|
-
|
184
|
-
registry_pod_ok = false
|
165
|
+
shutdown_ok = false
|
185
166
|
600.times do
|
186
|
-
|
187
|
-
|
188
|
-
|
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: :
|
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
|
-
|
198
|
-
registry_service_ok = false
|
179
|
+
shutdown_ok = false
|
199
180
|
600.times do
|
200
|
-
|
201
|
-
|
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: :
|
187
|
+
raise MinikubeSetupError, code: :registry_proxy_pod_shutdown_failed unless shutdown_ok
|
188
|
+
end
|
207
189
|
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
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
|
-
|
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
|
-
|
10
|
-
|
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
|
-
|
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.
|
35
|
+
$stdin.gets
|
21
36
|
else
|
22
37
|
$stdin.read
|
23
|
-
end
|
38
|
+
end.to_s.chomp
|
24
39
|
end
|
25
40
|
|
26
|
-
|
27
|
-
|
41
|
+
if data.empty?
|
42
|
+
exit 0
|
43
|
+
else
|
44
|
+
secret.extract(data)
|
28
45
|
end
|
29
46
|
end
|
30
47
|
|
31
|
-
def
|
32
|
-
raise Error::Command, code: :
|
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
|
-
|
35
|
-
|
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
|
-
|
10
|
-
|
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
|
-
|
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
|
-
|
27
|
-
|
41
|
+
if data.empty?
|
42
|
+
exit 0
|
43
|
+
else
|
44
|
+
secret.generate(data)
|
28
45
|
end
|
29
46
|
end
|
30
47
|
|
31
|
-
def
|
32
|
-
raise Error::Command, code: :
|
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
|
-
|
35
|
-
|
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
|
data/lib/dapp/kube/dapp/dapp.rb
CHANGED
data/lib/dapp/version.rb
CHANGED
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
|
+
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-
|
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
|