krane 2.3.5 → 2.4.1

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
  SHA256:
3
- metadata.gz: 87de5ec387037d29595e3de534aa73e5aa492769c58dbfda3788d8b70fe76097
4
- data.tar.gz: 3fbf5ea0bb33034f6ef4fad075628c144bbf6cffc73e8969617330c9d6705d95
3
+ metadata.gz: 93f7d9e842d616ea60e2c509f5e5a3fcb54d24375d426efd0345ba3a07dd2008
4
+ data.tar.gz: 24ccdd3165654319b55632a866f85839268644cb32ee719f55f03de6e5f63eb6
5
5
  SHA512:
6
- metadata.gz: f24f15dc5733820c518c6636ddd2150c266166f836d366db72460e2a94dca3d81e52ea7e2ea2e143871bc2279f469ca1263cbb1993bad4c2ce972f3f57559c41
7
- data.tar.gz: 0a49d8ea6a69b228991be2756ebbf93e2aa2c1b2f043aebb2f9a6b697b06c7eeb4ff5eab1ddfd3b40359e35e7ef5e73e8a6e8d9d8659c862bde0abbc8a218ee4
6
+ metadata.gz: 1c90430d28fe8513dd86aef6d160e04257beb66f294b998d780c66b27d8bdb7e5320947b06894399c49bcb336795f72a338fb197f3be4626467bfb286bbde2f0
7
+ data.tar.gz: 98fc07319ed605978d558777cea947a187bf3857d229b95945096d446fdbacd2637102e34a9e03afb9f5472105ce39d5d396f9c1cf8bc6f4c0677f28e6b88e9b
@@ -11,24 +11,23 @@ jobs:
11
11
  fail-fast: false
12
12
  matrix:
13
13
  ruby:
14
- - '3.0' # With k8s 1.23
15
- - '3.0' # With k8s 1.22
16
- - '3.0' # With k8s 1.21
14
+ # Use unique Ruby versions, or GitHub gets confused when building the rest of the matrix
15
+ - '3.0.3' # With k8s 1.23
16
+ - '3.0.2' # With k8s 1.22
17
+ - '3.0.1' # With k8s 1.21
17
18
  - '3.0' # With k8s 1.20
18
19
  - '2.7' # With k8s 1.19
19
- - '2.6.6' # With k8s 1.18
20
- - '2.6.6' # With k8s 1.17
21
20
  include:
22
21
  # Match kind images with chosen version https://github.com/kubernetes-sigs/kind/releases
23
- - ruby: '3.0'
22
+ - ruby: '3.0.3'
24
23
  kind_version: 'v0.11.1'
25
24
  kubernetes_version: '1.23.0'
26
25
  kind_image: 'kindest/node:v1.23.0@sha256:49824ab1727c04e56a21a5d8372a402fcd32ea51ac96a2706a12af38934f81ac'
27
- - ruby: '3.0'
26
+ - ruby: '3.0.2'
28
27
  kind_version: 'v0.11.1'
29
28
  kubernetes_version: '1.22.0'
30
29
  kind_image: 'kindest/node:v1.22.0@sha256:b8bda84bb3a190e6e028b1760d277454a72267a5454b57db34437c34a588d047'
31
- - ruby: '3.0'
30
+ - ruby: '3.0.1'
32
31
  kind_version: 'v0.11.1'
33
32
  kubernetes_version: '1.21.1'
34
33
  kind_image: 'kindest/node:v1.21.1@sha256:69860bda5563ac81e3c0057d654b5253219618a22ec3a346306239bba8cfa1a6'
@@ -40,14 +39,6 @@ jobs:
40
39
  kind_version: 'v0.11.1'
41
40
  kubernetes_version: '1.19.11'
42
41
  kind_image: 'kindest/node:v1.19.11@sha256:07db187ae84b4b7de440a73886f008cf903fcf5764ba8106a9fd5243d6f32729'
43
- - ruby: '2.6.6'
44
- kind_version: 'v0.11.1'
45
- kubernetes_version: '1.18.19'
46
- kind_image: '1.18: kindest/node:v1.18.19@sha256:7af1492e19b3192a79f606e43c35fb741e520d195f96399284515f077b3b622c'
47
- - ruby: '2.6.6'
48
- kind_version: 'v0.11.1'
49
- kubernetes_version: '1.17.17'
50
- kind_image: 'kindest/node:v1.17.17@sha256:66f1d0d91a88b8a001811e2f1054af60eef3b669a9a74f9b6db871f2f1eeed00'
51
42
 
