Send Gitaly Repository with /api/internal/allowed
- Make single gitaly payload - Add feature-flag specs to verify payload
This commit is contained in:
parent
4eb6b7c137
commit
8b074b4e78
3 changed files with 91 additions and 21 deletions
|
@ -1,6 +1,11 @@
|
|||
module API
|
||||
module Helpers
|
||||
module InternalHelpers
|
||||
SSH_GITALY_FEATURES = {
|
||||
'git-receive-pack' => :ssh_receive_pack,
|
||||
'git-upload-pack' => :ssh_upload_pack
|
||||
}.freeze
|
||||
|
||||
def wiki?
|
||||
set_project unless defined?(@wiki)
|
||||
@wiki
|
||||
|
@ -10,7 +15,7 @@ module API
|
|||
set_project unless defined?(@project)
|
||||
@project
|
||||
end
|
||||
|
||||
|
||||
def redirected_path
|
||||
@redirected_path
|
||||
end
|
||||
|
@ -54,14 +59,32 @@ module API
|
|||
Gitlab::GlRepository.gl_repository(project, wiki?)
|
||||
end
|
||||
|
||||
# Return the repository depending on whether we want the wiki or the
|
||||
# regular repository
|
||||
def repository
|
||||
if wiki?
|
||||
project.wiki.repository
|
||||
else
|
||||
project.repository
|
||||
end
|
||||
end
|
||||
|
||||
# Return the repository full path so that gitlab-shell has it when
|
||||
# handling ssh commands
|
||||
def repository_path
|
||||
if wiki?
|
||||
project.wiki.repository.path_to_repo
|
||||
else
|
||||
project.repository.path_to_repo
|
||||
end
|
||||
repository.path_to_repo
|
||||
end
|
||||
|
||||
# Return the Gitaly Address if it is enabled
|
||||
def gitaly_payload(action)
|
||||
feature = SSH_GITALY_FEATURES[action]
|
||||
return unless feature && Gitlab::GitalyClient.feature_enabled?(feature)
|
||||
|
||||
{
|
||||
repository: repository.gitaly_repository,
|
||||
address: Gitlab::GitalyClient.address(project.repository_storage),
|
||||
token: Gitlab::GitalyClient.token(project.repository_storage)
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -47,7 +47,8 @@ module API
|
|||
{
|
||||
status: true,
|
||||
gl_repository: gl_repository,
|
||||
repository_path: repository_path
|
||||
repository_path: repository_path,
|
||||
gitaly: gitaly_payload(params[:action])
|
||||
}
|
||||
end
|
||||
|
||||
|
|
|
@ -220,26 +220,72 @@ describe API::Internal do
|
|||
end
|
||||
|
||||
context "git pull" do
|
||||
it do
|
||||
pull(key, project)
|
||||
context "gitaly disabled" do
|
||||
it "has the correct payload" do
|
||||
allow(Gitlab::GitalyClient).to receive(:feature_enabled?).with(:ssh_upload_pack).and_return(false)
|
||||
pull(key, project)
|
||||
|
||||
expect(response).to have_http_status(200)
|
||||
expect(json_response["status"]).to be_truthy
|
||||
expect(json_response["repository_path"]).to eq(project.repository.path_to_repo)
|
||||
expect(json_response["gl_repository"]).to eq("project-#{project.id}")
|
||||
expect(user).to have_an_activity_record
|
||||
expect(response).to have_http_status(200)
|
||||
expect(json_response["status"]).to be_truthy
|
||||
expect(json_response["repository_path"]).to eq(project.repository.path_to_repo)
|
||||
expect(json_response["gl_repository"]).to eq("project-#{project.id}")
|
||||
expect(json_response["gitaly"]).to be_nil
|
||||
expect(user).to have_an_activity_record
|
||||
end
|
||||
end
|
||||
|
||||
context "gitaly enabled" do
|
||||
it "has the correct payload" do
|
||||
allow(Gitlab::GitalyClient).to receive(:feature_enabled?).with(:ssh_upload_pack).and_return(true)
|
||||
pull(key, project)
|
||||
|
||||
expect(response).to have_http_status(200)
|
||||
expect(json_response["status"]).to be_truthy
|
||||
expect(json_response["repository_path"]).to eq(project.repository.path_to_repo)
|
||||
expect(json_response["gl_repository"]).to eq("project-#{project.id}")
|
||||
expect(json_response["gitaly"]).not_to be_nil
|
||||
expect(json_response["gitaly"]["repository"]).not_to be_nil
|
||||
expect(json_response["gitaly"]["repository"]["storage_name"]).to eq(project.repository.gitaly_repository.storage_name)
|
||||
expect(json_response["gitaly"]["repository"]["relative_path"]).to eq(project.repository.gitaly_repository.relative_path)
|
||||
expect(json_response["gitaly"]["address"]).to eq(Gitlab::GitalyClient.address(project.repository_storage))
|
||||
expect(json_response["gitaly"]["token"]).to eq(Gitlab::GitalyClient.token(project.repository_storage))
|
||||
expect(user).to have_an_activity_record
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context "git push" do
|
||||
it do
|
||||
push(key, project)
|
||||
context "gitaly disabled" do
|
||||
it "has the correct payload" do
|
||||
allow(Gitlab::GitalyClient).to receive(:feature_enabled?).with(:ssh_receive_pack).and_return(false)
|
||||
push(key, project)
|
||||
|
||||
expect(response).to have_http_status(200)
|
||||
expect(json_response["status"]).to be_truthy
|
||||
expect(json_response["repository_path"]).to eq(project.repository.path_to_repo)
|
||||
expect(json_response["gl_repository"]).to eq("project-#{project.id}")
|
||||
expect(user).not_to have_an_activity_record
|
||||
expect(response).to have_http_status(200)
|
||||
expect(json_response["status"]).to be_truthy
|
||||
expect(json_response["repository_path"]).to eq(project.repository.path_to_repo)
|
||||
expect(json_response["gl_repository"]).to eq("project-#{project.id}")
|
||||
expect(json_response["gitaly"]).to be_nil
|
||||
expect(user).not_to have_an_activity_record
|
||||
end
|
||||
end
|
||||
|
||||
context "gitaly enabled" do
|
||||
it "has the correct payload" do
|
||||
allow(Gitlab::GitalyClient).to receive(:feature_enabled?).with(:ssh_receive_pack).and_return(true)
|
||||
push(key, project)
|
||||
|
||||
expect(response).to have_http_status(200)
|
||||
expect(json_response["status"]).to be_truthy
|
||||
expect(json_response["repository_path"]).to eq(project.repository.path_to_repo)
|
||||
expect(json_response["gl_repository"]).to eq("project-#{project.id}")
|
||||
expect(json_response["gitaly"]).not_to be_nil
|
||||
expect(json_response["gitaly"]["repository"]).not_to be_nil
|
||||
expect(json_response["gitaly"]["repository"]["storage_name"]).to eq(project.repository.gitaly_repository.storage_name)
|
||||
expect(json_response["gitaly"]["repository"]["relative_path"]).to eq(project.repository.gitaly_repository.relative_path)
|
||||
expect(json_response["gitaly"]["address"]).to eq(Gitlab::GitalyClient.address(project.repository_storage))
|
||||
expect(json_response["gitaly"]["token"]).to eq(Gitlab::GitalyClient.token(project.repository_storage))
|
||||
expect(user).not_to have_an_activity_record
|
||||
end
|
||||
end
|
||||
|
||||
context 'project as /namespace/project' do
|
||||
|
|
Loading…
Reference in a new issue