class HubClustersCreator::Kube
Kube
is a collection of methods for interacting with the kubernetes api rubocop:disable Metrics/LineLength,Metrics/MethodLength,Metrics/ParameterLists
Attributes
endpoint[RW]
Public Class Methods
new(endpoint, token: nil, client_certificate: nil, client_key: nil, certificate_authority: nil)
click to toggle source
# File lib/hub-clusters-creator/kube/kube.rb, line 26 def initialize(endpoint, token: nil, client_certificate: nil, client_key: nil, certificate_authority: nil) options = { ssl_verify_peer: false } config = K8s::Config.new( clusters: [{ name: 'default', cluster: { server: 'https://' + endpoint, certificate_authority_data: certificate_authority } }], users: [{ name: 'default', user: { token: token, client_certificate_data: client_certificate, client_key_data: client_key } }], contexts: [{ name: 'default', context: { cluster: 'default', user: 'default' } }], current_context: 'default' ) @endpoint = "https://#{endpoint}" unless endpoint.start_with?('https') @client = K8s::Client.config(config, options) end
Public Instance Methods
account(name, namespace = 'kube-system')
click to toggle source
account returns the credentials for a service account
# File lib/hub-clusters-creator/kube/kube.rb, line 125 def account(name, namespace = 'kube-system') sa = @client.api('v1').resource('serviceaccounts', namespace: namespace).get(name) secret = @client.api('v1').resource('secrets', namespace: namespace).get(sa.secrets.first.name) secret.data.token end
delete(name, kind, namespace, version: 'v1')
click to toggle source
delete removes a resource from the cluster
# File lib/hub-clusters-creator/kube/kube.rb, line 72 def delete(name, kind, namespace, version: 'v1') return unless exists?(name, kind, namespace, version) @client.api(version).resource(kind, namespace: namespace).delete_resource(name) end
exists?(name, kind, namespace = 'default', version = 'v1')
click to toggle source
exists? checks if the resource exists
# File lib/hub-clusters-creator/kube/kube.rb, line 56 def exists?(name, kind, namespace = 'default', version = 'v1') begin kind = "#{kind}s" unless kind.end_with?('s') @client.api(version).resource(kind, namespace: namespace).get(name) rescue K8s::Error::NotFound return false end true end
get(name, namespace, kind, version: 'v1')
click to toggle source
get retrieves a resource from the cluster
# File lib/hub-clusters-creator/kube/kube.rb, line 67 def get(name, namespace, kind, version: 'v1') @client.api(version).resource(kind, namespace: namespace).get(name) end
kubectl(manifest)
click to toggle source
kubectl is used to apply a manifest rubocop:disable Metrics/AbcSize
# File lib/hub-clusters-creator/kube/kube.rb, line 107 def kubectl(manifest) resource = K8s::Resource.from_json(YAML.safe_load(manifest).to_json) raise ArgumentError, 'no api version associated to resource' unless resource.apiVersion raise ArgumentError, 'no kind associated to resource' unless resource.kind raise ArgumentError, 'no metadata associated to resource' unless resource.metadata raise ArgumentError, 'no name associated to resource' unless resource.metadata.name name = resource.metadata.name namespace = resource.metadata.namespace kind = resource.kind.downcase version = resource.apiVersion return if exists?(name, kind, namespace, version) @client.api(version).resource("#{kind}s", namespace: namespace).create_resource(resource) end
wait(name, namespace, kind, version: 'v1', max_retries: 50, timeout: 300, interval: 5, &block)
click to toggle source
wait is used to poll until a resource meets the needs of the consumer rubocop:disable Lint/RescueException,Metrics/CyclomaticComplexity,Metrics/AbcSize
# File lib/hub-clusters-creator/kube/kube.rb, line 80 def wait(name, namespace, kind, version: 'v1', max_retries: 50, timeout: 300, interval: 5, &block) retries = counter = 0 while counter < timeout begin unless block_given? return if exists?(name, kind, namespace, version) continue end resource = @client.api(version).resource(kind).get(name, namespace: namespace) return if block.call(resource) rescue Exception => e raise e if retries > max_retries retries += 1 end sleep(interval) counter += interval end raise Exception, "operation waiting for #{name}/#{namespace}/#{kind} has failed" end
wait_for_kubeapi(max_attempts = 60, interval = 5)
click to toggle source
wait_for_kubeapi
is responsible for waiting the api is available
# File lib/hub-clusters-creator/kube/kube.rb, line 132 def wait_for_kubeapi(max_attempts = 60, interval = 5) attempts = 0 while attempts < max_attempts begin return if @client.api('v1').resource('nodes').list rescue StandardError => e puts "bad: #{e}" attempts += 1 end sleep(interval) end raise Exception, 'timed out waiting for the kube api' end