# frozen_string_literal: true # Concern for setting Sidekiq settings for the various GitLab ObjectStorage workers. module ClusterCleanupMethods extend ActiveSupport::Concern include ApplicationWorker include ClusterQueue DEFAULT_EXECUTION_LIMIT = 10 ExceededExecutionLimitError = Class.new(StandardError) included do worker_has_external_dependencies! sidekiq_options retry: 3 sidekiq_retries_exhausted do |msg, error| cluster_id = msg['args'][0] cluster = Clusters::Cluster.find_by_id(cluster_id) cluster.make_cleanup_errored!("#{self.class.name} retried too many times") if cluster logger = Gitlab::Kubernetes::Logger.build logger.error({ exception: error, cluster_id: cluster_id, class_name: msg['class'], event: :sidekiq_retries_exhausted, message: msg['error_message'] }) end end private # Override this method to customize the execution_limit def execution_limit DEFAULT_EXECUTION_LIMIT end def exceeded_execution_limit?(execution_count) execution_count >= execution_limit end def logger @logger ||= Gitlab::Kubernetes::Logger.build end def exceeded_execution_limit(cluster) log_exceeded_execution_limit_error(cluster) cluster.make_cleanup_errored!("#{self.class.name} exceeded the execution limit") end def cluster_applications_and_status(cluster) cluster.persisted_applications .map { |application| "#{application.name}:#{application.status_name}" } .join(",") end def log_exceeded_execution_limit_error(cluster) logger.error({ exception: ExceededExecutionLimitError.name, cluster_id: cluster.id, class_name: self.class.name, cleanup_status: cluster.cleanup_status_name, applications: cluster_applications_and_status(cluster), event: :failed_to_remove_cluster_and_resources, message: "exceeded execution limit of #{execution_limit} tries" }) end end