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.
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
  - - ">="