Class: KubernetesDeploy::KubernetesResource
- Inherits:
-
Object
- Object
- KubernetesDeploy::KubernetesResource
show all
- Defined in:
- lib/kubernetes-deploy/kubernetes_resource.rb
Direct Known Subclasses
Bugsnag, Cloudsql, ConfigMap, Deployment, Ingress, PersistentVolumeClaim, Pod, PodDisruptionBudget, PodTemplate, Redis, ReplicaSet, Service, ServiceAccount
Defined Under Namespace
Classes: Event
Constant Summary
collapse
- TIMEOUT =
5.minutes
- LOG_LINE_COUNT =
250
- DEBUG_RESOURCE_NOT_FOUND_MESSAGE =
"None found. Please check your usual logging service (e.g. Splunk)."
- UNUSUAL_FAILURE_MESSAGE =
"It is very unusual for this resource type to fail to deploy. Please try the deploy again.\nIf that new deploy also fails, contact your cluster administrator.\n"
- STANDARD_TIMEOUT_MESSAGE =
"Kubernetes will continue to attempt to deploy this resource in the cluster, but at this point it is considered unlikely that it will succeed.\nIf you have reason to believe it will succeed, retry the deploy to continue to monitor the rollout.\n"
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
Constructor Details
#initialize(namespace:, context:, definition:, logger:) ⇒ KubernetesResource
Returns a new instance of KubernetesResource.
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
# File 'lib/kubernetes-deploy/kubernetes_resource.rb', line 45
def initialize(namespace:, context:, definition:, logger:)
@name = definition.dig("metadata", "name")
unless @name.present?
logger.summary.add_paragraph("Rendered template content:\n#{definition.to_yaml}")
raise FatalDeploymentError, "Template is missing required field metadata.name"
end
@namespace = namespace
@context = context
@logger = logger
@definition = definition
@statsd_report_done = false
end
|
Instance Attribute Details
#context ⇒ Object
Returns the value of attribute context.
9
10
11
|
# File 'lib/kubernetes-deploy/kubernetes_resource.rb', line 9
def context
@context
end
|
#deploy_started=(value) ⇒ Object
Sets the attribute deploy_started
10
11
12
|
# File 'lib/kubernetes-deploy/kubernetes_resource.rb', line 10
def deploy_started=(value)
@deploy_started = value
end
|
#name ⇒ Object
Returns the value of attribute name.
9
10
11
|
# File 'lib/kubernetes-deploy/kubernetes_resource.rb', line 9
def name
@name
end
|
#namespace ⇒ Object
Returns the value of attribute namespace.
9
10
11
|
# File 'lib/kubernetes-deploy/kubernetes_resource.rb', line 9
def namespace
@namespace
end
|
#type ⇒ Object
91
92
93
|
# File 'lib/kubernetes-deploy/kubernetes_resource.rb', line 91
def type
@type || self.class.name.split('::').last
end
|
Class Method Details
.build(namespace:, context:, definition:, logger:) ⇒ Object
25
26
27
28
29
30
31
32
33
34
35
|
# File 'lib/kubernetes-deploy/kubernetes_resource.rb', line 25
def self.build(namespace:, context:, definition:, logger:)
opts = { namespace: namespace, context: context, definition: definition, logger: logger }
if KubernetesDeploy.const_defined?(definition["kind"])
klass = KubernetesDeploy.const_get(definition["kind"])
klass.new(**opts)
else
inst = new(**opts)
inst.type = definition["kind"]
inst
end
end
|
.timeout ⇒ Object
37
38
39
|
# File 'lib/kubernetes-deploy/kubernetes_resource.rb', line 37
def self.timeout
self::TIMEOUT
end
|
Instance Method Details
#debug_message ⇒ Object
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
|
# File 'lib/kubernetes-deploy/kubernetes_resource.rb', line 114
def debug_message
helpful_info = []
if deploy_failed?
helpful_info << ColorizedString.new("#{id}: FAILED").red
helpful_info << failure_message if failure_message.present?
else
helpful_info << ColorizedString.new("#{id}: TIMED OUT").yellow + " (limit: #{timeout}s)"
helpful_info << timeout_message if timeout_message.present?
end
helpful_info << " - Final status: #{status}"
events = fetch_events
if events.present?
helpful_info << " - Events (common success events excluded):"
events.each do |identifier, event_hashes|
event_hashes.each { |event| helpful_info << " [#{identifier}]\t#{event}" }
end
else
helpful_info << " - Events: #{DEBUG_RESOURCE_NOT_FOUND_MESSAGE}"
end
if respond_to?(:fetch_logs)
container_logs = fetch_logs
if container_logs.blank? || container_logs.values.all?(&:blank?)
helpful_info << " - Logs: #{DEBUG_RESOURCE_NOT_FOUND_MESSAGE}"
else
sorted_logs = container_logs.sort_by { |_, log_lines| log_lines.length }
sorted_logs.each do |identifier, log_lines|
if log_lines.empty?
helpful_info << " - Logs from container '#{identifier}': #{DEBUG_RESOURCE_NOT_FOUND_MESSAGE}"
next
end
helpful_info << " - Logs from container '#{identifier}' (last #{LOG_LINE_COUNT} lines shown):"
log_lines.each do |line|
helpful_info << " #{line}"
end
end
end
end
helpful_info.join("\n")
end
|
#deploy_failed? ⇒ Boolean
71
72
73
|
# File 'lib/kubernetes-deploy/kubernetes_resource.rb', line 71
def deploy_failed?
false
end
|
#deploy_finished? ⇒ Boolean
95
96
97
|
# File 'lib/kubernetes-deploy/kubernetes_resource.rb', line 95
def deploy_finished?
deploy_failed? || deploy_succeeded? || deploy_timed_out?
end
|
#deploy_method ⇒ Object
Expected values: :apply, :replace, :replace_force
109
110
111
112
|
# File 'lib/kubernetes-deploy/kubernetes_resource.rb', line 109
def deploy_method
tpr? ? :replace : :apply
end
|
#deploy_succeeded? ⇒ Boolean
75
76
77
78
79
80
81
|
# File 'lib/kubernetes-deploy/kubernetes_resource.rb', line 75
def deploy_succeeded?
if @deploy_started && !@success_assumption_warning_shown
@logger.warn("Don't know how to monitor resources of type #{type}. Assuming #{id} deployed successfully.")
@success_assumption_warning_shown = true
end
true
end
|
#deploy_timed_out? ⇒ Boolean
99
100
101
102
|
# File 'lib/kubernetes-deploy/kubernetes_resource.rb', line 99
def deploy_timed_out?
return false unless @deploy_started
!deploy_succeeded? && !deploy_failed? && (Time.now.utc - @deploy_started > timeout)
end
|
#exists? ⇒ Boolean
83
84
85
|
# File 'lib/kubernetes-deploy/kubernetes_resource.rb', line 83
def exists?
nil
end
|
#failure_message ⇒ Object
180
181
|
# File 'lib/kubernetes-deploy/kubernetes_resource.rb', line 180
def failure_message
end
|
#fetch_events ⇒ Object
Returns a hash in the following format:
"pod/web-1" => [
"Pulling: pulling image "hello-world:latest" (1 events)",
"Pulled: Successfully pulled image "hello-world:latest" (1 events)"
]
165
166
167
168
169
170
171
172
173
174
|
# File 'lib/kubernetes-deploy/kubernetes_resource.rb', line 165
def fetch_events
return {} unless exists?
out, _err, st = kubectl.run("get", "events", "--output=go-template=#{Event.go_template_for(type, name)}")
return {} unless st.success?
event_collector = Hash.new { |hash, key| hash[key] = [] }
Event.(out).each_with_object(event_collector) do |candidate, events|
events[id] << candidate.to_s if candidate.seen_since?(@deploy_started - 5.seconds)
end
end
|
#file_path ⇒ Object
64
65
66
|
# File 'lib/kubernetes-deploy/kubernetes_resource.rb', line 64
def file_path
file.path
end
|
#id ⇒ Object
60
61
62
|
# File 'lib/kubernetes-deploy/kubernetes_resource.rb', line 60
def id
"#{type}/#{name}"
end
|
#kubectl ⇒ Object
189
190
191
|
# File 'lib/kubernetes-deploy/kubernetes_resource.rb', line 189
def kubectl
@kubectl ||= Kubectl.new(namespace: @namespace, context: @context, logger: @logger, log_failure_by_default: false)
end
|
#pretty_status ⇒ Object
183
184
185
186
187
|
# File 'lib/kubernetes-deploy/kubernetes_resource.rb', line 183
def pretty_status
padding = " " * [50 - id.length, 1].max
msg = exists? ? status : "not found"
"#{id}#{padding}#{msg}"
end
|
#report_status_to_statsd(watch_time) ⇒ Object
193
194
195
196
197
198
|
# File 'lib/kubernetes-deploy/kubernetes_resource.rb', line 193
def report_status_to_statsd(watch_time)
unless @statsd_report_done
::StatsD.measure('resource.duration', watch_time, tags: statsd_tags)
@statsd_report_done = true
end
end
|
#status ⇒ Object
87
88
89
|
# File 'lib/kubernetes-deploy/kubernetes_resource.rb', line 87
def status
@status ||= "Unknown"
end
|
#sync ⇒ Object
68
69
|
# File 'lib/kubernetes-deploy/kubernetes_resource.rb', line 68
def sync
end
|
#timeout ⇒ Object
41
42
43
|
# File 'lib/kubernetes-deploy/kubernetes_resource.rb', line 41
def timeout
self.class.timeout
end
|
#timeout_message ⇒ Object
176
177
178
|
# File 'lib/kubernetes-deploy/kubernetes_resource.rb', line 176
def timeout_message
STANDARD_TIMEOUT_MESSAGE
end
|
#tpr? ⇒ Boolean
104
105
106
|
# File 'lib/kubernetes-deploy/kubernetes_resource.rb', line 104
def tpr?
false
end
|