Add Clusters::Appplications::CheckInstallationProgressService tests
This commit is contained in:
parent
c6c9b37b1d
commit
80b0834ae9
|
@ -27,13 +27,13 @@ module Clusters
|
||||||
end
|
end
|
||||||
|
|
||||||
def on_failed
|
def on_failed
|
||||||
app.make_errored!(log || 'Installation silently failed')
|
app.make_errored!(installation_errors || 'Installation silently failed')
|
||||||
finalize_installation
|
finalize_installation
|
||||||
end
|
end
|
||||||
|
|
||||||
def check_timeout
|
def check_timeout
|
||||||
if Time.now.utc - app.updated_at.to_time.utc > ClusterWaitForAppInstallationWorker::TIMEOUT
|
if Time.now.utc - app.updated_at.to_time.utc > ClusterWaitForAppInstallationWorker::TIMEOUT
|
||||||
app.make_errored!('App installation timeouted')
|
app.make_errored!('Installation timeouted')
|
||||||
else
|
else
|
||||||
ClusterWaitForAppInstallationWorker.perform_in(
|
ClusterWaitForAppInstallationWorker.perform_in(
|
||||||
ClusterWaitForAppInstallationWorker::INTERVAL, app.name, app.id)
|
ClusterWaitForAppInstallationWorker::INTERVAL, app.name, app.id)
|
||||||
|
|
|
@ -31,5 +31,10 @@ FactoryGirl.define do
|
||||||
status(-1)
|
status(-1)
|
||||||
status_reason 'something went wrong'
|
status_reason 'something went wrong'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
trait :timeouted do
|
||||||
|
installing
|
||||||
|
updated_at ClusterWaitForAppInstallationWorker::TIMEOUT.ago
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,75 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe Clusters::Applications::CheckInstallationProgressService do
|
||||||
|
RESCHEDULE_PHASES = Gitlab::Kubernetes::Pod::PHASES - [Gitlab::Kubernetes::Pod::SUCCEEDED, Gitlab::Kubernetes::Pod::FAILED].freeze
|
||||||
|
|
||||||
|
def mock_helm_api(phase, errors: nil)
|
||||||
|
expect(service).to receive(:installation_phase).once.and_return(phase)
|
||||||
|
expect(service).to receive(:installation_errors).once.and_return(errors) if errors.present?
|
||||||
|
end
|
||||||
|
|
||||||
|
shared_examples 'not yet completed phase' do |phase|
|
||||||
|
context "when the installation POD phase is #{phase}" do
|
||||||
|
before do
|
||||||
|
mock_helm_api(phase)
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when not timeouted' do
|
||||||
|
it 'reschedule a new check' do
|
||||||
|
expect(ClusterWaitForAppInstallationWorker).to receive(:perform_in).once
|
||||||
|
|
||||||
|
service.execute
|
||||||
|
|
||||||
|
expect(application).to be_installing
|
||||||
|
expect(application.status_reason).to be_nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when timeouted' do
|
||||||
|
let(:application) { create(:applications_helm, :timeouted) }
|
||||||
|
|
||||||
|
it 'make the application errored' do
|
||||||
|
expect(ClusterWaitForAppInstallationWorker).not_to receive(:perform_in)
|
||||||
|
|
||||||
|
service.execute
|
||||||
|
|
||||||
|
expect(application).to be_errored
|
||||||
|
expect(application.status_reason).to match(/\btimeouted\b/)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#execute' do
|
||||||
|
let(:application) { create(:applications_helm, :installing) }
|
||||||
|
let(:service) { described_class.new(application) }
|
||||||
|
|
||||||
|
context 'when installation POD succeeded' do
|
||||||
|
it 'make the application installed' do
|
||||||
|
mock_helm_api(Gitlab::Kubernetes::Pod::SUCCEEDED)
|
||||||
|
expect(service).to receive(:finalize_installation).once
|
||||||
|
|
||||||
|
service.execute
|
||||||
|
|
||||||
|
expect(application).to be_installed
|
||||||
|
expect(application.status_reason).to be_nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when installation POD failed' do
|
||||||
|
let(:error_message) { 'test installation failed' }
|
||||||
|
|
||||||
|
it 'make the application errored' do
|
||||||
|
mock_helm_api(Gitlab::Kubernetes::Pod::FAILED, errors: error_message)
|
||||||
|
expect(service).to receive(:finalize_installation).once
|
||||||
|
|
||||||
|
service.execute
|
||||||
|
|
||||||
|
expect(application).to be_errored
|
||||||
|
expect(application.status_reason).to eq(error_message)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
RESCHEDULE_PHASES.each { |phase| it_behaves_like 'not yet completed phase', phase }
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue