test(auth): gate local and OIDC authentication release

This commit is contained in:
2026-08-18 06:02:25 +02:00
parent 7cf7d9db6b
commit 8a3fa5031d
23 changed files with 1711 additions and 168 deletions
+16 -7
View File
@@ -127,23 +127,32 @@ func createWithDependencies(ctx context.Context, installation config.Installatio
if request.IncludeSecrets && !request.Confirm {
return Result{}, ErrConfirmationRequired
}
lock, err := lifecycle.Acquire(installation)
transaction, err := lifecycle.AcquireTransaction(installation)
if err != nil {
return Result{}, err
}
defer func() {
if releaseErr := lock.Release(); releaseErr != nil {
if releaseErr := transaction.Release(); releaseErr != nil {
result = Result{}
resultErr = errors.Join(resultErr, fmt.Errorf("release backup lifecycle lock: %w", releaseErr))
}
}()
return createWithDependenciesLockHeld(ctx, installation, request, dependencies)
return createWithDependenciesTransaction(ctx, transaction, installation, request, dependencies)
}
// createWithDependenciesLockHeld performs backup creation while the caller owns the installation
// lifecycle lock. It must never acquire a lifecycle lock itself: Restore uses this primitive to
// create its recovery checkpoint inside its already-locked transaction.
func createWithDependenciesLockHeld(ctx context.Context, installation config.Installation, request CreateRequest, dependencies dependencies) (result Result, resultErr error) {
// createWithDependenciesTransaction performs backup creation only with an active, opaque
// installation-bound lifecycle capability. Restore passes the capability it acquired for the
// enclosing transaction, so a recovery checkpoint cannot run without the same lifecycle lock.
func createWithDependenciesTransaction(ctx context.Context, transaction *lifecycle.Transaction, installation config.Installation, request CreateRequest, dependencies dependencies) (result Result, resultErr error) {
if err := transaction.Verify(installation); err != nil {
return Result{}, err
}
if dependencies.runner == nil || dependencies.now == nil || dependencies.homeDir == nil || dependencies.revision == nil || dependencies.sleep == nil || dependencies.reserveOutput == nil || dependencies.publishReserved == nil {
return Result{}, errors.New("backup dependencies are incomplete")
}
if request.IncludeSecrets && !request.Confirm {
return Result{}, ErrConfirmationRequired
}
if err := rejectInlineSecretValues(installation.EnvFile); err != nil {
return Result{}, err
}