dapp 0.13.0 → 0.13.1

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: fc7114fd303ed284e6a00e4e35047b43577d346d
4
- data.tar.gz: 4a5e24ab8bcbf23b781a97988be0a975188d75db
3
+ metadata.gz: ed07e4ba41f680a79acc2f27a826dec12bf5ba77
4
+ data.tar.gz: 981b7d0951b7361e9b20ab6469e7d797cabf0de3
5
5
  SHA512:
6
- metadata.gz: 6581f92f31676b7e98707f2774ca3afed77ba3420cb8ebb5617d40c11a203077f5750c71607d7767e5c94d3b9551ee5413b2ad8a540bc2a71de670b7e9fd9cf4
7
- data.tar.gz: bb0284c586d5d24679a55e97c4eeb23e2bf23a847ad5365f595876bca37ecf85ea9e959a79668fbc95fd1ed2f6345645a834a71d0dcc2e4cf277158127fae7f1
6
+ metadata.gz: 058341b114a2978ca617951f957500227ae76ef4f074c23f6a68e3c9845880ff9778dc435fdd7256fa0b8ba18893bc41748179573498f111869ffe9de8cb3517
7
+ data.tar.gz: 2251d7ce20c67b6103821aa808da48fde2de2d8a850591155a4eff6bf19288f27bc39636f218d4a096a556b9dd33befd22c75239dbf79997dffffc20c6946507
@@ -112,4 +112,4 @@ en:
112
112
  bootstrap_image_not_found: "Bootstrap failed because `%{reason}`: `%{message}`"
113
113
  kubernetes:
114
114
  kube_config_not_found: "Kube config `%{path}` not found!"
115
- kube_server_connection_refused: "Kube server `%{url}` connection refused!"
115
+ kube_server_connection_refused: "Kube server `%{url}` connection refused: %{error}"
@@ -99,7 +99,8 @@ require 'dapp/deployment/dapp/dappfile'
99
99
  require 'dapp/deployment/dapp/dapp'
100
100
  require 'dapp/deployment/secret'
101
101
  require 'dapp/kube'
102
- require 'dapp/kube/kubernetes'
102
+ require 'dapp/kube/client'
103
+ require 'dapp/kube/client/error'
103
104
  require 'dapp/kube/cli/command/base'
104
105
  require 'dapp/kube/cli/command/kube'
105
106
  require 'dapp/kube/cli/command/kube/deploy'
@@ -10,7 +10,7 @@ Options:
10
10
  BANNER
11
11
  option :namespace,
12
12
  long: '--namespace NAME',
13
- required: true
13
+ default: nil
14
14
 
15
15
  option :image_version,
16
16
  long: '--image-version IMAGE_VERSION',
@@ -20,10 +20,15 @@ BANNER
20
20
  long: '--tmp-dir-prefix PREFIX',
21
21
  description: 'Tmp directory prefix (/tmp by default). Used for build process service directories.'
22
22
 
23
+ option :helm_set_options,
24
+ long: '--set STRING_ARRAY',
25
+ default: [],
26
+ proc: proc { |v| composite_options(:helm_set) << v }
27
+
23
28
  def run(argv = ARGV)
24
29
  self.class.parse_options(self, argv)
25
30
  repo = self.class.required_argument(self, 'repo')
26
- ::Dapp::Dapp.new(options: cli_options(apps_patterns: cli_arguments, repo: repo)).public_send(run_method)
31
+ ::Dapp::Dapp.new(options: cli_options(repo: repo)).public_send(run_method)
27
32
  end
28
33
  end
29
34
  end
@@ -11,7 +11,7 @@ BANNER
11
11
 
12
12
  option :namespace,
13
13
  long: '--namespace NAME',
14
- required: true
14
+ default: nil
15
15
 
16
16
  option :with_namespace,
17
17
  long: '--with-namespace',
@@ -10,7 +10,7 @@ Options:
10
10
  BANNER
11
11
 
12
12
  option :output_file_path,
13
- short: '-o OUTPUt_FILE_PATH',
13
+ short: '-o OUTPUT_FILE_PATH',
14
14
  required: false
15
15
 
16
16
  def run(argv = ARGV)
@@ -1,13 +1,13 @@
1
1
  module Dapp
2
2
  module Kube
3
- class Kubernetes
3
+ class Client
4
4
  def initialize(namespace: nil)
5
5
  @namespace = namespace
6
6
  @query_parameters = {}
7
7
  end
8
8
 
9
9
  def namespace
10
- @namespace || 'default'
10
+ @namespace || kube_context_config['context']['namespace']
11
11
  end
12
12
 
13
13
  # Чтобы не перегружать методы явной передачей namespace.
@@ -147,34 +147,84 @@ module Dapp
147
147
 
148
148
  def with_connection(excon_parameters: {}, &blk)
149
149
  old_ssl_ca_file = Excon.defaults[:ssl_ca_file]
