Class: KubernetesDeploy::Kubectl

Inherits:
Object
  • Object
show all
Defined in:
lib/kubernetes-deploy/kubectl.rb

Defined Under Namespace

Classes: ResourceNotFoundError

Constant Summary collapse

DEFAULT_TIMEOUT =
15
NOT_FOUND_ERROR_TEXT =
'NotFound'

Instance Method Summary collapse

Constructor Details

#initialize(namespace:, context:, logger:, log_failure_by_default:, default_timeout: DEFAULT_TIMEOUT, output_is_sensitive_default: false) ⇒ Kubectl

Returns a new instance of Kubectl.

Raises:

  • (ArgumentError)


10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/kubernetes-deploy/kubectl.rb', line 10

def initialize(namespace:, context:, logger:, log_failure_by_default:, default_timeout: DEFAULT_TIMEOUT,
  output_is_sensitive_default: false)
  @kubeconfig = KubeclientBuilder.kubeconfig
  @namespace = namespace
  @context = context
  @logger = logger
  @log_failure_by_default = log_failure_by_default
  @default_timeout = default_timeout
  @output_is_sensitive_default = output_is_sensitive_default

  raise ArgumentError, "namespace is required" if namespace.blank?
  raise ArgumentError, "context is required" if context.blank?
end

Instance Method Details

#client_versionObject



74
75
76
# File 'lib/kubernetes-deploy/kubectl.rb', line 74

def client_version
  version_info[:client]
end

#retry_delay(attempt) ⇒ Object



61
62
63
# File 'lib/kubernetes-deploy/kubectl.rb', line 61

def retry_delay(attempt)
  attempt
end

#run(*args, log_failure: nil, use_context: true, use_namespace: true, output: nil, raise_if_not_found: false, attempts: 1, output_is_sensitive: nil) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/kubernetes-deploy/kubectl.rb', line 24

def run(*args, log_failure: nil, use_context: true, use_namespace: true, output: nil,
  raise_if_not_found: false, attempts: 1, output_is_sensitive: nil)
  log_failure = @log_failure_by_default if log_failure.nil?
  output_is_sensitive = @output_is_sensitive_default if output_is_sensitive.nil?

  args = args.unshift("kubectl")
  args.push("--kubeconfig=#{@kubeconfig}")
  args.push("--namespace=#{@namespace}") if use_namespace
  args.push("--context=#{@context}")     if use_context
  args.push("--output=#{output}") if output
  args.push("--request-timeout=#{@default_timeout}") if @default_timeout
  out, err, st = nil

  (1..attempts).to_a.each do |attempt|
    @logger.debug("Running command (attempt #{attempt}): #{args.join(' ')}")
    out, err, st = Open3.capture3(*args)
    @logger.debug("Kubectl out: " + out.gsub(/\s+/, ' ')) unless output_is_sensitive

    break if st.success?

    if log_failure
      @logger.warn("The following command failed (attempt #{attempt}/#{attempts}): #{Shellwords.join(args)}")
      @logger.warn(err) unless output_is_sensitive
    end

    if err.match(NOT_FOUND_ERROR_TEXT)
      raise(ResourceNotFoundError, err) if raise_if_not_found
    else
      @logger.debug("Kubectl err: #{err}") unless output_is_sensitive
      StatsD.increment('kubectl.error', 1, tags: { context: @context, namespace: @namespace, cmd: args[1] })
    end
    sleep(retry_delay(attempt)) unless attempt == attempts
  end

  [out.chomp, err.chomp, st]
end

#server_versionObject



78
79
80
# File 'lib/kubernetes-deploy/kubectl.rb', line 78

def server_version
  version_info[:server]
end

#version_infoObject



65
66
67
68
69
70
71
72
# File 'lib/kubernetes-deploy/kubectl.rb', line 65

def version_info
  @version_info ||=
    begin
      response, _, status = run("version", use_namespace: false, log_failure: true)
      raise KubectlError, "Could not retrieve kubectl version info" unless status.success?
      extract_version_info_from_kubectl_response(response)
    end
end