52
43
  steps:
53
44
  - uses: actions/checkout@v2
data/CHANGELOG.md CHANGED
@@ -1,5 +1,34 @@
1
1
  ## next
2
2
 
3
+ ## 2.4.1
4
+
5
+ *Enhancements*
6
+
7
+ - Support restart task for stateful sets that use the `OnDelete` strategy [#840](https://github.com/Shopify/krane/pull/840)
8
+ - Make `krane render` produce output in a deterministic order [#871](https://github.com/Shopify/krane/pull/871)
9
+
10
+ *Other*
11
+
12
+ - Remove buildkite [#869](https://github.com/Shopify/krane/pull/869)
13
+
14
+ ## 2.4.0
15
+
16
+ *Enhancements*
17
+
18
+ - Ensure deploy tasks fail without at least one non-empty resource [#865](https://github.com/Shopify/krane/issues/865)
19
+
20
+ *Other*
21
+
22
+ - Remove Ruby 2.6 and K8s < 1.19 from the CI testing matrix. All fixtures have been updated to be compatible with K8s 1.22+.
23
+
24
+ ## 2.3.7
25
+
26
+ - isolated_execution_state active_support require for Rails 7+
27
+
28
+ ## 2.3.6
29
+
30
+ - Update kubeclient for better Ruby 3.1 compatibility.
31
+
3
32
  ## 2.3.5
4
33
 
5
34
  - Psych 4 compatibility
data/README.md CHANGED
@@ -73,24 +73,24 @@ If you need the ability to render dynamic values in templates before deploying,
73
73
 
74
74
  ## Prerequisites
75
75
 
76
- * Ruby 2.6+
77
- * Your cluster must be running Kubernetes v1.15.0 or higher<sup>1</sup>
76
+ * Ruby 2.7+
77
+ * Your cluster must be running Kubernetes v1.19.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.
81
81
 
82
- | Kubernetes version | Last officially supported in gem version |
83
- | :----------------: | :-------------------: |
84
- | 1.5 | 0.11.2 |
85
- | 1.6 | 0.15.2 |
86
- | 1.7 | 0.20.6 |
87
- | 1.8 | 0.21.1 |
88
- | 1.9 | 0.24.0 |
89
- | 1.10 | 0.27.0 |
82
+ | Kubernetes version | Currently Tested? | Last officially supported in gem version |
83
+ |:------------------:|-------------------|:----------------------------------------:|
84
+ | 1.18 | No | 2.3.7 |
85
+ | 1.19 | Yes | -- |
86
+ | 1.20 | Yes | -- |
87
+ | 1.21 | Yes | -- |
88
+ | 1.22 | Yes | -- |
89
+ | 1.23 | Yes | -- |
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.15.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.19.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
 
data/dev.yml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: krane
3
3
  up:
4
- - ruby: 2.6.6 # Matches gemspec
4
+ - ruby: '3.0.3' # Matches gemspec
5
5
  - bundler
6
6
  - custom:
7
7
  name: Install Kubernetes in Docker (KinD)
@@ -13,7 +13,7 @@ up:
13
13
  - custom:
14
14
  name: Create KinD Cluster
15
15
  met?: bin/kind get clusters | grep -q krane
16
- meet: bin/kind create cluster --name krane
16
+ meet: bin/kind create cluster --name krane --image "kindest/node:v1.22.0@sha256:b8bda84bb3a190e6e028b1760d277454a72267a5454b57db34437c34a588d047"
17
17
  down: |
18
18
  ((bin/kind get clusters | grep -q krane) && bin/kind delete cluster --name krane) || true
19
19
  commands:
data/krane.gemspec CHANGED
@@ -27,14 +27,14 @@ Gem::Specification.new do |spec|
27
27
 
28
28
  spec.required_ruby_version = '>= 2.6.0'
29
29
  spec.add_dependency("activesupport", ">= 5.0")
30
- spec.add_dependency("kubeclient", "~> 4.3")
30
+ spec.add_dependency("kubeclient", "~> 4.9")
31
31
  spec.add_dependency("googleauth", "~> 0.8")
32
32
  spec.add_dependency("ejson", "~> 1.0")
33
33
  spec.add_dependency("colorize", "~> 0.8")
34
34
  spec.add_dependency("statsd-instrument", ['>= 2.8', "< 4"])
35
35
  spec.add_dependency("oj", "~> 3.0")
36
36
  spec.add_dependency("concurrent-ruby", "~> 1.1")
37
- spec.add_dependency("jsonpath", "~> 0.9.6")
37
+ spec.add_dependency("jsonpath", "~> 1.0")
38
38
  spec.add_dependency("thor", ">= 1.0", "< 2.0")
39
39
 
40
40
  # Basics
data/lib/krane/common.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'active_support'
4
+ require 'active_support/isolated_execution_state' if ActiveSupport::VERSION::MAJOR > 6
4
5
  require 'active_support/core_ext/object/blank'
5
6
  require 'active_support/core_ext/hash/reverse_merge'
6
7
  require 'active_support/core_ext/hash/slice'
@@ -254,6 +254,10 @@ module Krane
254
254
 
255
255
  StatsD.client.gauge('discover_resources.count', resources.size, tags: statsd_tags)
256
256
 
257
+ if resources.empty?
258
+ raise FatalDeploymentError, "No deployable resources were found!"
259
+ end
260
+
257
261
  resources.sort
258
262
  rescue InvalidTemplateError => e
259
263
  record_invalid_template(logger: @logger, err: e.message, filename: e.filename,
@@ -37,7 +37,10 @@ module Krane
37
37
 
38
38
  def group_version_kind
39
39
  group = @definition.dig("spec", "group")
40
- version = @definition.dig("spec", "version")
40
+ # Since 1.22: spec.version is removed in v1; use spec.versions instead.
41
+ # New spec here: https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/#create-a-customresourcedefinition
42
+ # This is only used in testing, so we will simply take the first version we see:
43
+ version = @definition.dig("spec", "versions", 0, "name")
41
44
  "#{group}/#{version}/#{kind}"
42
45
  end
43
46
 
@@ -48,6 +48,7 @@ module Krane
48
48
  end
49
49
 
50
50
  def has_side_effects?
51
+ # Note: After K8s 1.22, this should ALWAYS be false.
51
52
  !%w(None NoneOnDryRun).include?(side_effects)
52
53
  end
53
54
 
@@ -27,13 +27,11 @@ module Krane
27
27
  "Consider switching to rollingUpdate.")
28
28
  @success_assumption_warning_shown = true
29
29
  end
30
- true
31
- else
32
- observed_generation == current_generation &&
33
- status_data['currentRevision'] == status_data['updateRevision'] &&
34
- desired_replicas == status_data['readyReplicas'].to_i &&
35
- desired_replicas == status_data['currentReplicas'].to_i
36
30
  end
31
+ observed_generation == current_generation &&
32
+ status_data['currentRevision'] == status_data['updateRevision'] &&
33
+ desired_replicas == status_data['readyReplicas'].to_i &&
34
+ desired_replicas == status_data['currentReplicas'].to_i
37
35
  end
38
36
 
39
37
  def deploy_failed?
@@ -69,10 +69,10 @@ module Krane
69
69
  deployments, statefulsets, daemonsets = identify_target_workloads(deployments, statefulsets,
70
70
  daemonsets, selector: selector)
71
71
 
72
- @logger.phase_heading("Triggering restart by annotating pod template #{RESTART_TRIGGER_ANNOTATION} annotation")
73
- patch_kubeclient_deployments(deployments)
74
- patch_kubeclient_statefulsets(statefulsets)
75
- patch_kubeclient_daemonsets(daemonsets)
72
+ @logger.phase_heading("Triggering restart")
73
+ restart_deployments!(deployments)
74
+ restart_statefulsets!(statefulsets)
75
+ restart_daemonsets!(daemonsets)
76
76
 
77
77
  if verify_result
78
78
  @logger.phase_heading("Waiting for rollout")
@@ -210,7 +210,15 @@ module Krane
210
210
  apps_v1_kubeclient.patch_daemon_set(record.metadata.name, build_patch_payload(record), @namespace)
211
211
  end
212
212
 
213
- def patch_kubeclient_deployments(deployments)
213
+ def delete_statefulset_pods(record)
214
+ pods = kubeclient.get_pods(namespace: record.metadata.namespace)
215
+ pods.select! do |pod|
216
+ pod.metadata.ownerReferences.find { |ref| ref.uid == record.metadata.uid }
217
+ end
218
+ pods.each { |pod| kubeclient.delete_pod(pod.metadata.name, pod.metadata.namespace) }
219
+ end
220
+
221
+ def restart_deployments!(deployments)
214
222
  deployments.each do |record|
215
223
  begin
216
224
  patch_deployment_with_restart(record)
@@ -221,18 +229,23 @@ module Krane
221
229
  end
222
230
  end
223
231
 
224
- def patch_kubeclient_statefulsets(statefulsets)
232
+ def restart_statefulsets!(statefulsets)
225
233
  statefulsets.each do |record|
226
- begin
234
+ @logger.info("Triggered `StatefulSet/#{record.metadata.name}` restart")
235
+ if record.spec.updateStrategy&.type == "OnDelete"
236
+ @logger.info("`StatefulSet/#{record.metadata.name}` has updateStrategy: OnDelete," \
237
+ " Restarting by forcefully deleting child pods"
238
+ )
239
+ delete_statefulset_pods(record)
240
+ else
227
241
  patch_statefulset_with_restart(record)
228
- @logger.info("Triggered `StatefulSet/#{record.metadata.name}` restart")
229
- rescue Kubeclient::HttpError => e
230
- raise RestartAPIError.new(record.metadata.name, e.message)
231
242
  end
243
+ rescue Kubeclient::HttpError => e
244
+ raise RestartAPIError.new(record.metadata.name, e.message)
232
245
  end
233
246
  end
234
247
 
235
- def patch_kubeclient_daemonsets(daemonsets)
248
+ def restart_daemonsets!(daemonsets)
236
249
  daemonsets.each do |record|
237
250
  begin
238
251
  patch_daemonset_with_restart(record)
@@ -104,11 +104,11 @@ module Krane
104
104
  dir_paths.each do |template_dir|
105
105
  resource_templates[template_dir] = Dir.foreach(template_dir).select do |filename|
106
106
  filename.end_with?(*VALID_TEMPLATES) || filename == EjsonSecretProvisioner::EJSON_SECRETS_FILE
107
- end
107
+ end.sort
108
108
  end
109
109
 
110
110
  # Filename paths
111
- file_paths.each do |filename|
111
+ file_paths.sort.each do |filename|
112
112
  dir_name = File.dirname(filename)
113
113
  resource_templates[dir_name] ||= []
114
114
  resource_templates[dir_name] << File.basename(filename) unless resource_templates[dir_name].include?(filename)
data/lib/krane/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Krane
3
- VERSION = "2.3.5"
3
+ VERSION = "2.4.1"
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.3.5
4
+ version: 2.4.1
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: 2022-01-11 00:00:00.000000000 Z
13
+ date: 2022-02-02 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
@@ -32,14 +32,14 @@ dependencies:
32
32
  requirements:
33
33
  - - "~>"
34
34
  - !ruby/object:Gem::Version
35
- version: '4.3'
35
+ version: '4.9'
36
36
  type: :runtime
37
37
  prerelease: false
38
38
  version_requirements: !ruby/object:Gem::Requirement
39
39
  requirements:
40
40
  - - "~>"
41
41
  - !ruby/object:Gem::Version
42
- version: '4.3'
42
+ version: '4.9'
43
43
  - !ruby/object:Gem::Dependency
44
44
  name: googleauth
45
45
  requirement: !ruby/object:Gem::Requirement
@@ -136,14 +136,14 @@ dependencies:
136
136
  requirements:
137
137
  - - "~>"
138
138
  - !ruby/object:Gem::Version
139
- version: 0.9.6
139
+ version: '1.0'
140
140
  type: :runtime
141
141
  prerelease: false
142
142
  version_requirements: !ruby/object:Gem::Requirement
143
143
  requirements:
144
144
  - - "~>"
145
145
  - !ruby/object:Gem::Version
146
- version: 0.9.6
146
+ version: '1.0'
147
147
  - !ruby/object:Gem::Dependency
148
148
  name: thor
149
149
  requirement: !ruby/object:Gem::Requirement
@@ -411,7 +411,6 @@ executables:
411
411
  extensions: []
412
412
  extra_rdoc_files: []
413
413
  files:
414
- - ".buildkite/pipeline.nightly.yml"
415
414
  - ".github/CODEOWNERS"
416
415
  - ".github/ISSUE_TEMPLATE.md"
417
416
  - ".github/probots.yml"
@@ -1,15 +0,0 @@
1
- steps:
2
- - name: 'Run Test Suite (:kubernetes: 1.16-latest)'
3
- command: bin/ci
4
- agents:
5
- queue: k8s-ci
6
- env:
7
- LOGGING_LEVEL: 4
8
- KUBERNETES_VERSION: v1.16-latest
9
- - name: 'Run Test Suite (:kubernetes: 1.15-latest)'
10
- command: bin/ci
11
- agents:
12
- queue: k8s-ci
13
- env:
14
- LOGGING_LEVEL: 4
15
- KUBERNETES_VERSION: v1.15-latest