kubernetes-operator 0.0.3 → 0.0.4
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 +4 -4
- data/lib/kubernetes-operator.rb +139 -55
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1381c210b1d1b87dececde16b1f04cfcf661a0bf3352833ba427f34eb8cabadd
|
4
|
+
data.tar.gz: 565c20d59f1dec816b089ec31ef398cb4bf93c98dbaa605c2374ccaf23c4c216
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9e55012c03c012bfb6f349446b58a39efca9672e0ec00f7a559f906e1b4a0fc9a02dc7a4a93c4d360faeb56448295a5217aa0322a9e7cd1638f6b51c6447842e
|
7
|
+
data.tar.gz: 34666b517622bbf9e759fedd5ca375187c30a4e72c15bb134519bd085634cca84ffba4019420e6492d9a74070a87791375f50eabfe323d74f3f262ebd4be6d65
|
data/lib/kubernetes-operator.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/local/bin/ruby
|
2
2
|
|
3
3
|
## kubernetes
|
4
|
-
require '
|
4
|
+
require 'kubeclient'
|
5
5
|
|
6
6
|
## storage
|
7
7
|
require 'yaml'
|
@@ -24,6 +24,7 @@ class KubernetesOperator
|
|
24
24
|
# default config
|
25
25
|
@options = options
|
26
26
|
@options[:sleepTimer] ||= 10
|
27
|
+
@options[:namespace] ||= nil
|
27
28
|
|
28
29
|
# create persistence
|
29
30
|
@options[:persistence_location] ||= "/tmp/persistence"
|
@@ -41,13 +42,30 @@ class KubernetesOperator
|
|
41
42
|
# kubeconfig
|
42
43
|
# (for local development it's nice to use .kube/config)
|
43
44
|
if File.exist?("#{Dir.home}/.kube/config")
|
44
|
-
@
|
45
|
-
|
46
|
-
|
47
|
-
|
45
|
+
@logger.info("use local kube config")
|
46
|
+
config = Kubeclient::Config.read(ENV['KUBECONFIG'] || "#{ENV['HOME']}/.kube/config")
|
47
|
+
context = config.context
|
48
|
+
@k8sclient = Kubeclient::Client.new(
|
49
|
+
context.api_endpoint+"/apis/"+@crdGroup,
|
50
|
+
@crdVersion,
|
51
|
+
ssl_options: context.ssl_options,
|
52
|
+
auth_options: context.auth_options
|
48
53
|
)
|
49
54
|
else
|
50
|
-
@
|
55
|
+
@logger.info("use incluster config")
|
56
|
+
auth_options = {
|
57
|
+
bearer_token_file: '/var/run/secrets/kubernetes.io/serviceaccount/token'
|
58
|
+
}
|
59
|
+
ssl_options = {}
|
60
|
+
if File.exist?("/var/run/secrets/kubernetes.io/serviceaccount/ca.crt")
|
61
|
+
ssl_options[:ca_file] = "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
|
62
|
+
end
|
63
|
+
@k8sclient = Kubeclient::Client.new(
|
64
|
+
'https://kubernetes.default.svc/apis/'+@crdGroup,
|
65
|
+
@crdVersion,
|
66
|
+
auth_options: auth_options,
|
67
|
+
ssl_options: ssl_options
|
68
|
+
)
|
51
69
|
end
|
52
70
|
end
|
53
71
|
|
@@ -86,64 +104,130 @@ class KubernetesOperator
|
|
86
104
|
while true
|
87
105
|
|
88
106
|
begin
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
@store.
|
107
|
+
if @options[:namespace]
|
108
|
+
watcher = @k8sclient.watch_entities(@crdPlural,@options[:namespace])
|
109
|
+
else
|
110
|
+
watcher = @k8sclient.watch_entities(@crdPlural)
|
111
|
+
end
|
112
|
+
watcher.each do |notice|
|
113
|
+
begin
|
114
|
+
isCached = @store.transaction{@store[notice[:object][:metadata][:uid]]}
|
115
|
+
case notice[:type]
|
116
|
+
# new cr was added
|
117
|
+
when "ADDED"
|
118
|
+
# check if version is already processed
|
119
|
+
unless isCached
|
120
|
+
# add finalizer
|
121
|
+
@logger.info("add finalizer to #{notice[:object][:metadata][:name]} (#{notice[:object][:metadata][:uid]})")
|
122
|
+
patched = @k8sclient.patch_entity(@crdPlural,notice[:object][:metadata][:name], {metadata: {finalizers: ["#{@crdPlural}.#{@crdVersion}.#{@crdGroup}"]}},'merge-patch',@options[:namespace])
|
123
|
+
# trigger action
|
124
|
+
@logger.info("trigger add action for #{notice[:object][:metadata][:name]} (#{notice[:object][:metadata][:uid]})")
|
125
|
+
@addMethod.call(notice[:object],@k8sclient)
|
126
|
+
# save version
|
127
|
+
@store.transaction do
|
128
|
+
@store[patched[:metadata][:uid]] = patched[:metadata][:resourceVersion]
|
129
|
+
@store.commit
|
130
|
+
end
|
131
|
+
else
|
132
|
+
@logger.info("skip add action for #{notice[:object][:metadata][:name]} (#{notice[:object][:metadata][:uid]}), found version in cache")
|
110
133
|
end
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
# remove finalizers
|
122
|
-
_i[:metadata][:finalizers] = []
|
123
|
-
@k8sclient.api(@crdGroup+"/"+@crdVersion).resource(@crdPlural).update_resource(_i)
|
124
|
-
|
125
|
-
# call the action method
|
126
|
-
_i["metadata"]["crd_status"] = "delete"
|
127
|
-
@logger.info("delete custom resource #{_i["metadata"]["name"]}@#{_i["metadata"]["namespace"]}") if _i["metadata"]["namespace"]
|
128
|
-
@logger.info("delete custom resource #{_i["metadata"]["name"]}@cluster") unless _i["metadata"]["namespace"]
|
129
|
-
@deleteMethod.call(_i,@k8sclient)
|
130
|
-
else
|
131
|
-
# store new version in cache
|
134
|
+
# cr was change or deleted (if finalizer is set, it an modified call, not an delete)
|
135
|
+
when "MODIFIED"
|
136
|
+
# check if version is already processed
|
137
|
+
if isCached != notice[:object][:metadata][:resourceVersion]
|
138
|
+
# check if it's an delete event
|
139
|
+
unless notice[:object][:metadata][:deletionTimestamp]
|
140
|
+
# trigger action
|
141
|
+
@logger.info("trigger update action for #{notice[:object][:metadata][:name]} (#{notice[:object][:metadata][:uid]})")
|
142
|
+
@updateMethod.call(notice[:object],@k8sclient)
|
143
|
+
# save version
|
132
144
|
@store.transaction do
|
133
|
-
@store[
|
145
|
+
@store[notice[:object][:metadata][:uid]] = notice[:object][:metadata][:resourceVersion]
|
134
146
|
@store.commit
|
135
147
|
end
|
136
|
-
|
137
|
-
#
|
138
|
-
|
139
|
-
@
|
140
|
-
|
141
|
-
@
|
148
|
+
else
|
149
|
+
# trigger action
|
150
|
+
@logger.info("trigger delete action for #{notice[:object][:metadata][:name]} (#{notice[:object][:metadata][:uid]})")
|
151
|
+
@updateMethod.call(notice[:object],@k8sclient)
|
152
|
+
# remove finalizer
|
153
|
+
@logger.info("remove finalizer to #{notice[:object][:metadata][:name]} (#{notice[:object][:metadata][:uid]})")
|
154
|
+
patched = @k8sclient.patch_entity(@crdPlural,notice[:object][:metadata][:name], {metadata: {finalizers: nil}},'merge-patch',@options[:namespace])
|
142
155
|
end
|
156
|
+
else
|
157
|
+
@logger.info("skip update action for #{notice[:object][:metadata][:name]} (#{notice[:object][:metadata][:uid]}), found version in cache")
|
143
158
|
end
|
159
|
+
when "DELETED"
|
160
|
+
@logger.info("#{notice[:object][:metadata][:name]} (#{notice[:object][:metadata][:uid]}) is done")
|
161
|
+
else
|
162
|
+
@logger.info("strange things are going on here, I found the type "+notice[:type])
|
144
163
|
end
|
164
|
+
rescue => exception
|
165
|
+
@logger.error(exception.inspect)
|
145
166
|
end
|
146
167
|
end
|
168
|
+
watcher.finish
|
169
|
+
|
170
|
+
## Search for ressources
|
171
|
+
#_ressources = @k8sclient.get(@crdGroup+"/"+@crdVersion).resource(@crdPlural).list()
|
172
|
+
|
173
|
+
#_ressources.each do |_i|
|
174
|
+
# _uid = _i["metadata"]["uid"]
|
175
|
+
# _v = _i["metadata"]["resourceVersion"]
|
176
|
+
|
177
|
+
# if @options[:namespace] == nil || @options[:namespace].contains(_i["metadata"]["namespace"])
|
178
|
+
# _from_cache = @store.transaction{@store[_uid]}
|
179
|
+
|
180
|
+
# unless _from_cache
|
181
|
+
# # Add finalizer and refresh version number
|
182
|
+
# _i[:metadata][:finalizers] = ["#{@crdPlural}.#{@crdVersion}.#{@crdGroup}"]
|
183
|
+
# _i = @k8sclient.api(@crdGroup+"/"+@crdVersion).resource(@crdPlural).update_resource(_i)
|
184
|
+
|
185
|
+
# # call the action method
|
186
|
+
# _i["metadata"]["crd_status"] = "add"
|
187
|
+
# @logger.info("add custom resource #{_i["metadata"]["name"]}@#{_i["metadata"]["namespace"]}") if _i["metadata"]["namespace"]
|
188
|
+
# @logger.info("add custom resource #{_i["metadata"]["name"]}@cluster") unless _i["metadata"]["namespace"]
|
189
|
+
# @addMethod.call(_i,@k8sclient)
|
190
|
+
|
191
|
+
# # update status
|
192
|
+
# _i[:status] = {message: "Test"}
|
193
|
+
# _i = @k8sclient.api(@crdGroup+"/"+@crdVersion).resource(@crdPlural).update_resource(_i)
|
194
|
+
|
195
|
+
# # Cache last version of ressources
|
196
|
+
# @store.transaction do
|
197
|
+
# @store[_uid] = _i["metadata"]["resourceVersion"]
|
198
|
+
# @store.commit
|
199
|
+
# end
|
200
|
+
|
201
|
+
# else
|
202
|
+
# # only trigger action on change or delete event
|
203
|
+
# unless _from_cache == _v
|
204
|
+
# if _i["metadata"]["deletionTimestamp"]
|
205
|
+
# # remove finalizers
|
206
|
+
# _i[:metadata][:finalizers] = []
|
207
|
+
# @k8sclient.api(@crdGroup+"/"+@crdVersion).resource(@crdPlural).update_resource(_i)
|
208
|
+
|
209
|
+
# # call the action method
|
210
|
+
# _i["metadata"]["crd_status"] = "delete"
|
211
|
+
# @logger.info("delete custom resource #{_i["metadata"]["name"]}@#{_i["metadata"]["namespace"]}") if _i["metadata"]["namespace"]
|
212
|
+
# @logger.info("delete custom resource #{_i["metadata"]["name"]}@cluster") unless _i["metadata"]["namespace"]
|
213
|
+
# @deleteMethod.call(_i,@k8sclient)
|
214
|
+
# else
|
215
|
+
# # store new version in cache
|
216
|
+
# @store.transaction do
|
217
|
+
# @store[_uid] = _v
|
218
|
+
# @store.commit
|
219
|
+
# end
|
220
|
+
|
221
|
+
# # call the action method
|
222
|
+
# _i["metadata"]["crd_status"] = "update"
|
223
|
+
# @logger.info("update custom resource #{_i["metadata"]["name"]}@#{_i["metadata"]["namespace"]}") if _i["metadata"]["namespace"]
|
224
|
+
# @logger.info("update custom resource #{_i["metadata"]["name"]}@cluster") unless _i["metadata"]["namespace"]
|
225
|
+
# @updateMethod.call(_i,@k8sclient)
|
226
|
+
# end
|
227
|
+
# end
|
228
|
+
# end
|
229
|
+
# end
|
230
|
+
#end
|
147
231
|
|
148
232
|
rescue => exception
|
149
233
|
@logger.error(exception.inspect)
|
metadata
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kubernetes-operator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tobias Kuntzsch
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-03-
|
11
|
+
date: 2020-03-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: kubeclient
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|