krane 2.1.0 → 2.1.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
  SHA256:
3
- metadata.gz: a3b3d47fb38961012857a5964baadcc19c6e5c147223383430f820af2029cf75
4
- data.tar.gz: 94addb8d8743d249ec0437467c8eb5ccf075b41536a329e781ef80fad48dbad3
3
+ metadata.gz: ae99732594c24143e48be0c4c44fdfec9f3f81e7d604362f8d000df837758aaa
4
+ data.tar.gz: 11684058ac036a9846e5101944c0f26e33216da3d87bde0f20fe13246e52bbb5
5
5
  SHA512:
6
- metadata.gz: 10038a1f57185f4d78fda538aadb71357f1c7d84b77b9a27873062b7bdd82e06e696666ab639384d84e25c010165bdfdd69533860fc50ce564fc419b09fc01a2
7
- data.tar.gz: a12bf652e4503d37fd368f38d6219e48e1755ea688016094849d6558440b6db88aba22aaadfa807ac6e9f1ff1e3ceba171bfbf1cdcd07fe95bf7e2cc553a0e90
6
+ metadata.gz: 36fec016df1d46e0bec3b7889913bbaa20bdb411795bb58b9995a87dde2bd0ed94203b21d229673fa8fe3d663d60981ce0e4d666acc173e7262b67a3671209ac
7
+ data.tar.gz: df91b23d97e65489476c5ddb9f404e07c7a314003d84debd6cb5d59c27328f9a48394876af32a7ccb3976d3bfb296f60cd54af4c4fbdca6c31527ce86c2ad19a
@@ -13,31 +13,3 @@ steps:
13
13
  env:
14
14
  LOGGING_LEVEL: 4
15
15
  KUBERNETES_VERSION: v1.15-latest
16
- - name: 'Run Test Suite (:kubernetes: 1.14-latest)'
17
- command: bin/ci
18
- agents:
19
- queue: k8s-ci
20
- env:
21
- LOGGING_LEVEL: 4
22
- KUBERNETES_VERSION: v1.14-latest
23
- - name: 'Run Test Suite (:kubernetes: 1.13-latest)'
24
- command: bin/ci
25
- agents:
26
- queue: k8s-ci
27
- env:
28
- LOGGING_LEVEL: 4
29
- KUBERNETES_VERSION: v1.13-latest
30
- - name: 'Run Test Suite (:kubernetes: 1.12-latest)'
31
- command: bin/ci
32
- agents:
33
- queue: k8s-ci
34
- env:
35
- LOGGING_LEVEL: 4
36
- KUBERNETES_VERSION: v1.12-latest
37
- - name: 'Run Test Suite (:kubernetes: 1.11-latest)'
38
- command: bin/ci
39
- agents:
40
- queue: k8s-ci
41
- env:
42
- LOGGING_LEVEL: 4
43
- KUBERNETES_VERSION: v1.11-latest
@@ -195,6 +195,7 @@ Style/FrozenStringLiteralComment:
195
195
  SupportedStyles:
196
196
  - always
197
197
  - never
198
+ SafeAutoCorrect: true
198
199
 
199
200
  Style/GlobalVars:
200
201
  AllowedVariables: []
@@ -1,6 +1,6 @@
1
1
  containers:
2
2
  default:
3
- docker: circleci/ruby:2.5.7
3
+ docker: circleci/ruby:2.6.6
4
4
 
5
5
  steps:
6
6
  - label: Lint
@@ -8,61 +8,47 @@ steps:
8
8
  run:
9
9
  - bundle: ~
10
10
  - bundle exec rubocop
11
- - label: 'Run Test Suite (:kubernetes: 1.18-latest :ruby: 2.7)'
11
+ - label: 'Run Test Suite (:kubernetes: 1.20-latest :ruby: 3.0)'
12
12
  command: bin/ci
13
13
  agents:
14
14
  queue: k8s-ci
15
15
  env:
16
16
  LOGGING_LEVEL: "4"
