Class: PicsolveDockerBuilder::Helpers::KubernetesManager
- Inherits:
-
Object
- Object
- PicsolveDockerBuilder::Helpers::KubernetesManager
show all
- Includes:
- Base
- Defined in:
- lib/picsolve_docker_builder/helpers/kubernetes_manager.rb
Overview
Ruby representation of a kuberentes cluster
Instance Attribute Summary collapse
Instance Method Summary
collapse
Methods included from Base
#base_dir, #config, #config_file, #config_path, #create_logger, #default_config, #log, #read_config, #validate_config
Constructor Details
#initialize(composer, host, type = nil, port = nil) ⇒ KubernetesManager
Returns a new instance of KubernetesManager.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 16
def initialize(composer, host, type = nil, port = nil)
type ||= :http
if type == :ssh_forward
@type = type
@port = port || 22
end
if type == :http
@type = type
@port = port || 8080
end
@host = host
@composer = composer
end
|
Instance Attribute Details
#host ⇒ Object
Returns the value of attribute host.
14
15
16
|
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 14
def host
@host
end
|
#port ⇒ Object
Returns the value of attribute port.
14
15
16
|
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 14
def port
@port
end
|
#type ⇒ Object
Returns the value of attribute type.
14
15
16
|
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 14
def type
@type
end
|
Instance Method Details
#app_name ⇒ Object
84
85
86
|
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 84
def app_name
@composer.app_name
end
|
#client ⇒ Object
76
77
78
|
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 76
def client
@client ||= create_client
end
|
#create_client ⇒ Object
38
39
40
|
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 38
def create_client
Kubeclient::Client.new kubernetes_url, 'v1'
end
|
#deploy ⇒ Object
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 138
def deploy
log.info "start deploying app_name=#{app_name} to stage #{stage}"
@hash = nil
deploy_services
deploy_rcs
successful_images, unready_images = wait_for_deployed_rcs
remove_old_rcs(successful_images)
fail "Failed to deploy this service: #{unready_images.map(&:name)}" \
if unready_images.length > 0
end
|
#deploy_rcs ⇒ Object
162
163
164
165
166
|
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 162
def deploy_rcs
images.each do |i|
i.rc(self).deploy
end
end
|
#deploy_services ⇒ Object
156
157
158
159
160
|
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 156
def deploy_services
images.each do |i|
i.service(self).deploy
end
end
|
#images ⇒ Object
80
81
82
|
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 80
def images
@composer.images
end
|
#kubernetes_url ⇒ Object
42
43
44
45
46
47
48
|
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 42
def kubernetes_url
if type == :ssh_forward
kubernetes_url_ssh_forward
elsif type == :http
kubernetes_url_http
end
end
|
#kubernetes_url_http ⇒ Object
50
51
52
|
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 50
def kubernetes_url_http
"http://#{host}:#{port}"
end
|
#kubernetes_url_ssh_forward ⇒ Object
63
64
65
66
67
68
69
70
71
72
73
74
|
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 63
def kubernetes_url_ssh_forward
@ssh = SshConnection.new(
ssh_host: host,
ssh_port: port
)
forward = @ssh.forward('127.0.0.1', 8080, 10_000)
@ssh.start
at_exit do
kubernetes_url_ssh_forward_stop
end
"http://127.0.0.1:#{forward.local_port}"
end
|
#kubernetes_url_ssh_forward_stop ⇒ Object
54
55
56
57
|
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 54
def kubernetes_url_ssh_forward_stop
@ssh.stop unless @ssh_forward.nil?
@ssh = nil
end
|
#rc(image) ⇒ Object
96
97
98
|
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 96
def rc(image)
Kubernetes::Rc.new(image, self)
end
|
#remove_old_rcs(successful_images) ⇒ Object
128
129
130
131
132
133
134
135
136
|
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 128
def remove_old_rcs(successful_images)
successful_images.each do |i|
log.debug "Remove old pods for #{i.name}"
i.rc(self).remove_old_rcs
log.debug "Remove orphaned pods for #{i.name}"
i.rc(self).remove_pods_orphan
end
end
|
#service(image) ⇒ Object
92
93
94
|
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 92
def service(image)
Kubernetes::Service.new(image, self)
end
|
#stage ⇒ Object
88
89
90
|
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 88
def stage
@composer.stage
end
|
#stop ⇒ Object
59
60
61
|
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 59
def stop
kubernetes_url_ssh_forward_stop if type == :ssh_forward
end
|
#template_labels(i) ⇒ Object
174
175
176
177
178
179
180
|
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 174
def template_labels(i)
{
'name' => i.name,
'app_name' => i.composer.app_name,
'stage' => i.composer.stage
}
end
|
#template_labels_pods(i) ⇒ Object
168
169
170
171
172
|
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 168
def template_labels_pods(i)
c = template_labels(i)
c['deployment'] = i.composer.hash
c
end
|
#user ⇒ Object
34
35
36
|
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 34
def user
'core'
end
|
#wait_for_deployed_rcs ⇒ Object
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 100
def wait_for_deployed_rcs
wait_timeout = 300
wait_sleep = 2
wait_beginning = 15
wait_count = wait_beginning
unready_images = images.dup
log.info \
'Wait for the new pods to be up and running for at least 20 seconds'
sleep wait_beginning
loop do
unready_images.each do |i|
unready_images.delete(i) if i.rc(self).ready?
end
log.debug "Still waiting for: #{unready_images.map(&:name)}"
$stdout.flush
$stderr.flush
wait_count += wait_sleep
break if wait_count > wait_timeout
break if unready_images.length == 0
sleep wait_sleep
end
successful_images = images.dup
unready_images.each do |u|
successful_images.delete(u)
end
[successful_images, unready_images]
end
|