Handle errors from credential refresh

Previously, errors from askpass and credential storage were being
ignored, causing git clone/fetch to later error with hard-to-read
errors.

Now the error indicates the credential refresh as the problem, and
does not try to sync.
This commit is contained in:
Karl Isenberg 2023-07-20 17:17:49 -07:00 committed by Tim Hockin
parent 2a7678a14c
commit dd57eb0049
No known key found for this signature in database
2 changed files with 109 additions and 6 deletions

View File

@ -944,8 +944,8 @@ func main() {
} }
} }
if *flAskPassURL != "" { if *flAskPassURL != "" {
// When using an auth URL, the credentials can be dynamic, it needs to be // When using an auth URL, the credentials can be dynamic, and need
// re-fetched each time. // to be re-fetched each time.
if err := git.CallAskPassURL(ctx); err != nil { if err := git.CallAskPassURL(ctx); err != nil {
metricAskpassCount.WithLabelValues(metricKeyError).Inc() metricAskpassCount.WithLabelValues(metricKeyError).Inc()
return err return err
@ -1723,7 +1723,9 @@ func (git *repoSync) currentWorktree() (worktree, error) {
func (git *repoSync) SyncRepo(ctx context.Context, refreshCreds func(context.Context) error) (bool, string, error) { func (git *repoSync) SyncRepo(ctx context.Context, refreshCreds func(context.Context) error) (bool, string, error) {
git.log.V(3).Info("syncing", "repo", git.repo) git.log.V(3).Info("syncing", "repo", git.repo)
refreshCreds(ctx) if err := refreshCreds(ctx); err != nil {
return false, "", fmt.Errorf("credential refresh failed: %w", err)
}
// Initialize the repo directory if needed. // Initialize the repo directory if needed.
if err := git.initRepo(ctx); err != nil { if err := git.initRepo(ctx); err != nil {

View File

@ -1763,9 +1763,9 @@ function e2e::auth_askpass_url_correct_password() {
} }
############################################## ##############################################
# Test askpass-url where the URL is flaky # Test askpass-url where the URL is sometimes wrong
############################################## ##############################################
function e2e::auth_askpass_url_flaky() { function e2e::auth_askpass_url_sometimes_wrong() {
# run with askpass_url service which alternates good/bad replies. # run with askpass_url service which alternates good/bad replies.
HITLOG="$WORK/hitlog" HITLOG="$WORK/hitlog"
cat /dev/null > "$HITLOG" cat /dev/null > "$HITLOG"
@ -1821,6 +1821,107 @@ function e2e::auth_askpass_url_flaky() {
assert_file_eq "$ROOT/link/file" "$FUNCNAME 1" assert_file_eq "$ROOT/link/file" "$FUNCNAME 1"
} }
##############################################
# Test askpass-url where the URL is flaky
##############################################
function e2e::auth_askpass_url_flaky() {
# run with askpass_url service which alternates good/bad replies.
HITLOG="$WORK/hitlog"
cat /dev/null > "$HITLOG"
CTR=$(docker_run \
-v "$HITLOG":/var/log/hits \
e2e/test/ncsvr \
80 'read X
if [ -f /tmp/flag ]; then
echo "HTTP/1.1 200 OK"
echo
echo "username=my-username"
echo "password=my-password"
rm /tmp/flag
else
echo "HTTP/1.1 503 Service Unavailable"
echo
touch /tmp/flag
fi
')
IP=$(docker_ip "$CTR")
# First sync
echo "$FUNCNAME 1" > "$REPO/file"
git -C "$REPO" commit -qam "$FUNCNAME 1"
GIT_SYNC \
--git="/$ASKPASS_GIT" \
--askpass-url="http://$IP/git_askpass" \
--max-failures=2 \
--period=100ms \
--repo="file://$REPO" \
--root="$ROOT" \
--link="link" \
&
wait_for_sync "${MAXWAIT}"
assert_link_exists "$ROOT/link"
assert_file_exists "$ROOT/link/file"
assert_file_eq "$ROOT/link/file" "$FUNCNAME 1"
# Move HEAD forward
echo "$FUNCNAME 2" > "$REPO/file"
git -C "$REPO" commit -qam "$FUNCNAME 2"
wait_for_sync "${MAXWAIT}"
assert_link_exists "$ROOT/link"
assert_file_exists "$ROOT/link/file"
assert_file_eq "$ROOT/link/file" "$FUNCNAME 2"
# Move HEAD backward
git -C "$REPO" reset -q --hard HEAD^
wait_for_sync "${MAXWAIT}"
assert_link_exists "$ROOT/link"
assert_file_exists "$ROOT/link/file"
assert_file_eq "$ROOT/link/file" "$FUNCNAME 1"
}
##############################################
# Test askpass-url where the URL fails at startup
##############################################
function e2e::auth_askpass_url_slow_start() {
# run with askpass_url service which takes a while to come up
HITLOG="$WORK/hitlog"
cat /dev/null > "$HITLOG"
CTR=$(docker_run \
-v "$HITLOG":/var/log/hits \
--entrypoint sh \
e2e/test/ncsvr \
-c "sleep 4;
/ncsvr.sh 80 'read X
echo \"HTTP/1.1 200 OK\"
echo
echo \"username=my-username\"
echo \"password=my-password\"
'")
IP=$(docker_ip "$CTR")
# Sync
echo "$FUNCNAME" > "$REPO/file"
git -C "$REPO" commit -qam "$FUNCNAME"
GIT_SYNC \
--git="/$ASKPASS_GIT" \
--askpass-url="http://$IP/git_askpass" \
--max-failures=5 \
--period=1s \
--repo="file://$REPO" \
--root="$ROOT" \
--link="link" \
&
sleep 1
assert_file_absent "$ROOT/link"
wait_for_sync "5"
assert_link_exists "$ROOT/link"
assert_file_exists "$ROOT/link/file"
assert_file_eq "$ROOT/link/file" "$FUNCNAME"
}
############################################## ##############################################
# Test exechook-success # Test exechook-success
############################################## ##############################################