Commit 0b690416 authored by Igor's avatar Igor

Merge branch '37371-git-clone-on-secondary-geo-node-fetches-lfs-files-from-primary' into 'master'

Use correct git-lfs download or upload operation names

See merge request gitlab-org/gitlab-shell!353
parents 0afa8ec5 bcccc30c
...@@ -14,8 +14,8 @@ import ( ...@@ -14,8 +14,8 @@ import (
) )
const ( const (
downloadAction = "download" downloadOperation = "download"
uploadAction = "upload" uploadOperation = "upload"
) )
type Command struct { type Command struct {
...@@ -40,8 +40,11 @@ func (c *Command) Execute() error { ...@@ -40,8 +40,11 @@ func (c *Command) Execute() error {
return disallowedcommand.Error return disallowedcommand.Error
} }
// e.g. git-lfs-authenticate user/repo.git download
repo := args[1] repo := args[1]
action, err := actionToCommandType(args[2]) operation := args[2]
action, err := actionFromOperation(operation)
if err != nil { if err != nil {
return err return err
} }
...@@ -51,7 +54,7 @@ func (c *Command) Execute() error { ...@@ -51,7 +54,7 @@ func (c *Command) Execute() error {
return err return err
} }
payload, err := c.authenticate(action, repo, accessResponse.UserId) payload, err := c.authenticate(operation, repo, accessResponse.UserId)
if err != nil { if err != nil {
// return nothing just like Ruby's GitlabShell#lfs_authenticate does // return nothing just like Ruby's GitlabShell#lfs_authenticate does
return nil return nil
...@@ -62,18 +65,19 @@ func (c *Command) Execute() error { ...@@ -62,18 +65,19 @@ func (c *Command) Execute() error {
return nil return nil
} }
func actionToCommandType(action string) (commandargs.CommandType, error) { func actionFromOperation(operation string) (commandargs.CommandType, error) {
var accessAction commandargs.CommandType var action commandargs.CommandType
switch action {
case downloadAction: switch operation {
accessAction = commandargs.UploadPack case downloadOperation:
case uploadAction: action = commandargs.UploadPack
accessAction = commandargs.ReceivePack case uploadOperation:
action = commandargs.ReceivePack
default: default:
return "", disallowedcommand.Error return "", disallowedcommand.Error
} }
return accessAction, nil return action, nil
} }
func (c *Command) verifyAccess(action commandargs.CommandType, repo string) (*accessverifier.Response, error) { func (c *Command) verifyAccess(action commandargs.CommandType, repo string) (*accessverifier.Response, error) {
...@@ -82,13 +86,13 @@ func (c *Command) verifyAccess(action commandargs.CommandType, repo string) (*ac ...@@ -82,13 +86,13 @@ func (c *Command) verifyAccess(action commandargs.CommandType, repo string) (*ac
return cmd.Verify(action, repo) return cmd.Verify(action, repo)
} }
func (c *Command) authenticate(action commandargs.CommandType, repo, userId string) ([]byte, error) { func (c *Command) authenticate(operation string, repo, userId string) ([]byte, error) {
client, err := lfsauthenticate.NewClient(c.Config, c.Args) client, err := lfsauthenticate.NewClient(c.Config, c.Args)
if err != nil { if err != nil {
return nil, err return nil, err
} }
response, err := client.Authenticate(action, repo, userId) response, err := client.Authenticate(operation, repo, userId)
if err != nil { if err != nil {
return nil, err return nil, err
} }
......
...@@ -64,6 +64,7 @@ func TestFailedRequests(t *testing.T) { ...@@ -64,6 +64,7 @@ func TestFailedRequests(t *testing.T) {
func TestLfsAuthenticateRequests(t *testing.T) { func TestLfsAuthenticateRequests(t *testing.T) {
userId := "123" userId := "123"
operation := "upload"
requests := []testserver.TestRequestHandler{ requests := []testserver.TestRequestHandler{
{ {
...@@ -75,6 +76,7 @@ func TestLfsAuthenticateRequests(t *testing.T) { ...@@ -75,6 +76,7 @@ func TestLfsAuthenticateRequests(t *testing.T) {
var request *lfsauthenticate.Request var request *lfsauthenticate.Request
require.NoError(t, json.Unmarshal(b, &request)) require.NoError(t, json.Unmarshal(b, &request))
require.Equal(t, request.Operation, operation)
if request.UserId == userId { if request.UserId == userId {
body := map[string]interface{}{ body := map[string]interface{}{
...@@ -140,7 +142,7 @@ func TestLfsAuthenticateRequests(t *testing.T) { ...@@ -140,7 +142,7 @@ func TestLfsAuthenticateRequests(t *testing.T) {
output := &bytes.Buffer{} output := &bytes.Buffer{}
cmd := &Command{ cmd := &Command{
Config: &config.Config{GitlabUrl: url}, Config: &config.Config{GitlabUrl: url},
Args: &commandargs.Shell{GitlabUsername: tc.username, SshArgs: []string{"git-lfs-authenticate", "group/repo", "upload"}}, Args: &commandargs.Shell{GitlabUsername: tc.username, SshArgs: []string{"git-lfs-authenticate", "group/repo", operation}},
ReadWriter: &readwriter.ReadWriter{ErrOut: output, Out: output}, ReadWriter: &readwriter.ReadWriter{ErrOut: output, Out: output},
} }
......
...@@ -17,10 +17,10 @@ type Client struct { ...@@ -17,10 +17,10 @@ type Client struct {
} }
type Request struct { type Request struct {
Action commandargs.CommandType `json:"operation"` Operation string `json:"operation"`
Repo string `json:"project"` Repo string `json:"project"`
KeyId string `json:"key_id,omitempty"` KeyId string `json:"key_id,omitempty"`
UserId string `json:"user_id,omitempty"` UserId string `json:"user_id,omitempty"`
} }
type Response struct { type Response struct {
...@@ -39,8 +39,8 @@ func NewClient(config *config.Config, args *commandargs.Shell) (*Client, error) ...@@ -39,8 +39,8 @@ func NewClient(config *config.Config, args *commandargs.Shell) (*Client, error)
return &Client{config: config, client: client, args: args}, nil return &Client{config: config, client: client, args: args}, nil
} }
func (c *Client) Authenticate(action commandargs.CommandType, repo, userId string) (*Response, error) { func (c *Client) Authenticate(operation, repo, userId string) (*Response, error) {
request := &Request{Action: action, Repo: repo} request := &Request{Operation: operation, Repo: repo}
if c.args.GitlabKeyId != "" { if c.args.GitlabKeyId != "" {
request.KeyId = c.args.GitlabKeyId request.KeyId = c.args.GitlabKeyId
} else { } else {
......
...@@ -14,9 +14,8 @@ import ( ...@@ -14,9 +14,8 @@ import (
) )
const ( const (
keyId = "123" keyId = "123"
repo = "group/repo" repo = "group/repo"
action = commandargs.UploadPack
) )
func setup(t *testing.T) []testserver.TestRequestHandler { func setup(t *testing.T) []testserver.TestRequestHandler {
...@@ -64,17 +63,17 @@ func TestFailedRequests(t *testing.T) { ...@@ -64,17 +63,17 @@ func TestFailedRequests(t *testing.T) {
}{ }{
{ {
desc: "With bad response", desc: "With bad response",
args: &commandargs.Shell{GitlabKeyId: "-1", CommandType: commandargs.UploadPack}, args: &commandargs.Shell{GitlabKeyId: "-1", CommandType: commandargs.LfsAuthenticate, SshArgs: []string{"git-lfs-authenticate", repo, "download"}},
expectedOutput: "Parsing failed", expectedOutput: "Parsing failed",
}, },
{ {
desc: "With API returns an error", desc: "With API returns an error",
args: &commandargs.Shell{GitlabKeyId: "forbidden", CommandType: commandargs.UploadPack}, args: &commandargs.Shell{GitlabKeyId: "forbidden", CommandType: commandargs.LfsAuthenticate, SshArgs: []string{"git-lfs-authenticate", repo, "download"}},
expectedOutput: "Internal API error (403)", expectedOutput: "Internal API error (403)",
}, },
{ {
desc: "With API fails", desc: "With API fails",
args: &commandargs.Shell{GitlabKeyId: "broken", CommandType: commandargs.UploadPack}, args: &commandargs.Shell{GitlabKeyId: "broken", CommandType: commandargs.LfsAuthenticate, SshArgs: []string{"git-lfs-authenticate", repo, "download"}},
expectedOutput: "Internal API error (500)", expectedOutput: "Internal API error (500)",
}, },
} }
...@@ -84,9 +83,9 @@ func TestFailedRequests(t *testing.T) { ...@@ -84,9 +83,9 @@ func TestFailedRequests(t *testing.T) {
client, err := NewClient(&config.Config{GitlabUrl: url}, tc.args) client, err := NewClient(&config.Config{GitlabUrl: url}, tc.args)
require.NoError(t, err) require.NoError(t, err)
repo := "group/repo" operation := tc.args.SshArgs[2]
_, err = client.Authenticate(tc.args.CommandType, repo, "") _, err = client.Authenticate(operation, repo, "")
require.Error(t, err) require.Error(t, err)
require.Equal(t, tc.expectedOutput, err.Error()) require.Equal(t, tc.expectedOutput, err.Error())
...@@ -99,19 +98,38 @@ func TestSuccessfulRequests(t *testing.T) { ...@@ -99,19 +98,38 @@ func TestSuccessfulRequests(t *testing.T) {
url, cleanup := testserver.StartHttpServer(t, requests) url, cleanup := testserver.StartHttpServer(t, requests)
defer cleanup() defer cleanup()
args := &commandargs.Shell{GitlabKeyId: keyId, CommandType: commandargs.LfsAuthenticate} testCases := []struct {
client, err := NewClient(&config.Config{GitlabUrl: url}, args) desc string
require.NoError(t, err) operation string
}{
{
desc: "For download",
operation: "download",
},
{
desc: "For upload",
operation: "upload",
},
}
response, err := client.Authenticate(action, repo, "") for _, tc := range testCases {
require.NoError(t, err) t.Run(tc.desc, func(t *testing.T) {
operation := tc.operation
args := &commandargs.Shell{GitlabKeyId: keyId, CommandType: commandargs.LfsAuthenticate, SshArgs: []string{"git-lfs-authenticate", repo, operation}}
client, err := NewClient(&config.Config{GitlabUrl: url}, args)
require.NoError(t, err)
expectedResponse := &Response{ response, err := client.Authenticate(operation, repo, "")
Username: "john", require.NoError(t, err)
LfsToken: "sometoken",
RepoPath: "https://gitlab.com/repo/path",
ExpiresIn: 1800,
}
require.Equal(t, expectedResponse, response) expectedResponse := &Response{
Username: "john",
LfsToken: "sometoken",
RepoPath: "https://gitlab.com/repo/path",
ExpiresIn: 1800,
}
require.Equal(t, expectedResponse, response)
})
}
} }
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