summaryrefslogtreecommitdiff
path: root/lib/gitlab/kubernetes
diff options
context:
space:
mode:
authorAlessio Caiazza <acaiazza@gitlab.com>2017-11-02 16:57:18 +0100
committerAlessio Caiazza <acaiazza@gitlab.com>2017-11-02 17:01:21 +0100
commit31c256c154e7a8727de9e91b1353b9740f380dd8 (patch)
treefbb532d5642478a581dc740821b064526a788ca6 /lib/gitlab/kubernetes
parent30938b898c5415d8ec5cdf6c9851c45c1464c1a0 (diff)
downloadgitlab-ce-31c256c154e7a8727de9e91b1353b9740f380dd8.tar.gz
General cleanup
Diffstat (limited to 'lib/gitlab/kubernetes')
-rw-r--r--lib/gitlab/kubernetes/helm.rb108
1 files changed, 108 insertions, 0 deletions
diff --git a/lib/gitlab/kubernetes/helm.rb b/lib/gitlab/kubernetes/helm.rb
new file mode 100644
index 00000000000..76bb14a0609
--- /dev/null
+++ b/lib/gitlab/kubernetes/helm.rb
@@ -0,0 +1,108 @@
+module Gitlab
+ module Kubernetes
+ class Helm
+ HELM_VERSION = '2.7.0'.freeze
+ NAMESPACE = 'gitlab-managed-apps'.freeze
+ COMMAND_SCRIPT = <<-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
+
+ def initialize(kubeclient)
+ @kubeclient = kubeclient
+ end
+
+ def init!
+ install(OpenStruct.new(name: 'helm'))
+ end
+
+ def install(app)
+ create_namespace! unless has_namespace?
+ @kubeclient.create_pod(pod_resource(app))
+ end
+
+ ##
+ # Returns Pod phase
+ #
+ # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-phase
+ #
+ # values: "Pending", "Running", "Succeeded", "Failed", "Unknown"
+ #
+ def installation_status(app)
+ @kubeclient.get_pod(pod_name(app), NAMESPACE).status.phase
+ end
+
+ def installation_log(app)
+ @kubeclient.get_pod_log(pod_name(app), NAMESPACE).body
+ end
+
+ def delete_installation_pod!(app)
+ @kubeclient.delete_pod(pod_name(app), NAMESPACE)
+ 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, labels: labels }
+ container = {
+ name: 'helm',
+ image: 'alpine:3.6',
+ env: generate_pod_env(app),
+ 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(app)
+ env = {
+ HELM_VERSION: HELM_VERSION,
+ TILLER_NAMESPACE: NAMESPACE,
+ COMMAND_SCRIPT: COMMAND_SCRIPT
+ }
+
+ if app.name != 'helm'
+ env[:HELM_INIT_OPTS] = '--client-only'
+ env[:HELM_COMMAND] = helm_install_comand(app)
+ end
+
+ env.map { |key, value| { name: key, value: value } }
+ end
+
+ def helm_install_comand(app)
+ "install #{app.chart} --name #{app.name} --namespace #{NAMESPACE}"
+ end
+
+ def has_namespace?
+ return @has_namespace if defined?(@has_namespace)
+
+ begin
+ @kubeclient.get_namespace(NAMESPACE)
+ @has_namespace = true
+ rescue KubeException => ke
+ raise ke unless ke.error_code == 404
+ false
+ end
+ end
+
+ def create_namespace!
+ namespace_resource = ::Kubeclient::Resource.new
+ namespace_resource.metadata = {}
+ namespace_resource.metadata.name = NAMESPACE
+
+ @kubeclient.create_namespace(namespace_resource)
+ end
+ end
+ end
+end