summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThong Kuah <tkuah@gitlab.com>2019-01-29 11:24:37 +1300
committerThong Kuah <tkuah@gitlab.com>2019-01-29 14:47:44 +1300
commit464b6cf2b7c4bece6188e6db2c75d80fdd55edd2 (patch)
tree477730531bcdfa0bf0026cd537c8652000f60c3b
parentd4ebb6462a917a49f749bb76a04d08872d13a6de (diff)
downloadgitlab-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
-rw-r--r--app/services/clusters/applications/check_installation_progress_service.rb33
-rw-r--r--app/services/clusters/applications/check_upgrade_progress_service.rb29
-rw-r--r--app/services/clusters/applications/install_service.rb4
-rw-r--r--app/services/clusters/applications/update_service.rb4
-rw-r--r--app/workers/cluster_wait_for_app_installation_worker.rb3
-rw-r--r--app/workers/cluster_wait_for_app_update_worker.rb3
-rw-r--r--spec/factories/clusters/applications/helm.rb2
-rw-r--r--spec/services/clusters/applications/check_installation_progress_service_spec.rb35
-rw-r--r--spec/services/clusters/applications/check_upgrade_progress_service_spec.rb26
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) }