diff options
Diffstat (limited to 'app/services/clusters')
-rw-r--r-- | app/services/clusters/management/create_project_service.rb | 87 |
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 |