diff options
author | Dylan Griffith <dyl.griffith@gmail.com> | 2018-02-20 04:42:05 +0300 |
---|---|---|
committer | Dylan Griffith <dyl.griffith@gmail.com> | 2018-02-20 04:47:07 +0300 |
commit | ba4114d25f538d198df2f681b9cb08567494207e (patch) | |
tree | 876cf5b44ab81b25cdf30acb9ebd642778800615 /app | |
parent | f0b27f9b406579a03e55fa16cbc7095009dc8c2b (diff) |
Refactor ingress IP address waiting code (#42643)
Diffstat (limited to 'app')
5 files changed, 32 insertions, 26 deletions
diff --git a/app/models/clusters/applications/ingress.rb b/app/models/clusters/applications/ingress.rb index 5e9086aecca..418ce7d1504 100644 --- a/app/models/clusters/applications/ingress.rb +++ b/app/models/clusters/applications/ingress.rb @@ -5,6 +5,7 @@ module Clusters include ::Clusters::Concerns::ApplicationCore include ::Clusters::Concerns::ApplicationStatus + include AfterCommitQueue default_value_for :ingress_type, :nginx default_value_for :version, :nginx @@ -15,6 +16,15 @@ module Clusters IP_ADDRESS_FETCH_RETRIES = 3 + state_machine :status do + before_transition any => [:installed] do |application| + application.run_after_commit do + ClusterWaitForIngressIpAddressWorker.perform_in( + ClusterWaitForIngressIpAddressWorker::INTERVAL, application.name, application.id, IP_ADDRESS_FETCH_RETRIES) + end + end + end + def chart 'stable/nginx-ingress' end @@ -26,11 +36,6 @@ module Clusters def install_command Gitlab::Kubernetes::Helm::InstallCommand.new(name, chart: chart, chart_values_file: chart_values_file) end - - def post_install - ClusterWaitForIngressIpAddressWorker.perform_in( - ClusterWaitForIngressIpAddressWorker::INTERVAL, name, id, IP_ADDRESS_FETCH_RETRIES) - end end end end diff --git a/app/models/clusters/concerns/application_core.rb b/app/models/clusters/concerns/application_core.rb index b047fbce214..a98fa85a5ff 100644 --- a/app/models/clusters/concerns/application_core.rb +++ b/app/models/clusters/concerns/application_core.rb @@ -23,10 +23,6 @@ module Clusters def name self.class.application_name end - - def post_install - # Override for any extra work that needs to be done after install - end end end end 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 3262aa59a90..300b7ed522c 100644 --- a/app/services/clusters/applications/check_ingress_ip_address_service.rb +++ b/app/services/clusters/applications/check_ingress_ip_address_service.rb @@ -1,22 +1,24 @@ module Clusters module Applications class CheckIngressIpAddressService < BaseHelmService + Error = Class.new(StandardError) + LEASE_TIMEOUT = 3.seconds.to_i - def execute(retries_remaining) - return if app.external_ip - return unless try_obtain_lease + def execute + return true if app.external_ip + return true unless try_obtain_lease service = get_service if service.status.loadBalancer.ingress resolve_external_ip(service) else - retry_if_necessary(retries_remaining) + false end - rescue KubeException - retry_if_necessary(retries_remaining) + rescue KubeException => e + raise Error, "#{e.class}: #{e.message}" end private @@ -28,19 +30,12 @@ module Clusters end 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 def get_service kubeclient.get_service('ingress-nginx-ingress-controller', Gitlab::Kubernetes::Helm::NAMESPACE) end - - def retry_if_necessary(retries_remaining) - if retries_remaining > 0 - ClusterWaitForIngressIpAddressWorker.perform_in( - ClusterWaitForIngressIpAddressWorker::INTERVAL, app.name, app.id, retries_remaining - 1) - end - end end end end diff --git a/app/services/clusters/applications/check_installation_progress_service.rb b/app/services/clusters/applications/check_installation_progress_service.rb index 7dcddc1c3f7..bde090eaeec 100644 --- a/app/services/clusters/applications/check_installation_progress_service.rb +++ b/app/services/clusters/applications/check_installation_progress_service.rb @@ -20,7 +20,6 @@ module Clusters def on_success app.make_installed! - app.post_install ensure remove_installation_pod end diff --git a/app/workers/cluster_wait_for_ingress_ip_address_worker.rb b/app/workers/cluster_wait_for_ingress_ip_address_worker.rb index 829417484cf..0fbb9fb2526 100644 --- a/app/workers/cluster_wait_for_ingress_ip_address_worker.rb +++ b/app/workers/cluster_wait_for_ingress_ip_address_worker.rb @@ -4,11 +4,22 @@ class ClusterWaitForIngressIpAddressWorker include ClusterApplications INTERVAL = 10.seconds - TIMEOUT = 20.minutes def perform(app_name, app_id, retries_remaining) find_application(app_name, app_id) do |app| - Clusters::Applications::CheckIngressIpAddressService.new(app).execute(retries_remaining) + result = Clusters::Applications::CheckIngressIpAddressService.new(app).execute + retry_if_necessary(app_name, app_id, retries_remaining) unless result + end + rescue Clusters::Applications::CheckIngressIpAddressService::Error => e + retry_if_necessary(app_name, app_id, retries_remaining) + raise e + end + + private + + def retry_if_necessary(app_name, app_id, retries_remaining) + if retries_remaining > 0 + self.class.perform_in(INTERVAL, app_name, app_id, retries_remaining - 1) end end end |