150
+ old_ssl_cert_store = Excon.defaults[:ssl_cert_store]
150
151
  old_middlewares = Excon.defaults[:middlewares].dup
151
152
 
152
153
  begin
153
- Excon.defaults[:ssl_ca_file] = kube_config.fetch('clusters', [{}]).first.fetch('cluster', {}).fetch('certificate-authority', nil)
154
+ ssl_cert_store = OpenSSL::X509::Store.new
155
+ if ssl_ca_file = kube_config.fetch('clusters', [{}]).first.fetch('cluster', {}).fetch('certificate-authority', nil)
156
+ ssl_cert_store.add_file ssl_ca_file
157
+ elsif ssl_ca_data = kube_config.fetch('clusters', [{}]).first.fetch('cluster', {}).fetch('certificate-authority-data', nil)
158
+ ssl_cert_store.add_cert OpenSSL::X509::Certificate.new(Base64.decode64(ssl_ca_data))
159
+ end
160
+
161
+ Excon.defaults[:ssl_ca_file] = nil
162
+ Excon.defaults[:ssl_cert_store] = ssl_cert_store
154
163
  Excon.defaults[:middlewares] << Excon::Middleware::RedirectFollower
155
164
 
156
- return yield Excon.new(kube_server_url, **kube_server_options(excon_parameters))
165
+ connection = begin
166
+ Excon.new(kube_cluster_config['cluster']['server'], **kube_server_options(excon_parameters)).tap(&:get)
167
+ rescue Excon::Error::Socket => err
168
+ raise Error::ConnectionRefused,
169
+ code: :kube_server_connection_refused,
170
+ data: { kube_cluster_config: kube_cluster_config, kube_user_config: kube_user_config, error: err.message }
171
+ end
172
+
173
+ return yield connection
157
174
  ensure
158
175
  Excon.defaults[:ssl_ca_file] = old_ssl_ca_file
176
+ Excon.defaults[:ssl_cert_store] = old_ssl_cert_store
159
177
  Excon.defaults[:middlewares] = old_middlewares
160
178
  end
161
179
  end
162
180
 
163
- def kube_server_url
164
- @kube_server_url ||= begin
165
- kube_config.fetch('clusters', [{}]).first.fetch('cluster', {}).fetch('server', nil).tap do |url|
166
- begin
167
- Excon.new(url, **kube_server_options).get
168
- rescue Excon::Error::Socket
169
- raise Error::ConnectionRefused, code: :kube_server_connection_refused, data: { url: url }
170
- end
181
+ def kube_server_options(excon_parameters = {})
182
+ {}.tap do |opts|
183
+ client_cert = kube_config.fetch('users', [{}]).first.fetch('user', {}).fetch('client-certificate', nil)
184
+ opts[:client_cert] = client_cert if client_cert
185
+
186
+ client_cert_data = kube_config.fetch('users', [{}]).first.fetch('user', {}).fetch('client-certificate-data', nil)
187
+ opts[:client_cert_data] = Base64.decode64(client_cert_data) if client_cert_data
188
+
189
+ client_key = kube_config.fetch('users', [{}]).first.fetch('user', {}).fetch('client-key', nil)
190
+ opts[:client_key] = client_key if client_key
191
+
192
+ client_key_data = kube_config.fetch('users', [{}]).first.fetch('user', {}).fetch('client-key-data', nil)
193
+ opts[:client_key_data] = Base64.decode64(client_key_data) if client_key_data
194
+ end
195
+ end
196
+
197
+ def kube_user_config
198
+ @kube_user_config ||= begin
199
+ kube_config.fetch('users', []).find {|user| user['name'] == kube_context_config['context']['user']} || begin
200
+ raise Error::BadConfig, code: :kube_user_not_found, data: {context: kube_context_config}
171
201
  end
172
202
  end
173
203
  end
174
204
 
175
- def kube_server_options(excon_parameters = {})
176
- { client_cert: kube_config.fetch('users', [{}]).first.fetch('user', {}).fetch('client-certificate', nil),
177
- client_key: kube_config.fetch('users', [{}]).first.fetch('user', {}).fetch('client-key', nil) }.merge(excon_parameters)
205
+ def kube_cluster_config
206
+ @kube_cluster_config ||= begin
207
+ kube_config.fetch('clusters', []).find {|cluster| cluster['name'] == kube_context_config['context']['cluster']} || begin
208
+ raise Error::BadConfig, code: :kube_cluster_not_found, data: {context: kube_context_config}
209
+ end
210
+ end
211
+ end
212
+
213
+ def kube_context_config
214
+ @kube_context_config ||= begin
215
+ kube_config.fetch('contexts', []).find {|context| context['name'] == kube_context_name} || begin
216
+ raise Error::BadConfig, code: :kube_context_not_found, data: {context_name: kube_context_name}
217
+ end
218
+ end
219
+ end
220
+
221
+ def kube_context_name
222
+ @kube_context_name ||= kube_config['current-context'] || begin
223
+ if context = kube_config.fetch('contexts', []).first
224
+ warn "[WARN] .kube/config current-context is not set, using context '#{context['name']}'"
225
+ context['name']
226
+ end
227
+ end
178
228
  end
