kubernetes-operator 0.0.2 → 0.0.3

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 +96 -64
  3. metadata +30 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fea623164ec2a233bfca10f01311607bb48ccc75bbb5608d0c119cd551a86699
4
- data.tar.gz: 52bb5c2f22dfd0af819f98f61a47a66a8109f4006b2b5b7efb209c73b25f08cb
3
+ metadata.gz: 353a5f5b4f17f95efd27083d1ba6e5f80d50d63b7dd62a5392e1440b66f40706
4
+ data.tar.gz: 92758fa35f611c64d8bbd99edb0b03e9c24b7637c47e427722cadf50340276e9
5
5
  SHA512:
6
- metadata.gz: 58b5c57faec3ad7fb0a3bf87919b33708872400f687d5216a606e3037f318a704f0d776f874d3749cb09710d87500a4c9c7fbc75f3b421bd103d0a997c01af28
7
- data.tar.gz: 90ae44767237c5a5613e3af416d170ac29d9af338674933b1c95e5c2c5f02589af9372241fd00a131d907c892d7d0a932a571fea8bce88361991dc9bb9587847
6
+ metadata.gz: 274e13ddf21260eb78d46b2e8a2f4acd886a0ecf620ff35cbb383eba98b34afc05c7d8ec2fb93cce758920d870531b708ebe0b2ac584685b01fe36098f6a54b4
7
+ data.tar.gz: 341e4cc1f336fa7bf9cabc64f5bce171472eb189a75466cf3bc59af40ed3a0b80c33e1bf17681ef24b5bda7ada48f4874e445363d3fafdc3972edf1450c141b1
@@ -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
- @sleepTimer = 10
19
-
20
- # create cache
21
- @store = YAML::Store.new("#{@crdGroup}_#{@crdVersion}_#{@crdPlural}.yaml")
22
-
23
- # Kubeconfig
24
- puts '{leve: "info", message: "validate kube config"}'
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 setDeleteMethod(callback)
48
- @deleteMethod = callback
49
- end
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
- # Config Methods
56
- def setSleepTimer(nr)
57
- @sleepTimer = nr
68
+ def setDeleteMethod(callback)
69
+ @deleteMethod = callback
58
70
  end
59
71
 
60
- def setScopeNamespaces(lst)
61
- @lstOfNamespaces = lst
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
- # Search for ressources
75
- _ressources = @k8sclient.api(@crdGroup+"/"+@crdVersion).resource(@crdPlural).list()
88
+ begin
76
89
 
77
- _ressources.each do |_i|
78
- _uid = _i["metadata"]["uid"]
79
- _v = _i["metadata"]["resourceVersion"]
90
+ # Search for ressources
91
+ _ressources = @k8sclient.api(@crdGroup+"/"+@crdVersion).resource(@crdPlural).list()
80
92
 
81
- if @lstOfNamespaces == nil || @lstOfNamespaces.contains(_i["metadata"]["namespace"])
82
- _from_cache = @store.transaction{@store[_uid]}
93
+ _ressources.each do |_i|
94
+ _uid = _i["metadata"]["uid"]
95
+ _v = _i["metadata"]["resourceVersion"]
83
96
 
84
- unless _from_cache
85
- # Add finalizer and refresh version number
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
- # Cache last version of ressources
91
- @store.transaction do
92
- @store[_uid] = _v
93
- @store.commit
94
- end
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
- # call the action method
97
- _i["metadata"]["crd_status"] = "add"
98
- @addMethod.call(_i,@k8sclient)
99
- else
100
- # only trigger action on change or delete event
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
- # call the action method
118
- _i["metadata"]["crd_status"] = "update"
119
- @updateMethod.call(_i,@k8sclient)
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.2
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-25 00:00:00.000000000 Z
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: []