summaryrefslogtreecommitdiff
path: root/app/services/clusters
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/clusters')
-rw-r--r--app/services/clusters/management/create_project_service.rb87
1 files changed, 87 insertions, 0 deletions
diff --git a/app/services/clusters/management/create_project_service.rb b/app/services/clusters/management/create_project_service.rb
new file mode 100644
index 00000000000..0a33582be98
--- /dev/null
+++ b/app/services/clusters/management/create_project_service.rb
@@ -0,0 +1,87 @@
+# frozen_string_literal: true
+
+module Clusters
+ module Management
+ class CreateProjectService
+ CreateError = Class.new(StandardError)
+
+ attr_reader :cluster, :current_user
+
+ def initialize(cluster, current_user:)
+ @cluster = cluster
+ @current_user = current_user
+ end
+
+ def execute
+ return unless management_project_required?
+
+ ActiveRecord::Base.transaction do
+ project = create_management_project!
+
+ update_cluster!(project)
+ end
+ end
+
+ private
+
+ def management_project_required?
+ Feature.enabled?(:auto_create_cluster_management_project) && cluster.management_project.nil?
+ end
+
+ def project_params
+ {
+ name: project_name,
+ description: project_description,
+ namespace_id: namespace.id,
+ visibility_level: Gitlab::VisibilityLevel::PRIVATE
+ }
+ end
+
+ def project_name
+ "#{cluster.name} Cluster Management"
+ end
+
+ def project_description
+ "This project is automatically generated and will be used to manage your Kubernetes cluster. [More information](#{docs_path})"
+ end
+
+ def docs_path
+ Rails.application.routes.url_helpers.help_page_path('user/clusters/management_project')
+ end
+
+ def create_management_project!
+ ::Projects::CreateService.new(current_user, project_params).execute.tap do |project|
+ errors = project.errors.full_messages
+
+ if errors.any?
+ raise CreateError.new("Failed to create project: #{errors}")
+ end
+ end
+ end
+
+ def update_cluster!(project)
+ unless cluster.update(management_project: project)
+ raise CreateError.new("Failed to update cluster: #{cluster.errors.full_messages}")
+ end
+ end
+
+ def namespace
+ case cluster.cluster_type
+ when 'project_type'
+ cluster.project.namespace
+ when 'group_type'
+ cluster.group
+ when 'instance_type'
+ instance_administrators_group
+ else
+ raise NotImplementedError
+ end
+ end
+
+ def instance_administrators_group
+ Gitlab::CurrentSettings.instance_administrators_group ||
+ raise(CreateError.new('Instance administrators group not found'))
+ end
+ end
+ end
+end