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

finalize_creation_service.rb « gcp « clusters « services « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 9f257bd0e9a7764b20e80f16ff8cf65df209b38c (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
module Clusters
  module Gcp
    class FinalizeCreationService
      attr_reader :provider

      def execute(provider)
        @provider = provider

        configure_provider
        configure_kubernetes

        ActiveRecord::Base.transaction do
          kubernetes.save!
          provider.make_created!
        end
      rescue Google::Apis::ServerError, Google::Apis::ClientError, Google::Apis::AuthorizationError => e
        cluster.make_errored!("Failed to request to CloudPlatform; #{e.message}")
      rescue ActiveRecord::RecordInvalid => e
        cluster.make_errored!("Failed to configure GKE Cluster: #{e.message}")
      end

      private

      def configure_provider
        provider.endpoint = gke_cluster.endpoint
      end

      def configure_kubernetes
        kubernetes.api_url = 'https://' + gke_cluster.endpoint
        kubernetes.ca_cert = Base64.decode64(gke_cluster.master_auth.cluster_ca_certificate)
        kubernetes.username = gke_cluster.master_auth.username
        kubernetes.password = gke_cluster.master_auth.password
        kubernetes.token = request_kuberenetes_token
      end

      def request_kuberenetes_token
        kubernetes.read_secrets.each do |secret|
          name = secret.dig('metadata', 'name')
          if /default-token/ =~ name
            token_base64 = secret.dig('data', 'token')
            return Base64.decode64(token_base64) if token_base64
          end
        end
      end

      def gke_cluster
        @gke_cluster ||= provider.api_client.projects_zones_clusters_get(
          provider.gcp_project_id,
          provider.zone,
          cluster.name)
      end

      def cluster
        @cluster ||= provider.cluster
      end

      def kubernetes
        @kubernetes ||= cluster.platform_kubernetes
      end
    end
  end
end