97 lines
2.7 KiB
Ruby
97 lines
2.7 KiB
Ruby
module Gitlab
|
|
module Kubernetes
|
|
class Helm
|
|
HELM_VERSION = '2.7.0'.freeze
|
|
NAMESPACE = 'gitlab-managed-apps'.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/
|
|
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 install(command)
|
|
@namespace.ensure_exists!
|
|
@kubeclient.create_pod(pod_resource(command))
|
|
end
|
|
|
|
##
|
|
# Returns Pod phase
|
|
#
|
|
# https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-phase
|
|
#
|
|
# values: "Pending", "Running", "Succeeded", "Failed", "Unknown"
|
|
#
|
|
def installation_status(pod_name)
|
|
@kubeclient.get_pod(pod_name, @namespace.name).status.phase
|
|
end
|
|
|
|
def installation_log(pod_name)
|
|
@kubeclient.get_pod_log(pod_name, @namespace.name).body
|
|
end
|
|
|
|
def delete_installation_pod!(pod_name)
|
|
@kubeclient.delete_pod(pod_name, @namespace.name)
|
|
end
|
|
|
|
private
|
|
|
|
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(command),
|
|
command: %w(/bin/sh),
|
|
args: %w(-c $(COMMAND_SCRIPT))
|
|
}
|
|
spec = { containers: [container], restartPolicy: 'Never' }
|
|
|
|
::Kubeclient::Resource.new(metadata: metadata, spec: spec)
|
|
end
|
|
|
|
def generate_pod_env(command)
|
|
{
|
|
HELM_VERSION: HELM_VERSION,
|
|
TILLER_NAMESPACE: @namespace.name,
|
|
COMMAND_SCRIPT: generate_script(command)
|
|
}.map { |key, value| { name: key, value: value } }
|
|
end
|
|
|
|
def generate_script(command)
|
|
[
|
|
INSTALL_DEPS,
|
|
helm_init_command(command),
|
|
helm_install_command(command)
|
|
].join("\n")
|
|
end
|
|
|
|
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_command(command)
|
|
return if command.chart.nil?
|
|
|
|
"helm install #{command.chart} --name #{command.name} --namespace #{@namespace.name} >/dev/null"
|
|
end
|
|
end
|
|
end
|
|
end
|