From 3af3bc1724ae45cc7cc0dbc5330aadc84f45f41d Mon Sep 17 00:00:00 2001
From: Aleksei Lipniagov <alipniagov@gitlab.com>
Date: Mon, 5 Feb 2024 10:12:48 +0000
Subject: [PATCH] Move SyncServiceTokenWorker to CC namespace

Move the worker from Ai:: to CloudConnector:: namespace.
---
 .../workers/ai/sync_service_token_worker.rb   |  4 ++
 ee/app/workers/all_queues.yml                 |  9 ++++
 .../sync_service_token_worker.rb              | 27 ++++++++++
 .../sync_service_token_worker_spec.rb         | 53 +++++++++++++++++++
 spec/workers/every_sidekiq_worker_spec.rb     |  1 +
 5 files changed, 94 insertions(+)
 create mode 100644 ee/app/workers/cloud_connector/sync_service_token_worker.rb
 create mode 100644 ee/spec/workers/cloud_connector/sync_service_token_worker_spec.rb

diff --git a/ee/app/workers/ai/sync_service_token_worker.rb b/ee/app/workers/ai/sync_service_token_worker.rb
index 01204d51827bc..bff8e1a941e56 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 4dd90f8566fe1..18f6fff4d67a5 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 0000000000000..806da20d54a51
--- /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 0000000000000..a3c932fefc5bf
--- /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 4918c4e00824b..75101c1a24e48 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,
-- 
GitLab