krane 1.1.2 → 2.1.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 +4 -4
- data/.rubocop-http---shopify-github-io-ruby-style-guide-rubocop-yml +11 -19
- data/.shopify-build/krane.yml +20 -6
- data/1.0-Upgrade.md +1 -1
- data/CHANGELOG.md +48 -1
- data/CONTRIBUTING.md +1 -1
- data/README.md +8 -5
- data/bin/ci +1 -1
- data/dev.yml +3 -2
- data/krane.gemspec +4 -2
- data/lib/krane/annotation.rb +11 -0
- data/lib/krane/cluster_resource_discovery.rb +9 -6
- data/lib/krane/concerns/template_reporting.rb +0 -6
- data/lib/krane/container_overrides.rb +33 -0
- data/lib/krane/deploy_task.rb +21 -17
- data/lib/krane/ejson_secret_provisioner.rb +2 -3
- data/lib/krane/global_deploy_task.rb +8 -14
- data/lib/krane/kubeclient_builder.rb +4 -2
- data/lib/krane/kubectl.rb +8 -4
- data/lib/krane/kubernetes_resource.rb +32 -42
- data/lib/krane/kubernetes_resource/custom_resource.rb +2 -2
- data/lib/krane/kubernetes_resource/custom_resource_definition.rb +13 -10
- data/lib/krane/kubernetes_resource/deployment.rb +5 -7
- data/lib/krane/kubernetes_resource/persistent_volume_claim.rb +1 -0
- data/lib/krane/psych_k8s_compatibility.rb +36 -0
- data/lib/krane/render_task.rb +2 -2
- data/lib/krane/renderer.rb +2 -0
- data/lib/krane/resource_deployer.rb +9 -5
- data/lib/krane/restart_task.rb +8 -8
- data/lib/krane/runner_task.rb +21 -24
- data/lib/krane/statsd.rb +2 -2
- data/lib/krane/task_config.rb +7 -2
- data/lib/krane/task_config_validator.rb +3 -3
- data/lib/krane/version.rb +1 -1
- metadata +10 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d5cbad8d48ae06d3286c19cd193ef7208c04c74ee72b3519a82a25605d9c4e86
|
4
|
+
data.tar.gz: 2eded80d29111517ca964fe81033d6c3e3667b8704e9c37de3e293fe06fab987
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bf04a253ca03e3b3741e7c57dfd3967f54ccfc22b1094da4e9ca854e8211ce0f2fff4c1bc8ed56fef3c4fb7aefe63dd7a53c601e374ebdeaaf6274749722c7ec
|
7
|
+
data.tar.gz: db700598c8ec1e634c3c0db7802a6822668651355a2c3c509c1a4ff6dd54947b1999e36ee60404c62b397ffd58287eca93f272497ecfb7114082cdb029410595
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# Recommended rubocop version: ~> 0.78.0
|
2
|
-
|
3
1
|
AllCops:
|
4
2
|
Exclude:
|
5
3
|
- 'db/schema.rb'
|
@@ -78,13 +76,6 @@ Style/BlockDelimiters:
|
|
78
76
|
- proc
|
79
77
|
- it
|
80
78
|
|
81
|
-
Style/BracesAroundHashParameters:
|
82
|
-
EnforcedStyle: no_braces
|
83
|
-
SupportedStyles:
|
84
|
-
- braces
|
85
|
-
- no_braces
|
86
|
-
- context_dependent
|
87
|
-
|
88
79
|
Layout/CaseIndentation:
|
89
80
|
EnforcedStyle: end
|
90
81
|
SupportedStyles:
|
@@ -273,7 +264,7 @@ Style/MethodCallWithArgsParentheses:
|
|
273
264
|
- raise
|
274
265
|
- puts
|
275
266
|
Exclude:
|
276
|
-
- Gemfile
|
267
|
+
- '**/Gemfile'
|
277
268
|
|
278
269
|
Style/MethodDefParentheses:
|
279
270
|
EnforcedStyle: require_parentheses
|
@@ -586,6 +577,7 @@ Layout/BlockEndNewline:
|
|
586
577
|
|
587
578
|
Style/CaseEquality:
|
588
579
|
Enabled: true
|
580
|
+
AllowOnConstant: true
|
589
581
|
|
590
582
|
Style/CharacterLiteral:
|
591
583
|
Enabled: true
|
@@ -668,6 +660,9 @@ Style/IfWithSemicolon:
|
|
668
660
|
Style/IdenticalConditionalBranches:
|
669
661
|
Enabled: true
|
670
662
|
|
663
|
+
Layout/IndentationStyle:
|
664
|
+
Enabled: true
|
665
|
+
|
671
666
|
Style/InfiniteLoop:
|
672
667
|
Enabled: true
|
673
668
|
|
@@ -680,7 +675,7 @@ Style/LineEndConcatenation:
|
|
680
675
|
Style/MethodCallWithoutArgsParentheses:
|
681
676
|
Enabled: true
|
682
677
|
|
683
|
-
|
678
|
+
Lint/MissingSuper:
|
684
679
|
Enabled: true
|
685
680
|
|
686
681
|
Style/MissingRespondToMissing:
|
@@ -812,9 +807,6 @@ Layout/SpaceInsideRangeLiteral:
|
|
812
807
|
Style/SymbolLiteral:
|
813
808
|
Enabled: true
|
814
809
|
|
815
|
-
Layout/Tab:
|
816
|
-
Enabled: true
|
817
|
-
|
818
810
|
Layout/TrailingWhitespace:
|
819
811
|
Enabled: true
|
820
812
|
|
@@ -843,7 +835,7 @@ Style/ZeroLengthPredicate:
|
|
843
835
|
Enabled: true
|
844
836
|
|
845
837
|
Layout/HeredocIndentation:
|
846
|
-
|
838
|
+
Enabled: true
|
847
839
|
|
848
840
|
Lint/AmbiguousOperator:
|
849
841
|
Enabled: true
|
@@ -881,9 +873,6 @@ Lint/EmptyEnsure:
|
|
881
873
|
Lint/EmptyInterpolation:
|
882
874
|
Enabled: true
|
883
875
|
|
884
|
-
Lint/EndInMethod:
|
885
|
-
Enabled: true
|
886
|
-
|
887
876
|
Lint/EnsureReturn:
|
888
877
|
Enabled: true
|
889
878
|
|
@@ -976,7 +965,7 @@ Lint/UselessAccessModifier:
|
|
976
965
|
Lint/UselessAssignment:
|
977
966
|
Enabled: true
|
978
967
|
|
979
|
-
Lint/
|
968
|
+
Lint/BinaryOperatorWithIdenticalOperands:
|
980
969
|
Enabled: true
|
981
970
|
|
982
971
|
Lint/UselessElseWithoutRescue:
|
@@ -1027,3 +1016,6 @@ Style/ModuleFunction:
|
|
1027
1016
|
|
1028
1017
|
Lint/OrderedMagicComments:
|
1029
1018
|
Enabled: true
|
1019
|
+
|
1020
|
+
Lint/DeprecatedOpenSSLConstant:
|
1021
|
+
Enabled: true
|
data/.shopify-build/krane.yml
CHANGED
@@ -1,21 +1,36 @@
|
|
1
1
|
containers:
|
2
2
|
default:
|
3
|
-
docker: circleci/ruby:2.
|
3
|
+
docker: circleci/ruby:2.5.7
|
4
4
|
|
5
5
|
steps:
|
6
6
|
- label: Lint
|
7
7
|
timeout: 5m
|
8
8
|
run:
|
9
|
+
- bundle: ~
|
9
10
|
- bundle exec rubocop
|
10
|
-
|
11
|
-
- bundler
|
12
|
-
- label: 'Run Test Suite (:kubernetes: 1.16-latest)'
|
11
|
+
- label: 'Run Test Suite (:kubernetes: 1.18-latest :ruby: 2.7)'
|
13
12
|
command: bin/ci
|
14
13
|
agents:
|
15
14
|
queue: k8s-ci
|
16
15
|
env:
|
17
16
|
LOGGING_LEVEL: "4"
|
18
|
-
KUBERNETES_VERSION: v1.
|
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
|
19
34
|
- label: 'Run Test Suite (:kubernetes: 1.15-latest)'
|
20
35
|
command: bin/ci
|
21
36
|
agents:
|
@@ -51,4 +66,3 @@ steps:
|
|
51
66
|
env:
|
52
67
|
LOGGING_LEVEL: "4"
|
53
68
|
KUBERNETES_VERSION: v1.11-latest
|
54
|
-
|
data/1.0-Upgrade.md
CHANGED
@@ -119,7 +119,7 @@ Old flag | New flag | Comments
|
|
119
119
|
--skip-wait | --verify-result=true |
|
120
120
|
--allow-protected-ns | --protected-namespaces=default,kube-system,kube-public | Added the ability to specify which namespaces are protected
|
121
121
|
--no-prune | --prune=true |
|
122
|
-
--template-dir | -f, --
|
122
|
+
--template-dir | -f, --filenames | Makes all krane commands accept this argument, which is now required for the deploy task
|
123
123
|
--verbose-log-prefix | --verbose-log-prefix |
|
124
124
|
--max-watch-seconds=seconds | --global-timeout=300s | Changed flag name and default value to be a duration (expressed using strings like "300s" or "1h")
|
125
125
|
--selector | --selector |
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,47 @@
|
|
1
1
|
## next
|
2
2
|
|
3
|
-
|
3
|
+
## 2.1.1
|
4
|
+
|
5
|
+
*Bug Fixes*
|
6
|
+
- Fix the way environment variables are passed into the EJSON decryption invocation [#759](https://github.com/Shopify/krane/pull/759)
|
7
|
+
|
8
|
+
## 2.1.0
|
9
|
+
|
10
|
+
*Features*
|
11
|
+
- _(experimental)_ Override deploy method via annotation. This feature is considered alpha and should not be considered stable [#753](https://github.com/Shopify/krane/pull/753)
|
12
|
+
|
13
|
+
*Enhancements*
|
14
|
+
- Increased the number of attempts on kubectl commands during Initializing deploy phase [#749](https://github.com/Shopify/krane/pull/749)
|
15
|
+
- Increased attempts on kubectl apply command during deploy [#751](https://github.com/Shopify/krane/pull/751)
|
16
|
+
- Whitelist context deadline error during kubctl dry run [#754](https://github.com/Shopify/krane/pull/754)
|
17
|
+
- Allow specifying a kubeconfig per task in the internal API [#746](https://github.com/Shopify/krane/pull/746)
|
18
|
+
|
19
|
+
## 2.0.0
|
20
|
+
|
21
|
+
*Breaking Changes*
|
22
|
+
- Remove kubernetes deploy annotation prefix [#738](https://github.com/Shopify/krane/pull/738)
|
23
|
+
|
24
|
+
*Bug Fixes*
|
25
|
+
- Always set a deployment_id, even if the current_sha isn't set [#730](https://github.com/Shopify/krane/pull/730)
|
26
|
+
- YAML string scalars with scientific/e-notation numeric format not properly quoted. [#740](https://github.com/Shopify/krane/pull/740)
|
27
|
+
|
28
|
+
## 1.1.4
|
29
|
+
|
30
|
+
*Bug Fixes*
|
31
|
+
- Properly look up constant on Krane namespace. [#720](https://github.com/Shopify/krane/pull/720)
|
32
|
+
|
33
|
+
*Enhancements*
|
34
|
+
- Allow to configure `image_tag` when using task runner. [#719](https://github.com/Shopify/krane/pull/719)
|
35
|
+
|
36
|
+
## 1.1.3
|
37
|
+
|
38
|
+
*Bug Fixes*
|
39
|
+
- Retry dry-run validation when no error is returned. [#705](https://github.com/Shopify/krane/pull/705)
|
40
|
+
- Stop deploys if ClusterResourceDiscovery's kubectl calls fail. [#701](https://github.com/Shopify/krane/pull/701)
|
41
|
+
|
42
|
+
*Other*
|
43
|
+
- Dropped support for Ruby 2.4 since it will be EoL shortly. [#693](https://github.com/Shopify/krane/pull/693).
|
44
|
+
- Ruby 2.7 support: fix deprecation warnings, add testing. [#710](https://github.com/Shopify/krane/pull/705)
|
4
45
|
|
5
46
|
## 1.1.2
|
6
47
|
*Enhancements*
|
@@ -43,6 +84,12 @@
|
|
43
84
|
We've renamed the gem and cli to Krane.
|
44
85
|
See our [migration guide](https://github.com/Shopify/krane/blob/master/1.0-Upgrade.md) to help navigate the breaking changes.
|
45
86
|
|
87
|
+
## 1.0.0.pre.2
|
88
|
+
|
89
|
+
*Enhancements*
|
90
|
+
- Relax thor version requirement. ([#731](https://github.com/Shopify/krane/pull/731))
|
91
|
+
- Relax googleauth restriction. ([#731](https://github.com/Shopify/krane/pull/731))
|
92
|
+
|
46
93
|
## 1.0.0.pre.1
|
47
94
|
|
48
95
|
*Important!*
|
data/CONTRIBUTING.md
CHANGED
@@ -151,7 +151,7 @@ To see the full-color output of a specific integration test, you can use `PRINT_
|
|
151
151
|
1. Make sure CHANGELOG.md includes all user-facing changes since the last release. Things like test changes or refactors do not need to be included.
|
152
152
|
1. Update the version number in `version.rb`.
|
153
153
|
1. Commit your changes with message "Version x.y.z" and open a PR.
|
154
|
-
1. After merging your PR, deploy via [Shipit](https://shipit.shopify.io/shopify/
|
154
|
+
1. After merging your PR, deploy via [Shipit](https://shipit.shopify.io/shopify/krane/rubygems). Shipit will automatically tag the release and upload the gem to [rubygems.org](https://rubygems.org/gems/krane).
|
155
155
|
|
156
156
|
## CI (External contributors)
|
157
157
|
|
data/README.md
CHANGED
@@ -73,7 +73,7 @@ If you need the ability to render dynamic values in templates before deploying,
|
|
73
73
|
|
74
74
|
## Prerequisites
|
75
75
|
|
76
|
-
* Ruby 2.
|
76
|
+
* Ruby 2.5+
|
77
77
|
* Your cluster must be running Kubernetes v1.11.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
|
@@ -103,7 +103,7 @@ official compatibility chart below.
|
|
103
103
|
|
104
104
|
*Environment variables:*
|
105
105
|
|
106
|
-
- `$KUBECONFIG`: points to one or multiple valid kubeconfig files that include the context you want to deploy to. File names are separated by colon for Linux and Mac, and semi-colon for Windows. If
|
106
|
+
- `$KUBECONFIG`: points to one or multiple valid kubeconfig files that include the context you want to deploy to. File names are separated by colon for Linux and Mac, and semi-colon for Windows. If omitted, Krane will use the Kubernetes default of `~/.kube/config`.
|
107
107
|
- `$GOOGLE_APPLICATION_CREDENTIALS`: points to the credentials for an authenticated service account (required if your kubeconfig `user`'s auth provider is GCP)
|
108
108
|
|
109
109
|
|
@@ -159,6 +159,11 @@ before the deployment is considered successful.
|
|
159
159
|
- _Default_: `true`
|
160
160
|
- `true`: The custom resource will be deployed in the pre-deploy phase.
|
161
161
|
- All other values: The custom resource will be deployed in the main deployment phase.
|
162
|
+
- `krane.shopify.io/deploy-method-override`: Cause a resource to be deployed by the specified `kubectl` command, instead of the default `apply`.
|
163
|
+
- _Compatibility_: Cannot be used for `PodDisruptionBudget`, since it always uses `create/replace-force`
|
164
|
+
- _Accepted values_: `create`, `replace`, and `replace-force`
|
165
|
+
- _Warning_: Resources whose deploy method is overridden are no longer subject to pruning on deploy.
|
166
|
+
- This feature is _experimental_ and may be removed at any time.
|
162
167
|
|
163
168
|
|
164
169
|
### Running tasks at the beginning of a deploy
|
@@ -544,9 +549,7 @@ krane render -f ./path/to/template/dir/template.yaml.erb > template.yaml
|
|
544
549
|
- `--bindings=BINDINGS`: Makes additional variables available to your ERB templates. For example, `krane render --bindings=color=blue size=large -f some-template.yaml.erb` will expose `color` and `size` to `some-template.yaml.erb`.
|
545
550
|
- `--current-sha`: Expose SHA `current_sha` in ERB bindings
|
546
551
|
|
547
|
-
You can add additional variables using the `--bindings=BINDINGS` option which can be
|
548
|
-
file path prefixed with an `@` sign. An argument error will be raised if the string argument cannot be parsed, the referenced file does not include a
|
549
|
-
valid extension (`.json`, `.yaml` or `.yml`) or the referenced file does not exist.
|
552
|
+
You can add additional variables using the `--bindings=BINDINGS` option which can be formatted as a string, JSON string or path to a JSON or YAML file. Complex JSON or YAML data will be converted to a Hash for use in templates. To load a file, the argument should include the relative file path prefixed with an `@` sign. An argument error will be raised if the string argument cannot be parsed, the referenced file does not include a valid extension (`.json`, `.yaml` or `.yml`) or the referenced file does not exist.
|
550
553
|
|
551
554
|
#### Bindings examples
|
552
555
|
|
data/bin/ci
CHANGED
data/dev.yml
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
---
|
2
2
|
name: krane
|
3
3
|
up:
|
4
|
-
- ruby: 2.
|
4
|
+
- ruby: 2.5.7 # Matches gemspec
|
5
5
|
- bundler
|
6
6
|
- homebrew:
|
7
|
-
-
|
7
|
+
- homebrew/cask/minikube
|
8
|
+
- hyperkit
|
8
9
|
- custom:
|
9
10
|
name: Install the minikube fork of driver-hyperkit
|
10
11
|
met?: command -v docker-machine-driver-hyperkit
|
data/krane.gemspec
CHANGED
@@ -23,7 +23,9 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
24
24
|
spec.require_paths = %w(lib)
|
25
25
|
|
26
|
-
spec.
|
26
|
+
spec.metadata['allowed_push_host'] = "https://rubygems.org"
|
27
|
+
|
28
|
+
spec.required_ruby_version = '>= 2.5.0'
|
27
29
|
spec.add_dependency("activesupport", ">= 5.0")
|
28
30
|
spec.add_dependency("kubeclient", "~> 4.3")
|
29
31
|
spec.add_dependency("googleauth", "~> 0.8")
|
@@ -54,6 +56,6 @@ Gem::Specification.new do |spec|
|
|
54
56
|
spec.add_development_dependency("byebug")
|
55
57
|
spec.add_development_dependency("ruby-prof")
|
56
58
|
spec.add_development_dependency("ruby-prof-flamegraph")
|
57
|
-
spec.add_development_dependency("rubocop", "~> 0.
|
59
|
+
spec.add_development_dependency("rubocop", "~> 0.89.1")
|
58
60
|
spec.add_development_dependency("codecov")
|
59
61
|
end
|
@@ -37,7 +37,7 @@ module Krane
|
|
37
37
|
def fetch_resources(namespaced: false)
|
38
38
|
command = %w(api-resources)
|
39
39
|
command << "--namespaced=#{namespaced}"
|
40
|
-
raw,
|
40
|
+
raw, err, st = kubectl.run(*command, output: "wide", attempts: 5,
|
41
41
|
use_namespace: false)
|
42
42
|
if st.success?
|
43
43
|
rows = raw.split("\n")
|
@@ -59,7 +59,7 @@ module Krane
|
|
59
59
|
resource
|
60
60
|
end
|
61
61
|
else
|
62
|
-
|
62
|
+
raise FatalKubeAPIError, "Error retrieving api-resources: #{err}"
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
@@ -68,7 +68,7 @@ module Krane
|
|
68
68
|
# kubectl api-versions returns a list of group/version strings e.g. autoscaling/v2beta2
|
69
69
|
# A kind may not exist in all versions of the group.
|
70
70
|
def fetch_api_versions
|
71
|
-
raw,
|
71
|
+
raw, err, st = kubectl.run("api-versions", attempts: 5, use_namespace: false)
|
72
72
|
# The "core" group is represented by an empty string
|
73
73
|
versions = { "" => %w(v1) }
|
74
74
|
if st.success?
|
@@ -78,6 +78,8 @@ module Krane
|
|
78
78
|
versions[group] ||= []
|
79
79
|
versions[group] << version
|
80
80
|
end
|
81
|
+
else
|
82
|
+
raise FatalKubeAPIError, "Error retrieving api-versions: #{err}"
|
81
83
|
end
|
82
84
|
versions
|
83
85
|
end
|
@@ -86,7 +88,8 @@ module Krane
|
|
86
88
|
# Override list for kinds that don't appear in the lastest version of a group
|
87
89
|
version_override = { "CronJob" => "v1beta1", "VolumeAttachment" => "v1beta1",
|
88
90
|
"CSIDriver" => "v1beta1", "Ingress" => "v1beta1",
|
89
|
-
"CSINode" => "v1beta1", "Job" => "v1"
|
91
|
+
"CSINode" => "v1beta1", "Job" => "v1",
|
92
|
+
"IngressClass" => "v1beta1" }
|
90
93
|
|
91
94
|
pattern = /v(?<major>\d+)(?<pre>alpha|beta)?(?<minor>\d+)?/
|
92
95
|
latest = versions.sort_by do |version|
|
@@ -98,12 +101,12 @@ module Krane
|
|
98
101
|
end
|
99
102
|
|
100
103
|
def fetch_crds
|
101
|
-
raw_json,
|
104
|
+
raw_json, err, st = kubectl.run("get", "CustomResourceDefinition", output: "json", attempts: 5,
|
102
105
|
use_namespace: false)
|
103
106
|
if st.success?
|
104
107
|
JSON.parse(raw_json)["items"]
|
105
108
|
else
|
106
|
-
|
109
|
+
raise FatalKubeAPIError, "Error retrieving CustomResourceDefinition: #{err}"
|
107
110
|
end
|
108
111
|
end
|
109
112
|
|
@@ -15,12 +15,6 @@ module Krane
|
|
15
15
|
logger.summary.add_paragraph(debug_msg)
|
16
16
|
end
|
17
17
|
|
18
|
-
def record_warnings(logger:, warning:, filename:)
|
19
|
-
warn_msg = "Template warning: #{filename}\n"
|
20
|
-
warn_msg += "> Warning message:\n#{Krane::FormattedLogger.indent_four(warning)}"
|
21
|
-
logger.summary.add_paragraph(ColorizedString.new(warn_msg).yellow)
|
22
|
-
end
|
23
|
-
|
24
18
|
def add_para_from_list(logger:, action:, enum:)
|
25
19
|
logger.summary.add_action(action)
|
26
20
|
logger.summary.add_paragraph(enum.map { |e| "- #{e}" }.join("\n"))
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Krane
|
3
|
+
class ContainerOverrides
|
4
|
+
attr_reader :command, :arguments, :env_vars, :image_tag
|
5
|
+
|
6
|
+
def initialize(command: nil, arguments: nil, env_vars: [], image_tag: nil)
|
7
|
+
@command = command
|
8
|
+
@arguments = arguments
|
9
|
+
@env_vars = env_vars
|
10
|
+
@image_tag = image_tag
|
11
|
+
end
|
12
|
+
|
13
|
+
def apply!(container)
|
14
|
+
container.command = command if command
|
15
|
+
container.args = arguments if arguments
|
16
|
+
|
17
|
+
if image_tag
|
18
|
+
image = container.image
|
19
|
+
base_image, _old_tag = image.split(':')
|
20
|
+
new_image = "#{base_image}:#{image_tag}"
|
21
|
+
|
22
|
+
container.image = new_image
|
23
|
+
end
|
24
|
+
|
25
|
+
env_args = env_vars.map do |env|
|
26
|
+
key, value = env.split('=', 2)
|
27
|
+
{ name: key, value: value }
|
28
|
+
end
|
29
|
+
container.env ||= []
|
30
|
+
container.env = container.env.map(&:to_h) + env_args
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/krane/deploy_task.rb
CHANGED
@@ -4,6 +4,7 @@ require 'shellwords'
|
|
4
4
|
require 'tempfile'
|
5
5
|
require 'fileutils'
|
6
6
|
|
7
|
+
require 'krane/annotation'
|
7
8
|
require 'krane/common'
|
8
9
|
require 'krane/concurrency'
|
9
10
|
require 'krane/resource_cache'
|
@@ -56,6 +57,7 @@ module Krane
|
|
56
57
|
)
|
57
58
|
|
58
59
|
def predeploy_sequence
|
60
|
+
default_group = { group: nil }
|
59
61
|
before_crs = %w(
|
60
62
|
ResourceQuota
|
61
63
|
NetworkPolicy
|
@@ -65,12 +67,14 @@ module Krane
|
|
65
67
|
Role
|
66
68
|
RoleBinding
|
67
69
|
Secret
|
68
|
-
)
|
70
|
+
).map { |r| [r, default_group] }
|
71
|
+
|
69
72
|
after_crs = %w(
|
70
73
|
Pod
|
71
|
-
)
|
74
|
+
).map { |r| [r, default_group] }
|
72
75
|
|
73
|
-
|
76
|
+
crs = cluster_resource_discoverer.crds.select(&:predeployed?).map { |cr| [cr.kind, { group: cr.group }] }
|
77
|
+
Hash[before_crs + crs + after_crs]
|
74
78
|
end
|
75
79
|
|
76
80
|
def prune_whitelist
|
@@ -81,6 +85,10 @@ module Krane
|
|
81
85
|
kubectl.server_version
|
82
86
|
end
|
83
87
|
|
88
|
+
attr_reader :task_config
|
89
|
+
|
90
|
+
delegate :kubeclient_builder, to: :task_config
|
91
|
+
|
84
92
|
# Initializes the deploy task
|
85
93
|
#
|
86
94
|
# @param namespace [String] Kubernetes namespace (*required*)
|
@@ -97,10 +105,10 @@ module Krane
|
|
97
105
|
# @param render_erb [Boolean] Enable ERB rendering
|
98
106
|
def initialize(namespace:, context:, current_sha: nil, logger: nil, kubectl_instance: nil, bindings: {},
|
99
107
|
global_timeout: nil, selector: nil, filenames: [], protected_namespaces: nil,
|
100
|
-
render_erb: false)
|
108
|
+
render_erb: false, kubeconfig: nil)
|
101
109
|
@logger = logger || Krane::FormattedLogger.build(namespace, context)
|
102
110
|
@template_sets = TemplateSets.from_dirs_and_files(paths: filenames, logger: @logger, render_erb: render_erb)
|
103
|
-
@task_config = Krane::TaskConfig.new(context, namespace, @logger)
|
111
|
+
@task_config = Krane::TaskConfig.new(context, namespace, @logger, kubeconfig)
|
104
112
|
@bindings = bindings
|
105
113
|
@namespace = namespace
|
106
114
|
@namespace_tags = []
|
@@ -116,8 +124,8 @@ module Krane
|
|
116
124
|
# Runs the task, returning a boolean representing success or failure
|
117
125
|
#
|
118
126
|
# @return [Boolean]
|
119
|
-
def run(
|
120
|
-
run!(
|
127
|
+
def run(**args)
|
128
|
+
run!(**args)
|
121
129
|
true
|
122
130
|
rescue FatalDeploymentError
|
123
131
|
false
|
@@ -186,10 +194,6 @@ module Krane
|
|
186
194
|
selector: @selector, statsd_tags: statsd_tags, current_sha: @current_sha)
|
187
195
|
end
|
188
196
|
|
189
|
-
def kubeclient_builder
|
190
|
-
@kubeclient_builder ||= KubeclientBuilder.new
|
191
|
-
end
|
192
|
-
|
193
197
|
def cluster_resource_discoverer
|
194
198
|
@cluster_resource_discoverer ||= ClusterResourceDiscovery.new(
|
195
199
|
task_config: @task_config,
|
@@ -210,7 +214,10 @@ module Krane
|
|
210
214
|
end
|
211
215
|
|
212
216
|
def deploy_has_priority_resources?(resources)
|
213
|
-
resources.any?
|
217
|
+
resources.any? do |r|
|
218
|
+
next unless (pr = predeploy_sequence[r.type])
|
219
|
+
!pr[:group] || pr[:group] == r.group
|
220
|
+
end
|
214
221
|
end
|
215
222
|
|
216
223
|
def check_initial_status(resources)
|
@@ -242,6 +249,8 @@ module Krane
|
|
242
249
|
@logger.info(" - #{secret.id} (from ejson)")
|
243
250
|
end
|
244
251
|
|
252
|
+
StatsD.client.gauge('discover_resources.count', resources.size, tags: statsd_tags)
|
253
|
+
|
245
254
|
resources.sort
|
246
255
|
rescue InvalidTemplateError => e
|
247
256
|
record_invalid_template(logger: @logger, err: e.message, filename: e.filename,
|
@@ -274,11 +283,6 @@ module Krane
|
|
274
283
|
r.validate_definition(kubectl, selector: @selector)
|
275
284
|
end
|
276
285
|
|
277
|
-
resources.select(&:has_warnings?).each do |resource|
|
278
|
-
record_warnings(logger: @logger, warning: resource.validation_warning_msg,
|
279
|
-
filename: File.basename(resource.file_path))
|
280
|
-
end
|
281
|
-
|
282
286
|
failed_resources = resources.select(&:validation_failed?)
|
283
287
|
if failed_resources.present?
|
284
288
|
|