summaryrefslogtreecommitdiff
path: root/app/services/ci/create_cluster_service.rb
blob: edae245ec386b1a443ac36506c65b6e7dddc24d6 (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
module Ci
  class CreateClusterService < BaseService
    UnexpectedOperationError = Class.new(StandardError)

    def create_cluster_on_gke(api_client)
      # Create a cluster on GKE
      operation = api_client.projects_zones_clusters_create(
        params['gcp_project_id'], params['cluster_zone'], params['cluster_name'],
        cluster_size: params['cluster_size'], machine_type: params['machine_type']
      )

      if operation&.status != ('RUNNING' || 'PENDING')
        raise UnexpectedOperationError.new(operation&.status_message)
      end

      api_client.parse_self_link(operation.self_link).tap do |project_id, zone, operation_id|
        project.clusters.create(user: current_user,
                                gcp_project_id: params['gcp_project_id'],
                                cluster_zone: params['cluster_zone'],
                                cluster_name: params['cluster_name'],
                                project_namespace: params['project_namespace'],
                                gcp_operation_id: operation_id).tap do |cluster|
          # Start status polling. When the operation finish, create KubernetesService.
          cluster.creation_status(api_client.access_token)
        end
      end
    end
  end
end