debian-mirror-gitlab/app/services/clusters/management/create_project_service.rb
2020-04-22 19:07:51 +05:30

87 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