Commit 0e31f5f4 authored by Markus Koller's avatar Markus Koller

Merge branch 'cat-geo-ssh-proxy-to-internal-url' into 'master'

Change Geo SSH proxy to internal primary URL

See merge request gitlab-org/gitlab!73738
parents 8e19dcd9 d7111269
...@@ -2,8 +2,14 @@ ...@@ -2,8 +2,14 @@
module EE module EE
module GitlabRoutingHelper module GitlabRoutingHelper
def geo_primary_web_url(container) def geo_primary_web_url(container, internal: false)
File.join(::Gitlab::Geo.primary_node.url, container.full_path) primary_base_url = if internal
::Gitlab::Geo.primary_node.internal_url
else
::Gitlab::Geo.primary_node.url
end
File.join(primary_base_url, container.full_path)
end end
def geo_primary_ssh_url_to_repo(container) def geo_primary_ssh_url_to_repo(container)
...@@ -14,6 +20,10 @@ module EE ...@@ -14,6 +20,10 @@ module EE
geo_primary_web_url(container) + '.git' geo_primary_web_url(container) + '.git'
end end
def geo_primary_http_internal_url_to_repo(container)
geo_primary_web_url(container, internal: true) + '.git'
end
def geo_primary_default_url_to_repo(container) def geo_primary_default_url_to_repo(container)
case default_clone_protocol case default_clone_protocol
when 'ssh' when 'ssh'
......
...@@ -17,7 +17,7 @@ module EE ...@@ -17,7 +17,7 @@ module EE
'action' => 'geo_proxy_to_primary', 'action' => 'geo_proxy_to_primary',
'data' => { 'data' => {
'api_endpoints' => custom_action_api_endpoints_for(cmd), 'api_endpoints' => custom_action_api_endpoints_for(cmd),
'primary_repo' => primary_http_repo_url 'primary_repo' => primary_http_repo_internal_url
} }
} }
...@@ -46,8 +46,8 @@ module EE ...@@ -46,8 +46,8 @@ module EE
messages + ['', lag_message] messages + ['', lag_message]
end end
def primary_http_repo_url def primary_http_repo_internal_url
geo_primary_http_url_to_repo(container) geo_primary_http_internal_url_to_repo(container)
end end
def primary_ssh_url_to_repo def primary_ssh_url_to_repo
......
...@@ -6,7 +6,16 @@ RSpec.describe EE::GitlabRoutingHelper do ...@@ -6,7 +6,16 @@ RSpec.describe EE::GitlabRoutingHelper do
include ProjectsHelper include ProjectsHelper
include ApplicationSettingsHelper include ApplicationSettingsHelper
let_it_be(:primary, reload: true) { create(:geo_node, :primary, url: 'http://localhost:123/relative', clone_url_prefix: 'git@localhost:') } let_it_be(:primary, reload: true) do
create(
:geo_node,
:primary,
url: 'http://localhost:123/relative',
internal_url: 'http://internal:321/relative',
clone_url_prefix: 'git@localhost:'
)
end
let_it_be(:group, reload: true) { create(:group, path: 'foo') } let_it_be(:group, reload: true) { create(:group, path: 'foo') }
let_it_be(:project, reload: true) { create(:project, namespace: group, path: 'bar') } let_it_be(:project, reload: true) { create(:project, namespace: group, path: 'bar') }
...@@ -15,6 +24,7 @@ RSpec.describe EE::GitlabRoutingHelper do ...@@ -15,6 +24,7 @@ RSpec.describe EE::GitlabRoutingHelper do
allow(helper).to receive(:default_clone_protocol).and_return('http') allow(helper).to receive(:default_clone_protocol).and_return('http')
end end
context 'public / default URL' do
it 'generates a path to the project' do it 'generates a path to the project' do
result = helper.geo_primary_web_url(project) result = helper.geo_primary_web_url(project)
...@@ -28,6 +38,21 @@ RSpec.describe EE::GitlabRoutingHelper do ...@@ -28,6 +38,21 @@ RSpec.describe EE::GitlabRoutingHelper do
end end
end end
context 'internal URL' do
it 'generates a path to the project' do
result = helper.geo_primary_web_url(project, internal: true)
expect(result).to eq('http://internal:321/relative/foo/bar')
end
it 'generates a path to the wiki' do
result = helper.geo_primary_web_url(project.wiki, internal: true)
expect(result).to eq('http://internal:321/relative/foo/bar.wiki')
end
end
end
describe '#geo_primary_default_url_to_repo' do describe '#geo_primary_default_url_to_repo' do
subject { helper.geo_primary_default_url_to_repo(repo) } subject { helper.geo_primary_default_url_to_repo(repo) }
......
...@@ -27,7 +27,7 @@ RSpec.describe Gitlab::Geo::GitSSHProxy, :geo do ...@@ -27,7 +27,7 @@ RSpec.describe Gitlab::Geo::GitSSHProxy, :geo do
} }
end end
let(:primary_repo_http) { geo_primary_http_url_to_repo(project) } let(:primary_repo_http) { geo_primary_http_internal_url_to_repo(project) }
let(:primary_repo_ssh) { geo_primary_ssh_url_to_repo(project) } let(:primary_repo_ssh) { geo_primary_ssh_url_to_repo(project) }
let(:data) do let(:data) do
......
...@@ -35,7 +35,7 @@ RSpec.describe Gitlab::GitAccess do ...@@ -35,7 +35,7 @@ RSpec.describe Gitlab::GitAccess do
allow(Gitlab::Database).to receive(:read_only?) { true } allow(Gitlab::Database).to receive(:read_only?) { true }
end end
let(:primary_repo_url) { geo_primary_http_url_to_repo(project) } let(:primary_repo_url) { geo_primary_http_internal_url_to_repo(project) }
let(:primary_repo_ssh_url) { geo_primary_ssh_url_to_repo(project) } let(:primary_repo_ssh_url) { geo_primary_ssh_url_to_repo(project) }
it_behaves_like 'git access for a read-only GitLab instance' it_behaves_like 'git access for a read-only GitLab instance'
...@@ -384,7 +384,7 @@ RSpec.describe Gitlab::GitAccess do ...@@ -384,7 +384,7 @@ RSpec.describe Gitlab::GitAccess do
end end
it 'returns a custom action' do it 'returns a custom action' do
expected_payload = { "action" => "geo_proxy_to_primary", "data" => { "api_endpoints" => ["/api/v4/geo/proxy_git_ssh/info_refs_upload_pack", "/api/v4/geo/proxy_git_ssh/upload_pack"], "primary_repo" => geo_primary_http_url_to_repo(project) } } expected_payload = { "action" => "geo_proxy_to_primary", "data" => { "api_endpoints" => ["/api/v4/geo/proxy_git_ssh/info_refs_upload_pack", "/api/v4/geo/proxy_git_ssh/upload_pack"], "primary_repo" => geo_primary_http_internal_url_to_repo(project) } }
expected_console_messages = ["This request to a Geo secondary node will be forwarded to the", "Geo primary node:", "", " #{geo_primary_ssh_url_to_repo(project)}"] expected_console_messages = ["This request to a Geo secondary node will be forwarded to the", "Geo primary node:", "", " #{geo_primary_ssh_url_to_repo(project)}"]
response = pull_changes response = pull_changes
...@@ -408,7 +408,7 @@ RSpec.describe Gitlab::GitAccess do ...@@ -408,7 +408,7 @@ RSpec.describe Gitlab::GitAccess do
end end
it 'returns a custom action' do it 'returns a custom action' do
expected_payload = { "action" => "geo_proxy_to_primary", "data" => { "api_endpoints" => ["/api/v4/geo/proxy_git_ssh/info_refs_receive_pack", "/api/v4/geo/proxy_git_ssh/receive_pack"], "primary_repo" => geo_primary_http_url_to_repo(project) } } expected_payload = { "action" => "geo_proxy_to_primary", "data" => { "api_endpoints" => ["/api/v4/geo/proxy_git_ssh/info_refs_receive_pack", "/api/v4/geo/proxy_git_ssh/receive_pack"], "primary_repo" => geo_primary_http_internal_url_to_repo(project) } }
expected_console_messages = ["This request to a Geo secondary node will be forwarded to the", "Geo primary node:", "", " #{geo_primary_ssh_url_to_repo(project)}"] expected_console_messages = ["This request to a Geo secondary node will be forwarded to the", "Geo primary node:", "", " #{geo_primary_ssh_url_to_repo(project)}"]
response = push_changes response = push_changes
......
...@@ -156,7 +156,7 @@ RSpec.describe Gitlab::GitAccessWiki do ...@@ -156,7 +156,7 @@ RSpec.describe Gitlab::GitAccessWiki do
allow(Gitlab::Database).to receive(:read_only?) { true } allow(Gitlab::Database).to receive(:read_only?) { true }
end end
let(:primary_repo_url) { geo_primary_http_url_to_repo(project.wiki) } let(:primary_repo_url) { geo_primary_http_internal_url_to_repo(project.wiki) }
let(:primary_repo_ssh_url) { geo_primary_ssh_url_to_repo(project.wiki) } let(:primary_repo_ssh_url) { geo_primary_ssh_url_to_repo(project.wiki) }
it_behaves_like 'git access for a read-only GitLab instance' it_behaves_like 'git access for a read-only GitLab instance'
......
...@@ -8,7 +8,14 @@ RSpec.shared_examples 'git access for a read-only GitLab instance' do ...@@ -8,7 +8,14 @@ RSpec.shared_examples 'git access for a read-only GitLab instance' do
end end
context 'for a Geo setup' do context 'for a Geo setup' do
let(:primary_node) { create(:geo_node, :primary, url: 'https://localhost:3000/gitlab') } let(:primary_node) do
create(
:geo_node,
:primary,
url: 'https://localhost:3000/gitlab',
internal_url: 'https://localhost:3001/gitlab'
)
end
before do before do
allow(Gitlab::Geo).to receive(:primary).and_return(primary_node) allow(Gitlab::Geo).to receive(:primary).and_return(primary_node)
......
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