Commit 5190ef57 authored by Dylan Griffith's avatar Dylan Griffith

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

parent c1828eae
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
......
......@@ -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') }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment