From 03d6e368c4e7e5b1d544f18b379a40fdae47b74e Mon Sep 17 00:00:00 2001 From: hainenber Date: Tue, 28 May 2024 23:15:04 +0700 Subject: [PATCH] feat(vcs): bubble up SSH key conversion error for better debugging experience Signed-off-by: hainenber --- CHANGELOG.md | 2 ++ internal/vcs/auth.go | 15 +++++++++------ internal/vcs/git.go | 22 +++++++++++++++++++--- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 79fef0fca4..69c35f6878 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -91,6 +91,8 @@ Main (unreleased) - Updated Prometheus dependency to [v2.51.2](https://github.com/prometheus/prometheus/releases/tag/v2.51.2) (@thampiotr) +- Bubble up SSH key conversion error to facilitate failed `import.git`. (@hainenber) + v1.1.0 ------ diff --git a/internal/vcs/auth.go b/internal/vcs/auth.go index b9d0610734..9aa63e7739 100644 --- a/internal/vcs/auth.go +++ b/internal/vcs/auth.go @@ -16,20 +16,23 @@ type GitAuthConfig struct { // Convert converts HTTPClientConfig to the native Prometheus type. If h is // nil, the default client config is returned. -func (h *GitAuthConfig) Convert() transport.AuthMethod { +func (h *GitAuthConfig) Convert() (transport.AuthMethod, error) { if h == nil { - return nil + return nil, nil } if h.BasicAuth != nil { - return h.BasicAuth.Convert() + return h.BasicAuth.Convert(), nil } if h.SSHKey != nil { - key, _ := h.SSHKey.Convert() - return key + key, err := h.SSHKey.Convert() + if err != nil { + return nil, err + } + return key, nil } - return nil + return nil, nil } type BasicAuth struct { diff --git a/internal/vcs/git.go b/internal/vcs/git.go index 41bd209490..fead62c611 100644 --- a/internal/vcs/git.go +++ b/internal/vcs/git.go @@ -40,11 +40,19 @@ func NewGitRepo(ctx context.Context, storagePath string, opts GitRepoOptions) (* err error ) + authConfig, err := opts.Auth.Convert() + if err != nil { + return nil, DownloadFailedError{ + Repository: opts.Repository, + Inner: err, + } + } + if !isRepoCloned(storagePath) { repo, err = git.PlainCloneContext(ctx, storagePath, false, &git.CloneOptions{ URL: opts.Repository, ReferenceName: plumbing.HEAD, - Auth: opts.Auth.Convert(), + Auth: authConfig, RecurseSubmodules: git.DefaultSubmoduleRecursionDepth, Tags: git.AllTags, }) @@ -69,7 +77,7 @@ func NewGitRepo(ctx context.Context, storagePath string, opts GitRepoOptions) (* pullRepoErr := wt.PullContext(ctx, &git.PullOptions{ RemoteName: "origin", Force: true, - Auth: opts.Auth.Convert(), + Auth: authConfig, }) if pullRepoErr != nil && !errors.Is(pullRepoErr, git.NoErrAlreadyUpToDate) { workTree, err := repo.Worktree() @@ -109,10 +117,18 @@ func isRepoCloned(dir string) bool { // Update updates the repository by pulling new content and re-checking out to // latest version of Revision. func (repo *GitRepo) Update(ctx context.Context) error { + authConfig, err := repo.opts.Auth.Convert() + if err != nil { + return UpdateFailedError{ + Repository: repo.opts.Repository, + Inner: err, + } + } + pullRepoErr := repo.workTree.PullContext(ctx, &git.PullOptions{ RemoteName: "origin", Force: true, - Auth: repo.opts.Auth.Convert(), + Auth: authConfig, }) if pullRepoErr != nil && !errors.Is(pullRepoErr, git.NoErrAlreadyUpToDate) { return UpdateFailedError{