class HelmWrapper::Shared::Runner

Attributes

auths[R]
binary[R]
chart[R]
config[R]
repos[R]

Public Class Methods

new(binary:, chart:, config: nil) click to toggle source
# File lib/helm-wrapper/shared/runner.rb, line 39
def initialize(binary:, chart:, config: nil)
  @binary = binary
  @chart  = chart
  @config = config

  @auths = false
  @repos = false
end

Public Instance Methods

clean(repos: true) click to toggle source
# File lib/helm-wrapper/shared/runner.rb, line 110
def clean(repos: true)
  clean_repos if repos
  clean_auths if @auths_attempted
end
delete() click to toggle source
# File lib/helm-wrapper/shared/runner.rb, line 117
def delete()
  logger.fatal("Cannot Helm delete without a valid configuration!") if @config.nil?
  logger.fatal("Cannot Helm delete before initialising authenticators!") unless auths

  parameters = Array.new
  parameters.append("--namespace=\"#{@config.namespace}\"")
  parameters.append("\"#{@config.release}\"")

  logger.fatal("Helm delete failed!") unless run(action: "delete", parameters: parameters)
end
init_auths() click to toggle source
# File lib/helm-wrapper/shared/runner.rb, line 50
def init_auths()
  logger.fatal("Cannot initialise authenticators without a valid configuration!") if @config.nil?

  @auths_attempted = true

  config.auths.map(&:auth)

  @auths = true
end
init_repos(force: false) click to toggle source
# File lib/helm-wrapper/shared/runner.rb, line 62
def init_repos(force: false)
  ENV["HELM_EXPERIMENTAL_OCI"] = "true"

  @chart.oci.each_with_index do |oci_repo, oci_index|
    logger.info("Logging into OCI repository: #{oci_repo["name"]}")

    username = from_environment(variable: oci_repo["username"])
    password = from_environment(variable: oci_repo["password"])

    @chart.oci_active(active: true, index: oci_index)

    parameters = Array.new
    parameters.append("login")
    parameters.append("\"#{oci_repo["url"]}\"")
    parameters.append("--username=\"#{username}\"")
    parameters.append("--password-stdin")
    logger.fatal("Failed to login to Helm OCI repository: #{oci_repo["name"]}, url: #{oci_repo["url"]}") unless run(action: "registry", parameters: parameters, stdin: password)
  end

  if @chart.artefact.length > 0 then

    @chart.artefact.each_with_index do |artefact_repo, artefact_index|
      logger.info("Adding artefact repository: #{artefact_repo["name"]}")

      username = artefact_repo["username"].nil? ? nil : from_environment(variable: artefact_repo["username"])
      password = artefact_repo["password"].nil? ? nil : from_environment(variable: artefact_repo["password"])

      @chart.artefact_active(active: true, index: artefact_index)

      parameters = Array.new
      parameters.append("add")
      parameters.append("\"#{artefact_repo["name"]}\"")
      parameters.append("\"#{artefact_repo["url"]}\"")
      parameters.append("--username=\"#{username}\"") unless username.nil?
      parameters.append("--password=\"#{password}\"") unless password.nil?
      parameters.append("--force-update") if force
      logger.fatal("Failed to add Helm repository: #{artefact_repo["name"]}, url: #{artefact_repo["url"]}") unless run(action: "repo", parameters: parameters)
    end

    logger.info("Updating artefact repositories...")
    logger.fatal("Failed to update Helm artefact repositories!") unless run(action: "repo", parameters: Array.new([ "update" ]))
  end

  @repos = true
end
lint() click to toggle source
# File lib/helm-wrapper/shared/runner.rb, line 169
def lint()
  parameters = Array.new
  parameters.append("\"#{@chart.path}\"")

  logger.fatal("Helm validate failed!") unless run(action: "lint", parameters: parameters)
end
push(tag:) click to toggle source
# File lib/helm-wrapper/shared/runner.rb, line 178
def push(tag:)
  logger.fatal("Cannot Helm push before initialising repositories!") unless repos

  parameters = Array.new
  parameters.append("push")
  parameters.append("\"#{@chart.name}:#{tag}\"")

  logger.fatal("Helm push failed!") unless run(action: "chart", parameters: parameters)
end
save(tag:) click to toggle source
# File lib/helm-wrapper/shared/runner.rb, line 190
def save(tag:)
  parameters = Array.new
  parameters.append("save")
  parameters.append("\"#{@chart.path}\"")
  parameters.append("\"#{@chart.name}:#{tag}\"")

  logger.fatal("Helm save failed!") unless run(action: "chart", parameters: parameters)
