88 lines
2.3 KiB
Ruby
88 lines
2.3 KiB
Ruby
|
# 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
|