summaryrefslogtreecommitdiff
path: root/app/services/clusters/gcp/verify_provision_status_service.rb
blob: ddb2832aae6b31833cae889b63abead1fb5c9881 (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
# frozen_string_literal: true

module Clusters
  module Gcp
    class VerifyProvisionStatusService
      attr_reader :provider

      INITIAL_INTERVAL = 2.minutes
      EAGER_INTERVAL = 10.seconds
      TIMEOUT = 20.minutes

      def execute(provider)
        @provider = provider

        request_operation do |operation|
          case operation.status
          when 'PENDING', 'RUNNING'
            continue_creation(operation)
          when 'DONE'
            finalize_creation
          else
            provider.make_errored!("Unexpected operation status; #{operation.status} #{operation.status_message}")
          end
        end
      end

      private

      def continue_creation(operation)
        if elapsed_time_from_creation(operation) < TIMEOUT
          WaitForClusterCreationWorker.perform_in(EAGER_INTERVAL, provider.cluster_id)
        else
          provider.make_errored!(_('Kubernetes cluster creation time exceeds timeout; %{timeout}') % { timeout: TIMEOUT })
        end
      end

      def elapsed_time_from_creation(operation)
        Time.current.utc - operation.start_time.to_time.utc
      end

      def finalize_creation
        Clusters::Gcp::FinalizeCreationService.new.execute(provider)
      end

      def request_operation(&blk)
        Clusters::Gcp::FetchOperationService.new.execute(provider, &blk)
      end
    end
  end
end