krane 2.4.9 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +19 -37
- data/.github/workflows/cla.yml +22 -0
- data/CHANGELOG.md +13 -0
- data/CONTRIBUTING.md +2 -4
- data/README.md +13 -8
- data/bin/ci +1 -1
- data/bin/setup +2 -2
- data/dev.yml +2 -2
- data/krane.gemspec +1 -1
- data/lib/krane/cluster_resource_discovery.rb +0 -13
- data/lib/krane/common.rb +1 -1
- data/lib/krane/deploy_task.rb +8 -17
- data/lib/krane/kubectl.rb +1 -5
- data/lib/krane/kubernetes_resource.rb +2 -15
- data/lib/krane/version.rb +1 -1
- metadata +4 -5
- data/.github/probots.yml +0 -2
- data/lib/krane/kubernetes_resource/mutating_webhook_configuration.rb +0 -87
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aeb4645e62609672df9a1a4fbe8323e801cdc904d45ae79aaa047d1f1cb8f1e7
|
4
|
+
data.tar.gz: de5c4a20c870041a532d22208c23d002f14c5ff0b6dae8ba8db1b9cc2d088c36
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a8e4b1a9d17a537c533c8ecab1a7146c093ef6b0ddaedcbab76b7451d9ff18541ea73788614ba74739d1804a08146bb98e26d3f984b902dc6d609bcc8ca95a5a
|
7
|
+
data.tar.gz: 45aff6ae937b76ffb4cbb1f7fe3ffd4eceb73ae48442f8260c2a97689191cbfc991ba7767736aa2b048db51d5f1f169f8062d3e0d1c0c60acd8ee550c66e0690
|
data/.github/workflows/ci.yml
CHANGED
@@ -6,64 +6,46 @@ jobs:
|
|
6
6
|
ruby-tests:
|
7
7
|
runs-on: ubuntu-latest
|
8
8
|
|
9
|
-
name: "Tests - Ruby ${{ matrix.ruby }} with
|
9
|
+
name: "Tests - Ruby ${{ matrix.ruby }} with Kubernetes ${{ matrix.kubernetes_version }}"
|
10
10
|
strategy:
|
11
11
|
fail-fast: false
|
12
12
|
matrix:
|
13
13
|
ruby:
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
14
|
+
- "3.1.2"
|
15
|
+
- "3.0.4"
|
16
|
+
- "2.7.6"
|
17
|
+
kubernetes_version:
|
18
|
+
- "1.24.6"
|
19
|
+
- "1.23.12"
|
20
|
+
- "1.22.15"
|
21
21
|
include:
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
kind_version: 'v0.11.1'
|
29
|
-
kubernetes_version: '1.23.0'
|
30
|
-
kind_image: 'kindest/node:v1.23.0@sha256:49824ab1727c04e56a21a5d8372a402fcd32ea51ac96a2706a12af38934f81ac'
|
31
|
-
- ruby: '3.0.2'
|
32
|
-
kind_version: 'v0.11.1'
|
33
|
-
kubernetes_version: '1.22.0'
|
34
|
-
kind_image: 'kindest/node:v1.22.0@sha256:b8bda84bb3a190e6e028b1760d277454a72267a5454b57db34437c34a588d047'
|
35
|
-
- ruby: '3.0.1'
|
36
|
-
kind_version: 'v0.11.1'
|
37
|
-
kubernetes_version: '1.21.1'
|
38
|
-
kind_image: 'kindest/node:v1.21.1@sha256:69860bda5563ac81e3c0057d654b5253219618a22ec3a346306239bba8cfa1a6'
|
39
|
-
- ruby: '3.0'
|
40
|
-
kind_version: 'v0.11.1'
|
41
|
-
kubernetes_version: '1.20.7'
|
42
|
-
kind_image: 'kindest/node:v1.20.7@sha256:cbeaf907fc78ac97ce7b625e4bf0de16e3ea725daf6b04f930bd14c67c671ff9'
|
43
|
-
- ruby: '2.7'
|
44
|
-
kind_version: 'v0.11.1'
|
45
|
-
kubernetes_version: '1.19.11'
|
46
|
-
kind_image: 'kindest/node:v1.19.11@sha256:07db187ae84b4b7de440a73886f008cf903fcf5764ba8106a9fd5243d6f32729'
|
22
|
+
- kubernetes_version: "1.24.6"
|
23
|
+
kind_image: "kindest/node:v1.24.6@sha256:97e8d00bc37a7598a0b32d1fabd155a96355c49fa0d4d4790aab0f161bf31be1"
|
24
|
+
- kubernetes_version: "1.23.12"
|
25
|
+
kind_image: "kindest/node:v1.23.12@sha256:9402cf1330bbd3a0d097d2033fa489b2abe40d479cc5ef47d0b6a6960613148a"
|
26
|
+
- kubernetes_version: "1.22.15"
|
27
|
+
kind_image: "kindest/node:v1.22.15@sha256:bfd5eaae36849bfb3c1e3b9442f3da17d730718248939d9d547e86bbac5da586"
|
47
28
|
|
48
29
|
steps:
|
49
30
|
- uses: actions/checkout@v2
|
50
31
|
|
51
|
-
- name:
|
32
|
+
- name: Setup Ruby ${{ matrix.ruby }}
|
52
33
|
uses: ruby/setup-ruby@v1
|
53
34
|
with:
|
54
35
|
ruby-version: ${{ matrix.ruby }}
|
55
36
|
bundler-cache: true
|
56
37
|
|
57
|
-
- name: Setup kubectl
|
38
|
+
- name: Setup kubectl ${{ matrix.kubernetes_version }}
|
58
39
|
run: |
|
59
40
|
mkdir -p "${GITHUB_WORKSPACE}/bin"
|
60
41
|
curl -o "${GITHUB_WORKSPACE}/bin/kubectl" -LO "https://dl.k8s.io/release/v${{ matrix.kubernetes_version }}/bin/linux/amd64/kubectl"
|
61
42
|
chmod +x "${GITHUB_WORKSPACE}/bin/kubectl"
|
62
43
|
echo "PATH=$GITHUB_WORKSPACE/bin:${PATH}" >> $GITHUB_ENV
|
63
44
|
|
64
|
-
-
|
45
|
+
- name: Setup Kind v0.16.0
|
46
|
+
uses: engineerd/setup-kind@v0.5.0
|
65
47
|
with:
|
66
|
-
version:
|
48
|
+
version: v0.16.0
|
67
49
|
image: "${{ matrix.kind_image }}"
|
68
50
|
|
69
51
|
- name: Run tests
|
@@ -0,0 +1,22 @@
|
|
1
|
+
name: Contributor License Agreement (CLA)
|
2
|
+
|
3
|
+
on:
|
4
|
+
pull_request_target:
|
5
|
+
types: [opened, synchronize]
|
6
|
+
issue_comment:
|
7
|
+
types: [created]
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
cla:
|
11
|
+
runs-on: ubuntu-latest
|
12
|
+
if: |
|
13
|
+
(github.event.issue.pull_request
|
14
|
+
&& !github.event.issue.pull_request.merged_at
|
15
|
+
&& contains(github.event.comment.body, 'signed')
|
16
|
+
)
|
17
|
+
|| (github.event.pull_request && !github.event.pull_request.merged)
|
18
|
+
steps:
|
19
|
+
- uses: Shopify/shopify-cla-action@v1
|
20
|
+
with:
|
21
|
+
github-token: ${{ secrets.GITHUB_TOKEN }}
|
22
|
+
cla-token: ${{ secrets.CLA_TOKEN }}
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,18 @@
|
|
1
1
|
## next
|
2
2
|
|
3
|
+
|
4
|
+
## 3.0.0
|
5
|
+
|
6
|
+
*Enhancements*
|
7
|
+
|
8
|
+
- CI test matrix now test all Krane supported Ruby and Kubernetes versions.
|
9
|
+
Ruby: 3.1.2 , 3.0.4 , 2.7.6, Kubernetes: - 1.24.6, 1.23.12, 1.22.15.
|
10
|
+
|
11
|
+
*Breaking Changes*
|
12
|
+
- Remove unsupported Kubernetes and Ruby versions from Krane and CI [#905](https://github.com/Shopify/krane/pull/905).
|
13
|
+
See supported Kubernetes and Ruby versions in [Compatibility](./CONTRIBUTING.md#compatibility).
|
14
|
+
If you are using Kubernetes <v1.22 keep using Krane v2.4.9.
|
15
|
+
|
3
16
|
## 2.4.9
|
4
17
|
|
5
18
|
- Fixed a Ruby 3.1 regression that caused an exception when using a `--bindings=@<file>` argument to `krane render` [#900](https://github.com/Shopify/krane/pull/900)
|
data/CONTRIBUTING.md
CHANGED
@@ -29,9 +29,7 @@ behavior to [krane@shopify.com](mailto:krane@shopify.com).
|
|
29
29
|
## Maintainers
|
30
30
|
|
31
31
|
This project is currently under the stewardship of the Production Platform group at Shopify.
|
32
|
-
|
33
|
-
required for all significant feature proposals and code architecture changes. In general,
|
34
|
-
two people must approve all non-trivial PRs.
|
32
|
+
In general, two people must approve all non-trivial PRs.
|
35
33
|
|
36
34
|
## What should I know before I get started?
|
37
35
|
|
@@ -113,7 +111,7 @@ This gem uses subclasses of `KubernetesResource` to implement custom success/fai
|
|
113
111
|
|
114
112
|
If you work for Shopify, just run `dev up`, but otherwise:
|
115
113
|
|
116
|
-
1. [Install kubectl version 1.
|
114
|
+
1. [Install kubectl version 1.22.0 or higher](https://kubernetes.io/docs/user-guide/prereqs/) and make sure it is in your path
|
117
115
|
2. [Install minikube](https://kubernetes.io/docs/getting-started-guides/minikube/#installation) (required to run the test suite)
|
118
116
|
3. [Install any required minikube drivers](https://github.com/kubernetes/minikube/blob/master/docs/drivers.md) (on OS X, you may need the [hyperkit driver](https://github.com/kubernetes/minikube/blob/master/docs/drivers.md#hyperkit-driver)
|
119
117
|
4. Check out the repo
|
data/README.md
CHANGED
@@ -74,23 +74,28 @@ If you need the ability to render dynamic values in templates before deploying,
|
|
74
74
|
## Prerequisites
|
75
75
|
|
76
76
|
* Ruby 2.7+
|
77
|
-
* Your cluster must be running Kubernetes v1.
|
77
|
+
* Your cluster must be running Kubernetes v1.22.0 or higher<sup>1</sup>
|
78
78
|
|
79
|
-
|
80
|
-
|
79
|
+
## Compatibility
|
80
|
+
|
81
|
+
<sup>1</sup> We run integration tests against these Kubernetes versions. You can find our official compatibility chart below.
|
82
|
+
|
83
|
+
Krane provides support for official upstream supported versions [Kubernetes](https://endoflife.date/kubernetes), [Ruby](https://endoflife.date/ruby) that are part of the compatibility matrix; Nevertheless, older releases are still likely to work.
|
81
84
|
|
82
85
|
| Kubernetes version | Currently Tested? | Last officially supported in gem version |
|
83
86
|
|:------------------:|-------------------|:----------------------------------------:|
|
84
87
|
| 1.18 | No | 2.3.7 |
|
85
|
-
| 1.19 |
|
86
|
-
| 1.20 |
|
87
|
-
| 1.21 |
|
88
|
+
| 1.19 | No | 2.4.9 |
|
89
|
+
| 1.20 | No | 2.4.9 |
|
90
|
+
| 1.21 | No | 2.4.9 |
|
88
91
|
| 1.22 | Yes | -- |
|
89
92
|
| 1.23 | Yes | -- |
|
93
|
+
| 1.24 | Yes | -- |
|
94
|
+
| 1.25 | No | -- |
|
90
95
|
|
91
96
|
## Installation
|
92
97
|
|
93
|
-
1. [Install kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-binary-via-curl) (requires v1.
|
98
|
+
1. [Install kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-binary-via-curl) (requires v1.22.0 or higher) and make sure it is available in your $PATH
|
94
99
|
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
100
|
3. `gem install krane`
|
96
101
|
|
@@ -497,7 +502,7 @@ resource to restart.
|
|
497
502
|
|
498
503
|
## Prerequisites
|
499
504
|
|
500
|
-
* You've already deployed a [`PodTemplate`](https://v1-
|
505
|
+
* You've already deployed a [`PodTemplate`](https://v1-22.docs.kubernetes.io/docs/reference/generated/kubernetes-api/v1.22/#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`.
|
501
506
|
* The `Pod` specification in that template has a container named `task-runner`.
|
502
507
|
|
503
508
|
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
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.
|
12
|
+
echo -e "\n\033[0;33mPlease install kubectl version 1.22.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.
|
15
|
+
echo -e "\n\033[0;32mKubectl version $KUBECTL_VERSION is already installed. This gem requires version v1.22.0 or greater.\033[0m"
|
16
16
|
fi
|
data/dev.yml
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
---
|
2
2
|
name: krane
|
3
3
|
up:
|
4
|
-
- ruby: '3.
|
4
|
+
- ruby: '3.1.2' # Matches gemspec
|
5
5
|
- bundler
|
6
6
|
- podman
|
7
7
|
- kind:
|
8
8
|
name: krane
|
9
|
-
image: kindest/node:v1.
|
9
|
+
image: kindest/node:v1.24.6@sha256:97e8d00bc37a7598a0b32d1fabd155a96355c49fa0d4d4790aab0f161bf31be1
|
10
10
|
commands:
|
11
11
|
test:
|
12
12
|
run: bin/test
|
data/krane.gemspec
CHANGED
@@ -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.6
|
28
|
+
spec.required_ruby_version = '>= 2.7.6'
|
29
29
|
spec.add_dependency("activesupport", ">= 5.0")
|
30
30
|
spec.add_dependency("kubeclient", "~> 4.9")
|
31
31
|
spec.add_dependency("googleauth", "~> 1.2")
|
@@ -37,19 +37,6 @@ module Krane
|
|
37
37
|
end.compact.uniq { |r| "#{r['apigroup']}/#{r['kind']}" }
|
38
38
|
end
|
39
39
|
|
40
|
-
def fetch_mutating_webhook_configurations
|
41
|
-
command = %w(get mutatingwebhookconfigurations)
|
42
|
-
raw_json, err, st = kubectl.run(*command, output: "json", attempts: 5, use_namespace: false)
|
43
|
-
if st.success?
|
44
|
-
JSON.parse(raw_json)["items"].map do |definition|
|
45
|
-
Krane::MutatingWebhookConfiguration.new(namespace: namespace, context: context, logger: logger,
|
46
|
-
definition: definition, statsd_tags: @namespace_tags)
|
47
|
-
end
|
48
|
-
else
|
49
|
-
raise FatalKubeAPIError, "Error retrieving mutatingwebhookconfigurations: #{err}"
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
40
|
private
|
54
41
|
|
55
42
|
# During discovery, the api paths may not actually be at the root, so we must programatically find it.
|
data/lib/krane/common.rb
CHANGED
data/lib/krane/deploy_task.rb
CHANGED
@@ -30,7 +30,6 @@ require 'krane/kubernetes_resource'
|
|
30
30
|
custom_resource_definition
|
31
31
|
horizontal_pod_autoscaler
|
32
32
|
secret
|
33
|
-
mutating_webhook_configuration
|
34
33
|
).each do |subresource|
|
35
34
|
require "krane/kubernetes_resource/#{subresource}"
|
36
35
|
end
|
@@ -285,26 +284,18 @@ module Krane
|
|
285
284
|
end
|
286
285
|
measure_method(:validate_configuration)
|
287
286
|
|
288
|
-
def partition_dry_run_resources(resources)
|
289
|
-
individuals = []
|
290
|
-
mutating_webhook_configurations = cluster_resource_discoverer.fetch_mutating_webhook_configurations
|
291
|
-
mutating_webhook_configurations.each do |mutating_webhook_configuration|
|
292
|
-
mutating_webhook_configuration.webhooks.each do |webhook|
|
293
|
-
individuals = (individuals + resources.select { |resource| webhook.matches_resource?(resource) }).uniq
|
294
|
-
resources -= individuals
|
295
|
-
end
|
296
|
-
end
|
297
|
-
[resources, individuals]
|
298
|
-
end
|
299
|
-
|
300
287
|
def validate_resources(resources)
|
301
288
|
validate_globals(resources)
|
302
|
-
|
303
|
-
batch_dry_run_success = kubectl.server_dry_run_enabled? && validate_dry_run(batchable_resources)
|
304
|
-
individuals += batchable_resources unless batch_dry_run_success
|
289
|
+
batch_dry_run_success = validate_dry_run(resources)
|
305
290
|
resources.select! { |r| r.selected?(@selector) } if @selector_as_filter
|
291
|
+
|
306
292
|
Krane::Concurrency.split_across_threads(resources) do |r|
|
307
|
-
|
293
|
+
# No need to pass in kubectl (and do per-resource dry run apply) if batch dry run succeeded
|
294
|
+
if batch_dry_run_success
|
295
|
+
r.validate_definition(kubectl: nil, selector: @selector, dry_run: false)
|
296
|
+
else
|
297
|
+
r.validate_definition(kubectl: kubectl, selector: @selector, dry_run: true)
|
298
|
+
end
|
308
299
|
end
|
309
300
|
failed_resources = resources.select(&:validation_failed?)
|
310
301
|
if failed_resources.present?
|
data/lib/krane/kubectl.rb
CHANGED
@@ -226,11 +226,6 @@ module Krane
|
|
226
226
|
version ? grouping : "core"
|
227
227
|
end
|
228
228
|
|
229
|
-
def version
|
230
|
-
prefix, version = @definition.dig("apiVersion").split("/")
|
231
|
-
version || prefix
|
232
|
-
end
|
233
|
-
|
234
229
|
def kubectl_resource_type
|
235
230
|
type
|
236
231
|
end
|
@@ -569,11 +564,7 @@ module Krane
|
|
569
564
|
|
570
565
|
# Server side dry run is only supported on apply
|
571
566
|
def validate_with_server_side_dry_run(kubectl)
|
572
|
-
command =
|
573
|
-
["apply", "-f", file_path, "--dry-run=server", "--output=name"]
|
574
|
-
else
|
575
|
-
["apply", "-f", file_path, "--server-dry-run", "--output=name"]
|
576
|
-
end
|
567
|
+
command = ["apply", "-f", file_path, "--dry-run=server", "--output=name"]
|
577
568
|
|
578
569
|
kubectl.run(*command, log_failure: false, output_is_sensitive: sensitive_template_content?,
|
579
570
|
retry_whitelist: [:client_timeout, :empty, :context_deadline], attempts: 3)
|
@@ -584,11 +575,7 @@ module Krane
|
|
584
575
|
# If the resource template uses generateName, validating with apply will fail
|
585
576
|
def validate_with_local_dry_run(kubectl)
|
586
577
|
verb = deploy_method == :apply ? "apply" : "create"
|
587
|
-
command =
|
588
|
-
[verb, "-f", file_path, "--dry-run=client", "--output=name"]
|
589
|
-
else
|
590
|
-
[verb, "-f", file_path, "--dry-run", "--output=name"]
|
591
|
-
end
|
578
|
+
command = [verb, "-f", file_path, "--dry-run=client", "--output=name"]
|
592
579
|
|
593
580
|
kubectl.run(*command, log_failure: false, output_is_sensitive: sensitive_template_content?,
|
594
581
|
retry_whitelist: [:client_timeout, :empty, :context_deadline], attempts: 3, use_namespace: !global?)
|
data/lib/krane/version.rb
CHANGED
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:
|
4
|
+
version: 3.0.0
|
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-
|
13
|
+
date: 2022-10-14 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|
@@ -413,9 +413,9 @@ extra_rdoc_files: []
|
|
413
413
|
files:
|
414
414
|
- ".github/CODEOWNERS"
|
415
415
|
- ".github/ISSUE_TEMPLATE.md"
|
416
|
-
- ".github/probots.yml"
|
417
416
|
- ".github/pull_request_template.md"
|
418
417
|
- ".github/workflows/ci.yml"
|
418
|
+
- ".github/workflows/cla.yml"
|
419
419
|
- ".gitignore"
|
420
420
|
- ".rubocop-http---shopify-github-io-ruby-style-guide-rubocop-yml"
|
421
421
|
- ".rubocop.yml"
|
@@ -472,7 +472,6 @@ files:
|
|
472
472
|
- lib/krane/kubernetes_resource/horizontal_pod_autoscaler.rb
|
473
473
|
- lib/krane/kubernetes_resource/ingress.rb
|
474
474
|
- lib/krane/kubernetes_resource/job.rb
|
475
|
-
- lib/krane/kubernetes_resource/mutating_webhook_configuration.rb
|
476
475
|
- lib/krane/kubernetes_resource/network_policy.rb
|
477
476
|
- lib/krane/kubernetes_resource/persistent_volume_claim.rb
|
478
477
|
- lib/krane/kubernetes_resource/pod.rb
|
@@ -519,7 +518,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
519
518
|
requirements:
|
520
519
|
- - ">="
|
521
520
|
- !ruby/object:Gem::Version
|
522
|
-
version: 2.6
|
521
|
+
version: 2.7.6
|
523
522
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
524
523
|
requirements:
|
525
524
|
- - ">="
|
data/.github/probots.yml
DELETED
@@ -1,87 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Krane
|
4
|
-
class MutatingWebhookConfiguration < KubernetesResource
|
5
|
-
GLOBAL = true
|
6
|
-
|
7
|
-
class Webhook
|
8
|
-
EQUIVALENT = 'Equivalent'
|
9
|
-
EXACT = 'Exact'
|
10
|
-
|
11
|
-
class Rule
|
12
|
-
def initialize(definition)
|
13
|
-
@definition = definition
|
14
|
-
end
|
15
|
-
|
16
|
-
def matches_resource?(resource, accept_equivalent:)
|
17
|
-
groups.each do |group|
|
18
|
-
versions.each do |version|
|
19
|
-
resources.each do |kind|
|
20
|
-
return true if (resource.group == group || group == '*' || accept_equivalent) &&
|
21
|
-
(resource.version == version || version == '*' || accept_equivalent) &&
|
22
|
-
(resource.type.downcase == kind.downcase.singularize || kind == "*")
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
false
|
27
|
-
end
|
28
|
-
|
29
|
-
def groups
|
30
|
-
@definition.dig('apiGroups')
|
31
|
-
end
|
32
|
-
|
33
|
-
def versions
|
34
|
-
@definition.dig('apiVersions')
|
35
|
-
end
|
36
|
-
|
37
|
-
def resources
|
38
|
-
@definition.dig('resources')
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def initialize(definition)
|
43
|
-
@definition = definition
|
44
|
-
end
|
45
|
-
|
46
|
-
def side_effects
|
47
|
-
@definition.dig('sideEffects')
|
48
|
-
end
|
49
|
-
|
50
|
-
def has_side_effects?
|
51
|
-
# Note: After K8s 1.22, this should ALWAYS be false.
|
52
|
-
!%w(None NoneOnDryRun).include?(side_effects)
|
53
|
-
end
|
54
|
-
|
55
|
-
def match_policy
|
56
|
-
@definition.dig('matchPolicy')
|
57
|
-
end
|
58
|
-
|
59
|
-
def matches_resource?(resource, skip_rule_if_side_effect_none: true)
|
60
|
-
return false if skip_rule_if_side_effect_none && !has_side_effects?
|
61
|
-
rules.any? do |rule|
|
62
|
-
rule.matches_resource?(resource, accept_equivalent: match_policy == EQUIVALENT)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
def rules
|
67
|
-
@definition.fetch('rules', []).map { |rule| Rule.new(rule) }
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
def initialize(namespace:, context:, definition:, logger:, statsd_tags:)
|
72
|
-
@webhooks = (definition.dig('webhooks') || []).map { |hook| Webhook.new(hook) }
|
73
|
-
super(namespace: namespace, context: context, definition: definition,
|
74
|
-
logger: logger, statsd_tags: statsd_tags)
|
75
|
-
end
|
76
|
-
|
77
|
-
TIMEOUT = 30.seconds
|
78
|
-
|
79
|
-
def deploy_succeeded?
|
80
|
-
exists?
|
81
|
-
end
|
82
|
-
|
83
|
-
def webhooks
|
84
|
-
@definition.fetch('webhooks', []).map { |webhook| Webhook.new(webhook) }
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|