end
template() click to toggle source
# File lib/helm-wrapper/shared/runner.rb, line 130
def template()
  logger.fatal("Cannot Helm template without a valid configuration!") if @config.nil?
  logger.fatal("Cannot Helm template before initialising repositories!") unless repos

  parameters = Array.new
  parameters.append("--namespace=\"#{@config.namespace}\"")
  parameters.append("\"#{@config.release}\"")
  parameters.append("\"#{@chart.name}\"")
  parameters.append("--version=\"#{@chart.version}\"") unless @chart.version.strip.empty?
  parameters.concat(variable_files)
  parameters.concat(variable_strings)

  logger.fatal("Helm template failed!") unless run(action: "template", parameters: parameters)
end
upgrade(install: true) click to toggle source
# File lib/helm-wrapper/shared/runner.rb, line 147
def upgrade(install: true)
  logger.fatal("Cannot Helm upgrade without a valid configuration!") if @config.nil?
  logger.fatal("Cannot Helm upgrade before initialising authenticators!") unless auths
  logger.fatal("Cannot Helm upgrade before initialising repositories!") unless repos

  parameters = Array.new
  parameters.append("--namespace=\"#{@config.namespace}\"")
  parameters.append("--install") if install
  parameters.append("\"#{@config.release}\"")
  parameters.append("\"#{@chart.name}\"")
  parameters.append("--atomic") if @config.atomic
  parameters.append("--wait") if @config.wait
  parameters.append("--timeout=\"#{@config.timeout}\"") if (@config.atomic or @config.wait)
  parameters.append("--version=\"#{@chart.version}\"") unless @chart.version.strip.empty?
  parameters.concat(variable_files)
  parameters.concat(variable_strings)

  logger.fatal("Helm upgrade failed!") unless run(action: "upgrade", parameters: parameters)
end

Private Instance Methods

clean_auths() click to toggle source
# File lib/helm-wrapper/shared/runner.rb, line 205
def clean_auths
  @auths = false
  config.auths.map(&:clear)
  @auths_attempted = false
end
clean_repos() click to toggle source
# File lib/helm-wrapper/shared/runner.rb, line 213
def clean_repos
  @repos = false

  @chart.oci.each do |oci_repo|
    if oci_repo["active"] then
      logger.info("Logging out of OCI repository: #{oci_repo["name"]}")

      parameters = Array.new
      parameters.append("logout")
      parameters.append("\"#{oci_repo["url"]}\"")
      logger.error("Failed to logout of Helm OCI repository: #{oci_repo["name"]}, url: #{oci_repo["url"]}") unless run(action: "registry", parameters: parameters)
    end
  end

  @chart.artefact.each do |artefact_repo|
    if artefact_repo["active"] then
      if artefact_repo["password"].nil? then
        logger.info("Not removing artefact repository: #{artefact_repo["name"]}, no credentials stored.")
      else
        logger.info("Removing artefact repository: #{artefact_repo["name"]}")

        parameters = Array.new
        parameters.append("remove")
        parameters.append("\"#{artefact_repo["name"]}\"")
        logger.error("Failed to remove Helm repository: #{artefact_repo["name"]}, url: #{artefact_repo["url"]}") unless run(action: "repo", parameters: parameters)
      end
    end
  end

  ENV.delete("HELM_EXPERIMENTAL_OCI")
end
from_environment(variable:) click to toggle source
# File lib/helm-wrapper/shared/runner.rb, line 303
def from_environment(variable:)
  logger.fatal("Environment variable: #{variable} does not exist") unless ENV.key?(variable)
  logger.fatal("Environment variable: #{variable} is blank!") if ENV[variable].strip.empty?

  return ENV[variable].strip
end
run(action:, parameters: Array.new, stdin: nil) click to toggle source
# File lib/helm-wrapper/shared/runner.rb, line 271
def run(action:, parameters: Array.new, stdin: nil)
  result = false

  parameters.reject! { |item| not item.kind_of?(String) or item.strip.empty? }

  cmdline = [ "\"#{@binary.path}\"", action ].concat(parameters).join(" ")

  if @@repo_actions.include?(action)
    begin
      out, status = Open3.capture2e(cmdline, :stdin_data=>stdin)
      logger.debug("Helm output:")
      logger.debug(out)
      result = status.success?
    rescue
      result = false
    end
  else
    logger.info("Starting Helm, action: #{action}")

    fatal("Running Helm with data for stdin can only be used when configuring repos!") unless stdin.nil?
    puts("\n" + ('#' * 80) + "\n\n")

    result = system(cmdline) || false

    puts("\n" + ('#' * 80) + "\n\n")
  end

  return result
end
variable_files() click to toggle source
# File lib/helm-wrapper/shared/runner.rb, line 247
def variable_files
  result = Array.new

  @config.variables.files.each do |file|
    result.append("--values=\"#{file}\"")
  end

  return result
end
variable_strings() click to toggle source
# File lib/helm-wrapper/shared/runner.rb, line 259
def variable_strings
  result = Array.new

  @config.variables.values.each do |key, value|
    result.append("--set=\"#{key.to_s}=#{value}\"")
  end

  return result
end