seira 0.4.7 → 0.4.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.rubocop.yml +1 -1
- data/.ruby-version +1 -1
- data/.travis.yml +1 -1
- data/lib/helpers.rb +5 -0
- data/lib/seira/pods.rb +74 -55
- data/lib/seira/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 48543d46e562c460bb07cd4e5264b381a9f8f290416fc9b49ed72f857c0082d9
|
4
|
+
data.tar.gz: 14866aed401685a325be5f8687ac799be8028a2607537ea7c0634331af7f9ad6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 867599d8ef0343d263432f3c0faac188864eb0df28bacbb381238669df373c9d9d5c5a9d2ec7dd02a633bbae40b7ba2559db8ee41a094f71c8ceb541d7a8b2d0
|
7
|
+
data.tar.gz: 2a8e70e9c427e1f718d85f538b1df7c0909e942e87cec9c575e9ee64a9560b2b7cd3a2bc2b801e5ab47d3a6d18f2245afdd6d0943ea9f2a4a3ac180853b043cf
|
data/.rubocop.yml
CHANGED
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.5.1
|
data/.travis.yml
CHANGED
data/lib/helpers.rb
CHANGED
@@ -17,6 +17,11 @@ module Seira
|
|
17
17
|
JSON.parse(output)['items']
|
18
18
|
end
|
19
19
|
|
20
|
+
def fetch_pod(name, context:)
|
21
|
+
output = Seira::Commands.kubectl("get pod #{name} -o json", context: context, return_output: true)
|
22
|
+
JSON.parse(output) unless output.empty?
|
23
|
+
end
|
24
|
+
|
20
25
|
def log_link(context:, query:)
|
21
26
|
link = context[:settings].log_link_format
|
22
27
|
return nil if link.nil?
|
data/lib/seira/pods.rb
CHANGED
@@ -82,69 +82,88 @@ module Seira
|
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
85
|
-
# If a pod name is specified,
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
if
|
90
|
-
|
91
|
-
|
92
|
-
|
85
|
+
# If a pod name is specified, find the pod with that name
|
86
|
+
existing_pod = Helpers.fetch_pod(pod_name, context: context) unless pod_name.to_s.empty?
|
87
|
+
|
88
|
+
# Use existing pod if found and not --dedicated
|
89
|
+
# Otherwise, connect to a random pod from the specified tier or the 'terminal' tier if unspecified
|
90
|
+
target_pod = if existing_pod && dedicated
|
91
|
+
puts "Cannot create new dedicated pod with name: #{pod_name}"
|
92
|
+
puts "A pod with this name already exists"
|
93
|
+
exit(1)
|
94
|
+
elsif existing_pod
|
95
|
+
existing_pod
|
96
|
+
elsif dedicated || pod_name.to_s.empty?
|
97
|
+
Helpers.fetch_pods(context: context, filters: { tier: tier || 'terminal' }).sample
|
98
|
+
else
|
99
|
+
puts 'Could not find pod to connect to'
|
100
|
+
exit(1)
|
101
|
+
end
|
93
102
|
|
94
103
|
if dedicated
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
104
|
+
new_pod = if pod_name.nil?
|
105
|
+
create_dedicated_pod(target_pod)
|
106
|
+
else
|
107
|
+
create_dedicated_pod(target_pod, pod_name)
|
108
|
+
end
|
109
|
+
|
110
|
+
connect_to_pod(new_pod, command)
|
111
|
+
clean_up_pod(new_pod)
|
112
|
+
else
|
113
|
+
# If we don't need a dedicated pod, it's way easier - just connect to the already running one
|
114
|
+
connect_to_pod(target_pod.dig('metadata', 'name'), command)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
# Create a dedicated temp pod to run in
|
119
|
+
# This is useful if you would like to have a persistent connection that doesn't get killed
|
120
|
+
# when someone updates the terminal deployment, or if you want to avoid noisy neighbors
|
121
|
+
# connected to the same pod.
|
122
|
+
def create_dedicated_pod(target_pod, pod_name = "temp-#{Random.unique_name}")
|
123
|
+
spec = target_pod['spec']
|
124
|
+
temp_pod = {
|
125
|
+
apiVersion: target_pod['apiVersion'],
|
126
|
+
kind: 'Pod',
|
127
|
+
spec: spec,
|
128
|
+
metadata: {
|
129
|
+
name: pod_name,
|
130
|
+
annotations: {
|
131
|
+
owner: Helpers.shell_username
|
112
132
|
}
|
113
133
|
}
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
134
|
+
}
|
135
|
+
# Don't restart the pod when it dies
|
136
|
+
spec['restartPolicy'] = 'Never'
|
137
|
+
# Overwrite container commands with something that times out, so if the client disconnects
|
138
|
+
# there's a limited amount of time that the temp pod is still taking up resources
|
139
|
+
# Note that this will break a pods which depends on containers running real commands, but
|
140
|
+
# for a simple terminal pod it's fine
|
141
|
+
spec['containers'].each do |container|
|
142
|
+
container['command'] = %w[sleep 86400] # 86400 seconds = 24 hours
|
143
|
+
end
|
123
144
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
145
|
+
puts 'Creating dedicated pod...'
|
146
|
+
unless system("kubectl --namespace=#{app} create -f - <<JSON\n#{temp_pod.to_json}\nJSON")
|
147
|
+
puts 'Failed to create dedicated pod'
|
148
|
+
exit(1)
|
149
|
+
end
|
129
150
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
151
|
+
print 'Waiting for dedicated pod to start...'
|
152
|
+
loop do
|
153
|
+
pod = JSON.parse(kubectl("get pods/#{pod_name} -o json", context: context, return_output: true))
|
154
|
+
break if pod['status']['phase'] == 'Running'
|
155
|
+
print '.'
|
156
|
+
sleep 1
|
157
|
+
end
|
158
|
+
print "\n"
|
138
159
|
|
139
|
-
|
160
|
+
pod_name
|
161
|
+
end
|
140
162
|
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
else
|
146
|
-
# If we don't need a dedicated pod, it's way easier - just connect to the already running one
|
147
|
-
connect_to_pod(target_pod.dig('metadata', 'name'), command)
|
163
|
+
# Clean up pod so it isn't taking up resources. Usually only for dedicated pods
|
164
|
+
def clean_up_pod(pod_name)
|
165
|
+
unless kubectl("delete pods/#{pod_name}", context: context)
|
166
|
+
puts 'Failed to delete temp pod'
|
148
167
|
end
|
149
168
|
end
|
150
169
|
|
data/lib/seira/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: seira
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Scott Ringwelski
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-05-
|
11
|
+
date: 2018-05-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: highline
|
@@ -158,7 +158,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
158
158
|
version: '0'
|
159
159
|
requirements: []
|
160
160
|
rubyforge_project:
|
161
|
-
rubygems_version: 2.6
|
161
|
+
rubygems_version: 2.7.6
|
162
162
|
signing_key:
|
163
163
|
specification_version: 4
|
164
164
|
summary: An opinionated library for building applications on Kubernetes.
|