Class: KubernetesDeploy::Deployment
Constant Summary
collapse
- TIMEOUT =
7.minutes
- REQUIRED_ROLLOUT_ANNOTATION_SUFFIX =
"required-rollout"
- REQUIRED_ROLLOUT_ANNOTATION_DEPRECATED =
"kubernetes-deploy.shopify.io/#{REQUIRED_ROLLOUT_ANNOTATION_SUFFIX}"
- REQUIRED_ROLLOUT_ANNOTATION =
"krane.shopify.io/#{REQUIRED_ROLLOUT_ANNOTATION_SUFFIX}"
- REQUIRED_ROLLOUT_TYPES =
%w(maxUnavailable full none).freeze
- DEFAULT_REQUIRED_ROLLOUT =
'full'
KubernetesResource::DEBUG_RESOURCE_NOT_FOUND_MESSAGE, KubernetesResource::DISABLED_EVENT_INFO_MESSAGE, KubernetesResource::DISABLED_LOG_INFO_MESSAGE, KubernetesResource::DISABLE_FETCHING_EVENT_INFO, KubernetesResource::DISABLE_FETCHING_LOG_INFO, KubernetesResource::GLOBAL, KubernetesResource::LAST_APPLIED_ANNOTATION, KubernetesResource::LOG_LINE_COUNT, KubernetesResource::SENSITIVE_TEMPLATE_CONTENT, KubernetesResource::SERVER_DRY_RUNNABLE, KubernetesResource::SERVER_DRY_RUN_DISABLED_ERROR, KubernetesResource::STANDARD_TIMEOUT_MESSAGE, KubernetesResource::TIMEOUT_OVERRIDE_ANNOTATION, KubernetesResource::TIMEOUT_OVERRIDE_ANNOTATION_DEPRECATED, KubernetesResource::TIMEOUT_OVERRIDE_ANNOTATION_SUFFIX, KubernetesResource::UNUSUAL_FAILURE_MESSAGE
Instance Attribute Summary
#context, #deploy_started_at, #global, #name, #namespace, #type
Instance Method Summary
collapse
#<=>, #after_sync, build, class_for_kind, #debug_message, #deploy_method, #deploy_started?, #disappeared?, #exists?, #file_path, #global?, #has_warnings?, #id, #initialize, kind, #kubectl_resource_type, #pretty_status, #report_status_to_statsd, #sensitive_template_content?, #server_dry_run_validated?, #server_dry_runnable_resource?, #sync_debug_info, #terminating?, timeout, #timeout, #timeout_override, #to_kubeclient_resource, #validation_error_msg, #validation_failed?, #validation_warning_msg
Instance Method Details
#deploy_failed? ⇒ Boolean
59
60
61
62
|
# File 'lib/kubernetes-deploy/kubernetes_resource/deployment.rb', line 59
def deploy_failed?
@latest_rs&.deploy_failed? &&
observed_generation == current_generation
end
|
#deploy_succeeded? ⇒ Boolean
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
# File 'lib/kubernetes-deploy/kubernetes_resource/deployment.rb', line 37
def deploy_succeeded?
return false unless exists? && @latest_rs.present?
return false unless observed_generation == current_generation
if required_rollout == 'full'
@latest_rs.deploy_succeeded? &&
@latest_rs.desired_replicas == desired_replicas && rollout_data["updatedReplicas"].to_i == desired_replicas &&
rollout_data["updatedReplicas"].to_i == rollout_data["availableReplicas"].to_i
elsif required_rollout == 'none'
true
elsif required_rollout == 'maxUnavailable' || percent?(required_rollout)
minimum_needed = min_available_replicas
@latest_rs.desired_replicas >= minimum_needed &&
@latest_rs.ready_replicas >= minimum_needed &&
@latest_rs.available_replicas >= minimum_needed
else
raise FatalDeploymentError, rollout_annotation_err_msg
end
end
|
#deploy_timed_out? ⇒ Boolean
91
92
93
94
95
96
97
|
# File 'lib/kubernetes-deploy/kubernetes_resource/deployment.rb', line 91
def deploy_timed_out?
return false if deploy_failed?
return super if timeout_override
progress_condition.present? ? deploy_failing_to_progress? : super
end
|
#failure_message ⇒ Object
64
65
66
67
|
# File 'lib/kubernetes-deploy/kubernetes_resource/deployment.rb', line 64
def failure_message
return unless @latest_rs.present?
"Latest ReplicaSet: #{@latest_rs.name}\n\n#{@latest_rs.failure_message}"
end
|
#fetch_debug_logs ⇒ Object
33
34
35
|
# File 'lib/kubernetes-deploy/kubernetes_resource/deployment.rb', line 33
def fetch_debug_logs
@latest_rs.fetch_debug_logs
end
|
#fetch_events(kubectl) ⇒ Object
23
24
25
26
27
|
# File 'lib/kubernetes-deploy/kubernetes_resource/deployment.rb', line 23
def fetch_events(kubectl)
own_events = super
return own_events unless @latest_rs.present?
own_events.merge(@latest_rs.fetch_events(kubectl))
end
|
#pretty_timeout_type ⇒ Object
81
82
83
84
85
86
87
88
89
|
# File 'lib/kubernetes-deploy/kubernetes_resource/deployment.rb', line 81
def pretty_timeout_type
if timeout_override
"timeout override: #{timeout_override}s"
elsif progress_deadline.present?
"progress deadline: #{progress_deadline}s"
else
super
end
end
|
#print_debug_logs? ⇒ Boolean
29
30
31
|
# File 'lib/kubernetes-deploy/kubernetes_resource/deployment.rb', line 29
def print_debug_logs?
@latest_rs.present?
end
|
#status ⇒ Object
18
19
20
21
|
# File 'lib/kubernetes-deploy/kubernetes_resource/deployment.rb', line 18
def status
return super unless exists?
rollout_data.map { |state_replicas, num| "#{num} #{state_replicas.chop.pluralize(num)}" }.join(", ")
end
|
#sync(cache) ⇒ Object
13
14
15
16
|
# File 'lib/kubernetes-deploy/kubernetes_resource/deployment.rb', line 13
def sync(cache)
super
@latest_rs = exists? ? find_latest_rs(cache) : nil
end
|
#timeout_message ⇒ Object
69
70
71
72
73
74
75
76
77
78
79
|
# File 'lib/kubernetes-deploy/kubernetes_resource/deployment.rb', line 69
def timeout_message
reason_msg = if timeout_override
STANDARD_TIMEOUT_MESSAGE
elsif progress_condition.present?
"Timeout reason: #{progress_condition['reason']}"
else
"Timeout reason: hard deadline for #{type}"
end
return reason_msg unless @latest_rs.present?
"#{reason_msg}\nLatest ReplicaSet: #{@latest_rs.name}\n\n#{@latest_rs.timeout_message}"
end
|
#validate_definition ⇒ Object
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
# File 'lib/kubernetes-deploy/kubernetes_resource/deployment.rb', line 99
def validate_definition(*)
super
unless REQUIRED_ROLLOUT_TYPES.include?(required_rollout) || percent?(required_rollout)
@validation_errors << rollout_annotation_err_msg
end
strategy = @definition.dig('spec', 'strategy', 'type').to_s
if required_rollout.downcase == 'maxunavailable' && strategy.present? && strategy.downcase != 'rollingupdate'
@validation_errors << "'#{krane_annotation_key(REQUIRED_ROLLOUT_ANNOTATION_SUFFIX)}: #{required_rollout}' "\
"is incompatible with strategy '#{strategy}'"
end
@validation_errors.empty?
end
|