krane 2.0.0 → 2.1.0
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 +3 -3
- data/CHANGELOG.md +11 -0
- data/README.md +5 -0
- data/dev.yml +2 -1
- data/krane.gemspec +1 -1
- data/lib/krane/deploy_task.rb +6 -6
- data/lib/krane/global_deploy_task.rb +4 -7
- data/lib/krane/kubeclient_builder.rb +4 -2
- data/lib/krane/kubectl.rb +7 -4
- data/lib/krane/kubernetes_resource.rb +20 -3
- data/lib/krane/kubernetes_resource/persistent_volume_claim.rb +1 -0
- data/lib/krane/resource_deployer.rb +2 -3
- data/lib/krane/restart_task.rb +6 -6
- data/lib/krane/runner_task.rb +5 -7
- 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 +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a3b3d47fb38961012857a5964baadcc19c6e5c147223383430f820af2029cf75
|
4
|
+
data.tar.gz: 94addb8d8743d249ec0437467c8eb5ccf075b41536a329e781ef80fad48dbad3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 10038a1f57185f4d78fda538aadb71357f1c7d84b77b9a27873062b7bdd82e06e696666ab639384d84e25c010165bdfdd69533860fc50ce564fc419b09fc01a2
|
7
|
+
data.tar.gz: a12bf652e4503d37fd368f38d6219e48e1755ea688016094849d6558440b6db88aba22aaadfa807ac6e9f1ff1e3ceba171bfbf1cdcd07fe95bf7e2cc553a0e90
|
@@ -264,7 +264,7 @@ Style/MethodCallWithArgsParentheses:
|
|
264
264
|
- raise
|
265
265
|
- puts
|
266
266
|
Exclude:
|
267
|
-
- Gemfile
|
267
|
+
- '**/Gemfile'
|
268
268
|
|
269
269
|
Style/MethodDefParentheses:
|
270
270
|
EnforcedStyle: require_parentheses
|
@@ -675,7 +675,7 @@ Style/LineEndConcatenation:
|
|
675
675
|
Style/MethodCallWithoutArgsParentheses:
|
676
676
|
Enabled: true
|
677
677
|
|
678
|
-
|
678
|
+
Lint/MissingSuper:
|
679
679
|
Enabled: true
|
680
680
|
|
681
681
|
Style/MissingRespondToMissing:
|
@@ -965,7 +965,7 @@ Lint/UselessAccessModifier:
|
|
965
965
|
Lint/UselessAssignment:
|
966
966
|
Enabled: true
|
967
967
|
|
968
|
-
Lint/
|
968
|
+
Lint/BinaryOperatorWithIdenticalOperands:
|
969
969
|
Enabled: true
|
970
970
|
|
971
971
|
Lint/UselessElseWithoutRescue:
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,16 @@
|
|
1
1
|
## next
|
2
2
|
|
3
|
+
## 2.1.0
|
4
|
+
|
5
|
+
*Features*
|
6
|
+
- _(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)
|
7
|
+
|
8
|
+
*Enhancements*
|
9
|
+
- Increased the number of attempts on kubectl commands during Initializing deploy phase [#749](https://github.com/Shopify/krane/pull/749)
|
10
|
+
- Increased attempts on kubectl apply command during deploy [#751](https://github.com/Shopify/krane/pull/751)
|
11
|
+
- Whitelist context deadline error during kubctl dry run [#754](https://github.com/Shopify/krane/pull/754)
|
12
|
+
- Allow specifying a kubeconfig per task in the internal API [#746](https://github.com/Shopify/krane/pull/746)
|
13
|
+
|
3
14
|
## 2.0.0
|
4
15
|
|
5
16
|
*Breaking Changes*
|
data/README.md
CHANGED
@@ -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
|
data/dev.yml
CHANGED
data/krane.gemspec
CHANGED
@@ -56,6 +56,6 @@ Gem::Specification.new do |spec|
|
|
56
56
|
spec.add_development_dependency("byebug")
|
57
57
|
spec.add_development_dependency("ruby-prof")
|
58
58
|
spec.add_development_dependency("ruby-prof-flamegraph")
|
59
|
-
spec.add_development_dependency("rubocop", "~> 0.
|
59
|
+
spec.add_development_dependency("rubocop", "~> 0.89.1")
|
60
60
|
spec.add_development_dependency("codecov")
|
61
61
|
end
|
data/lib/krane/deploy_task.rb
CHANGED
@@ -85,6 +85,10 @@ module Krane
|
|
85
85
|
kubectl.server_version
|
86
86
|
end
|
87
87
|
|
88
|
+
attr_reader :task_config
|
89
|
+
|
90
|
+
delegate :kubeclient_builder, to: :task_config
|
91
|
+
|
88
92
|
# Initializes the deploy task
|
89
93
|
#
|
90
94
|
# @param namespace [String] Kubernetes namespace (*required*)
|
@@ -101,10 +105,10 @@ module Krane
|
|
101
105
|
# @param render_erb [Boolean] Enable ERB rendering
|
102
106
|
def initialize(namespace:, context:, current_sha: nil, logger: nil, kubectl_instance: nil, bindings: {},
|
103
107
|
global_timeout: nil, selector: nil, filenames: [], protected_namespaces: nil,
|
104
|
-
render_erb: false)
|
108
|
+
render_erb: false, kubeconfig: nil)
|
105
109
|
@logger = logger || Krane::FormattedLogger.build(namespace, context)
|
106
110
|
@template_sets = TemplateSets.from_dirs_and_files(paths: filenames, logger: @logger, render_erb: render_erb)
|
107
|
-
@task_config = Krane::TaskConfig.new(context, namespace, @logger)
|
111
|
+
@task_config = Krane::TaskConfig.new(context, namespace, @logger, kubeconfig)
|
108
112
|
@bindings = bindings
|
109
113
|
@namespace = namespace
|
110
114
|
@namespace_tags = []
|
@@ -190,10 +194,6 @@ module Krane
|
|
190
194
|
selector: @selector, statsd_tags: statsd_tags, current_sha: @current_sha)
|
191
195
|
end
|
192
196
|
|
193
|
-
def kubeclient_builder
|
194
|
-
@kubeclient_builder ||= KubeclientBuilder.new
|
195
|
-
end
|
196
|
-
|
197
197
|
def cluster_resource_discoverer
|
198
198
|
@cluster_resource_discoverer ||= ClusterResourceDiscovery.new(
|
199
199
|
task_config: @task_config,
|
@@ -25,7 +25,8 @@ module Krane
|
|
25
25
|
class GlobalDeployTask
|
26
26
|
extend Krane::StatsD::MeasureMethods
|
27
27
|
include TemplateReporting
|
28
|
-
delegate :context, :logger, :global_kinds, to: :@task_config
|
28
|
+
delegate :context, :logger, :global_kinds, :kubeclient_builder, to: :@task_config
|
29
|
+
attr_reader :task_config
|
29
30
|
|
30
31
|
# Initializes the deploy task
|
31
32
|
#
|
@@ -33,10 +34,10 @@ module Krane
|
|
33
34
|
# @param global_timeout [Integer] Timeout in seconds
|
34
35
|
# @param selector [Hash] Selector(s) parsed by Krane::LabelSelector (*required*)
|
35
36
|
# @param filenames [Array<String>] An array of filenames and/or directories containing templates (*required*)
|
36
|
-
def initialize(context:, global_timeout: nil, selector: nil, filenames: [], logger: nil)
|
37
|
+
def initialize(context:, global_timeout: nil, selector: nil, filenames: [], logger: nil, kubeconfig: nil)
|
37
38
|
template_paths = filenames.map { |path| File.expand_path(path) }
|
38
39
|
|
39
|
-
@task_config = TaskConfig.new(context, nil, logger)
|
40
|
+
@task_config = TaskConfig.new(context, nil, logger, kubeconfig)
|
40
41
|
@template_sets = TemplateSets.from_dirs_and_files(paths: template_paths,
|
41
42
|
logger: @task_config.logger, render_erb: false)
|
42
43
|
@global_timeout = global_timeout
|
@@ -189,10 +190,6 @@ module Krane
|
|
189
190
|
@kubectl ||= Kubectl.new(task_config: @task_config, log_failure_by_default: true)
|
190
191
|
end
|
191
192
|
|
192
|
-
def kubeclient_builder
|
193
|
-
@kubeclient_builder ||= KubeclientBuilder.new
|
194
|
-
end
|
195
|
-
|
196
193
|
def prune_whitelist
|
197
194
|
cluster_resource_discoverer.prunable_resources(namespaced: false)
|
198
195
|
end
|
@@ -10,8 +10,10 @@ module Krane
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
|
14
|
-
|
13
|
+
attr_reader :kubeconfig_files
|
14
|
+
|
15
|
+
def initialize(kubeconfig: nil)
|
16
|
+
files = kubeconfig || ENV["KUBECONFIG"] || "#{Dir.home}/.kube/config"
|
15
17
|
# Split the list by colon for Linux and Mac, and semicolon for Windows.
|
16
18
|
@kubeconfig_files = files.split(/[:;]/).map!(&:strip).reject(&:empty?)
|
17
19
|
end
|
data/lib/krane/kubectl.rb
CHANGED
@@ -7,6 +7,7 @@ module Krane
|
|
7
7
|
not_found: /NotFound/,
|
8
8
|
client_timeout: /Client\.Timeout exceeded while awaiting headers/,
|
9
9
|
empty: /\A\z/,
|
10
|
+
context_deadline: /context deadline exceeded/,
|
10
11
|
}
|
11
12
|
DEFAULT_TIMEOUT = 15
|
12
13
|
MAX_RETRY_DELAY = 16
|
@@ -14,7 +15,7 @@ module Krane
|
|
14
15
|
|
15
16
|
class ResourceNotFoundError < StandardError; end
|
16
17
|
|
17
|
-
delegate :namespace, :context, :logger, to: :@task_config
|
18
|
+
delegate :namespace, :context, :logger, :kubeconfig, to: :@task_config
|
18
19
|
|
19
20
|
def initialize(task_config:, log_failure_by_default:, default_timeout: DEFAULT_TIMEOUT,
|
20
21
|
output_is_sensitive_default: false)
|
@@ -34,7 +35,8 @@ module Krane
|
|
34
35
|
|
35
36
|
(1..attempts).to_a.each do |current_attempt|
|
36
37
|
logger.debug("Running command (attempt #{current_attempt}): #{cmd.join(' ')}")
|
37
|
-
|
38
|
+
env = { 'KUBECONFIG' => kubeconfig }
|
39
|
+
out, err, st = Open3.capture3(env, *cmd)
|
38
40
|
|
39
41
|
# https://github.com/Shopify/krane/issues/395
|
40
42
|
unless out.valid_encoding?
|
@@ -62,7 +64,8 @@ module Krane
|
|
62
64
|
else
|
63
65
|
logger.debug("Kubectl err: #{output_is_sensitive ? '<suppressed sensitive output>' : err}")
|
64
66
|
end
|
65
|
-
StatsD.client.increment('kubectl.error', 1, tags: { context: context, namespace: namespace, cmd: cmd[1]
|
67
|
+
StatsD.client.increment('kubectl.error', 1, tags: { context: context, namespace: namespace, cmd: cmd[1],
|
68
|
+
max_attempt: attempts, current_attempt: current_attempt })
|
66
69
|
|
67
70
|
break unless retriable_err?(err, retry_whitelist) && current_attempt < attempts
|
68
71
|
sleep(retry_delay(current_attempt))
|
@@ -79,7 +82,7 @@ module Krane
|
|
79
82
|
def version_info
|
80
83
|
@version_info ||=
|
81
84
|
begin
|
82
|
-
response, _, status = run("version", use_namespace: false, log_failure: true)
|
85
|
+
response, _, status = run("version", use_namespace: false, log_failure: true, attempts: 2)
|
83
86
|
raise KubectlError, "Could not retrieve kubectl version info" unless status.success?
|
84
87
|
extract_version_info_from_kubectl_response(response)
|
85
88
|
end
|
@@ -35,6 +35,8 @@ module Krane
|
|
35
35
|
If you have reason to believe it will succeed, retry the deploy to continue to monitor the rollout.
|
36
36
|
MSG
|
37
37
|
|
38
|
+
ALLOWED_DEPLOY_METHOD_OVERRIDES = %w(create replace replace-force)
|
39
|
+
DEPLOY_METHOD_OVERRIDE_ANNOTATION = "deploy-method-override"
|
38
40
|
TIMEOUT_OVERRIDE_ANNOTATION = "timeout-override"
|
39
41
|
LAST_APPLIED_ANNOTATION = "kubectl.kubernetes.io/last-applied-configuration"
|
40
42
|
SENSITIVE_TEMPLATE_CONTENT = false
|
@@ -136,6 +138,7 @@ module Krane
|
|
136
138
|
@validation_errors = []
|
137
139
|
validate_selector(selector) if selector
|
138
140
|
validate_timeout_annotation
|
141
|
+
validate_deploy_method_override_annotation
|
139
142
|
validate_spec_with_kubectl(kubectl)
|
140
143
|
@validation_errors.present?
|
141
144
|
end
|
@@ -237,10 +240,14 @@ module Krane
|
|
237
240
|
if @definition.dig("metadata", "name").blank? && uses_generate_name?
|
238
241
|
:create
|
239
242
|
else
|
240
|
-
:apply
|
243
|
+
deploy_method_override || :apply
|
241
244
|
end
|
242
245
|
end
|
243
246
|
|
247
|
+
def deploy_method_override
|
248
|
+
krane_annotation_value(DEPLOY_METHOD_OVERRIDE_ANNOTATION)&.to_sym
|
249
|
+
end
|
250
|
+
|
244
251
|
def sync_debug_info(kubectl)
|
245
252
|
@debug_events = fetch_events(kubectl) unless ENV[DISABLE_FETCHING_EVENT_INFO]
|
246
253
|
@debug_logs = fetch_debug_logs if print_debug_logs? && !ENV[DISABLE_FETCHING_LOG_INFO]
|
@@ -504,6 +511,16 @@ module Krane
|
|
504
511
|
@validation_errors << "#{timeout_annotation_key} annotation is invalid: #{e}"
|
505
512
|
end
|
506
513
|
|
514
|
+
def validate_deploy_method_override_annotation
|
515
|
+
deploy_method_override_value = krane_annotation_value(DEPLOY_METHOD_OVERRIDE_ANNOTATION)
|
516
|
+
deploy_method_override_annotation_key = Annotation.for(DEPLOY_METHOD_OVERRIDE_ANNOTATION)
|
517
|
+
return unless deploy_method_override_value
|
518
|
+
unless ALLOWED_DEPLOY_METHOD_OVERRIDES.include?(deploy_method_override_value)
|
519
|
+
@validation_errors << "#{deploy_method_override_annotation_key} is invalid: Accepted values are: " \
|
520
|
+
"#{ALLOWED_DEPLOY_METHOD_OVERRIDES.join(', ')} but got #{deploy_method_override_value}"
|
521
|
+
end
|
522
|
+
end
|
523
|
+
|
507
524
|
def krane_annotation_value(suffix)
|
508
525
|
@definition.dig("metadata", "annotations", Annotation.for(suffix))
|
509
526
|
end
|
@@ -545,7 +562,7 @@ module Krane
|
|
545
562
|
def validate_with_server_side_dry_run(kubectl)
|
546
563
|
command = ["apply", "-f", file_path, "--server-dry-run", "--output=name"]
|
547
564
|
kubectl.run(*command, log_failure: false, output_is_sensitive: sensitive_template_content?,
|
548
|
-
retry_whitelist: [:client_timeout, :empty], attempts: 3)
|
565
|
+
retry_whitelist: [:client_timeout, :empty, :context_deadline], attempts: 3)
|
549
566
|
end
|
550
567
|
|
551
568
|
# Local dry run is supported on only create and apply
|
@@ -555,7 +572,7 @@ module Krane
|
|
555
572
|
verb = deploy_method == :apply ? "apply" : "create"
|
556
573
|
command = [verb, "-f", file_path, "--dry-run", "--output=name"]
|
557
574
|
kubectl.run(*command, log_failure: false, output_is_sensitive: sensitive_template_content?,
|
558
|
-
retry_whitelist: [:client_timeout, :empty], attempts: 3, use_namespace: !global?)
|
575
|
+
retry_whitelist: [:client_timeout, :empty, :context_deadline], attempts: 3, use_namespace: !global?)
|
559
576
|
end
|
560
577
|
|
561
578
|
def labels
|
@@ -95,11 +95,10 @@ module Krane
|
|
95
95
|
applyables, individuals = resources.partition { |r| r.deploy_method == :apply }
|
96
96
|
# Prunable resources should also applied so that they can be pruned
|
97
97
|
pruneable_types = @prune_whitelist.map { |t| t.split("/").last }
|
98
|
-
applyables += individuals.select { |r| pruneable_types.include?(r.type) }
|
98
|
+
applyables += individuals.select { |r| pruneable_types.include?(r.type) && !r.deploy_method_override }
|
99
99
|
|
100
100
|
individuals.each do |individual_resource|
|
101
101
|
individual_resource.deploy_started_at = Time.now.utc
|
102
|
-
|
103
102
|
case individual_resource.deploy_method
|
104
103
|
when :create
|
105
104
|
err, status = create_resource(individual_resource)
|
@@ -153,7 +152,7 @@ module Krane
|
|
153
152
|
output_is_sensitive = resources.any?(&:sensitive_template_content?)
|
154
153
|
global_mode = resources.all?(&:global?)
|
155
154
|
out, err, st = kubectl.run(*command, log_failure: false, output_is_sensitive: output_is_sensitive,
|
156
|
-
use_namespace: !global_mode)
|
155
|
+
attempts: 2, use_namespace: !global_mode)
|
157
156
|
|
158
157
|
if st.success?
|
159
158
|
log_pruning(out) if prune
|
data/lib/krane/restart_task.rb
CHANGED
@@ -22,15 +22,19 @@ module Krane
|
|
22
22
|
HTTP_OK_RANGE = 200..299
|
23
23
|
ANNOTATION = "shipit.shopify.io/restart"
|
24
24
|
|
25
|
+
attr_reader :task_config
|
26
|
+
|
27
|
+
delegate :kubeclient_builder, to: :task_config
|
28
|
+
|
25
29
|
# Initializes the restart task
|
26
30
|
#
|
27
31
|
# @param context [String] Kubernetes context / cluster (*required*)
|
28
32
|
# @param namespace [String] Kubernetes namespace (*required*)
|
29
33
|
# @param logger [Object] Logger object (defaults to an instance of Krane::FormattedLogger)
|
30
34
|
# @param global_timeout [Integer] Timeout in seconds
|
31
|
-
def initialize(context:, namespace:, logger: nil, global_timeout: nil)
|
35
|
+
def initialize(context:, namespace:, logger: nil, global_timeout: nil, kubeconfig: nil)
|
32
36
|
@logger = logger || Krane::FormattedLogger.build(namespace, context)
|
33
|
-
@task_config = Krane::TaskConfig.new(context, namespace, @logger)
|
37
|
+
@task_config = Krane::TaskConfig.new(context, namespace, @logger, kubeconfig)
|
34
38
|
@context = context
|
35
39
|
@namespace = namespace
|
36
40
|
@global_timeout = global_timeout
|
@@ -220,9 +224,5 @@ module Krane
|
|
220
224
|
def v1beta1_kubeclient
|
221
225
|
@v1beta1_kubeclient ||= kubeclient_builder.build_v1beta1_kubeclient(@context)
|
222
226
|
end
|
223
|
-
|
224
|
-
def kubeclient_builder
|
225
|
-
@kubeclient_builder ||= KubeclientBuilder.new
|
226
|
-
end
|
227
227
|
end
|
228
228
|
end
|
data/lib/krane/runner_task.rb
CHANGED
@@ -16,7 +16,9 @@ module Krane
|
|
16
16
|
class RunnerTask
|
17
17
|
class TaskTemplateMissingError < TaskConfigurationError; end
|
18
18
|
|
19
|
-
attr_reader :pod_name
|
19
|
+
attr_reader :pod_name, :task_config
|
20
|
+
|
21
|
+
delegate :kubeclient_builder, to: :task_config
|
20
22
|
|
21
23
|
# Initializes the runner task
|
22
24
|
#
|
@@ -24,9 +26,9 @@ module Krane
|
|
24
26
|
# @param context [String] Kubernetes context / cluster (*required*)
|
25
27
|
# @param logger [Object] Logger object (defaults to an instance of Krane::FormattedLogger)
|
26
28
|
# @param global_timeout [Integer] Timeout in seconds
|
27
|
-
def initialize(namespace:, context:, logger: nil, global_timeout: nil)
|
29
|
+
def initialize(namespace:, context:, logger: nil, global_timeout: nil, kubeconfig: nil)
|
28
30
|
@logger = logger || Krane::FormattedLogger.build(namespace, context)
|
29
|
-
@task_config = Krane::TaskConfig.new(context, namespace, @logger)
|
31
|
+
@task_config = Krane::TaskConfig.new(context, namespace, @logger, kubeconfig)
|
30
32
|
@namespace = namespace
|
31
33
|
@context = context
|
32
34
|
@global_timeout = global_timeout
|
@@ -200,10 +202,6 @@ module Krane
|
|
200
202
|
@kubeclient ||= kubeclient_builder.build_v1_kubeclient(@context)
|
201
203
|
end
|
202
204
|
|
203
|
-
def kubeclient_builder
|
204
|
-
@kubeclient_builder ||= KubeclientBuilder.new
|
205
|
-
end
|
206
|
-
|
207
205
|
def statsd_tags(status)
|
208
206
|
%W(namespace:#{@namespace} context:#{@context} status:#{status})
|
209
207
|
end
|
data/lib/krane/task_config.rb
CHANGED
@@ -4,12 +4,13 @@ require 'krane/cluster_resource_discovery'
|
|
4
4
|
|
5
5
|
module Krane
|
6
6
|
class TaskConfig
|
7
|
-
attr_reader :context, :namespace, :logger
|
7
|
+
attr_reader :context, :namespace, :logger, :kubeconfig
|
8
8
|
|
9
|
-
def initialize(context, namespace, logger = nil)
|
9
|
+
def initialize(context, namespace, logger = nil, kubeconfig = nil)
|
10
10
|
@context = context
|
11
11
|
@namespace = namespace
|
12
12
|
@logger = logger || FormattedLogger.build(@namespace, @context)
|
13
|
+
@kubeconfig = kubeconfig || ENV['KUBECONFIG']
|
13
14
|
end
|
14
15
|
|
15
16
|
def global_kinds
|
@@ -18,5 +19,9 @@ module Krane
|
|
18
19
|
cluster_resource_discoverer.fetch_resources(namespaced: false).map { |g| g["kind"] }
|
19
20
|
end
|
20
21
|
end
|
22
|
+
|
23
|
+
def kubeclient_builder
|
24
|
+
@kubeclient_builder ||= KubeclientBuilder.new(kubeconfig: kubeconfig)
|
25
|
+
end
|
21
26
|
end
|
22
27
|
end
|
@@ -45,7 +45,7 @@ module Krane
|
|
45
45
|
end
|
46
46
|
|
47
47
|
_, err, st = @kubectl.run("config", "get-contexts", context, "-o", "name",
|
48
|
-
use_namespace: false, use_context: false, log_failure: false)
|
48
|
+
use_namespace: false, use_context: false, log_failure: false, attempts: 2)
|
49
49
|
|
50
50
|
unless st.success?
|
51
51
|
@errors << if err.match("error: context #{context} not found")
|
@@ -58,7 +58,7 @@ module Krane
|
|
58
58
|
|
59
59
|
def validate_context_reachable
|
60
60
|
_, err, st = @kubectl.run("get", "namespaces", "-o", "name",
|
61
|
-
use_namespace: false, log_failure: false)
|
61
|
+
use_namespace: false, log_failure: false, attempts: 2)
|
62
62
|
|
63
63
|
unless st.success?
|
64
64
|
@errors << "Something went wrong connecting to #{context}. #{err} "
|
@@ -71,7 +71,7 @@ module Krane
|
|
71
71
|
end
|
72
72
|
|
73
73
|
_, err, st = @kubectl.run("get", "namespace", "-o", "name", namespace,
|
74
|
-
use_namespace: false, log_failure: false)
|
74
|
+
use_namespace: false, log_failure: false, attempts: 3)
|
75
75
|
|
76
76
|
unless st.success?
|
77
77
|
@errors << if err.match("Error from server [(]NotFound[)]: namespace")
|
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: 2.
|
4
|
+
version: 2.1.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: 2020-
|
13
|
+
date: 2020-10-06 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|
@@ -366,14 +366,14 @@ dependencies:
|
|
366
366
|
requirements:
|
367
367
|
- - "~>"
|
368
368
|
- !ruby/object:Gem::Version
|
369
|
-
version: 0.
|
369
|
+
version: 0.89.1
|
370
370
|
type: :development
|
371
371
|
prerelease: false
|
372
372
|
version_requirements: !ruby/object:Gem::Requirement
|
373
373
|
requirements:
|
374
374
|
- - "~>"
|
375
375
|
- !ruby/object:Gem::Version
|
376
|
-
version: 0.
|
376
|
+
version: 0.89.1
|
377
377
|
- !ruby/object:Gem::Dependency
|
378
378
|
name: codecov
|
379
379
|
requirement: !ruby/object:Gem::Requirement
|