kubernetes-client 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: d9626576119f060206d829e6eeb84e5e3a78297b242c3fd089ea42907921de87
4
+ data.tar.gz: ce0d5d8e997009a6ae89bd93fc7b580a16e16216cb4ada9d576de73a575f22d6
5
+ SHA512:
6
+ metadata.gz: 0267b7bf5dd27c06c1cf63c63b99fd4fda1b5fc1247e8502a1c7fc4a0bedd80d045460116b7ebe57f074f6233e6ca7db251612555e49178f2a3f2ef1e9830758
7
+ data.tar.gz: 974445a09a37f7e12bfe660cc4d62d6c664b6ed6581756abae27f92ecbcb1065f1a0dfca07f70f44602dbb65197cf33adb555a0b1b3cf9657dd892079c1e3577
data/lib/kubernetes.rb ADDED
@@ -0,0 +1 @@
1
+ require 'kubernetes/client'
@@ -0,0 +1,2 @@
1
+ require 'kubernetes/client/version'
2
+ require 'kubernetes/client/class'
@@ -0,0 +1,191 @@
1
+ require 'rest-client'
2
+ require 'json'
3
+
4
+ class Hash
5
+ def method_missing(m, *args, &block)
6
+ self[m.to_sym]
7
+ end
8
+ end
9
+
10
+ module Kubernetes
11
+ class Client
12
+
13
+ attr_accessor :rest_client, :apis, :resources
14
+
15
+ def initialize( options = {} )
16
+ @options = {
17
+ url: nil,
18
+ verify_ssl: nil,
19
+ ssl_client_cert: nil,
20
+ ssl_client_key: nil,
21
+ ssl_ca_file: nil,
22
+ ssl_ca_path: nil,
23
+ ssl_cert_store: nil,
24
+ ssl_verify_callback: nil,
25
+ ssl_verify_callback_warnings: nil,
26
+ ssl_version: nil,
27
+ ssl_ciphers: nil,
28
+ headers: {},
29
+ user: nil,
30
+ password: nil,
31
+ token: nil,
32
+ namespace: nil,
33
+ symbolize: true,
34
+ discovery: true
35
+ }
36
+ @options.merge!(options)
37
+ @options[:headers]['Accept'] = 'application/json'
38
+ @options[:headers]['Authorization'] = "Bearer #{@options[:token]}" unless options[:token].nil?
39
+ @rest_client = RestClient::Resource.new(@options[:url], @options)
40
+ @apis = []
41
+ @resources = []
42
+ discover if @options[:discovery] == true
43
+ end
44
+
45
+ def self.new_in
46
+ self.class.new(
47
+ url: 'https://kubernetes.default.svc',
48
+ verify_ssl: OpenSSL::SSL::VERIFY_PEER,
49
+ ssl_ca_file: '/var/run/secrets/kubernetes.io/serviceaccount/ca.crt',
50
+ token: File.read('/var/run/secrets/kubernetes.io/serviceaccount/token'),
51
+ namespace: File.read('/var/run/secrets/kubernetes.io/serviceaccount/namespace')
52
+ )
53
+ end
54
+
55
+ def formatter(s)
56
+ def symbolize(obj)
57
+ return obj.reduce({}) do |memo, (k, v)|
58
+ memo.tap { |m| m[k.to_sym] = symbolize(v) }
59
+ end if obj.is_a? Hash
60
+
61
+ return obj.reduce([]) do |memo, v|
62
+ memo << symbolize(v); memo
63
+ end if obj.is_a? Array
64
+
65
+ obj
66
+ end
67
+ return symbolize(JSON.load(s)) if @options[:symbolize] == true
68
+ return JSON.load(s)
69
+ end
70
+
71
+ def method_missing(m, *args, &block)
72
+ return get(m.to_s.sub('get_',''), *args, &block) if m.to_s.start_with?('get_')
73
+ return create(m.to_s.sub('create_',''), *args, &block) if m.to_s.start_with?('create_')
74
+ return delete(m.to_s.sub('delete_',''), *args, &block) if m.to_s.start_with?('delete_')
75
+ return replace(m.to_s.sub('replace_',''), *args, &block) if m.to_s.start_with?('replace_')
76
+ return patch(m.to_s.sub('patch_',''), *args, &block) if m.to_s.start_with?('patch_')
77
+ return watch(m.to_s.sub('watch_',''), *args, &block) if m.to_s.start_with?('watch_')
78
+ end
79
+
80
+ def get(kind, options = {name: nil, namespace: nil})
81
+ formatter @rest_client[respath(kind, options)].get.body
82
+ end
83
+
84
+ def create(kind, options = {name: nil, namespace: nil, definition: {} })
85
+ formatter @rest_client[respath(kind, options)].post(
86
+ options[:definition].to_json
87
+ ).body
88
+ end
89
+
90
+ def delete(kind, options = {name: nil, namespace: nil})
91
+ formatter @rest_client[respath(kind, options)].delete.body
92
+ end
93
+
94
+ def replace(kind, options = {name: nil, namespace: nil, definition: {} })
95
+ formatter @rest_client[respath(kind, options)].put(
96
+ options[:definition].to_json
97
+ ).body
98
+ end
99
+
100
+ def patch(kind, options = {name: nil, namespace: nil, definition: {} })
101
+ formatter @rest_client[respath(kind, options)].patch(
102
+ options[:definition].to_json
103
+ ).body
104
+ end
105
+
106
+ def watch(kind, options = {name: nil, namespace: nil, watch: true})
107
+ block = Proc.new do |response|
108
+ buffer = ''
109
+ response.read_body do |chunk|
110
+ buffer += chunk
111
+ if buffer.end_with?("\n")
112
+ buffer.each_line do |line|
113
+ yield formatter(line.chomp)
114
+ end
115
+ buffer = ''
116
+ end
117
+ end
118
+ end
119
+ req_options = @options.dup
120
+ req_options.merge!({
121
+ method: :get,
122
+ url: @options[:url] + respath(kind, options),
123
+ block_response: block,
124
+ read_timeout: nil
125
+ })
126
+ RestClient::Request.execute(req_options)
127
+ end
128
+
129
+ def respath(kind, options = {name: nil, namespace: nil, watch: false})
130
+ raise "No such resource in api catalog, maybe run discovery" unless @resources.member?(kind)
131
+ resource = @resources[kind]
132
+
133
+ path = resource[:api]
134
+ path += '/watch' if options[:watch]
135
+ path += "/namespaces/" + options[:namespace] unless options[:namespace].nil?
136
+ path += "/" + resource[:name]
137
+ path += "/" + options[:name] unless options[:name].nil?
138
+
139
+ return path
140
+ end
141
+
142
+ def discover(nocache: false)
143
+ @apis = []
144
+ @resources = {}
145
+
146
+ uri = URI(@options[:url])
147
+ cachefile = File.join(File.expand_path('~'),".kubernetes-client.#{uri.host}.#{uri.port}.cache")
148
+ if File.readable?(cachefile)
149
+ @apis, @resources = JSON.load(File.read(cachefile))
150
+ @resources.each do |name, value|
151
+ @resources[name] = {
152
+ api: value['api'],
153
+ name: value['name']
154
+ }
155
+ end
156
+ return
157
+ end
158
+
159
+ # Load api versions
160
+ formatter(@rest_client['/api'].get.body).versions.each do |version|
161
+ @apis << "/api/#{version}"
162
+ end
163
+
164
+ # Load apis versions
165
+ formatter(@rest_client['/apis'].get.body).groups.each do |group|
166
+ @apis << "/apis/#{group.preferredVersion.groupVersion}"
167
+ end
168
+
169
+ # Load Resources
170
+ @apis.each do |api|
171
+ formatter(@rest_client[api].get.body).resources.each do |resource|
172
+ @resources[resource[:name]] = { api: api, name: resource[:name] }
173
+ @resources[resource[:kind]] = { api: api, name: resource[:name] }
174
+ @resources[resource[:singularName]] = { api: api, name: resource[:name] } \
175
+ unless resource.singularName.empty?
176
+ @resources[resource[:singularName].to_s.downcase] = \
177
+ { api: api, name: resource[:name] } \
178
+ unless resource.singularName.empty?
179
+ if resource[:shortNames]
180
+ resource[:shortNames].each do |shortname|
181
+ @resources[shortname] = { api: api, name: resource[:name] }
182
+ end
183
+ end
184
+ end
185
+ end
186
+
187
+ File.write(cachefile, JSON.dump([@apis,@resources]))
188
+ end
189
+
190
+ end
191
+ end
@@ -0,0 +1,5 @@
1
+ module Kubernetes
2
+ class Client
3
+ VERSION = '0.0.1'
4
+ end
5
+ end
metadata ADDED
@@ -0,0 +1,96 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kubernetes-client
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Sascha Spreitzer
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-02-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rest-client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: json
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.2'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: awesome_print
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.8'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.8'
55
+ description: This gem is a Kubernetes API client
56
+ email:
57
+ - sascha@redhat.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - lib/kubernetes.rb
63
+ - lib/kubernetes/client.rb
64
+ - lib/kubernetes/client/class.rb
65
+ - lib/kubernetes/client/version.rb
66
+ homepage: https://git.spreitzer.ch/sspreitzer/kubernetes-client
67
+ licenses:
68
+ - MIT
69
+ metadata:
70
+ bug_tracker_uri: https://git.spreitzer.ch/sspreitzer/kubernetes-client/issues
71
+ changelog_uri: https://git.spreitzer.ch/sspreitzer/kubernetes-client/blob/master/CHANGELOG.md
72
+ documentation_uri: https://git.spreitzer.ch/sspreitzer/kubernetes-client/blob/master/README.md
73
+ homepage_uri: https://git.spreitzer.ch/sspreitzer/kubernetes-client
74
+ source_code_uri: https://git.spreitzer.ch/sspreitzer/kubernetes-client
75
+ wiki_uri: https://git.spreitzer.ch/sspreitzer/kubernetes-client/wikis/home
76
+ post_install_message:
77
+ rdoc_options: []
78
+ require_paths:
79
+ - lib
80
+ required_ruby_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ required_rubygems_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ requirements: []
91
+ rubyforge_project:
92
+ rubygems_version: 2.7.6
93
+ signing_key:
94
+ specification_version: 4
95
+ summary: Ruby Kubernetes API client
96
+ test_files: []