kubernetes-operator 0.0.2 → 0.0.3
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 +96 -64
- metadata +30 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 353a5f5b4f17f95efd27083d1ba6e5f80d50d63b7dd62a5392e1440b66f40706
|
4
|
+
data.tar.gz: 92758fa35f611c64d8bbd99edb0b03e9c24b7637c47e427722cadf50340276e9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 274e13ddf21260eb78d46b2e8a2f4acd886a0ecf620ff35cbb383eba98b34afc05c7d8ec2fb93cce758920d870531b708ebe0b2ac584685b01fe36098f6a54b4
|
7
|
+
data.tar.gz: 341e4cc1f336fa7bf9cabc64f5bce171472eb189a75466cf3bc59af40ed3a0b80c33e1bf17681ef24b5bda7ada48f4874e445363d3fafdc3972edf1450c141b1
|
data/lib/kubernetes-operator.rb
CHANGED
@@ -1,36 +1,52 @@
|
|
1
1
|
#!/usr/local/bin/ruby
|
2
2
|
|
3
|
+
## kubernetes
|
3
4
|
require 'k8s-client'
|
5
|
+
|
6
|
+
## storage
|
4
7
|
require 'yaml'
|
5
8
|
require 'yaml/store'
|
6
|
-
require 'json'
|
7
9
|
|
10
|
+
## logging
|
11
|
+
require 'log4r'
|
12
|
+
require 'log_formatter'
|
13
|
+
require 'log_formatter/log4r_json_formatter'
|
14
|
+
require 'json'
|
8
15
|
|
9
16
|
class KubernetesOperator
|
10
17
|
|
11
|
-
def initialize(crdGroup, crdVersion, crdPlural)
|
18
|
+
def initialize(crdGroup, crdVersion, crdPlural, options = {} )
|
12
19
|
# parameter
|
13
20
|
@crdGroup = crdGroup
|
14
21
|
@crdVersion = crdVersion
|
15
22
|
@crdPlural = crdPlural
|
16
23
|
|
17
24
|
# default config
|
18
|
-
@
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
+
@options = options
|
26
|
+
@options[:sleepTimer] ||= 10
|
27
|
+
|
28
|
+
# create persistence
|
29
|
+
@options[:persistence_location] ||= "/tmp/persistence"
|
30
|
+
Dir.mkdir(@options[:persistence_location]) unless File.exists?(@options[:persistence_location])
|
31
|
+
@store = YAML::Store.new("#{@options[:persistence_location]}/#{@crdGroup}_#{@crdVersion}_#{@crdPlural}.yaml")
|
32
|
+
|
33
|
+
# logging
|
34
|
+
@logger = Log4r::Logger.new('Log4RTest')
|
35
|
+
outputter = Log4r::StdoutOutputter.new(
|
36
|
+
"console",
|
37
|
+
:formatter => Log4r::JSONFormatter::Base.new("#{crdPlural}.#{@crdGroup}/#{@crdVersion}")
|
38
|
+
)
|
39
|
+
@logger.add(outputter)
|
40
|
+
|
41
|
+
# kubeconfig
|
42
|
+
# (for local development it's nice to use .kube/config)
|
25
43
|
if File.exist?("#{Dir.home}/.kube/config")
|
26
|
-
puts '{leve: "info", message: "found kubeconfig in home directory"}'
|
27
44
|
@k8sclient = K8s::Client.config(
|
28
45
|
K8s::Config.load_file(
|
29
46
|
File.expand_path '~/.kube/config'
|
30
47
|
)
|
31
48
|
)
|
32
49
|
else
|
33
|
-
puts '{leve: "info", message: "use in cluster configuration"}'
|
34
50
|
@k8sclient = K8s::Client.in_cluster_config
|
35
51
|
end
|
36
52
|
end
|
@@ -44,91 +60,107 @@ class KubernetesOperator
|
|
44
60
|
@updateMethod = callback
|
45
61
|
end
|
46
62
|
|
47
|
-
def
|
48
|
-
@
|
49
|
-
|
50
|
-
|
51
|
-
def defaultActionMethod(obj,k8sclient)
|
52
|
-
puts "{leve: \"info\", action: \"#{obj["metadata"]["crd_status"]}\", ressource: \"#{obj["metadata"]["namespace"]}/#{obj["metadata"]["name"]}\"}"
|
63
|
+
def setUpsertMethod(callback)
|
64
|
+
@updateMethod = callback
|
65
|
+
@addMethod = callback
|
53
66
|
end
|
54
67
|
|
55
|
-
|
56
|
-
|
57
|
-
@sleepTimer = nr
|
68
|
+
def setDeleteMethod(callback)
|
69
|
+
@deleteMethod = callback
|
58
70
|
end
|
59
71
|
|
60
|
-
|
61
|
-
|
72
|
+
# Logger Methods
|
73
|
+
def getLogger()
|
74
|
+
return @logger
|
62
75
|
end
|
63
76
|
|
64
|
-
|
65
77
|
# Controller
|
66
78
|
def run
|
67
79
|
|
80
|
+
@logger.info("start the operator")
|
81
|
+
# load methods
|
68
82
|
@addMethod = method(:defaultActionMethod) unless @addMethod
|
69
83
|
@updateMethod = method(:defaultActionMethod) unless @updateMethod
|
70
84
|
@deleteMethod = method(:defaultActionMethod) unless @deleteMethod
|
71
85
|
|
72
86
|
while true
|
73
87
|
|
74
|
-
|
75
|
-
_ressources = @k8sclient.api(@crdGroup+"/"+@crdVersion).resource(@crdPlural).list()
|
88
|
+
begin
|
76
89
|
|
77
|
-
|
78
|
-
|
79
|
-
_v = _i["metadata"]["resourceVersion"]
|
90
|
+
# Search for ressources
|
91
|
+
_ressources = @k8sclient.api(@crdGroup+"/"+@crdVersion).resource(@crdPlural).list()
|
80
92
|
|
81
|
-
|
82
|
-
|
93
|
+
_ressources.each do |_i|
|
94
|
+
_uid = _i["metadata"]["uid"]
|
95
|
+
_v = _i["metadata"]["resourceVersion"]
|
83
96
|
|
84
|
-
|
85
|
-
|
86
|
-
_i[:metadata][:finalizers] = ["#{@crdPlural}.#{@crdVersion}.#{@crdGroup}"]
|
87
|
-
_i2 = @k8sclient.api(@crdGroup+"/"+@crdVersion).resource(@crdPlural).update_resource(_i)
|
88
|
-
_v = _i2["metadata"]["resourceVersion"]
|
97
|
+
if @options[:namespace] == nil || @options[:namespace].contains(_i["metadata"]["namespace"])
|
98
|
+
_from_cache = @store.transaction{@store[_uid]}
|
89
99
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
@
|
94
|
-
|
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"]
|
95
105
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
unless _from_cache == _v
|
102
|
-
if _i["metadata"]["deletionTimestamp"]
|
103
|
-
# remove finalizers
|
104
|
-
_i[:metadata][:finalizers] = []
|
105
|
-
@k8sclient.api(@crdGroup+"/"+@crdVersion).resource(@crdPlural).update_resource(_i)
|
106
|
-
|
107
|
-
# call the action method
|
108
|
-
_i["metadata"]["crd_status"] = "delete"
|
109
|
-
@deleteMethod.call(_i,@k8sclient)
|
110
|
-
else
|
111
|
-
# store new version in cache
|
112
|
-
@store.transaction do
|
113
|
-
@store[_uid] = _v
|
114
|
-
@store.commit
|
115
|
-
end
|
106
|
+
# Cache last version of ressources
|
107
|
+
@store.transaction do
|
108
|
+
@store[_uid] = _v
|
109
|
+
@store.commit
|
110
|
+
end
|
116
111
|
|
117
|
-
|
118
|
-
|
119
|
-
|
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
|
132
|
+
@store.transaction do
|
133
|
+
@store[_uid] = _v
|
134
|
+
@store.commit
|
135
|
+
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)
|
142
|
+
end
|
120
143
|
end
|
121
144
|
end
|
122
145
|
end
|
123
146
|
end
|
147
|
+
|
148
|
+
rescue => exception
|
149
|
+
@logger.error(exception.inspect)
|
124
150
|
end
|
125
151
|
|
126
152
|
# Done
|
127
|
-
sleep @sleepTimer
|
153
|
+
sleep @options[:sleepTimer]
|
128
154
|
|
129
155
|
end
|
130
156
|
end
|
157
|
+
|
158
|
+
private
|
159
|
+
def defaultActionMethod(obj,k8sclient)
|
160
|
+
puts "{leve: \"info\", action: \"#{obj["metadata"]["crd_status"]}\", ressource: \"#{obj["metadata"]["namespace"]}/#{obj["metadata"]["name"]}\"}"
|
161
|
+
end
|
131
162
|
end
|
132
163
|
|
133
164
|
|
134
165
|
|
166
|
+
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
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.3
|
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-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: k8s-client
|
@@ -24,6 +24,34 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: log4r
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: log_formatter
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
27
55
|
description: Libary to create an kubernetes operator with ruby
|
28
56
|
email: mail@tobiaskuntzsch.de
|
29
57
|
executables: []
|