Commit 103a2a9a authored by Robert Speicher's avatar Robert Speicher

Merge branch 'feature/add-feature-flags-for-upload-receive-pack' into 'master'

Add feature flags for enabling (Upload|Receive)Pack

Closes gitaly#168

See merge request !10341
parents 97c49b84 39753bfb
...@@ -57,7 +57,7 @@ class Projects::GitHttpController < Projects::GitHttpClientController ...@@ -57,7 +57,7 @@ class Projects::GitHttpController < Projects::GitHttpClientController
def render_ok def render_ok
set_workhorse_internal_api_content_type set_workhorse_internal_api_content_type
render json: Gitlab::Workhorse.git_http_ok(repository, user) render json: Gitlab::Workhorse.git_http_ok(repository, user, action_name)
end end
def render_http_not_allowed def render_http_not_allowed
......
...@@ -16,7 +16,7 @@ module Gitlab ...@@ -16,7 +16,7 @@ module Gitlab
SECRET_LENGTH = 32 SECRET_LENGTH = 32
class << self class << self
def git_http_ok(repository, user) def git_http_ok(repository, user, action)
repo_path = repository.path_to_repo repo_path = repository.path_to_repo
params = { params = {
GL_ID: Gitlab::GlId.gl_id(user), GL_ID: Gitlab::GlId.gl_id(user),
...@@ -26,13 +26,25 @@ module Gitlab ...@@ -26,13 +26,25 @@ module Gitlab
if Gitlab.config.gitaly.enabled if Gitlab.config.gitaly.enabled
storage = repository.project.repository_storage storage = repository.project.repository_storage
address = Gitlab::GitalyClient.get_address(storage) address = Gitlab::GitalyClient.get_address(storage)
params[:GitalySocketPath] = URI(address).path
# TODO: use GitalyClient code to assemble the Repository message # TODO: use GitalyClient code to assemble the Repository message
params[:Repository] = Gitaly::Repository.new( params[:Repository] = Gitaly::Repository.new(
path: repo_path, path: repo_path,
storage_name: storage, storage_name: storage,
relative_path: Gitlab::RepoPath.strip_storage_path(repo_path), relative_path: Gitlab::RepoPath.strip_storage_path(repo_path),
).to_h ).to_h
feature_enabled = case action.to_s
when 'git_receive_pack'
Gitlab::GitalyClient.feature_enabled?(:post_receive_pack)
when 'git_upload_pack'
Gitlab::GitalyClient.feature_enabled?(:post_upload_pack)
when 'info_refs'
true
else
raise "Unsupported action: #{action}"
end
params[:GitalySocketPath] = URI(address).path if feature_enabled
end end
params params
......
...@@ -180,24 +180,68 @@ describe Gitlab::Workhorse, lib: true do ...@@ -180,24 +180,68 @@ describe Gitlab::Workhorse, lib: true do
describe '.git_http_ok' do describe '.git_http_ok' do
let(:user) { create(:user) } let(:user) { create(:user) }
let(:repo_path) { repository.path_to_repo } let(:repo_path) { repository.path_to_repo }
let(:action) { 'info_refs' }
subject { described_class.git_http_ok(repository, user) } subject { described_class.git_http_ok(repository, user, action) }
it { expect(subject).to eq({ GL_ID: "user-#{user.id}", RepoPath: repo_path }) } it { expect(subject).to include({ GL_ID: "user-#{user.id}", RepoPath: repo_path }) }
context 'when Gitaly is enabled' do context 'when Gitaly is enabled' do
let(:gitaly_params) do
{
GitalySocketPath: URI(Gitlab::GitalyClient.get_address('default')).path,
}
end
before do before do
allow(Gitlab.config.gitaly).to receive(:enabled).and_return(true) allow(Gitlab.config.gitaly).to receive(:enabled).and_return(true)
end end
it 'includes Gitaly params in the returned value' do it 'includes a Repository param' do
gitaly_socket_path = URI(Gitlab::GitalyClient.get_address('default')).path repo_param = { Repository: {
expect(subject).to include({ GitalySocketPath: gitaly_socket_path })
expect(subject[:Repository]).to include({
path: repo_path, path: repo_path,
storage_name: 'default', storage_name: 'default',
relative_path: project.full_path + '.git', relative_path: project.full_path + '.git',
}) } }
expect(subject).to include(repo_param)
end
{
git_receive_pack: :post_receive_pack,
git_upload_pack: :post_upload_pack
}.each do |action_name, feature_flag|
context "when #{action_name} action is passed" do
let(:action) { action_name }
context 'when action is enabled by feature flag' do
it 'includes Gitaly params in the returned value' do
allow(Gitlab::GitalyClient).to receive(:feature_enabled?).with(feature_flag).and_return(true)
expect(subject).to include(gitaly_params)
end
end
context 'when action is not enabled by feature flag' do
it 'does not include Gitaly params in the returned value' do
allow(Gitlab::GitalyClient).to receive(:feature_enabled?).with(feature_flag).and_return(false)
expect(subject).not_to include(gitaly_params)
end
end
end
end
context "when info_refs action is passed" do
let(:action) { 'info_refs' }
it { expect(subject).to include(gitaly_params) }
end
context 'when action passed is not supported by Gitaly' do
let(:action) { 'download' }
it { expect { subject }.to raise_exception('Unsupported action: download') }
end end
end end
end end
......
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