GC: Update Error Messages (#1252)

## Description

<!-- Insert PR description-->

## Type of change

- [x] 🗺️ Documentation

## Issue(s)

<!-- Can reference multiple issues. Use one of the following "magic words" - "closes, fixes" to auto-close the Github issue. -->
*Related  to #1225<issue>

## Test Plan

<!-- How will this be tested prior to merging.-->
- [x] 💪 Manual
This commit is contained in:
Danny 2022-10-21 18:11:29 -04:00 committed by GitHub
parent 6047805d6c
commit 597e689417
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 65 additions and 50 deletions

View File

@ -39,7 +39,9 @@ func (cfc *contactFolderCache) populateContactRoot(
ContactFoldersById(directoryID). ContactFoldersById(directoryID).
Get(ctx, opts) Get(ctx, opts)
if err != nil { if err != nil {
return errors.Wrapf(err, "fetching root contact folder") return errors.Wrapf(
err,
"fetching root contact folder: "+support.ConnectorStackErrorTrace(err))
} }
idPtr := f.GetId() idPtr := f.GetId()
@ -92,14 +94,14 @@ func (cfc *contactFolderCache) Populate(
iter, err := msgraphgocore.NewPageIterator(query, cfc.gs.Adapter(), iter, err := msgraphgocore.NewPageIterator(query, cfc.gs.Adapter(),
models.CreateContactFolderCollectionResponseFromDiscriminatorValue) models.CreateContactFolderCollectionResponseFromDiscriminatorValue)
if err != nil { if err != nil {
return err return errors.Wrap(err, support.ConnectorStackErrorTrace(err))
} }
cb := IterativeCollectContactContainers(containers, cb := IterativeCollectContactContainers(containers,
"", "",
errUpdater) errUpdater)
if err := iter.Iterate(ctx, cb); err != nil { if err := iter.Iterate(ctx, cb); err != nil {
return err return errors.Wrap(err, support.ConnectorStackErrorTrace(err))
} }
if errs != nil { if errs != nil {
@ -141,7 +143,7 @@ func (cfc *contactFolderCache) IDToPath(
) (*path.Builder, error) { ) (*path.Builder, error) {
c, ok := cfc.cache[folderID] c, ok := cfc.cache[folderID]
if !ok { if !ok {
return nil, errors.Errorf("folder %s not cached", folderID) return nil, errors.Errorf("contact folder %s not cached", folderID)
} }
p := c.Path() p := c.Path()

View File

@ -37,10 +37,13 @@ func (ecc *eventCalendarCache) Populate(
return err return err
} }
directories := make(map[string]graph.Container) var (
errUpdater := func(s string, e error) { asyncError error
err = support.WrapAndAppend(s, e, err) directories = make(map[string]graph.Container)
} errUpdater = func(s string, e error) {
asyncError = support.WrapAndAppend(s, e, err)
}
)
query, err := ecc.gs.Client().UsersById(ecc.userID).Calendars().Get(ctx, options) query, err := ecc.gs.Client().UsersById(ecc.userID).Calendars().Get(ctx, options)
if err != nil { if err != nil {
@ -64,10 +67,11 @@ func (ecc *eventCalendarCache) Populate(
iterateErr := iter.Iterate(ctx, cb) iterateErr := iter.Iterate(ctx, cb)
if iterateErr != nil { if iterateErr != nil {
return iterateErr return errors.Wrap(iterateErr, support.ConnectorStackErrorTrace(iterateErr))
} }
if err != nil { // check for errors created during iteration
if asyncError != nil {
return err return err
} }

View File

@ -48,7 +48,7 @@ func createService(credentials account.M365Config, shouldFailFast bool) (*exchan
credentials.AzureClientSecret, credentials.AzureClientSecret,
) )
if err != nil { if err != nil {
return nil, err return nil, errors.Wrap(err, "creating microsoft graph service for exchange")
} }
service := exchangeService{ service := exchangeService{
@ -58,7 +58,7 @@ func createService(credentials account.M365Config, shouldFailFast bool) (*exchan
credentials: credentials, credentials: credentials,
} }
return &service, err return &service, nil
} }
// CreateMailFolder makes a mail folder iff a folder of the same name does not exist // CreateMailFolder makes a mail folder iff a folder of the same name does not exist
@ -142,7 +142,7 @@ func GetAllMailFolders(
resolver, err := PopulateExchangeContainerResolver(ctx, qp, path.EmailCategory) resolver, err := PopulateExchangeContainerResolver(ctx, qp, path.EmailCategory)
if err != nil { if err != nil {
return nil, err return nil, errors.Wrap(err, "building directory resolver in GetAllMailFolders")
} }
for _, c := range resolver.Items() { for _, c := range resolver.Items() {
@ -171,7 +171,7 @@ func GetAllCalendars(
resolver, err := PopulateExchangeContainerResolver(ctx, qp, path.EventsCategory) resolver, err := PopulateExchangeContainerResolver(ctx, qp, path.EventsCategory)
if err != nil { if err != nil {
return nil, err return nil, errors.Wrap(err, "building calendar resolver in GetAllCalendars")
} }
for _, c := range resolver.Items() { for _, c := range resolver.Items() {
@ -200,7 +200,7 @@ func GetAllContactFolders(
resolver, err := PopulateExchangeContainerResolver(ctx, qp, path.ContactsCategory) resolver, err := PopulateExchangeContainerResolver(ctx, qp, path.ContactsCategory)
if err != nil { if err != nil {
return nil, err return nil, errors.Wrap(err, "building directory resolver in GetAllContactFolders")
} }
for _, c := range resolver.Items() { for _, c := range resolver.Items() {

View File

@ -40,7 +40,7 @@ func FilterContainersAndFillCollections(
service, err := createService(qp.Credentials, qp.FailFast) service, err := createService(qp.Credentials, qp.FailFast)
if err != nil { if err != nil {
errs = support.WrapAndAppend( errs = support.WrapAndAppend(
qp.User+" failed to create service during FilterContainerAndFillCollection", qp.User+" FilterContainerAndFillCollection",
err, err,
errs) errs)
@ -98,7 +98,8 @@ func IterativeCollectContactContainers(
return func(entry any) bool { return func(entry any) bool {
folder, ok := entry.(models.ContactFolderable) folder, ok := entry.(models.ContactFolderable)
if !ok { if !ok {
errUpdater("", errors.New("casting item to models.ContactFolderable")) errUpdater("iterateCollectContactContainers",
errors.New("casting item to models.ContactFolderable"))
return false return false
} }
@ -121,7 +122,7 @@ func IterativeCollectCalendarContainers(
return func(entry any) bool { return func(entry any) bool {
cal, ok := entry.(models.Calendarable) cal, ok := entry.(models.Calendarable)
if !ok { if !ok {
errUpdater("failure during IterativeCollectCalendarContainers", errUpdater("iterativeCollectCalendarContainers",
errors.New("casting item to models.Calendarable")) errors.New("casting item to models.Calendarable"))
return false return false
} }
@ -190,6 +191,7 @@ func FetchEventIDsFromCalendar(
if entry.GetId() == nil { if entry.GetId() == nil {
errs = multierror.Append(errs, errors.New("item with nil ID")) errs = multierror.Append(errs, errors.New("item with nil ID"))
return true
} }
ids = append(ids, *entry.GetId()) ids = append(ids, *entry.GetId())
@ -201,7 +203,7 @@ func FetchEventIDsFromCalendar(
return nil, errors.Wrap( return nil, errors.Wrap(
err, err,
support.ConnectorStackErrorTrace(err)+ support.ConnectorStackErrorTrace(err)+
" :iterateFailure for fetching events from calendar "+calendarID, " :fetching events from calendar "+calendarID,
) )
} }
@ -233,7 +235,7 @@ func FetchContactIDsFromDirectory(ctx context.Context, gs graph.Service, user, d
models.CreateContactCollectionResponseFromDiscriminatorValue, models.CreateContactCollectionResponseFromDiscriminatorValue,
) )
if err != nil { if err != nil {
return nil, errors.Wrap(err, "failure to create iterator during FecthContactIDs") return nil, errors.Wrap(err, "iterator creation during FetchContactIDs")
} }
var errs *multierror.Error var errs *multierror.Error
@ -249,6 +251,11 @@ func FetchContactIDsFromDirectory(ctx context.Context, gs graph.Service, user, d
return true return true
} }
if entry.GetId() == nil {
errs = multierror.Append(errs, errors.New("item with nil ID"))
return true
}
ids = append(ids, *entry.GetId()) ids = append(ids, *entry.GetId())
return true return true
@ -259,7 +266,7 @@ func FetchContactIDsFromDirectory(ctx context.Context, gs graph.Service, user, d
errors.Wrap( errors.Wrap(
err, err,
support.ConnectorStackErrorTrace(err)+ support.ConnectorStackErrorTrace(err)+
" :iterate failure during fetching contactIDs from directory "+directoryID, " :fetching contactIDs from directory "+directoryID,
) )
} }
@ -286,10 +293,8 @@ func FetchMessageIDsFromDirectory(
Messages(). Messages().
Get(ctx, options) Get(ctx, options)
if err != nil { if err != nil {
return nil, errors.Wrap( return nil,
errors.Wrap(err, support.ConnectorStackErrorTrace(err)), errors.Wrap(err, support.ConnectorStackErrorTrace(err))
"initial folder query",
)
} }
pageIter, err := msgraphgocore.NewPageIterator( pageIter, err := msgraphgocore.NewPageIterator(
@ -324,7 +329,7 @@ func FetchMessageIDsFromDirectory(
return nil, errors.Wrap( return nil, errors.Wrap(
err, err,
support.ConnectorStackErrorTrace(err)+ support.ConnectorStackErrorTrace(err)+
" :iterateFailure for fetching messages from directory "+directoryID, " :fetching messages from directory "+directoryID,
) )
} }

View File

@ -65,7 +65,7 @@ func RestoreExchangeContact(
) (*details.ExchangeInfo, error) { ) (*details.ExchangeInfo, error) {
contact, err := support.CreateContactFromBytes(bits) contact, err := support.CreateContactFromBytes(bits)
if err != nil { if err != nil {
return nil, errors.Wrap(err, "failure to create contact from bytes: RestoreExchangeContact") return nil, errors.Wrap(err, "creating contact from bytes: RestoreExchangeContact")
} }
response, err := service.Client().UsersById(user).ContactFoldersById(destination).Contacts().Post(ctx, contact, nil) response, err := service.Client().UsersById(user).ContactFoldersById(destination).Contacts().Post(ctx, contact, nil)
@ -74,7 +74,7 @@ func RestoreExchangeContact(
return nil, errors.Wrap( return nil, errors.Wrap(
err, err,
"failure to create Contact during RestoreExchangeContact: "+name+" "+ "uploading Contact during RestoreExchangeContact: "+name+" "+
support.ConnectorStackErrorTrace(err), support.ConnectorStackErrorTrace(err),
) )
} }
@ -101,7 +101,7 @@ func RestoreExchangeEvent(
) (*details.ExchangeInfo, error) { ) (*details.ExchangeInfo, error) {
event, err := support.CreateEventFromBytes(bits) event, err := support.CreateEventFromBytes(bits)
if err != nil { if err != nil {
return nil, err return nil, errors.Wrap(err, "creating event from bytes: RestoreExchangeEvent")
} }
transformedEvent := support.ToEventSimplified(event) transformedEvent := support.ToEventSimplified(event)
@ -110,7 +110,7 @@ func RestoreExchangeEvent(
if err != nil { if err != nil {
return nil, errors.Wrap(err, return nil, errors.Wrap(err,
fmt.Sprintf( fmt.Sprintf(
"failure to event creation failure during RestoreExchangeEvent: %s", "uploading event during RestoreExchangeEvent: %s",
support.ConnectorStackErrorTrace(err)), support.ConnectorStackErrorTrace(err)),
) )
} }
@ -138,7 +138,7 @@ func RestoreMailMessage(
// Creates messageable object from original bytes // Creates messageable object from original bytes
originalMessage, err := support.CreateMessageFromBytes(bits) originalMessage, err := support.CreateMessageFromBytes(bits)
if err != nil { if err != nil {
return nil, err return nil, errors.Wrap(err, "creating email from bytes: RestoreMailMessage")
} }
// Sets fields from original message from storage // Sets fields from original message from storage
clone := support.ToMessage(originalMessage) clone := support.ToMessage(originalMessage)
@ -226,7 +226,9 @@ func SendMailToBackStore(
for _, attachment := range attached { for _, attachment := range attached {
err := uploadAttachment(ctx, service, user, destination, id, attachment) err := uploadAttachment(ctx, service, user, destination, id, attachment)
if err != nil { if err != nil {
errs = support.WrapAndAppend(fmt.Sprintf("uploading attachment for message %s", id), errs = support.WrapAndAppend(
fmt.Sprintf("uploading attachment for message %s: %s",
id, support.ConnectorStackErrorTrace(err)),
err, err,
errs, errs,
) )

View File

@ -12,6 +12,7 @@ import (
khttp "github.com/microsoft/kiota-http-go" khttp "github.com/microsoft/kiota-http-go"
msgraphsdk "github.com/microsoftgraph/msgraph-sdk-go" msgraphsdk "github.com/microsoftgraph/msgraph-sdk-go"
msgraphgocore "github.com/microsoftgraph/msgraph-sdk-go-core" msgraphgocore "github.com/microsoftgraph/msgraph-sdk-go-core"
"github.com/pkg/errors"
"github.com/alcionai/corso/src/pkg/logger" "github.com/alcionai/corso/src/pkg/logger"
"github.com/alcionai/corso/src/pkg/path" "github.com/alcionai/corso/src/pkg/path"
@ -29,7 +30,7 @@ func CreateAdapter(tenant, client, secret string) (*msgraphsdk.GraphRequestAdapt
// Client Provider: Uses Secret for access to tenant-level data // Client Provider: Uses Secret for access to tenant-level data
cred, err := az.NewClientSecretCredential(tenant, client, secret, nil) cred, err := az.NewClientSecretCredential(tenant, client, secret, nil)
if err != nil { if err != nil {
return nil, err return nil, errors.Wrap(err, "creating m365 client secret credentials")
} }
auth, err := ka.NewAzureIdentityAuthenticationProviderWithScopes( auth, err := ka.NewAzureIdentityAuthenticationProviderWithScopes(
@ -37,7 +38,7 @@ func CreateAdapter(tenant, client, secret string) (*msgraphsdk.GraphRequestAdapt
[]string{"https://graph.microsoft.com/.default"}, []string{"https://graph.microsoft.com/.default"},
) )
if err != nil { if err != nil {
return nil, err return nil, errors.Wrap(err, "creating new AzureIdentityAuthentication")
} }
clientOptions := msgraphsdk.GetDefaultClientOptions() clientOptions := msgraphsdk.GetDefaultClientOptions()

View File

@ -84,14 +84,14 @@ func NewGraphConnector(ctx context.Context, acct account.Account) (*GraphConnect
aService, err := gc.createService(false) aService, err := gc.createService(false)
if err != nil { if err != nil {
return nil, err return nil, errors.Wrap(err, "creating service connection")
} }
gc.graphService = *aService gc.graphService = *aService
err = gc.setTenantUsers(ctx) err = gc.setTenantUsers(ctx)
if err != nil { if err != nil {
return nil, err return nil, errors.Wrap(err, "retrieving tenant user list")
} }
return &gc, nil return &gc, nil
@ -114,7 +114,7 @@ func (gc *GraphConnector) createService(shouldFailFast bool) (*graphService, err
failFast: shouldFailFast, failFast: shouldFailFast,
} }
return &connector, err return &connector, nil
} }
func (gs *graphService) EnableFailFast() { func (gs *graphService) EnableFailFast() {
@ -149,7 +149,7 @@ func (gc *GraphConnector) setTenantUsers(ctx context.Context) error {
callbackFunc := func(userItem interface{}) bool { callbackFunc := func(userItem interface{}) bool {
user, ok := userItem.(models.Userable) user, ok := userItem.(models.Userable)
if !ok { if !ok {
err = support.WrapAndAppend(gc.graphService.adapter.GetBaseUrl(), errors.New("user iteration failure"), err) err = support.WrapAndAppend(gc.graphService.adapter.GetBaseUrl(), errors.New("received non-User on iteration"), err)
return true return true
} }
@ -216,7 +216,7 @@ func (gc *GraphConnector) ExchangeDataCollection(
) ([]data.Collection, error) { ) ([]data.Collection, error) {
eb, err := selector.ToExchangeBackup() eb, err := selector.ToExchangeBackup()
if err != nil { if err != nil {
return nil, errors.Wrap(err, "exchangeDataCollection: unable to parse selector") return nil, errors.Wrap(err, "exchangeDataCollection: parsing selector")
} }
var ( var (
@ -386,7 +386,7 @@ func (gc *GraphConnector) DataCollections(ctx context.Context, sels selectors.Se
case selectors.ServiceOneDrive: case selectors.ServiceOneDrive:
return gc.OneDriveDataCollections(ctx, sels) return gc.OneDriveDataCollections(ctx, sels)
default: default:
return nil, errors.Errorf("Service %s not supported", sels) return nil, errors.Errorf("service %s not supported", sels)
} }
} }
@ -398,7 +398,7 @@ func (gc *GraphConnector) OneDriveDataCollections(
) ([]data.Collection, error) { ) ([]data.Collection, error) {
odb, err := selector.ToOneDriveBackup() odb, err := selector.ToOneDriveBackup()
if err != nil { if err != nil {
return nil, errors.Wrap(err, "collecting onedrive data") return nil, errors.Wrap(err, "oneDriveDataCollection: parsing selector")
} }
collections := []data.Collection{} collections := []data.Collection{}

View File

@ -4,6 +4,7 @@ import (
absser "github.com/microsoft/kiota-abstractions-go/serialization" absser "github.com/microsoft/kiota-abstractions-go/serialization"
js "github.com/microsoft/kiota-serialization-json-go" js "github.com/microsoft/kiota-serialization-json-go"
"github.com/microsoftgraph/msgraph-sdk-go/models" "github.com/microsoftgraph/msgraph-sdk-go/models"
"github.com/pkg/errors"
) )
// CreateFromBytes helper function to initialize m365 object form bytes. // CreateFromBytes helper function to initialize m365 object form bytes.
@ -11,12 +12,12 @@ import (
func CreateFromBytes(bytes []byte, createFunc absser.ParsableFactory) (absser.Parsable, error) { func CreateFromBytes(bytes []byte, createFunc absser.ParsableFactory) (absser.Parsable, error) {
parseNode, err := js.NewJsonParseNodeFactory().GetRootParseNode("application/json", bytes) parseNode, err := js.NewJsonParseNodeFactory().GetRootParseNode("application/json", bytes)
if err != nil { if err != nil {
return nil, err return nil, errors.Wrap(err, "parsing byte array into m365 object")
} }
anObject, err := parseNode.GetObjectValue(createFunc) anObject, err := parseNode.GetObjectValue(createFunc)
if err != nil { if err != nil {
return nil, err return nil, errors.Wrap(err, "parsing m365 object factory")
} }
return anObject, nil return anObject, nil
@ -26,7 +27,7 @@ func CreateFromBytes(bytes []byte, createFunc absser.ParsableFactory) (absser.Pa
func CreateMessageFromBytes(bytes []byte) (models.Messageable, error) { func CreateMessageFromBytes(bytes []byte) (models.Messageable, error) {
aMessage, err := CreateFromBytes(bytes, models.CreateMessageFromDiscriminatorValue) aMessage, err := CreateFromBytes(bytes, models.CreateMessageFromDiscriminatorValue)
if err != nil { if err != nil {
return nil, err return nil, errors.Wrap(err, "creating m365 exchange.Mail object from provided bytes")
} }
message := aMessage.(models.Messageable) message := aMessage.(models.Messageable)
@ -39,7 +40,7 @@ func CreateMessageFromBytes(bytes []byte) (models.Messageable, error) {
func CreateContactFromBytes(bytes []byte) (models.Contactable, error) { func CreateContactFromBytes(bytes []byte) (models.Contactable, error) {
parsable, err := CreateFromBytes(bytes, models.CreateContactFromDiscriminatorValue) parsable, err := CreateFromBytes(bytes, models.CreateContactFromDiscriminatorValue)
if err != nil { if err != nil {
return nil, err return nil, errors.Wrap(err, "creating m365 exchange.Contact object from provided bytes")
} }
contact := parsable.(models.Contactable) contact := parsable.(models.Contactable)
@ -51,7 +52,7 @@ func CreateContactFromBytes(bytes []byte) (models.Contactable, error) {
func CreateEventFromBytes(bytes []byte) (models.Eventable, error) { func CreateEventFromBytes(bytes []byte) (models.Eventable, error) {
parsable, err := CreateFromBytes(bytes, models.CreateEventFromDiscriminatorValue) parsable, err := CreateFromBytes(bytes, models.CreateEventFromDiscriminatorValue)
if err != nil { if err != nil {
return nil, err return nil, errors.Wrap(err, "creating m365 exchange.Event object from provided bytes")
} }
event := parsable.(models.Eventable) event := parsable.(models.Eventable)

View File

@ -90,7 +90,7 @@ func SetEventMessageRequest(orig models.Messageable, adtl map[string]any) (model
eventMessage, err := setEventRequestableFields(message, additional) eventMessage, err := setEventRequestableFields(message, additional)
if err != nil { if err != nil {
return nil, err return nil, errors.Wrap(err, "unable to set all fields for eventMessageRequestable")
} }
return eventMessage, nil return eventMessage, nil
@ -275,7 +275,7 @@ func SetAdditionalDataToEventMessage(
value, err := node.GetStringValue() value, err := node.GetStringValue()
if err != nil { if err != nil {
return nil, err return nil, errors.Wrapf(err, "could not parse string value for %s", key)
} }
switch key { switch key {
@ -304,7 +304,7 @@ func SetAdditionalDataToEventMessage(
value, err := node.GetStringValue() value, err := node.GetStringValue()
if err != nil { if err != nil {
return nil, err return nil, errors.Wrapf(err, "could not parse string value for %s", key)
} }
switch key { switch key {
@ -333,7 +333,7 @@ func SetAdditionalDataToEventMessage(
value, err := node.GetStringValue() value, err := node.GetStringValue()
if err != nil { if err != nil {
return nil, errors.New("map[string]*JsonParseNode conversion failure") return nil, errors.Wrapf(err, "could not parse string value for key %s", key)
} }
switch key { switch key {