From 5190ef57a3c5a4333020a5281904e56c00519e91 Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Thu, 15 Feb 2018 17:24:59 +1100 Subject: [PATCH] Ensure CheckIngressIpAddressService obtains exclusive lease per ingress controller (#42643) --- .../check_ingress_ip_address_service.rb | 9 +++++++++ .../check_ingress_ip_address_service_spec.rb | 19 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/app/services/clusters/applications/check_ingress_ip_address_service.rb b/app/services/clusters/applications/check_ingress_ip_address_service.rb index cf132676aa6..3262aa59a90 100644 --- a/app/services/clusters/applications/check_ingress_ip_address_service.rb +++ b/app/services/clusters/applications/check_ingress_ip_address_service.rb @@ -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 diff --git a/spec/services/clusters/applications/check_ingress_ip_address_service_spec.rb b/spec/services/clusters/applications/check_ingress_ip_address_service_spec.rb index 5d99196fbe6..6c81acfcf84 100644 --- a/spec/services/clusters/applications/check_ingress_ip_address_service_spec.rb +++ b/spec/services/clusters/applications/check_ingress_ip_address_service_spec.rb @@ -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') }