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 Clusters
|
||||||
module Applications
|
module Applications
|
||||||
class CheckIngressIpAddressService < BaseHelmService
|
class CheckIngressIpAddressService < BaseHelmService
|
||||||
|
LEASE_TIMEOUT = 3.seconds.to_i
|
||||||
|
|
||||||
def execute(retries_remaining)
|
def execute(retries_remaining)
|
||||||
return if app.external_ip
|
return if app.external_ip
|
||||||
|
return unless try_obtain_lease
|
||||||
|
|
||||||
service = get_service
|
service = get_service
|
||||||
|
|
||||||
|
@ -18,6 +21,12 @@ module Clusters
|
||||||
|
|
||||||
private
|
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)
|
def resolve_external_ip(service)
|
||||||
app.update!( external_ip: service.status.loadBalancer.ingress[0].ip)
|
app.update!( external_ip: service.status.loadBalancer.ingress[0].ip)
|
||||||
end
|
end
|
||||||
|
|
|
@ -16,9 +16,14 @@ describe Clusters::Applications::CheckIngressIpAddressService do
|
||||||
end
|
end
|
||||||
let(:kubeclient) { double(::Kubeclient::Client, get_service: kube_service) }
|
let(:kubeclient) { double(::Kubeclient::Client, get_service: kube_service) }
|
||||||
let(:ingress) { [{ ip: '111.222.111.222' }] }
|
let(:ingress) { [{ ip: '111.222.111.222' }] }
|
||||||
|
let(:exclusive_lease) { instance_double(Gitlab::ExclusiveLease, try_obtain: true) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
allow(application.cluster).to receive(:kubeclient).and_return(kubeclient)
|
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
|
end
|
||||||
|
|
||||||
describe '#execute' do
|
describe '#execute' do
|
||||||
|
@ -52,6 +57,20 @@ describe Clusters::Applications::CheckIngressIpAddressService do
|
||||||
end
|
end
|
||||||
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
|
context 'when there is already an external_ip' do
|
||||||
let(:application) { create(:clusters_applications_ingress, :installed, external_ip: '001.111.002.111') }
|
let(:application) { create(:clusters_applications_ingress, :installed, external_ip: '001.111.002.111') }
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue