Class: K8s::ResourceClient
- Inherits:
-
Object
- Object
- K8s::ResourceClient
- Extended by:
- Utils
- Includes:
- Utils
- Defined in:
- lib/k8s/resource_client.rb
Overview
Per-APIResource type client.
Used to get/list/update/patch/delete specific types of resources, optionally in some specific namespace.
Defined Under Namespace
Modules: Utils
Instance Attribute Summary collapse
- #namespace ⇒ String? readonly
- #resource ⇒ String readonly
-
#resource_class ⇒ class
readonly
K8s::Resource.
- #subresource ⇒ String? readonly
Class Method Summary collapse
-
.list(resources, transport, namespace: nil, labelSelector: nil, fieldSelector: nil, skip_forbidden: false) ⇒ Array<K8s::Resource>
Pipeline list requests for multiple resource types.
Instance Method Summary collapse
- #api_version ⇒ String
- #create? ⇒ Bool
- #create_resource(resource) ⇒ resource_class
- #delete(name, namespace: @namespace, propagationPolicy: nil) ⇒ K8s::API::MetaV1::Status
- #delete? ⇒ Bool
- #delete_collection(namespace: @namespace, labelSelector: nil, fieldSelector: nil, propagationPolicy: nil) ⇒ K8s::API::MetaV1::Status
- #delete_resource(resource, **options) ⇒ K8s::API::MetaV1::Status
- #get(name, namespace: @namespace) ⇒ resource_class
- #get? ⇒ Bool
- #get_resource(resource) ⇒ resource_class
-
#initialize(transport, api_client, api_resource, namespace: nil, resource_class: K8s::Resource) ⇒ ResourceClient
constructor
A new instance of ResourceClient.
- #json_patch(name, ops, namespace: @namespace) ⇒ resource_class
- #kind ⇒ String
- #list(labelSelector: nil, fieldSelector: nil, namespace: @namespace) ⇒ Array<resource_class>
- #list? ⇒ Bool
- #merge_patch(name, obj, namespace: @namespace, strategic_merge: true) ⇒ resource_class
- #meta_list(labelSelector: nil, fieldSelector: nil, namespace: @namespace) ⇒ K8s::API::MetaV1::List
-
#name ⇒ String
Resource or resource/subresource.
- #namespaced? ⇒ Bool
- #patch? ⇒ Bool
- #path(name = nil, subresource: @subresource, namespace: @namespace) ⇒ String
- #process_list(list) ⇒ Array<resource_class>
- #subresource? ⇒ Boolean
- #update? ⇒ Bool
- #update_resource(resource) ⇒ resource_class
- #watch(labelSelector: nil, fieldSelector: nil, resourceVersion: nil, timeout: nil, namespace: @namespace) {|K8S::API::MetaV1::WatchEvent| ... } ⇒ Object
Methods included from Utils
Constructor Details
#initialize(transport, api_client, api_resource, namespace: nil, resource_class: K8s::Resource) ⇒ ResourceClient
Returns a new instance of ResourceClient.
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'lib/k8s/resource_client.rb', line 69 def initialize(transport, api_client, api_resource, namespace: nil, resource_class: K8s::Resource) @transport = transport @api_client = api_client @api_resource = api_resource @namespace = namespace @resource_class = resource_class if @api_resource.name.include? '/' @resource, @subresource = @api_resource.name.split('/', 2) else @resource = @api_resource.name @subresource = nil end fail "Resource #{api_resource.name} is not namespaced" unless api_resource.namespaced || !namespace end |
Instance Attribute Details
#namespace ⇒ String? (readonly)
97 98 99 |
# File 'lib/k8s/resource_client.rb', line 97 def namespace @namespace end |
#resource ⇒ String (readonly)
100 101 102 |
# File 'lib/k8s/resource_client.rb', line 100 def resource @resource end |
#resource_class ⇒ class (readonly)
Returns K8s::Resource.
116 117 118 |
# File 'lib/k8s/resource_client.rb', line 116 def resource_class @resource_class end |
#subresource ⇒ String? (readonly)
108 109 110 |
# File 'lib/k8s/resource_client.rb', line 108 def subresource @subresource end |
Class Method Details
.list(resources, transport, namespace: nil, labelSelector: nil, fieldSelector: nil, skip_forbidden: false) ⇒ Array<K8s::Resource>
Pipeline list requests for multiple resource types.
Returns flattened array with mixed resource kinds.
50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/k8s/resource_client.rb', line 50 def self.list(resources, transport, namespace: nil, labelSelector: nil, fieldSelector: nil, skip_forbidden: false) api_paths = resources.map{ |resource| resource.path(namespace: namespace) } api_lists = transport.gets( *api_paths, response_class: K8s::API::MetaV1::List, query: make_query( 'labelSelector' => selector_query(labelSelector), 'fieldSelector' => selector_query(fieldSelector) ), skip_forbidden: skip_forbidden ) resources.zip(api_lists).map { |resource, api_list| api_list ? resource.process_list(api_list) : [] }.flatten end |
Instance Method Details
#api_version ⇒ String
87 88 89 |
# File 'lib/k8s/resource_client.rb', line 87 def api_version @api_client.api_version end |
#create? ⇒ Bool
137 138 139 |
# File 'lib/k8s/resource_client.rb', line 137 def create? @api_resource.verbs.include? 'create' end |
#create_resource(resource) ⇒ resource_class
143 144 145 146 147 148 149 150 |
# File 'lib/k8s/resource_client.rb', line 143 def create_resource(resource) @transport.request( method: 'POST', path: path(namespace: resource..namespace), request_object: resource, response_class: @resource_class ) end |
#delete(name, namespace: @namespace, propagationPolicy: nil) ⇒ K8s::API::MetaV1::Status
305 306 307 308 309 310 311 312 313 314 |
# File 'lib/k8s/resource_client.rb', line 305 def delete(name, namespace: @namespace, propagationPolicy: nil) @transport.request( method: 'DELETE', path: path(name, namespace: namespace), query: make_query( 'propagationPolicy' => propagationPolicy ), response_class: @resource_class, # XXX: documented as returning Status ) end |
#delete? ⇒ Bool
297 298 299 |
# File 'lib/k8s/resource_client.rb', line 297 def delete? @api_resource.verbs.include? 'delete' end |
#delete_collection(namespace: @namespace, labelSelector: nil, fieldSelector: nil, propagationPolicy: nil) ⇒ K8s::API::MetaV1::Status
320 321 322 323 324 325 326 327 328 329 330 331 332 |
# File 'lib/k8s/resource_client.rb', line 320 def delete_collection(namespace: @namespace, labelSelector: nil, fieldSelector: nil, propagationPolicy: nil) list = @transport.request( method: 'DELETE', path: path(namespace: namespace), query: make_query( 'labelSelector' => selector_query(labelSelector), 'fieldSelector' => selector_query(fieldSelector), 'propagationPolicy' => propagationPolicy ), response_class: K8s::API::MetaV1::List, # XXX: documented as returning Status ) process_list(list) end |
#delete_resource(resource, **options) ⇒ K8s::API::MetaV1::Status
338 339 340 |
# File 'lib/k8s/resource_client.rb', line 338 def delete_resource(resource, **) delete(resource..name, namespace: resource..namespace, **) end |
#get(name, namespace: @namespace) ⇒ resource_class
158 159 160 161 162 163 164 |
# File 'lib/k8s/resource_client.rb', line 158 def get(name, namespace: @namespace) @transport.request( method: 'GET', path: path(name, namespace: namespace), response_class: @resource_class ) end |
#get? ⇒ Bool
153 154 155 |
# File 'lib/k8s/resource_client.rb', line 153 def get? @api_resource.verbs.include? 'get' end |
#get_resource(resource) ⇒ resource_class
168 169 170 171 172 173 174 |
# File 'lib/k8s/resource_client.rb', line 168 def get_resource(resource) @transport.request( method: 'GET', path: path(resource..name, namespace: resource..namespace), response_class: @resource_class ) end |
#json_patch(name, ops, namespace: @namespace) ⇒ resource_class
286 287 288 289 290 291 292 293 294 |
# File 'lib/k8s/resource_client.rb', line 286 def json_patch(name, ops, namespace: @namespace) @transport.request( method: 'PATCH', path: path(name, namespace: namespace), content_type: 'application/json-patch+json', request_object: ops, response_class: @resource_class ) end |
#kind ⇒ String
111 112 113 |
# File 'lib/k8s/resource_client.rb', line 111 def kind @api_resource.kind end |
#list(labelSelector: nil, fieldSelector: nil, namespace: @namespace) ⇒ Array<resource_class>
194 195 196 197 |
# File 'lib/k8s/resource_client.rb', line 194 def list(labelSelector: nil, fieldSelector: nil, namespace: @namespace) list = (labelSelector: labelSelector, fieldSelector: fieldSelector, namespace: namespace) process_list(list) end |
#list? ⇒ Bool
177 178 179 |
# File 'lib/k8s/resource_client.rb', line 177 def list? @api_resource.verbs.include? 'list' end |
#merge_patch(name, obj, namespace: @namespace, strategic_merge: true) ⇒ resource_class
272 273 274 275 276 277 278 279 280 |
# File 'lib/k8s/resource_client.rb', line 272 def merge_patch(name, obj, namespace: @namespace, strategic_merge: true) @transport.request( method: 'PATCH', path: path(name, namespace: namespace), content_type: strategic_merge ? 'application/strategic-merge-patch+json' : 'application/merge-patch+json', request_object: obj, response_class: @resource_class ) end |
#meta_list(labelSelector: nil, fieldSelector: nil, namespace: @namespace) ⇒ K8s::API::MetaV1::List
203 204 205 206 207 208 209 210 211 212 213 |
# File 'lib/k8s/resource_client.rb', line 203 def (labelSelector: nil, fieldSelector: nil, namespace: @namespace) @transport.request( method: 'GET', path: path(namespace: namespace), response_class: K8s::API::MetaV1::List, query: make_query( 'labelSelector' => selector_query(labelSelector), 'fieldSelector' => selector_query(fieldSelector) ) ) end |
#name ⇒ String
Returns resource or resource/subresource.
92 93 94 |
# File 'lib/k8s/resource_client.rb', line 92 def name @api_resource.name end |
#namespaced? ⇒ Bool
119 120 121 |
# File 'lib/k8s/resource_client.rb', line 119 def namespaced? !!@api_resource.namespaced end |
#patch? ⇒ Bool
263 264 265 |
# File 'lib/k8s/resource_client.rb', line 263 def patch? @api_resource.verbs.include? 'patch' end |
#path(name = nil, subresource: @subresource, namespace: @namespace) ⇒ String
124 125 126 127 128 129 130 131 132 133 134 |
# File 'lib/k8s/resource_client.rb', line 124 def path(name = nil, subresource: @subresource, namespace: @namespace) namespace_part = namespace ? ['namespaces', namespace] : [] if name && subresource @api_client.path(*namespace_part, @resource, name, subresource) elsif name @api_client.path(*namespace_part, @resource, name) else @api_client.path(*namespace_part, @resource) end end |
#process_list(list) ⇒ Array<resource_class>
183 184 185 186 187 188 |
# File 'lib/k8s/resource_client.rb', line 183 def process_list(list) list.items.map { |item| # list items omit kind/apiVersion @resource_class.new(item.merge('apiVersion' => list.apiVersion, 'kind' => @api_resource.kind)) } end |
#subresource? ⇒ Boolean
103 104 105 |
# File 'lib/k8s/resource_client.rb', line 103 def subresource? !!@subresource end |
#update? ⇒ Bool
247 248 249 |
# File 'lib/k8s/resource_client.rb', line 247 def update? @api_resource.verbs.include? 'update' end |
#update_resource(resource) ⇒ resource_class
253 254 255 256 257 258 259 260 |
# File 'lib/k8s/resource_client.rb', line 253 def update_resource(resource) @transport.request( method: 'PUT', path: path(resource..name, namespace: resource..namespace), request_object: resource, response_class: @resource_class ) end |
#watch(labelSelector: nil, fieldSelector: nil, resourceVersion: nil, timeout: nil, namespace: @namespace) {|K8S::API::MetaV1::WatchEvent| ... } ⇒ Object
221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 |
# File 'lib/k8s/resource_client.rb', line 221 def watch(labelSelector: nil, fieldSelector: nil, resourceVersion: nil, timeout: nil, namespace: @namespace) method = 'GET' path = path(namespace: namespace) parser = Yajl::Parser.new parser.on_parse_complete = lambda do |data| event = K8s::API::MetaV1::WatchEvent.new(data) yield event end @transport.request( method: method, path: path, read_timeout: nil, query: make_query( 'labelSelector' => selector_query(labelSelector), 'fieldSelector' => selector_query(fieldSelector), 'resourceVersion' => resourceVersion, 'watch' => '1', 'timeoutSeconds' => timeout ), response_block: lambda do |chunk, _, _| parser << chunk end ) end |