Welcome to mirror list, hosted at ThFree Co, Russian Federation.

create_project_service.rb « management « clusters « services « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 0a33582be98d646bfdf9b16f766f9979d17423db (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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