179
229
 
180
230
  def kube_config
@@ -0,0 +1,21 @@
1
+ module Dapp
2
+ module Kube
3
+ module Client::Error
4
+ class Base < ::Dapp::Deployment::Error::Kubernetes
5
+ def initialize(**net_status)
6
+ super(**net_status, context: :kubernetes)
7
+ end
8
+ end
9
+
10
+ class NotFound < Base
11
+ def initialize(**net_status)
12
+ super({code: :not_found}.merge(net_status))
13
+ end
14
+ end
15
+
16
+ class Timeout < Base; end
17
+ class ConnectionRefused < Base; end
18
+ class BadConfig < Base; end
19
+ end
20
+ end
21
+ end
@@ -20,7 +20,7 @@ module Dapp
20
20
  end
21
21
 
22
22
  def kubernetes
23
- @kubernetes ||= Kubernetes.new(namespace: kube_namespace)
23
+ @kubernetes ||= Client.new(namespace: kube_namespace)
24
24
  end
25
25
  end
26
26
  end
@@ -27,7 +27,7 @@ module Dapp
27
27
  options << "--set global.dapp.repo=#{repo}"
28
28
  options << "--set global.dapp.image_version=#{image_version}"
29
29
  options << "--set global.namespace=#{kube_namespace}"
30
- options << "--set global.env=#{kube_namespace}"
30
+ options.concat(self.options[:helm_set_options].map { |opt| "--set #{opt}" })
31
31
  end
32
32
 
33
33
  kube_flush_hooks_jobs(additional_values, set_options)
@@ -86,19 +86,25 @@ module Dapp
86
86
  cont = <<-EOF
87
87
  {{/* vim: set filetype=mustache: */}}
88
88
 
89
+ {{- define "dimg" -}}
90
+ {{- $name := index . 0 -}}
91
+ {{- $context := index . 1 -}}
92
+ {{- printf "%s:%s-%s" $context.Values.global.dapp.repo $name $context.Values.global.dapp.image_version -}}
93
+ {{- end -}}
94
+
89
95
  {{- define "dapp_secret_file" -}}
90
96
  {{- $relative_file_path := index . 0 -}}
91
97
  {{- $context := index . 1 -}}
92
98
  {{- $context.Files.Get (print "#{secret_directory}/" $relative_file_path) -}}
93
99
  {{- end -}}
94
100
  EOF
95
- kube_tmp_chart_path('templates/dapp_secret_file.tpl').write(cont)
101
+ kube_tmp_chart_path('templates/_dapp_helpers.tpl').write(cont)
96
102
  end
97
103
 
98
104
  def kube_flush_hooks_jobs(additional_values, set_options)
99
105
  return if (config_jobs_names = kube_helm_hooks_jobs_to_delete(additional_values, set_options).keys).empty?
100
- kube_job_list.reject { |name| config_jobs_names.include? name }.each do
101
- log_process("Delete hooks job `#{job_name}` for release #{kube_release_name} ", short: true) { kube_delete_job!(name) }
106
+ config_jobs_names.select { |name| kube_job_list.include? name }.each do |name|
107
+ log_process("Delete hooks job `#{name}` for release #{kube_release_name} ", short: true) { kube_delete_job!(name) }
102
108
  end
103
109
  end
104
110
 
@@ -1,4 +1,4 @@
1
1
  module Dapp
2
- VERSION = '0.13.0'.freeze
2
+ VERSION = '0.13.1'.freeze
3
3
  BUILD_CACHE_VERSION = 13
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.0
4
+ version: 0.13.1
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-05-30 00:00:00.000000000 Z
11
+ date: 2017-05-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mixlib-shellout
@@ -625,6 +625,8 @@ files:
625
625
  - lib/dapp/kube/cli/command/kube/secret_file_encrypt.rb
626
626
  - lib/dapp/kube/cli/command/kube/secret_generate.rb
627
627
  - lib/dapp/kube/cli/command/kube/secret_key_generate.rb
628
+ - lib/dapp/kube/client.rb
629
+ - lib/dapp/kube/client/error.rb
628
630
  - lib/dapp/kube/dapp/command/common.rb
629
631
  - lib/dapp/kube/dapp/command/deploy.rb
630
632
  - lib/dapp/kube/dapp/command/dismiss.rb
@@ -634,7 +636,6 @@ files:
634
636
  - lib/dapp/kube/dapp/dapp.rb
635
637
  - lib/dapp/kube/error/base.rb
636
638
  - lib/dapp/kube/error/command.rb
637
- - lib/dapp/kube/kubernetes.rb
638
639
  - lib/dapp/kube/secret.rb
639
640
  - lib/dapp/prctl.rb
640
641
  - lib/dapp/version.rb