diff options
author | Thong Kuah <tkuah@gitlab.com> | 2019-01-29 11:24:37 +1300 |
---|---|---|
committer | Thong Kuah <tkuah@gitlab.com> | 2019-01-29 14:47:44 +1300 |
commit | 464b6cf2b7c4bece6188e6db2c75d80fdd55edd2 (patch) | |
tree | 477730531bcdfa0bf0026cd537c8652000f60c3b | |
parent | d4ebb6462a917a49f749bb76a04d08872d13a6de (diff) | |
download | gitlab-ce-464b6cf2b7c4bece6188e6db2c75d80fdd55edd2.tar.gz |
Reduce differences so that we can re-use codeport-gitlab-managed-apps-upgrade-services
check_installation_progress_service.rb and
check_upgrade_progress_service.rb and their respective specs are
basically copies of each other but with differnt states and error
messages
9 files changed, 77 insertions, 62 deletions
diff --git a/app/services/clusters/applications/check_installation_progress_service.rb b/app/services/clusters/applications/check_installation_progress_service.rb index 21ec26ea233..a9e09914153 100644 --- a/app/services/clusters/applications/check_installation_progress_service.rb +++ b/app/services/clusters/applications/check_installation_progress_service.rb @@ -3,10 +3,13 @@ module Clusters module Applications class CheckInstallationProgressService < BaseHelmService + INTERVAL = 10.seconds + TIMEOUT = 20.minutes + def execute return unless app.installing? - case installation_phase + case phase when Gitlab::Kubernetes::Pod::SUCCEEDED on_success when Gitlab::Kubernetes::Pod::FAILED @@ -19,43 +22,41 @@ module Clusters app.make_errored!("Kubernetes error: #{e.error_code}") unless app.errored? end + def pod_name + install_command.pod_name + end + private def on_success app.make_installed! ensure - remove_installation_pod + remove_pod end def on_failed - app.make_errored!("Installation failed. Check pod logs for #{install_command.pod_name} for more details.") + app.make_errored!("Installation failed. Check pod logs for #{pod_name} for more details.") end def check_timeout if timeouted? - begin - app.make_errored!("Installation timed out. Check pod logs for #{install_command.pod_name} for more details.") - end + app.make_errored!("Installation timed out. Check pod logs for #{pod_name} for more details.") else ClusterWaitForAppInstallationWorker.perform_in( - ClusterWaitForAppInstallationWorker::INTERVAL, app.name, app.id) + INTERVAL, app.name, app.id) end end def timeouted? - Time.now.utc - app.updated_at.to_time.utc > ClusterWaitForAppInstallationWorker::TIMEOUT - end - - def remove_installation_pod - helm_api.delete_pod!(install_command.pod_name) + Time.now.utc - app.updated_at.to_time.utc > TIMEOUT end - def installation_phase - helm_api.status(install_command.pod_name) + def remove_pod + helm_api.delete_pod!(pod_name) end - def installation_errors - helm_api.log(install_command.pod_name) + def phase + helm_api.status(pod_name) end end end diff --git a/app/services/clusters/applications/check_upgrade_progress_service.rb b/app/services/clusters/applications/check_upgrade_progress_service.rb index 11c078d15b7..6b1a6e4516f 100644 --- a/app/services/clusters/applications/check_upgrade_progress_service.rb +++ b/app/services/clusters/applications/check_upgrade_progress_service.rb @@ -3,13 +3,16 @@ module Clusters module Applications class CheckUpgradeProgressService < BaseHelmService + INTERVAL = 10.seconds + TIMEOUT = 20.minutes + def execute return unless app.updating? case phase - when ::Gitlab::Kubernetes::Pod::SUCCEEDED + when Gitlab::Kubernetes::Pod::SUCCEEDED on_success - when ::Gitlab::Kubernetes::Pod::FAILED + when Gitlab::Kubernetes::Pod::FAILED on_failed else check_timeout @@ -19,6 +22,10 @@ module Clusters app.make_update_errored!("Kubernetes error: #{e.error_code}") unless app.update_errored? end + def pod_name + upgrade_command.pod_name + end + private def on_success @@ -28,34 +35,30 @@ module Clusters end def on_failed - app.make_update_errored!("Update failed. Check pod logs for #{upgrade_command.pod_name} for more details.") + app.make_update_errored!("Update failed. Check pod logs for #{pod_name} for more details.") end def check_timeout if timeouted? - app.make_update_errored!("Update timed out. Check pod logs for #{upgrade_command.pod_name} for more details.") + app.make_update_errored!("Update timed out. Check pod logs for #{pod_name} for more details.") else - ::ClusterWaitForAppUpdateWorker.perform_in( - ::ClusterWaitForAppUpdateWorker::INTERVAL, app.name, app.id) + ClusterWaitForAppUpdateWorker.perform_in( + INTERVAL, app.name, app.id) end end def timeouted? - Time.now.utc - app.updated_at.to_time.utc > ::ClusterWaitForAppUpdateWorker::TIMEOUT + Time.now.utc - app.updated_at.to_time.utc > TIMEOUT end def remove_pod - helm_api.delete_pod!(upgrade_command.pod_name) + helm_api.delete_pod!(pod_name) rescue # no-op end def phase - helm_api.status(upgrade_command.pod_name) - end - - def errors - helm_api.log(upgrade_command.pod_name) + helm_api.status(pod_name) end end end diff --git a/app/services/clusters/applications/install_service.rb b/app/services/clusters/applications/install_service.rb index 5a65dc4ef59..4313fbae220 100644 --- a/app/services/clusters/applications/install_service.rb +++ b/app/services/clusters/applications/install_service.rb @@ -3,6 +3,8 @@ module Clusters module Applications class InstallService < BaseHelmService + INTERVAL = 10.seconds + def execute return unless app.scheduled? @@ -11,7 +13,7 @@ module Clusters helm_api.install(install_command) ClusterWaitForAppInstallationWorker.perform_in( - ClusterWaitForAppInstallationWorker::INTERVAL, app.name, app.id) + INTERVAL, app.name, app.id) rescue Kubeclient::HttpError => e log_error(e) app.make_errored!("Kubernetes error: #{e.error_code}") diff --git a/app/services/clusters/applications/update_service.rb b/app/services/clusters/applications/update_service.rb index e533bdc24f2..a94b87ee315 100644 --- a/app/services/clusters/applications/update_service.rb +++ b/app/services/clusters/applications/update_service.rb @@ -5,6 +5,8 @@ module Clusters class UpdateService < BaseHelmService attr_accessor :project + INTERVAL = 10.seconds + def initialize(app, project) super(app) @project = project @@ -17,7 +19,7 @@ module Clusters app.make_updating! helm_api.update(upgrade_command(replaced_values: replaced_values)) - ::ClusterWaitForAppUpdateWorker.perform_in(::ClusterWaitForAppUpdateWorker::INTERVAL, app.name, app.id) + ::ClusterWaitForAppUpdateWorker.perform_in(INTERVAL, app.name, app.id) rescue Kubeclient::HttpError => e log_error(e) app.make_update_errored!("Kubernetes error: #{e.error_code}") diff --git a/app/workers/cluster_wait_for_app_installation_worker.rb b/app/workers/cluster_wait_for_app_installation_worker.rb index e8d7e52f70f..1958c160d01 100644 --- a/app/workers/cluster_wait_for_app_installation_worker.rb +++ b/app/workers/cluster_wait_for_app_installation_worker.rb @@ -5,9 +5,6 @@ class ClusterWaitForAppInstallationWorker include ClusterQueue include ClusterApplications - INTERVAL = 10.seconds - TIMEOUT = 20.minutes - def perform(app_name, app_id) find_application(app_name, app_id) do |app| Clusters::Applications::CheckInstallationProgressService.new(app).execute diff --git a/app/workers/cluster_wait_for_app_update_worker.rb b/app/workers/cluster_wait_for_app_update_worker.rb index 10cdb67ca14..e647270a440 100644 --- a/app/workers/cluster_wait_for_app_update_worker.rb +++ b/app/workers/cluster_wait_for_app_update_worker.rb @@ -5,9 +5,6 @@ class ClusterWaitForAppUpdateWorker include ClusterQueue include ClusterApplications - INTERVAL = 10.seconds - TIMEOUT = 20.minutes - def perform(app_name, app_id) find_application(app_name, app_id) do |app| ::Clusters::Applications::CheckUpgradeProgressService.new(app).execute diff --git a/spec/factories/clusters/applications/helm.rb b/spec/factories/clusters/applications/helm.rb index fe56ac5b71d..618dd9b6325 100644 --- a/spec/factories/clusters/applications/helm.rb +++ b/spec/factories/clusters/applications/helm.rb @@ -42,7 +42,7 @@ FactoryBot.define do trait :timeouted do installing - updated_at { ClusterWaitForAppInstallationWorker::TIMEOUT.ago } + updated_at { Clusters::Applications::CheckInstallationProgressService::TIMEOUT.ago } end factory :clusters_applications_ingress, class: Clusters::Applications::Ingress do diff --git a/spec/services/clusters/applications/check_installation_progress_service_spec.rb b/spec/services/clusters/applications/check_installation_progress_service_spec.rb index 45b8ce94815..f4ed906c03e 100644 --- a/spec/services/clusters/applications/check_installation_progress_service_spec.rb +++ b/spec/services/clusters/applications/check_installation_progress_service_spec.rb @@ -1,25 +1,29 @@ +# frozen_string_literal: true + require 'spec_helper' describe Clusters::Applications::CheckInstallationProgressService do - RESCHEDULE_PHASES = Gitlab::Kubernetes::Pod::PHASES - [Gitlab::Kubernetes::Pod::SUCCEEDED, Gitlab::Kubernetes::Pod::FAILED].freeze + RESCHEDULE_PHASES = Gitlab::Kubernetes::Pod::PHASES - + [Gitlab::Kubernetes::Pod::SUCCEEDED, Gitlab::Kubernetes::Pod::FAILED].freeze let(:application) { create(:clusters_applications_helm, :installing) } let(:service) { described_class.new(application) } let(:phase) { Gitlab::Kubernetes::Pod::UNKNOWN } let(:errors) { nil } + let(:worker_class) { ClusterWaitForAppInstallationWorker } - shared_examples 'a not yet terminated installation' do |a_phase| + shared_examples 'a not yet terminated pod phase' do |a_phase| let(:phase) { a_phase } before do - expect(service).to receive(:installation_phase).once.and_return(phase) + expect(service).to receive(:phase).once.and_return(phase) end context "when phase is #{a_phase}" do - context 'when not timeouted' do + context 'when not timed out' do it 'reschedule a new check' do - expect(ClusterWaitForAppInstallationWorker).to receive(:perform_in).once - expect(service).not_to receive(:remove_installation_pod) + expect(worker_class).to receive(:perform_in).once + expect(service).not_to receive(:remove_pod) service.execute @@ -28,11 +32,11 @@ describe Clusters::Applications::CheckInstallationProgressService do end end - context 'when timeouted' do + context 'when timed out' do let(:application) { create(:clusters_applications_helm, :timeouted) } it 'make the application errored' do - expect(ClusterWaitForAppInstallationWorker).not_to receive(:perform_in) + expect(worker_class).not_to receive(:perform_in) service.execute @@ -44,8 +48,7 @@ describe Clusters::Applications::CheckInstallationProgressService do end before do - allow(service).to receive(:installation_errors).and_return(errors) - allow(service).to receive(:remove_installation_pod).and_return(nil) + allow(service).to receive(:remove_pod).and_return(nil) end describe '#execute' do @@ -53,17 +56,17 @@ describe Clusters::Applications::CheckInstallationProgressService do let(:phase) { Gitlab::Kubernetes::Pod::SUCCEEDED } before do - expect(service).to receive(:installation_phase).once.and_return(phase) + expect(service).to receive(:phase).once.and_return(phase) end it 'removes the installation POD' do - expect(service).to receive(:remove_installation_pod).once + expect(service).to receive(:remove_pod).once service.execute end it 'make the application installed' do - expect(ClusterWaitForAppInstallationWorker).not_to receive(:perform_in) + expect(worker_class).not_to receive(:perform_in) service.execute @@ -77,7 +80,7 @@ describe Clusters::Applications::CheckInstallationProgressService do let(:errors) { 'test installation failed' } before do - expect(service).to receive(:installation_phase).once.and_return(phase) + expect(service).to receive(:phase).once.and_return(phase) end it 'make the application errored' do @@ -88,7 +91,7 @@ describe Clusters::Applications::CheckInstallationProgressService do end end - RESCHEDULE_PHASES.each { |phase| it_behaves_like 'a not yet terminated installation', phase } + RESCHEDULE_PHASES.each { |phase| it_behaves_like 'a not yet terminated pod phase', phase } context 'when installation raises a Kubeclient::HttpError' do let(:cluster) { create(:cluster, :provided_by_user, :project) } @@ -96,7 +99,7 @@ describe Clusters::Applications::CheckInstallationProgressService do before do application.update!(cluster: cluster) - expect(service).to receive(:installation_phase).and_raise(Kubeclient::HttpError.new(401, 'Unauthorized', nil)) + expect(service).to receive(:phase).and_raise(Kubeclient::HttpError.new(401, 'Unauthorized', nil)) end it 'shows the response code from the error' do diff --git a/spec/services/clusters/applications/check_upgrade_progress_service_spec.rb b/spec/services/clusters/applications/check_upgrade_progress_service_spec.rb index 939c9b79a94..a8dd91aa160 100644 --- a/spec/services/clusters/applications/check_upgrade_progress_service_spec.rb +++ b/spec/services/clusters/applications/check_upgrade_progress_service_spec.rb @@ -10,14 +10,19 @@ describe Clusters::Applications::CheckUpgradeProgressService do let(:service) { described_class.new(application) } let(:phase) { ::Gitlab::Kubernetes::Pod::UNKNOWN } let(:errors) { nil } + let(:worker_class) { ClusterWaitForAppUpdateWorker } - shared_examples 'a not yet terminated upgrade' do |a_phase| + shared_examples 'a not yet terminated pod phase' do |a_phase| let(:phase) { a_phase } + before do + expect(service).to receive(:phase).once.and_return(phase) + end + context "when phase is #{a_phase}" do context 'when not timed out' do it 'reschedule a new check' do - expect(::ClusterWaitForAppUpdateWorker).to receive(:perform_in).once + expect(worker_class).to receive(:perform_in).once expect(service).not_to receive(:remove_pod) service.execute @@ -31,7 +36,7 @@ describe Clusters::Applications::CheckUpgradeProgressService do let(:application) { create(:clusters_applications_prometheus, :timeouted, :updating) } it 'make the application update errored' do - expect(::ClusterWaitForAppUpdateWorker).not_to receive(:perform_in) + expect(worker_class).not_to receive(:perform_in) service.execute @@ -43,9 +48,6 @@ describe Clusters::Applications::CheckUpgradeProgressService do end before do - allow(service).to receive(:phase).once.and_return(phase) - - allow(service).to receive(:errors).and_return(errors) allow(service).to receive(:remove_pod).and_return(nil) end @@ -53,6 +55,10 @@ describe Clusters::Applications::CheckUpgradeProgressService do context 'when upgrade pod succeeded' do let(:phase) { ::Gitlab::Kubernetes::Pod::SUCCEEDED } + before do + expect(service).to receive(:phase).once.and_return(phase) + end + it 'removes the upgrade pod' do expect(service).to receive(:remove_pod).once @@ -60,7 +66,7 @@ describe Clusters::Applications::CheckUpgradeProgressService do end it 'make the application upgraded' do - expect(::ClusterWaitForAppUpdateWorker).not_to receive(:perform_in) + expect(worker_class).not_to receive(:perform_in) service.execute @@ -73,6 +79,10 @@ describe Clusters::Applications::CheckUpgradeProgressService do let(:phase) { ::Gitlab::Kubernetes::Pod::FAILED } let(:errors) { 'test installation failed' } + before do + expect(service).to receive(:phase).once.and_return(phase) + end + it 'make the application update errored' do service.execute @@ -81,7 +91,7 @@ describe Clusters::Applications::CheckUpgradeProgressService do end end - RESCHEDULE_PHASES.each { |phase| it_behaves_like 'a not yet terminated upgrade', phase } + RESCHEDULE_PHASES.each { |phase| it_behaves_like 'a not yet terminated pod phase', phase } context 'when upgrade raises a Kubeclient::HttpError' do let(:cluster) { create(:cluster, :provided_by_user, :project) } |