diff options
author | Dylan Griffith <dyl.griffith@gmail.com> | 2018-02-23 01:08:12 +0300 |
---|---|---|
committer | Dylan Griffith <dyl.griffith@gmail.com> | 2018-02-23 01:10:14 +0300 |
commit | 3b320d675fe058311d921e26cd89b2e703310b21 (patch) | |
tree | c8135b9041f238bc2d435fea26cf3c3dd6940cd8 /app | |
parent | 17e85dacdd73b51a173d1f4c5efea5e20ee8c55b (diff) |
Simplify retrying for ClusterWaitForIngressIpAddressWorker and style changes
(#42643)
Diffstat (limited to 'app')
5 files changed, 20 insertions, 37 deletions
diff --git a/app/controllers/projects/clusters_controller.rb b/app/controllers/projects/clusters_controller.rb index c351caeeb7b..aeaba3a0acf 100644 --- a/app/controllers/projects/clusters_controller.rb +++ b/app/controllers/projects/clusters_controller.rb @@ -4,7 +4,7 @@ class Projects::ClustersController < Projects::ApplicationController before_action :authorize_create_cluster!, only: [:new] before_action :authorize_update_cluster!, only: [:update] before_action :authorize_admin_cluster!, only: [:destroy] - before_action :sync_application_details, only: [:status] + before_action :update_applications_status, only: [:status] STATUS_POLLING_INTERVAL = 10_000 @@ -116,7 +116,7 @@ class Projects::ClustersController < Projects::ApplicationController access_denied! unless can?(current_user, :admin_cluster, cluster) end - def sync_application_details - @cluster.applications.each(&:sync_details) + def update_applications_status + @cluster.applications.each(&:schedule_status_update) end end diff --git a/app/models/clusters/applications/ingress.rb b/app/models/clusters/applications/ingress.rb index e36fe9019c2..57ced0f5c44 100644 --- a/app/models/clusters/applications/ingress.rb +++ b/app/models/clusters/applications/ingress.rb @@ -37,12 +37,12 @@ module Clusters Gitlab::Kubernetes::Helm::InstallCommand.new(name, chart: chart, chart_values_file: chart_values_file) end - def sync_details + def schedule_status_update return unless installed? return if external_ip - ClusterWaitForIngressIpAddressWorker.perform_in( - ClusterWaitForIngressIpAddressWorker::INTERVAL, name, id, IP_ADDRESS_FETCH_RETRIES) + ClusterWaitForIngressIpAddressWorker.perform_async( + name, id, IP_ADDRESS_FETCH_RETRIES) end end end diff --git a/app/models/clusters/concerns/application_core.rb b/app/models/clusters/concerns/application_core.rb index 44b0fca3d01..623b836c0ed 100644 --- a/app/models/clusters/concerns/application_core.rb +++ b/app/models/clusters/concerns/application_core.rb @@ -24,7 +24,7 @@ module Clusters self.class.application_name end - def sync_details + def schedule_status_update # Override if you need extra data synchronized # from K8s after installation 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 300b7ed522c..a98e05b25cb 100644 --- a/app/services/clusters/applications/check_ingress_ip_address_service.rb +++ b/app/services/clusters/applications/check_ingress_ip_address_service.rb @@ -1,24 +1,17 @@ module Clusters module Applications class CheckIngressIpAddressService < BaseHelmService + include Gitlab::Utils::StrongMemoize + Error = Class.new(StandardError) LEASE_TIMEOUT = 3.seconds.to_i def execute - return true if app.external_ip - return true unless try_obtain_lease - - service = get_service + return if app.external_ip + return unless try_obtain_lease - if service.status.loadBalancer.ingress - resolve_external_ip(service) - else - false - end - - rescue KubeException => e - raise Error, "#{e.class}: #{e.message}" + app.update!(external_ip: ingress_ip) if ingress_ip end private @@ -29,12 +22,14 @@ module Clusters .try_obtain end - def resolve_external_ip(service) - app.update!(external_ip: service.status.loadBalancer.ingress[0].ip) + def ingress_ip + service.status.loadBalancer.ingress&.first&.ip end - def get_service - kubeclient.get_service('ingress-nginx-ingress-controller', Gitlab::Kubernetes::Helm::NAMESPACE) + def service + strong_memoize(:ingress_service) do + kubeclient.get_service('ingress-nginx-ingress-controller', Gitlab::Kubernetes::Helm::NAMESPACE) + end end end 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 0fbb9fb2526..72b3c8b49e0 100644 --- a/app/workers/cluster_wait_for_ingress_ip_address_worker.rb +++ b/app/workers/cluster_wait_for_ingress_ip_address_worker.rb @@ -3,23 +3,11 @@ class ClusterWaitForIngressIpAddressWorker include ClusterQueue include ClusterApplications - INTERVAL = 10.seconds + INTERVAL = 30.seconds def perform(app_name, app_id, retries_remaining) find_application(app_name, app_id) do |app| - 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) + Clusters::Applications::CheckIngressIpAddressService.new(app).execute end end end |