Add Clusters::Appplications::CheckInstallationProgressService tests

This commit is contained in:
Alessio Caiazza 2017-11-06 10:23:15 +01:00
parent c6c9b37b1d
commit 80b0834ae9
No known key found for this signature in database
GPG Key ID: 8655B9CB5B8B512E
3 changed files with 82 additions and 2 deletions

View File

@ -27,13 +27,13 @@ module Clusters
end
def on_failed
app.make_errored!(log || 'Installation silently failed')
app.make_errored!(installation_errors || 'Installation silently failed')
finalize_installation
end
def check_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
ClusterWaitForAppInstallationWorker.perform_in(
ClusterWaitForAppInstallationWorker::INTERVAL, app.name, app.id)

View File

@ -31,5 +31,10 @@ FactoryGirl.define do
status(-1)
status_reason 'something went wrong'
end
trait :timeouted do
installing
updated_at ClusterWaitForAppInstallationWorker::TIMEOUT.ago
end
end
end

View File

@ -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