lib/helmex/commands/install.ex

defmodule Helmex.Install do
  @moduledoc """
  Helm Install

  install a chart
  """

  alias Helmex.Option
  alias Helmex.Helm

  use Helmex.Command

  @doc """
  [add a chart repository](https://helm.sh/docs/helm/helm_repo_add/)

  Available options:

  Option  |  Type
  :------ | :------
  `:atomic`   | flag
  `:ca_file:`   | value
  `:cert_file`   | value
  `:create_namespace`   | flag only
  `:dependency_update`  | flag only
  `:description` | value
  `:devel`   | flag
  `:disable_openapi_validation` | flag
  `:dry_run` | flag
  `:generate_name:`   | value
  `:insecure_skip_tls_verify`   | flag only
  `:name_template` | value
  `:no_hooks`   | flag only
  `:output:`   | value,
  `:password:`   | value
  `:repo:`   | value
  `:set:`   | value
  `:timeout`   | value
  `:username`   | value
  `:values:`   | value
  `:verify`   | flag only
  `:version:`   | value
  `:wait`   | flag only
  `:wait_for_jobs`   | flag only

  ## Examples
      iex> Helmex.init(kubeconfig: "/path/to/kube/config")
      |> Helmex.install("mysql", "bitnami/mysql")
      |> Helmex.call()
  """
  @install_options %{
    atomic: %Option{name: "--atomic"},
    ca_file: %Option{name: "--ca-file", require_arg: true},
    cert_file: %Option{name: "--cert-file", require_arg: true},
    create_namespace: %Option{name: "--create-namespace"},
    dependency_update: %Option{name: "--dependency-update"},
    description: %Option{name: "--description", require_arg: true},
    devel: %Option{name: "--devel"},
    disable_openapi_validation: %Option{name: "--disable-openapi-validation"},
    dry_run: %Option{name: "--dry-run"},
    generate_name: %Option{name: "--generate-name", require_arg: true},
    insecure_skip_tls_verify: %Option{name: "--insecure-skip-tls-verify"},
    name_template: %Option{name: "--name-template", require_arg: true},
    no_hooks: %Option{name: "--no-hooks"},
    output: %Option{name: "--output", require_arg: true},
    password: %Option{name: "--password", require_arg: true},
    repo: %Option{name: "--repo", require_arg: true},
    set: %Option{name: "--set", require_arg: true},
    timeout: %Option{name: "--timeout", require_arg: true},
    username: %Option{name: "--username", require_arg: true},
    values: %Option{name: "--values", require_arg: true},
    verify: %Option{name: "--verify"},
    version: %Option{name: "--version", require_arg: true},
    wait: %Option{name: "--wait"},
    wait_for_jobs: %Option{name: "--wait-for-jobs"}
  }

  @spec install(helm :: Helm.t(), name :: binary(), chart :: binary(), opts :: keyword()) ::
          Helm.t()
  def install(%Helm{} = helm, name, chart, opts \\ []) do
    %Helm{
      helm
      | command: "install",
        args: [name, chart],
        options: parse_options(opts, @install_options)
    }
  end
end