summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlessio Caiazza <acaiazza@gitlab.com>2017-11-03 11:10:50 +0100
committerAlessio Caiazza <acaiazza@gitlab.com>2017-11-03 11:10:50 +0100
commit49210dfff12ba0fba5fdbcdc2c485fbbde43f83f (patch)
tree8207b9d670dd3f5342e07a78a114903b7dbc0e95
parent1ca9aaf860e09351a94331020cd43be4af5f2131 (diff)
downloadgitlab-ce-49210dfff12ba0fba5fdbcdc2c485fbbde43f83f.tar.gz
Schedule k8s application installation with a service
-rw-r--r--app/controllers/projects/clusters/applications_controller.rb14
-rw-r--r--app/models/clusters/applications/helm.rb2
-rw-r--r--app/models/clusters/concerns/application_status.rb8
-rw-r--r--app/services/clusters/applications/schedule_installation_service.rb27
4 files changed, 42 insertions, 9 deletions
diff --git a/app/controllers/projects/clusters/applications_controller.rb b/app/controllers/projects/clusters/applications_controller.rb
index cdebbdefb3f..aa36ccac804 100644
--- a/app/controllers/projects/clusters/applications_controller.rb
+++ b/app/controllers/projects/clusters/applications_controller.rb
@@ -5,12 +5,12 @@ class Projects::Clusters::ApplicationsController < Projects::ApplicationControll
before_action :authorize_create_cluster!, only: [:create]
def create
- return render_404 if application
-
respond_to do |format|
format.json do
- # TODO: Do that via Service
- if application_class.create(cluster: cluster).persisted?
+ scheduled = Clusters::Applications::ScheduleInstallationService.new(project, current_user,
+ application_class: @application_class,
+ cluster: @cluster).execute
+ if scheduled
head :no_data
else
head :bad_request
@@ -26,10 +26,6 @@ class Projects::Clusters::ApplicationsController < Projects::ApplicationControll
end
def application_class
- Clusters::Cluster::APPLICATIONS[params[:application]] || render_404
- end
-
- def application
- application_class.find_by(cluster: cluster)
+ @application_class ||= Clusters::Cluster::APPLICATIONS[params[:application]] || render_404
end
end
diff --git a/app/models/clusters/applications/helm.rb b/app/models/clusters/applications/helm.rb
index 77c0c61d968..54eca613ce3 100644
--- a/app/models/clusters/applications/helm.rb
+++ b/app/models/clusters/applications/helm.rb
@@ -11,6 +11,8 @@ module Clusters
default_value_for :version, Gitlab::Kubernetes::Helm::HELM_VERSION
+ validates :cluster, presence: true
+
def name
NAME
end
diff --git a/app/models/clusters/concerns/application_status.rb b/app/models/clusters/concerns/application_status.rb
index e1f4c7fdda8..c5711fd0b58 100644
--- a/app/models/clusters/concerns/application_status.rb
+++ b/app/models/clusters/concerns/application_status.rb
@@ -23,6 +23,14 @@ module Clusters
transition any - [:errored] => :errored
end
+ event :make_scheduled do
+ transition %i(installable errored) => :scheduled
+ end
+
+ before_transition any => [:scheduled] do |app_status, _|
+ app_status.status_reason = nil
+ end
+
before_transition any => [:errored] do |app_status, transition|
status_reason = transition.args.first
app_status.status_reason = status_reason if status_reason
diff --git a/app/services/clusters/applications/schedule_installation_service.rb b/app/services/clusters/applications/schedule_installation_service.rb
new file mode 100644
index 00000000000..17b3a09948d
--- /dev/null
+++ b/app/services/clusters/applications/schedule_installation_service.rb
@@ -0,0 +1,27 @@
+module Clusters
+ module Applications
+ class ScheduleInstallationService < ::BaseService
+ def execute
+ application = application_class.find_or_create_by!(cluster: cluster)
+
+ application.make_scheduled!
+ ClusterInstallAppWorker.perform_async(application.name, application.id)
+ true
+ rescue ActiveRecord::RecordInvalid
+ false
+ rescue StateMachines::InvalidTransition
+ false
+ end
+
+ private
+
+ def application_class
+ params[:application_class]
+ end
+
+ def cluster
+ params[:cluster]
+ end
+ end
+ end
+end