kubernetes-operator 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/kubernetes-operator.rb +139 -55
  3. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 353a5f5b4f17f95efd27083d1ba6e5f80d50d63b7dd62a5392e1440b66f40706
4
- data.tar.gz: 92758fa35f611c64d8bbd99edb0b03e9c24b7637c47e427722cadf50340276e9
3
+ metadata.gz: 1381c210b1d1b87dececde16b1f04cfcf661a0bf3352833ba427f34eb8cabadd
4
+ data.tar.gz: 565c20d59f1dec816b089ec31ef398cb4bf93c98dbaa605c2374ccaf23c4c216
5
5
  SHA512:
6
- metadata.gz: 274e13ddf21260eb78d46b2e8a2f4acd886a0ecf620ff35cbb383eba98b34afc05c7d8ec2fb93cce758920d870531b708ebe0b2ac584685b01fe36098f6a54b4
7
- data.tar.gz: 341e4cc1f336fa7bf9cabc64f5bce171472eb189a75466cf3bc59af40ed3a0b80c33e1bf17681ef24b5bda7ada48f4874e445363d3fafdc3972edf1450c141b1
6
+ metadata.gz: 9e55012c03c012bfb6f349446b58a39efca9672e0ec00f7a559f906e1b4a0fc9a02dc7a4a93c4d360faeb56448295a5217aa0322a9e7cd1638f6b51c6447842e
7
+ data.tar.gz: 34666b517622bbf9e759fedd5ca375187c30a4e72c15bb134519bd085634cca84ffba4019420e6492d9a74070a87791375f50eabfe323d74f3f262ebd4be6d65
@@ -1,7 +1,7 @@
1
1
  #!/usr/local/bin/ruby
2
2
 
3
3
  ## kubernetes
4
- require 'k8s-client'
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
- @k8sclient = K8s::Client.config(
45
- K8s::Config.load_file(
46
- File.expand_path '~/.kube/config'
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
- @k8sclient = K8s::Client.in_cluster_config
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
- # Search for ressources
91
- _ressources = @k8sclient.api(@crdGroup+"/"+@crdVersion).resource(@crdPlural).list()
92
-
93
- _ressources.each do |_i|
94
- _uid = _i["metadata"]["uid"]
95
- _v = _i["metadata"]["resourceVersion"]
96
-
97
- if @options[:namespace] == nil || @options[:namespace].contains(_i["metadata"]["namespace"])
98
- _from_cache = @store.transaction{@store[_uid]}
99
-
100
- unless _from_cache
101
- # Add finalizer and refresh version number
102
- _i[:metadata][:finalizers] = ["#{@crdPlural}.#{@crdVersion}.#{@crdGroup}"]
103
- _i2 = @k8sclient.api(@crdGroup+"/"+@crdVersion).resource(@crdPlural).update_resource(_i)
104
- _v = _i2["metadata"]["resourceVersion"]
105
-
106
- # Cache last version of ressources
107
- @store.transaction do
108
- @store[_uid] = _v
109
- @store.commit
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
- # call the action method
113
- _i["metadata"]["crd_status"] = "add"
114
- @logger.info("add custom resource #{_i["metadata"]["name"]}@#{_i["metadata"]["namespace"]}") if _i["metadata"]["namespace"]
115
- @logger.info("add custom resource #{_i["metadata"]["name"]}@cluster") unless _i["metadata"]["namespace"]
116
- @addMethod.call(_i,@k8sclient)
117
- else
118
- # only trigger action on change or delete event
119
- unless _from_cache == _v
120
- if _i["metadata"]["deletionTimestamp"]
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[_uid] = _v
145
+ @store[notice[:object][:metadata][:uid]] = notice[:object][:metadata][:resourceVersion]
134
146
  @store.commit
135
147
  end
136
-
137
- # call the action method
138
- _i["metadata"]["crd_status"] = "update"
139
- @logger.info("update custom resource #{_i["metadata"]["name"]}@#{_i["metadata"]["namespace"]}") if _i["metadata"]["namespace"]
140
- @logger.info("update custom resource #{_i["metadata"]["name"]}@cluster") unless _i["metadata"]["namespace"]
141
- @updateMethod.call(_i,@k8sclient)
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.3
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-28 00:00:00.000000000 Z
11
+ date: 2020-03-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: k8s-client
14
+ name: kubeclient
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="