17
- KUBERNETES_VERSION: v1.18-latest
18
- RUBY_VERSION: "2.7"
19
- - label: 'Run Test Suite (:kubernetes: 1.17-latest)'
20
- command: bin/ci
21
- agents:
22
- queue: k8s-ci
23
- env:
24
- LOGGING_LEVEL: "4"
25
- KUBERNETES_VERSION: v1.17-latest
26
- - label: 'Run Test Suite (:kubernetes: 1.16.12)'
27
- command: bin/ci
28
- agents:
29
- queue: k8s-ci
30
- env:
31
- LOGGING_LEVEL: "4"
32
- # Flip this back to v1.16-latest when 1.16.14 comes out (see #733)
33
- KUBERNETES_VERSION: v1.16.12
34
- - label: 'Run Test Suite (:kubernetes: 1.15-latest)'
17
+ KUBERNETES_VERSION: v1.20-latest
18
+ RUBY_VERSION: "3.0"
19
+ - label: 'Run Test Suite (:kubernetes: 1.19-latest :ruby: 2.7)'
35
20
  command: bin/ci
36
21
  agents:
37
22
  queue: k8s-ci
38
23
  env:
39
24
  LOGGING_LEVEL: "4"
40
- KUBERNETES_VERSION: v1.15-latest
41
- - label: 'Run Test Suite (:kubernetes: 1.14-latest)'
25
+ KUBERNETES_VERSION: v1.19-latest
26
+ RUBY_VERSION: "2.7"
27
+ - label: 'Run Test Suite (:kubernetes: 1.18-latest)'
42
28
  command: bin/ci
43
29
  agents:
44
30
  queue: k8s-ci
45
31
  env:
46
32
  LOGGING_LEVEL: "4"
47
- KUBERNETES_VERSION: v1.14-latest
48
- - label: 'Run Test Suite (:kubernetes: 1.13-latest)'
33
+ KUBERNETES_VERSION: v1.18-latest
34
+ - label: 'Run Test Suite (:kubernetes: 1.17-latest)'
49
35
  command: bin/ci
50
36
  agents:
51
37
  queue: k8s-ci
52
38
  env:
53
39
  LOGGING_LEVEL: "4"
54
- KUBERNETES_VERSION: v1.13-latest
55
- - label: 'Run Test Suite (:kubernetes: 1.12-latest)'
40
+ KUBERNETES_VERSION: v1.17-latest
41
+ - label: 'Run Test Suite (:kubernetes: 1.16-latest)'
56
42
  command: bin/ci
57
43
  agents:
58
44
  queue: k8s-ci
59
45
  env:
60
46
  LOGGING_LEVEL: "4"
61
- KUBERNETES_VERSION: v1.12-latest
62
- - label: 'Run Test Suite (:kubernetes: 1.11-latest)'
47
+ KUBERNETES_VERSION: v1.16-latest
48
+ - label: 'Run Test Suite (:kubernetes: 1.15-latest)'
63
49
  command: bin/ci
64
50
  agents:
65
51
  queue: k8s-ci
66
52
  env:
67
53
  LOGGING_LEVEL: "4"
68
- KUBERNETES_VERSION: v1.11-latest
54
+ KUBERNETES_VERSION: v1.15-latest
@@ -1,5 +1,33 @@
1
1
  ## next
2
2
 
