diff options
author | Alessio Caiazza <acaiazza@gitlab.com> | 2017-11-02 13:14:10 +0300 |
---|---|---|
committer | Alessio Caiazza <acaiazza@gitlab.com> | 2017-11-02 13:14:39 +0300 |
commit | 6950f38f830079199c382c974b51ad73048a6939 (patch) | |
tree | 80f4275ba2bfa0a4a8124362003be85d79debe1f /app/services/clusters | |
parent | 84f5aaa729d6286252602800a1f9e1bf1e5b47d3 (diff) |
Install k8s application with helm running inside the cluster
Diffstat (limited to 'app/services/clusters')
-rw-r--r-- | app/services/clusters/base_helm_service.rb | 17 | ||||
-rw-r--r-- | app/services/clusters/fetch_app_installation_status_service.rb | 13 | ||||
-rw-r--r-- | app/services/clusters/finalize_app_installation_service.rb | 15 | ||||
-rw-r--r-- | app/services/clusters/install_app_service.rb | 23 | ||||
-rw-r--r-- | app/services/clusters/install_tiller_service.rb | 24 |
5 files changed, 92 insertions, 0 deletions
diff --git a/app/services/clusters/base_helm_service.rb b/app/services/clusters/base_helm_service.rb new file mode 100644 index 00000000000..b8ed52bf376 --- /dev/null +++ b/app/services/clusters/base_helm_service.rb @@ -0,0 +1,17 @@ +module Clusters + class BaseHelmService + attr_accessor :app + + def initialize(app) + @app = app + end + + protected + + def helm + return @helm if defined?(@helm) + + @helm = @app.cluster.helm + end + end +end diff --git a/app/services/clusters/fetch_app_installation_status_service.rb b/app/services/clusters/fetch_app_installation_status_service.rb new file mode 100644 index 00000000000..e21aa49bb43 --- /dev/null +++ b/app/services/clusters/fetch_app_installation_status_service.rb @@ -0,0 +1,13 @@ +module Clusters + class FetchAppInstallationStatusService < BaseHelmService + def execute + return unless app.installing? + + phase = helm.installation_status(app) + log = helm.installation_log(app) if phase == 'Failed' + yield(phase, log) if block_given? + rescue KubeException => ke + app.make_errored!("Kubernetes error: #{ke.message}") unless app.errored? + end + end +end diff --git a/app/services/clusters/finalize_app_installation_service.rb b/app/services/clusters/finalize_app_installation_service.rb new file mode 100644 index 00000000000..c921747febc --- /dev/null +++ b/app/services/clusters/finalize_app_installation_service.rb @@ -0,0 +1,15 @@ +module Clusters + class FinalizeAppInstallationService < BaseHelmService + def execute + helm.delete_installation_pod!(app) + + app.make_errored!('Installation aborted') if aborted? + end + + private + + def aborted? + app.installing? || app.scheduled? + end + end +end diff --git a/app/services/clusters/install_app_service.rb b/app/services/clusters/install_app_service.rb new file mode 100644 index 00000000000..dd8556108d4 --- /dev/null +++ b/app/services/clusters/install_app_service.rb @@ -0,0 +1,23 @@ +module Clusters + class InstallAppService < BaseHelmService + def execute + return unless app.scheduled? + + begin + helm.install(app) + if app.make_installing + ClusterWaitForAppInstallationWorker.perform_in( + ClusterWaitForAppInstallationWorker::INITIAL_INTERVAL, app.name, app.id) + else + app.make_errored!("Failed to update app record; #{app.errors}") + end + + rescue KubeException => ke + app.make_errored!("Kubernetes error: #{ke.message}") + rescue StandardError => e + Rails.logger.warn(e.message) + app.make_errored!("Can't start installation process") + end + end + end +end diff --git a/app/services/clusters/install_tiller_service.rb b/app/services/clusters/install_tiller_service.rb new file mode 100644 index 00000000000..ac77a7ea3c2 --- /dev/null +++ b/app/services/clusters/install_tiller_service.rb @@ -0,0 +1,24 @@ +module Clusters + class InstallTillerService < BaseService + def execute + ensure_namespace + install + end + + private + + def kubernetes_service + return @kubernetes_service if defined?(@kubernetes_service) + + @kubernetes_service = project&.kubernetes_service + end + + def ensure_namespace + kubernetes_service&.ensure_namespace! + end + + def install + kubernetes_service&.helm_client&.init! + end + end +end |