Keepers 97ed97c1c3
logic change for sharepoint permission support (#3333)
adds logical changes required for sharepoint permission handling, both backup and restore.

---

#### Does this PR need a docs update or release note?

- [x]  Yes, it's included

#### Type of change

- [x] 🌻 Feature

#### Issue(s)

* #3135

#### Test Plan

- [x] 💪 Manual
- [x]  Unit test
- [x] 💚 E2E
2023-05-15 21:03:00 +00:00

77 lines
1.8 KiB
Go

package operations
import (
"context"
"fmt"
"github.com/alcionai/clues"
"github.com/alcionai/corso/src/pkg/control"
"github.com/alcionai/corso/src/pkg/fault"
"github.com/alcionai/corso/src/pkg/logger"
)
// finalizeErrorHandling ensures the operation follow the options
// failure behavior requirements.
func finalizeErrorHandling(
ctx context.Context,
opts control.Options,
errs *fault.Bus,
prefix string,
) {
rcvd := errs.Recovered()
// under certain conditions, there's nothing else left to do
if opts.FailureHandling == control.BestEffort ||
errs.Failure() != nil ||
len(rcvd) == 0 {
return
}
if opts.FailureHandling == control.FailAfterRecovery {
msg := fmt.Sprintf("%s: partial success: %d errors occurred", prefix, len(rcvd))
logger.Ctx(ctx).Error(msg)
if len(rcvd) == 1 {
errs.Fail(rcvd[0])
return
}
errs.Fail(clues.New(msg))
}
}
// LogFaultErrors is a helper function that logs all entries in the Errors struct.
func LogFaultErrors(ctx context.Context, fe *fault.Errors, prefix string) {
if fe == nil {
return
}
var (
log = logger.Ctx(ctx)
pfxMsg = prefix + ":"
li, ls, lr = len(fe.Items), len(fe.Skipped), len(fe.Recovered)
)
if fe.Failure == nil && li+ls+lr == 0 {
log.Info(pfxMsg + " no issues")
return
}
if fe.Failure != nil {
log.With("error", fe.Failure).Errorf("%s primary failure: %s", pfxMsg, fe.Failure.Msg)
}
for i, item := range fe.Items {
log.With("failed_item", item).Errorf("%s item failure %d of %d: %s", pfxMsg, i+1, li, item.Cause)
}
for i, item := range fe.Skipped {
log.With("skipped_item", item).Errorf("%s skipped item %d of %d: %s", pfxMsg, i+1, ls, item.Item.Cause)
}
for i, err := range fe.Recovered {
log.With("recovered_error", err).Errorf("%s recoverable error %d of %d: %s", pfxMsg, i+1, lr, err.Msg)
}
}