diff options
author | Alessio Caiazza <acaiazza@gitlab.com> | 2017-11-07 17:26:14 +0300 |
---|---|---|
committer | Alessio Caiazza <acaiazza@gitlab.com> | 2017-11-07 19:12:41 +0300 |
commit | 8ec618a6ede619d9f75279f03c03b24d106c79c7 (patch) | |
tree | 7fe8501fb56edf3f33febe5c0d39019160715293 /lib | |
parent | 760a154a032319a90e15dcf4d54ec1c1cdde9e1c (diff) |
Add Helm InstallCommand
Diffstat (limited to 'lib')
-rw-r--r-- | lib/gitlab/kubernetes/helm.rb | 77 |
1 files changed, 42 insertions, 35 deletions
diff --git a/lib/gitlab/kubernetes/helm.rb b/lib/gitlab/kubernetes/helm.rb index 16b2abb7de2..7a50f07f3c5 100644 --- a/lib/gitlab/kubernetes/helm.rb +++ b/lib/gitlab/kubernetes/helm.rb @@ -3,27 +3,27 @@ module Gitlab class Helm HELM_VERSION = '2.7.0'.freeze NAMESPACE = 'gitlab-managed-apps'.freeze - COMMAND_SCRIPT = <<-EOS.freeze + INSTALL_DEPS = <<-EOS.freeze set -eo pipefail apk add -U ca-certificates openssl >/dev/null wget -q -O - https://kubernetes-helm.storage.googleapis.com/helm-v${HELM_VERSION}-linux-amd64.tar.gz | tar zxC /tmp >/dev/null mv /tmp/linux-amd64/helm /usr/bin/ - helm init ${HELM_INIT_OPTS} >/dev/null - [[ -z "${HELM_COMMAND+x}" ]] || helm ${HELM_COMMAND} >/dev/null EOS + InstallCommand = Struct.new(:name, :install_helm, :chart) do + def pod_name + "install-#{name}" + end + end + def initialize(kubeclient) @kubeclient = kubeclient @namespace = Namespace.new(NAMESPACE, kubeclient) end - def init! - install(OpenStruct.new(name: 'helm')) - end - - def install(app) + def install(command) @namespace.ensure_exists! - @kubeclient.create_pod(pod_resource(app)) + @kubeclient.create_pod(pod_resource(command)) end ## @@ -33,31 +33,27 @@ module Gitlab # # values: "Pending", "Running", "Succeeded", "Failed", "Unknown" # - def installation_status(app) - @kubeclient.get_pod(pod_name(app), @namespace.name).status.phase + def installation_status(pod_name) + @kubeclient.get_pod(pod_name, @namespace.name).status.phase end - def installation_log(app) - @kubeclient.get_pod_log(pod_name(app), @namespace.name).body + def installation_log(pod_name) + @kubeclient.get_pod_log(pod_name, @namespace.name).body end - def delete_installation_pod!(app) - @kubeclient.delete_pod(pod_name(app), @namespace.name) + def delete_installation_pod!(pod_name) + @kubeclient.delete_pod(pod_name, @namespace.name) end private - def pod_name(app) - "install-#{app.name}" - end - - def pod_resource(app) - labels = { 'gitlab.org/action': 'install', 'gitlab.org/application': app.name } - metadata = { name: pod_name(app), namespace: @namespace.name, labels: labels } + def pod_resource(command) + labels = { 'gitlab.org/action': 'install', 'gitlab.org/application': command.name } + metadata = { name: command.pod_name, namespace: @namespace.name, labels: labels } container = { name: 'helm', image: 'alpine:3.6', - env: generate_pod_env(app), + env: generate_pod_env(command), command: %w(/bin/sh), args: %w(-c $(COMMAND_SCRIPT)) } @@ -66,23 +62,34 @@ module Gitlab ::Kubeclient::Resource.new(metadata: metadata, spec: spec) end - def generate_pod_env(app) - env = { + def generate_pod_env(command) + { HELM_VERSION: HELM_VERSION, - TILLER_NAMESPACE: NAMESPACE, - COMMAND_SCRIPT: COMMAND_SCRIPT - } + TILLER_NAMESPACE: @namespace.name, + COMMAND_SCRIPT: generate_script(command) + }.map { |key, value| { name: key, value: value } } + end - if app.name != 'helm' - env[:HELM_INIT_OPTS] = '--client-only' - env[:HELM_COMMAND] = helm_install_comand(app) - end + def generate_script(command) + [ + INSTALL_DEPS, + helm_init_command(command), + helm_install_command(command) + ].join("\n") + end - env.map { |key, value| { name: key, value: value } } + def helm_init_command(command) + if command.install_helm + 'helm init >/dev/null' + else + 'helm init --client-only >/dev/null' + end end - def helm_install_comand(app) - "install #{app.chart} --name #{app.name} --namespace #{NAMESPACE}" + def helm_install_command(command) + return if command.chart.nil? + + "helm install #{command.chart} --name #{command.name} --namespace #{@namespace.name} >/dev/null" end end end |