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.
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: []