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

cluster_wait_for_app_installation_worker.rb « workers « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 03d83008a6e2148b498c6132a3d9cedd6f5b0fac (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
# frozen_string_literal: true

class ClusterWaitForAppInstallationWorker < ClusterApplicationBaseWorker
  INTERVAL = 10.seconds
  TIMEOUT = 20.minutes

  def perform(app_name, app_id)
    super
    execute
  end

  def execute
    return unless operation_in_progress?

    case installation_phase
    when Gitlab::Kubernetes::Pod::SUCCEEDED
      on_success
    when Gitlab::Kubernetes::Pod::FAILED
      on_failed
    else
      check_timeout
    end
  rescue Kubeclient::HttpError => e
    log_error(e)

    app.make_errored!("Kubernetes error: #{e.error_code}")
  end

  private

  def operation_in_progress?
    app.installing? || app.updating?
  end

  def on_success
    app.make_installed!
  ensure
    remove_installation_pod
  end

  def on_failed
    app.make_errored!("Operation failed. Check pod logs for #{pod_name} for more details.")
  end

  def check_timeout
    if timeouted?
      begin
        app.make_errored!("Operation timed out. Check pod logs for #{pod_name} for more details.")
      end
    else
      ClusterWaitForAppInstallationWorker.perform_in(INTERVAL, app.name, app.id)
    end
  end

  def pod_name
    install_command.pod_name
  end

  def timeouted?
    Time.now.utc - app.updated_at.to_time.utc > TIMEOUT
  end

  def remove_installation_pod
    helm_api.delete_pod!(pod_name)
  end

  def installation_phase
    helm_api.status(pod_name)
  end

  def installation_errors
    helm_api.log(pod_name)
  end
end