krane 1.1.2 → 2.1.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|