Ensure CheckIngressIpAddressService obtains exclusive lease per ingress controller (#42643)

This commit is contained in:
Dylan Griffith 2018-02-15 17:24:59 +11:00
parent c1828eaed5
commit 5190ef57a3
2 changed files with 28 additions and 0 deletions

View File

@ -1,8 +1,11 @@
module Clusters
module Applications
class CheckIngressIpAddressService < BaseHelmService
LEASE_TIMEOUT = 3.seconds.to_i
def execute(retries_remaining)
return if app.external_ip
return unless try_obtain_lease
service = get_service
@ -18,6 +21,12 @@ module Clusters
private
def try_obtain_lease
Gitlab::ExclusiveLease
.new("check_ingress_ip_address_service:#{app.id}", timeout: LEASE_TIMEOUT)
.try_obtain
end
def resolve_external_ip(service)
app.update!( external_ip: service.status.loadBalancer.ingress[0].ip)
end

View File

@ -16,9 +16,14 @@ describe Clusters::Applications::CheckIngressIpAddressService do
end
let(:kubeclient) { double(::Kubeclient::Client, get_service: kube_service) }
let(:ingress) { [{ ip: '111.222.111.222' }] }
let(:exclusive_lease) { instance_double(Gitlab::ExclusiveLease, try_obtain: true) }
before do
allow(application.cluster).to receive(:kubeclient).and_return(kubeclient)
allow(Gitlab::ExclusiveLease)
.to receive(:new)
.with("check_ingress_ip_address_service:#{application.id}", timeout: 3.seconds.to_i)
.and_return(exclusive_lease)
end
describe '#execute' do
@ -52,6 +57,20 @@ describe Clusters::Applications::CheckIngressIpAddressService do
end
end
context 'when the exclusive lease cannot be obtained' do
before do
allow(exclusive_lease)
.to receive(:try_obtain)
.and_return(false)
end
it 'does not call kubeclient' do
expect(kubeclient).not_to receive(:get_service)
service.execute(1)
end
end
context 'when there is already an external_ip' do
let(:application) { create(:clusters_applications_ingress, :installed, external_ip: '001.111.002.111') }