Move Git access class to replicator

Each repository type has its own Git access class
with its specific error messages.
parent bc285ea5
......@@ -6,18 +6,19 @@ module EE
prepended do
include ::Gitlab::Geo::ReplicableModel
with_replicator Geo::SnippetRepositoryReplicator
end
class_methods do
def replicables_for_geo_node
# Not implemented yet. Should be responible for selective sync
# Not implemented yet. Should be responsible for selective sync
all
end
end
# Geo checks this method in FrameworkRepositorySyncService to avoid snapshotting
# repositories using object pools
# Geo checks this method in FrameworkRepositorySyncService to avoid
# snapshotting repositories using object pools
def pool_repository
nil
end
......
......@@ -8,6 +8,10 @@ module Geo
::SnippetRepository
end
def self.git_access_class
::Gitlab::GitAccessSnippet
end
def self.replication_enabled_by_default?
false
end
......@@ -16,8 +20,14 @@ module Geo
false
end
def repository
model_record.repository
# Once https://gitlab.com/gitlab-org/gitlab/-/issues/213021 is fixed
# this method can be removed
def jwt_authentication_header
authorization = ::Gitlab::Geo::RepoSyncRequest.new(
scope: repository.full_path.sub('@snippets', 'snippets')
).authorization
{ "http.#{remote_url}.extraHeader" => "Authorization: #{authorization}" }
end
# Once https://gitlab.com/gitlab-org/gitlab/-/issues/213021 is fixed
......@@ -27,14 +37,8 @@ module Geo
url.sub('@snippets', 'snippets')
end
# Once https://gitlab.com/gitlab-org/gitlab/-/issues/213021 is fixed
# this method can be removed
def jwt_authentication_header
authorization = ::Gitlab::Geo::RepoSyncRequest.new(
scope: repository.full_path.sub('@snippets', 'snippets')
).authorization
{ "http.#{remote_url}.extraHeader" => "Authorization: #{authorization}" }
def repository
model_record.repository
end
end
end
......@@ -48,12 +48,13 @@ module Geo
rescue Gitlab::Shell::Error, Gitlab::Git::BaseError => e
# In some cases repository does not exist, the only way to know about this is to parse the error text.
# If it does not exist we should consider it as successfully downloaded.
if e.message.include? Gitlab::GitAccess::ERROR_MESSAGES[:no_repo] # rubocop:disable Cop/LineBreakAroundConditionalBlock
if e.message.include?(replicator.class.git_access_class.error_message(:no_repo))
log_info('Repository is not found, marking it as successfully synced')
mark_sync_as_successful(missing_on_primary: true)
else
fail_registry_sync!('Error syncing repository', e)
end
ensure
expire_repository_caches
end
......
......@@ -121,7 +121,7 @@ RSpec.describe Geo::FrameworkRepositorySyncService, :geo do
it 'marks sync as successful if no repository found' do
allow(repository).to receive(:fetch_as_mirror)
.with(url_to_repo, remote_name: 'geo', forced: true)
.and_raise(Gitlab::Shell::Error.new(Gitlab::GitAccess::ERROR_MESSAGES[:no_repo]))
.and_raise(Gitlab::Shell::Error.new(Gitlab::GitAccessSnippet::ERROR_MESSAGES[:no_repo]))
subject.execute
......
......@@ -113,6 +113,12 @@ RSpec.shared_examples 'a repository replicator' do
end
end
describe '.git_access_class' do
it 'is implemented' do
expect(replicator.class.git_access_class).to be < Gitlab::GitAccess
end
end
describe '#model' do
let(:invoke_model) { replicator.class.model }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment