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