krane 2.3.5 → 2.4.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
  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