diff options
Diffstat (limited to 'app/services/clusters/applications/check_upgrade_progress_service.rb')
-rw-r--r-- | app/services/clusters/applications/check_upgrade_progress_service.rb | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/app/services/clusters/applications/check_upgrade_progress_service.rb b/app/services/clusters/applications/check_upgrade_progress_service.rb new file mode 100644 index 00000000000..8502ea69f27 --- /dev/null +++ b/app/services/clusters/applications/check_upgrade_progress_service.rb @@ -0,0 +1,71 @@ +# frozen_string_literal: true + +module Clusters + module Applications + class CheckUpgradeProgressService < BaseHelmService + def execute + return unless app.updating? + + case phase + when ::Gitlab::Kubernetes::Pod::SUCCEEDED + on_success + when ::Gitlab::Kubernetes::Pod::FAILED + on_failed + else + check_timeout + end + rescue ::Kubeclient::HttpError => e + app.make_update_errored!("Kubernetes error: #{e.message}") unless app.update_errored? + end + + private + + def on_success + app.make_installed! + ensure + remove_pod + end + + def on_failed + app.make_update_errored!(errors || 'Update silently failed') + ensure + remove_pod + end + + def check_timeout + if timed_out? + begin + app.make_update_errored!('Update timed out') + ensure + remove_pod + end + else + ::ClusterWaitForAppUpdateWorker.perform_in( + ::ClusterWaitForAppUpdateWorker::INTERVAL, app.name, app.id) + end + end + + def timed_out? + Time.now.utc - app.updated_at.to_time.utc > ::ClusterWaitForAppUpdateWorker::TIMEOUT + end + + def remove_pod + helm_api.delete_pod!(pod_name) + rescue + # no-op + end + + def phase + helm_api.status(pod_name) + end + + def errors + helm_api.log(pod_name) + end + + def pod_name + @pod_name ||= patch_command.pod_name + end + end + end +end |