Class: K8s::Client
- Inherits:
-
Object
- Object
- K8s::Client
- Defined in:
- lib/k8s/client.rb,
lib/k8s/client/version.rb
Overview
Top-level client wrapper. Uses a Transport instance to talk to the kube API. Offers access to APIClient and ResourceClient instances.
Constant Summary collapse
- VERSION =
Updated on releases using semver.
"0.4.0"
Class Method Summary collapse
Instance Method Summary collapse
- #api(api_version = 'v1') ⇒ APIClient
-
#api_groups ⇒ Array<String>
Cached /apis preferred group apiVersions.
-
#api_groups! ⇒ Array<String>
Force-update /apis cache.
- #apis(api_versions = nil, prefetch_resources: false, skip_missing: false) ⇒ Array<APIClient>
- #client_for_resource(resource, namespace: nil) ⇒ K8s::ResourceClient
- #create_resource(resource) ⇒ K8s::Resource
- #delete_resource(resource, **options) ⇒ K8s::Resource
- #get_resource(resource) ⇒ K8s::Resource
-
#get_resources(resources) ⇒ Array<K8s::Resource, nil>
Returns nils for any resources that do not exist.
-
#initialize(transport, namespace: nil) ⇒ Client
constructor
A new instance of Client.
-
#list_resources(resources = nil, **options) ⇒ Array<K8s::Resource>
Pipeline list requests for multiple resource types.
- #patch_resource(resource, attrs) ⇒ Object
- #resources(namespace: nil) ⇒ Array<K8s::ResourceClient>
- #update_resource(resource) ⇒ K8s::Resource
- #version ⇒ K8s::API::Version
Constructor Details
#initialize(transport, namespace: nil) ⇒ Client
Returns a new instance of Client.
33 34 35 36 37 38 |
# File 'lib/k8s/client.rb', line 33 def initialize(transport, namespace: nil) @transport = transport @namespace = namespace @api_clients = {} end |
Class Method Details
.config(config, namespace: nil, **options) ⇒ K8s::Client
20 21 22 23 24 |
# File 'lib/k8s/client.rb', line 20 def self.config(config, namespace: nil, **) new(Transport.config(config, **), namespace: namespace, ) end |
.in_cluster_config ⇒ K8s::Client
27 28 29 |
# File 'lib/k8s/client.rb', line 27 def self.in_cluster_config new(Transport.in_cluster_config) end |
Instance Method Details
#api(api_version = 'v1') ⇒ APIClient
50 51 52 |
# File 'lib/k8s/client.rb', line 50 def api(api_version = 'v1') @api_clients[api_version] ||= APIClient.new(@transport, api_version) end |
#api_groups ⇒ Array<String>
Cached /apis preferred group apiVersions
66 67 68 |
# File 'lib/k8s/client.rb', line 66 def api_groups @api_groups || api_groups! end |
#api_groups! ⇒ Array<String>
Force-update /apis cache. Required if creating new CRDs/apiservices.
58 59 60 61 62 |
# File 'lib/k8s/client.rb', line 58 def api_groups! @api_groups = @transport.get('/apis', response_class: K8s::API::MetaV1::APIGroupList, ).groups.map{|api_group| api_group.versions.map{|api_version| api_version.groupVersion} }.flatten end |
#apis(api_versions = nil, prefetch_resources: false, skip_missing: false) ⇒ Array<APIClient>
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
# File 'lib/k8s/client.rb', line 74 def apis(api_versions = nil, prefetch_resources: false, skip_missing: false) api_versions ||= ['v1'] + self.api_groups if prefetch_resources # api groups that are missing their api_resources api_paths = api_versions .uniq .select{|api_version| !api(api_version).api_resources? } .map{|api_version| APIClient.path(api_version) } # load into APIClient.api_resources= @transport.gets(*api_paths, response_class: K8s::API::MetaV1::APIResourceList, skip_missing: skip_missing).each do |api_resource_list| api(api_resource_list.groupVersion).api_resources = api_resource_list.resources if api_resource_list end end api_versions.map{|api_version| api(api_version) } end |
#client_for_resource(resource, namespace: nil) ⇒ K8s::ResourceClient
117 118 119 |
# File 'lib/k8s/client.rb', line 117 def client_for_resource(resource, namespace: nil) api(resource.apiVersion).client_for_resource(resource, namespace: namespace) end |
#create_resource(resource) ⇒ K8s::Resource
123 124 125 |
# File 'lib/k8s/client.rb', line 123 def create_resource(resource) client_for_resource(resource).create_resource(resource) end |
#delete_resource(resource, **options) ⇒ K8s::Resource
171 172 173 |
# File 'lib/k8s/client.rb', line 171 def delete_resource(resource, **) client_for_resource(resource).delete_resource(resource, **) end |
#get_resource(resource) ⇒ K8s::Resource
129 130 131 |
# File 'lib/k8s/client.rb', line 129 def get_resource(resource) client_for_resource(resource).get_resource(resource) end |
#get_resources(resources) ⇒ Array<K8s::Resource, nil>
Returns nils for any resources that do not exist. This includes custom resources that were not yet defined.
138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
# File 'lib/k8s/client.rb', line 138 def get_resources(resources) # prefetch api resources, skip missing APIs resource_apis = apis(resources.map{ |resource| resource.apiVersion }, prefetch_resources: true, skip_missing: true) # map each resource to excon request options, or nil if resource is not (yet) defined requests = resources.zip(resource_apis).map{ |resource, api_client| next nil unless api_client.api_resources? resource_client = api_client.client_for_resource(resource) { method: 'GET', path: resource_client.path(resource..name, namespace: resource..namespace), response_class: resource_client.resource_class, } } # map non-nil requests to response objects, or nil for nil request options Util.compact_map(requests) { |reqs| @transport.requests(*reqs, skip_missing: true) } end |
#list_resources(resources = nil, **options) ⇒ Array<K8s::Resource>
Pipeline list requests for multiple resource types.
Returns flattened array with mixed resource kinds.
106 107 108 109 110 |
# File 'lib/k8s/client.rb', line 106 def list_resources(resources = nil, **) resources ||= self.resources.select{|resource| resource.list? } ResourceClient.list(resources, @transport, **) end |
#patch_resource(resource, attrs) ⇒ Object
175 176 177 |
# File 'lib/k8s/client.rb', line 175 def patch_resource(resource, attrs) client_for_resource(resource).json_patch(resource..name, attrs) end |
#resources(namespace: nil) ⇒ Array<K8s::ResourceClient>
95 96 97 |
# File 'lib/k8s/client.rb', line 95 def resources(namespace: nil) apis(prefetch_resources: true).map { |api| api.resources(namespace: namespace) }.flatten end |
#update_resource(resource) ⇒ K8s::Resource
163 164 165 |
# File 'lib/k8s/client.rb', line 163 def update_resource(resource) client_for_resource(resource).update_resource(resource) end |
#version ⇒ K8s::API::Version
42 43 44 45 46 |
# File 'lib/k8s/client.rb', line 42 def version @transport.get('/version', response_class: K8s::API::Version, ) end |