Ensure CheckIngressIpAddressService obtains exclusive lease per ingress controller (#42643)
This commit is contained in:
parent
c1828eaed5
commit
5190ef57a3
|
@ -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
|
||||
|
|
|
@ -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') }
|
||||
|
||||
|
|
Loading…
Reference in New Issue