diff --git a/ee/app/workers/ai/sync_service_token_worker.rb b/ee/app/workers/ai/sync_service_token_worker.rb index 01204d51827bc8d89d23e7814e88af517625557a..bff8e1a941e564127fb1bea9965b95957aa61925 100644 --- a/ee/app/workers/ai/sync_service_token_worker.rb +++ b/ee/app/workers/ai/sync_service_token_worker.rb @@ -1,5 +1,9 @@ # frozen_string_literal: true +# !!! WARNING !!! +# We keep it for compatibility during 16.9. Planned for removal in future releases. +# Starting 16.10, apply all changes to Cloud::SyncServiceTokenWorker instead. +# Refer to https://gitlab.com/groups/gitlab-org/-/epics/12544. module Ai class SyncServiceTokenWorker include ApplicationWorker diff --git a/ee/app/workers/all_queues.yml b/ee/app/workers/all_queues.yml index 4dd90f8566fe1b1378ec5376b96a76c44df5fc1f..18f6fff4d67a5db13dc056a130d580f04444e0c6 100644 --- a/ee/app/workers/all_queues.yml +++ b/ee/app/workers/all_queues.yml @@ -129,6 +129,15 @@ :weight: 1 :idempotent: true :tags: [] +- :name: cronjob:cloud_connector_sync_service_token + :worker_name: CloudConnector::SyncServiceTokenWorker + :feature_category: :cloud_connector + :has_external_dependencies: true + :urgency: :low + :resource_boundary: :unknown + :weight: 1 + :idempotent: true + :tags: [] - :name: cronjob:compliance_management_merge_requests_compliance_violations_consistency :worker_name: ComplianceManagement::MergeRequests::ComplianceViolationsConsistencyWorker :feature_category: :compliance_management diff --git a/ee/app/workers/cloud_connector/sync_service_token_worker.rb b/ee/app/workers/cloud_connector/sync_service_token_worker.rb new file mode 100644 index 0000000000000000000000000000000000000000..806da20d54a517293904031257e7f769fc74bf97 --- /dev/null +++ b/ee/app/workers/cloud_connector/sync_service_token_worker.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +module CloudConnector + class SyncServiceTokenWorker + include ApplicationWorker + + data_consistency :sticky + + include CronjobQueue # rubocop:disable Scalability/CronWorkerContext -- Does not perform work scoped to a context + + idempotent! + + sidekiq_options retry: 3 + + worker_has_external_dependencies! + + feature_category :cloud_connector + + def perform + return unless ::Feature.enabled?(:use_sync_service_token_worker) + + result = ::CloudConnector::SyncCloudConnectorAccessService.new.execute + + log_extra_metadata_on_done(:error_message, result[:message]) unless result.success? + end + end +end diff --git a/ee/spec/workers/cloud_connector/sync_service_token_worker_spec.rb b/ee/spec/workers/cloud_connector/sync_service_token_worker_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..a3c932fefc5bf8be9910d691db9814261026cedc --- /dev/null +++ b/ee/spec/workers/cloud_connector/sync_service_token_worker_spec.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe CloudConnector::SyncServiceTokenWorker, type: :worker, feature_category: :cloud_connector do + describe '#perform' do + let(:service_response) { ServiceResponse.success } + + before do + allow(CloudConnector::SyncCloudConnectorAccessService).to receive_message_chain(:new, + :execute).and_return(service_response) + end + + include_examples 'an idempotent worker' do + let(:worker) { described_class.new } + + subject(:sync_service_token) { perform_multiple(worker: worker) } + + it 'executes the SyncCloudConnectorAccessService with expected params' do + expect(CloudConnector::SyncCloudConnectorAccessService).to receive_message_chain(:new, :execute) + expect(worker).not_to receive(:log_extra_metadata_on_done) + + sync_service_token + end + + context 'when :use_sync_service_token_worker feature flag is disabled' do + before do + stub_feature_flags(use_sync_service_token_worker: false) + end + + it 'does not call CloudConnector::SyncCloudConnectorAccessService' do + expect(::CloudConnector::SyncCloudConnectorAccessService).not_to receive(:new) + expect(worker).not_to receive(:log_extra_metadata_on_done) + + sync_service_token + end + end + + context 'when SyncCloudConnectorAccessService fails' do + let(:service_response) { ServiceResponse.error(message: 'Error') } + + it { expect { sync_service_token }.not_to raise_error } + + it 'logs the error' do + expect(worker).to receive(:log_extra_metadata_on_done) + .with(:error_message, service_response[:message]).twice + + sync_service_token + end + end + end + end +end diff --git a/spec/workers/every_sidekiq_worker_spec.rb b/spec/workers/every_sidekiq_worker_spec.rb index 4918c4e00824b96b53874a1216bdc83d907182e3..75101c1a24e4862510ce5cafafaf4007405ae731 100644 --- a/spec/workers/every_sidekiq_worker_spec.rb +++ b/spec/workers/every_sidekiq_worker_spec.rb @@ -176,6 +176,7 @@ 'Ci::UnlockPipelinesInQueueWorker' => 0, 'Ci::SyncReportsToReportApprovalRulesWorker' => 3, 'CleanupContainerRepositoryWorker' => 3, + 'CloudConnector::SyncServiceTokenWorker' => 3, 'ClusterConfigureIstioWorker' => 3, 'ClusterInstallAppWorker' => 3, 'ClusterPatchAppWorker' => 3,