3
+ ## 2.1.5
4
+
5
+ - Fix bug where the wrong dry-run flag is used for kubectl if client version is below 1.18 AND server version is 1.18+ [#793](https://github.com/Shopify/krane/pull/793).
6
+
7
+ ## 2.1.4
8
+
9
+ *Enhancements*
10
+ - Attempt to batch run server-side apply in validation phase instead of dry-running each resource individually [#781](https://github.com/Shopify/krane/pull/781).
11
+ - Evaluate progress condition only after progress deadline seconds have passed since deploy invocation [#765](https://github.com/Shopify/krane/pull/765).
12
+
13
+ *Other*
14
+ - Dropped support for Ruby 2.5 due to EoL. [#782](https://github.com/Shopify/krane/pull/782).
15
+ - Only patch JSON when run as CLI, not as library [#779](https://github.com/Shopify/krane/pull/779).
16
+
17
+ ## 2.1.3
18
+
19
+ - Add version exception for ServiceNetworkEndpointGroup (GKE resource) [#768](https://github.com/Shopify/krane/pull/768)
20
+ - Kubernetes 1.14 and lower is no longer officially supported as of this version ([#766](https://github.com/Shopify/krane/pull/766))
21
+
22
+ ## 2.1.2
23
+
24
+ - Add version exception for FrontendConfig (GKE resource) [#761](https://github.com/Shopify/krane/pull/761)
25
+
26
+ ## 2.1.1
27
+
28
+ *Bug Fixes*
29
+ - Fix the way environment variables are passed into the EJSON decryption invocation [#759](https://github.com/Shopify/krane/pull/759)
30
+
3
31
  ## 2.1.0
4
32
 
5
33
  *Features*
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # krane [![Build status](https://badge.buildkite.com/35c56e797c3bbd6ba50053aefdded0715898cd8e8c86f7e462.svg?branch=master)](https://buildkite.com/shopify/krane) [![codecov](https://codecov.io/gh/Shopify/kubernetes-deploy/branch/master/graph/badge.svg)](https://codecov.io/gh/Shopify/kubernetes-deploy)
1
+ # krane [![Build status](https://badge.buildkite.com/35c56e797c3bbd6ba50053aefdded0715898cd8e8c86f7e462.svg?branch=master)](https://buildkite.com/shopify/krane)
2
2
 
3
3
  > This project used to be called `kubernetes-deploy`. Check out our [migration guide](https://github.com/Shopify/krane/blob/master/1.0-Upgrade.md) for more information including details about breaking changes.
4
4
 
@@ -73,8 +73,8 @@ If you need the ability to render dynamic values in templates before deploying,
73
73
 
74
74
  ## Prerequisites
75
75
 
76
- * Ruby 2.5+
77
- * Your cluster must be running Kubernetes v1.11.0 or higher<sup>1</sup>
76
+ * Ruby 2.6+
77
+ * Your cluster must be running Kubernetes v1.15.0 or higher<sup>1</sup>
78
78
 
79
79
  <sup>1</sup> We run integration tests against these Kubernetes versions. You can find our
80
80
  official compatibility chart below.
@@ -90,7 +90,7 @@ official compatibility chart below.
90
90
 
91
91
  ## Installation
92
92
 
93
- 1. [Install kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-binary-via-curl) (requires v1.11.0 or higher) and make sure it is available in your $PATH
93
+ 1. [Install kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-binary-via-curl) (requires v1.15.0 or higher) and make sure it is available in your $PATH
94
94
  2. Set up your [kubeconfig file](https://kubernetes.io/docs/tasks/access-application-cluster/authenticate-across-clusters-kubeconfig/) for access to your cluster(s).
95
95
  3. `gem install krane`
96
96
 
@@ -493,7 +493,7 @@ resource to restart.
493
493
 
494
494
  ## Prerequisites
495
495
 
496
- * You've already deployed a [`PodTemplate`](https://v1-10.docs.kubernetes.io/docs/reference/generated/kubernetes-api/v1.11/#podtemplate-v1-core) object with field `template` containing a `Pod` specification that does not include the `apiVersion` or `kind` parameters. An example is provided in this repo in `test/fixtures/hello-cloud/template-runner.yml`.
496
+ * You've already deployed a [`PodTemplate`](https://v1-15.docs.kubernetes.io/docs/reference/generated/kubernetes-api/v1.15/#podtemplate-v1-core) object with field `template` containing a `Pod` specification that does not include the `apiVersion` or `kind` parameters. An example is provided in this repo in `test/fixtures/hello-cloud/template-runner.yml`.
497
497
  * The `Pod` specification in that template has a container named `task-runner`.
498
498
 
499
499
  Based on this specification `krane run` will create a new pod with the entrypoint of the `task-runner ` container overridden with the supplied arguments.
data/bin/ci CHANGED
@@ -12,10 +12,9 @@ docker run --rm \
12
12
  -v "$PWD":/usr/src/app \
13
13
  -v "/usr/bin/kubectl":"/usr/bin/kubectl" \
14
14
  -e CI=1 \
15
- -e CODECOV_TOKEN=$CODECOV_TOKEN \
16
15
  -e COVERAGE=1 \
17
16
  -e VERBOSE=1 \
18
17
  -e PARALLELISM=$PARALLELISM \
19
18
  -w /usr/src/app \
20
- ruby:"${RUBY_VERSION:-2.5}" \
19
+ ruby:"${RUBY_VERSION:-2.6.6}" \
21
20
  bin/test
data/bin/setup CHANGED
@@ -9,8 +9,8 @@ if [ ! -x "$(which minikube)" ]; then
9
9
  fi
10
10
 
11
11
  if [ ! -x "$(which kubectl)" ]; then
12
- echo -e "\n\033[0;33mPlease install kubectl version 1.11.0 or higher:\nhttps://kubernetes.io/docs/user-guide/prereqs/\033[0m"
12
+ echo -e "\n\033[0;33mPlease install kubectl version 1.15.0 or higher:\nhttps://kubernetes.io/docs/user-guide/prereqs/\033[0m"
13
13
  else
14
14
  KUBECTL_VERSION=$(kubectl version --short --client | grep -oe "v[[:digit:]\.]\+")
15
- echo -e "\n\033[0;32mKubectl version $KUBECTL_VERSION is already installed. This gem requires version v1.11.0 or greater.\033[0m"
15
+ echo -e "\n\033[0;32mKubectl version $KUBECTL_VERSION is already installed. This gem requires version v1.15.0 or greater.\033[0m"
16
16
  fi
data/dev.yml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: krane
3
3
  up:
4
- - ruby: 2.5.7 # Matches gemspec
4
+ - ruby: 2.6.6 # Matches gemspec
5
5
  - bundler
6
6
  - homebrew:
7
7
  - homebrew/cask/minikube
@@ -13,7 +13,7 @@ up:
13
13
  - custom:
14
14
  name: Minikube Cluster
15
15
  met?: test $(minikube status | grep Running | wc -l) -ge 2 && $(minikube status | grep -q 'Configured')
16
- meet: minikube start --kubernetes-version=v1.11.10 --vm-driver=hyperkit
16
+ meet: minikube start --kubernetes-version=v1.15.12 --vm-driver=hyperkit
17
17
  down: minikube stop
18
18
  commands:
19
19
  reset-minikube: minikube delete && rm -rf ~/.minikube
@@ -25,7 +25,7 @@ Gem::Specification.new do |spec|
25
25
 
26
26
  spec.metadata['allowed_push_host'] = "https://rubygems.org"
27
27
 
28
- spec.required_ruby_version = '>= 2.5.0'
28
+ spec.required_ruby_version = '>= 2.6.0'
29
29
  spec.add_dependency("activesupport", ">= 5.0")
30
30
  spec.add_dependency("kubeclient", "~> 4.3")
31
31
  spec.add_dependency("googleauth", "~> 0.8")
@@ -57,5 +57,5 @@ Gem::Specification.new do |spec|
57
57
  spec.add_development_dependency("ruby-prof")
58
58
  spec.add_development_dependency("ruby-prof-flamegraph")
59
59
  spec.add_development_dependency("rubocop", "~> 0.89.1")
60
- spec.add_development_dependency("codecov")
60
+ spec.add_development_dependency("simplecov")
61
61
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
-
3
2
  require 'krane'
3
+ require 'krane/oj'
4
4
  require 'thor'
5
5
  require 'krane/cli/version_command'
6
6
  require 'krane/cli/restart_command'
@@ -23,9 +23,7 @@ module Krane
23
23
  fetch_resources(namespaced: namespaced).uniq { |r| r['kind'] }.map do |resource|
24
24
  next unless resource['verbs'].one? { |v| v == "delete" }
25
25
  next if black_list.include?(resource['kind'])
26
- group_versions = api_versions[resource['apigroup'].to_s]
27
- version = version_for_kind(group_versions, resource['kind'])
28
- [resource['apigroup'], version, resource['kind']].compact.join("/")
26
+ gvk_string(api_versions, resource)
29
27
  end.compact
30
28
  end
31
29
 
@@ -89,7 +87,10 @@ module Krane
89
87
  version_override = { "CronJob" => "v1beta1", "VolumeAttachment" => "v1beta1",
90
88
  "CSIDriver" => "v1beta1", "Ingress" => "v1beta1",
91
89
  "CSINode" => "v1beta1", "Job" => "v1",
92
- "IngressClass" => "v1beta1" }
90
+ "IngressClass" => "v1beta1", "FrontendConfig" => "v1beta1",
91
+ "ServiceNetworkEndpointGroup" => "v1beta1",
92
+ "EnvoyFilter" => "v1alpha3",
93
+ "TCPIngress" => "v1beta1" }
93
94
 
94
95
  pattern = /v(?<major>\d+)(?<pre>alpha|beta)?(?<minor>\d+)?/
95
96
  latest = versions.sort_by do |version|
@@ -100,6 +101,23 @@ module Krane
100
101
  version_override.fetch(kind, latest)
101
102
  end
102
103
 
104
+ def gvk_string(api_versions, resource)
105
+ apiversion = resource['apiversion'].to_s
106
+
107
+ ## In kubectl 1.20 APIGroups was replaced by APIVersions
108
+ if apiversion.empty?
109
+ apigroup = resource['apigroup'].to_s
110
+ group_versions = api_versions[apigroup]
111
+
112
+ version = version_for_kind(group_versions, resource['kind'])
113
+ apigroup = 'core' if apigroup.empty?
114
+ apiversion = "#{apigroup}/#{version}"
115
+ end
116
+
117
+ apiversion = "core/#{apiversion}" unless apiversion.include?("/")
118
+ [apiversion, resource['kind']].compact.join("/")
119
+ end
120
+
103
121
  def fetch_crds
104
122
  raw_json, err, st = kubectl.run("get", "CustomResourceDefinition", output: "json", attempts: 5,
105
123
  use_namespace: false)
@@ -11,7 +11,6 @@ require 'active_support/core_ext/array/conversions'
11
11
  require 'colorized_string'
12
12
 
13
13
  require 'krane/version'
14
- require 'krane/oj'
15
14
  require 'krane/errors'
16
15
  require 'krane/formatted_logger'
17
16
  require 'krane/statsd'
@@ -19,5 +18,5 @@ require 'krane/task_config'
19
18
  require 'krane/task_config_validator'
20
19
 
21
20
  module Krane
22
- MIN_KUBE_VERSION = '1.11.0'
21
+ MIN_KUBE_VERSION = '1.15.0'
23
22
  end
@@ -279,13 +279,17 @@ module Krane
279
279
 
280
280
  def validate_resources(resources)
281
281
  validate_globals(resources)
282
+ batch_dry_run_success = kubectl.server_dry_run_enabled? && validate_dry_run(resources)
282
283
  Krane::Concurrency.split_across_threads(resources) do |r|
283
- r.validate_definition(kubectl, selector: @selector)
284
+ # No need to pass in kubectl (and do per-resource dry run apply) if batch dry run succeeded
285
+ if batch_dry_run_success
286
+ r.validate_definition(kubectl: nil, selector: @selector, dry_run: false)
287
+ else
288
+ r.validate_definition(kubectl: kubectl, selector: @selector, dry_run: true)
289
+ end
284
290
  end
285
-
286
291
  failed_resources = resources.select(&:validation_failed?)
287
292
  if failed_resources.present?
288
-
289
293
  failed_resources.each do |r|
290
294
  content = File.read(r.file_path) if File.file?(r.file_path) && !r.sensitive_template_content?
291
295
  record_invalid_template(logger: @logger, err: r.validation_error_msg,
@@ -308,6 +312,10 @@ module Krane
308
312
  "Use GlobalDeployTask instead."
309
313
  end
310
314
 
315
+ def validate_dry_run(resources)
316
+ resource_deployer.dry_run(resources)
317
+ end
318
+
311
319
  def namespace_definition
312
320
  @namespace_definition ||= begin
313
321
  definition, _err, st = kubectl.run("get", "namespace", @namespace, use_namespace: false,
@@ -53,7 +53,7 @@ module Krane
53
53
  secrets.map do |secret_name, secret_spec|
54
54
  validate_secret_spec(secret_name, secret_spec)
55
55
  resource = generate_secret_resource(secret_name, secret_spec["_type"], secret_spec["data"])
56
- resource.validate_definition(@kubectl)
56
+ resource.validate_definition(kubectl: @kubectl)
57
57
  if resource.validation_failed?
58
58
  raise EjsonSecretError, "Resulting resource Secret/#{secret_name} failed validation"
59
59
  end
@@ -133,7 +133,7 @@ module Krane
133
133
  end
134
134
 
135
135
  def decrypt_ejson(key_dir)
136
- out, err, st = Open3.capture3("EJSON_KEYDIR=#{key_dir} ejson decrypt #{@ejson_file}")
136
+ out, err, st = Open3.capture3({ 'EJSON_KEYDIR' => key_dir.to_s }, 'ejson', 'decrypt', @ejson_file.to_s)
137
137
  unless st.success?
138
138
  # older ejson versions dump some errors to STDOUT
139
139
  msg = err.presence || out
@@ -131,7 +131,7 @@ module Krane
131
131
  validate_globals(resources)
132
132
 
133
133
  Concurrency.split_across_threads(resources) do |r|
134
- r.validate_definition(@kubectl, selector: @selector)
134
+ r.validate_definition(kubectl: @kubectl, selector: @selector)
135
135
  end
136
136
 
137
137
  failed_resources = resources.select(&:validation_failed?)
@@ -100,6 +100,14 @@ module Krane
100
100
  server_version >= Gem::Version.new(SERVER_DRY_RUN_MIN_VERSION)
101
101
  end
102
102
 
103
+ def dry_run_flag
104
+ if client_version >= Gem::Version.new("1.18")
105
+ "--dry-run=server"
106
+ else
107
+ "--server-dry-run"
108
+ end
109
+ end
110
+
103
111
  private
104
112
 
105
113
  def build_command_from_options(args, use_namespace, use_context, output)
@@ -134,12 +134,12 @@ module Krane
134
134
  Kubeclient::Resource.new(@definition)
135
135
  end
136
136
 
137
- def validate_definition(kubectl, selector: nil)
137
+ def validate_definition(kubectl:, selector: nil, dry_run: true)
138
138
  @validation_errors = []
139
139
  validate_selector(selector) if selector
140
140
  validate_timeout_annotation
141
141
  validate_deploy_method_override_annotation
142
- validate_spec_with_kubectl(kubectl)
142
+ validate_spec_with_kubectl(kubectl) if dry_run
143
143
  @validation_errors.present?
144
144
  end
145
145
 
@@ -560,7 +560,12 @@ module Krane
560
560
 
561
561
  # Server side dry run is only supported on apply
562
562
  def validate_with_server_side_dry_run(kubectl)
563
- command = ["apply", "-f", file_path, "--server-dry-run", "--output=name"]
563
+ command = if kubectl.client_version >= Gem::Version.new('1.18')
564
+ ["apply", "-f", file_path, "--dry-run=server", "--output=name"]
565
+ else
566
+ ["apply", "-f", file_path, "--server-dry-run", "--output=name"]
567
+ end
568
+
564
569
  kubectl.run(*command, log_failure: false, output_is_sensitive: sensitive_template_content?,
565
570
  retry_whitelist: [:client_timeout, :empty, :context_deadline], attempts: 3)
566
571
  end
@@ -155,6 +155,8 @@ module Krane
155
155
 
156
156
  def deploy_failing_to_progress?
157
157
  return false unless progress_condition.present?
158
+ # Ensure at least progress_deadline wall clock time has passed before before examining progress_condition
159
+ return false if deploy_started? && Time.now.utc - @deploy_started_at < progress_deadline
158
160
 
159
161
  # This assumes that when the controller bumps the observed generation, it also updates/clears all the status
160
162
  # conditions. Specifically, it assumes the progress condition is immediately set to True if a rollout is starting.
@@ -20,6 +20,13 @@ module Krane
20
20
  @statsd_tags = statsd_tags
21
21
  end
22
22
 
23
+ def dry_run(resources)
24
+ apply_all(resources, true, dry_run: true)
25
+ true
26
+ rescue FatalDeploymentError
27
+ false
28
+ end
29
+
23
30
  def deploy!(resources, verify_result, prune)
24
31
  if verify_result
25
32
  deploy_all_resources(resources, prune: prune, verify: true)
@@ -128,17 +135,17 @@ module Krane
128
135
  end
129
136
  end
130
137
 
131
- def apply_all(resources, prune)
138
+ def apply_all(resources, prune, dry_run: false)
132
139
  return unless resources.present?
133
- command = %w(apply)
140
+ start = Time.now.utc
134
141
 
142
+ command = %w(apply)
135
143
  Dir.mktmpdir do |tmp_dir|
136
144
  resources.each do |r|
137
145
  FileUtils.symlink(r.file_path, tmp_dir)
138
- r.deploy_started_at = Time.now.utc
146
+ r.deploy_started_at = Time.now.utc unless dry_run
139
147
  end
140
148
  command.push("-f", tmp_dir)
141
-
142
149
  if prune && @prune_whitelist.present?
143
150
  command.push("--prune")
144
151
  if @selector
@@ -149,20 +156,22 @@ module Krane
149
156
  @prune_whitelist.each { |type| command.push("--prune-whitelist=#{type}") }
150
157
  end
151
158
 
159
+ command.push(kubectl.dry_run_flag) if dry_run
152
160
  output_is_sensitive = resources.any?(&:sensitive_template_content?)
153
161
  global_mode = resources.all?(&:global?)
154
162
  out, err, st = kubectl.run(*command, log_failure: false, output_is_sensitive: output_is_sensitive,
155
163
  attempts: 2, use_namespace: !global_mode)
156
164
 
165
+ tags = statsd_tags + (dry_run ? ['dry_run:true'] : ['dry_run:false'])
166
+ Krane::StatsD.client.distribution('apply_all.duration', Krane::StatsD.duration(start), tags: tags)
157
167
  if st.success?
158
168
  log_pruning(out) if prune
159
169
  else
160
- record_apply_failure(err, resources: resources)
170
+ record_apply_failure(err, resources: resources) unless dry_run
161
171
  raise FatalDeploymentError, "Command failed: #{Shellwords.join(command)}"
162
172
  end
163
173
  end
164
174
  end
165
- measure_method(:apply_all)
166
175
 
167
176
  def log_pruning(kubectl_output)
168
177
  pruned = kubectl_output.scan(/^(.*) pruned$/)
@@ -118,7 +118,7 @@ module Krane
118
118
  end
119
119
 
120
120
  def validate_pod(pod)
121
- pod.validate_definition(kubectl)
121
+ pod.validate_definition(kubectl: kubectl)
122
122
  end
123
123
 
124
124
  def watch_pod(pod)
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Krane
3
- VERSION = "2.1.0"
3
+ VERSION = "2.1.5"
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: krane
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Katrina Verey
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2020-10-06 00:00:00.000000000 Z
13
+ date: 2021-01-27 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
@@ -375,7 +375,7 @@ dependencies:
375
375
  - !ruby/object:Gem::Version
376
376
  version: 0.89.1
377
377
  - !ruby/object:Gem::Dependency
378
- name: codecov
378
+ name: simplecov
379
379
  requirement: !ruby/object:Gem::Requirement
380
380
  requirements:
381
381
  - - ">="
@@ -511,7 +511,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
511
511
  requirements:
512
512
  - - ">="
513
513
  - !ruby/object:Gem::Version
514
- version: 2.5.0
514
+ version: 2.6.0
515
515
  required_rubygems_version: !ruby/object:Gem::Requirement
516
516
  requirements:
517
517
  - - ">="