Error package graph connector (#173)

Merge of this package removes the `errorList` from the Query workflow. Some variable names changed to comply with industry standards.
This commit is contained in:
Danny 2022-06-09 17:20:04 -04:00 committed by GitHub
parent 340d875579
commit 8a450c07b5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 31 additions and 45 deletions

View File

@ -30,6 +30,13 @@ func (suite *GraphConnectorErrorSuite) TestWrapAndAppend() {
suite.T().Log(ListErrors(*multi)) suite.T().Log(ListErrors(*multi))
} }
func (suite *GraphConnectorErrorSuite) TestWrapAndAppend_OnVar() {
var err1 error
id := "xi2058"
received := WrapAndAppend(id, errors.New("network error"), err1)
suite.True(strings.Contains(received.Error(), id))
}
func (suite *GraphConnectorErrorSuite) TestWrapAndAppend_Add3() { func (suite *GraphConnectorErrorSuite) TestWrapAndAppend_Add3() {
errOneTwo := WrapAndAppend("user1", assert.AnError, assert.AnError) errOneTwo := WrapAndAppend("user1", assert.AnError, assert.AnError)
combined := WrapAndAppend("unix36", assert.AnError, errOneTwo) combined := WrapAndAppend("unix36", assert.AnError, errOneTwo)

View File

@ -3,7 +3,6 @@
package connector package connector
import ( import (
"errors"
"fmt" "fmt"
az "github.com/Azure/azure-sdk-for-go/sdk/azidentity" az "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
@ -14,6 +13,7 @@ import (
"github.com/microsoftgraph/msgraph-sdk-go/models" "github.com/microsoftgraph/msgraph-sdk-go/models"
msuser "github.com/microsoftgraph/msgraph-sdk-go/users" msuser "github.com/microsoftgraph/msgraph-sdk-go/users"
msfolder "github.com/microsoftgraph/msgraph-sdk-go/users/item/mailfolders" msfolder "github.com/microsoftgraph/msgraph-sdk-go/users/item/mailfolders"
"github.com/pkg/errors"
) )
// GraphConnector is a struct used to wrap the GraphServiceClient and // GraphConnector is a struct used to wrap the GraphServiceClient and
@ -60,7 +60,6 @@ func NewGraphConnector(tenantId, clientId, secret string) (*GraphConnector, erro
// iff the return value is true // iff the return value is true
func (gc *GraphConnector) setTenantUsers() error { func (gc *GraphConnector) setTenantUsers() error {
selecting := []string{"id, mail"} selecting := []string{"id, mail"}
errorList := make([]error, 0)
requestParams := &msuser.UsersRequestBuilderGetQueryParameters{ requestParams := &msuser.UsersRequestBuilderGetQueryParameters{
Select: selecting, Select: selecting,
} }
@ -72,38 +71,28 @@ func (gc *GraphConnector) setTenantUsers() error {
return err return err
} }
if response == nil { if response == nil {
return errors.New("connector unable to complete queries. Verify credentials") err = WrapAndAppend("general access", errors.New("connector failed: No access"), err)
return err
} }
userIterator, err := msgraphgocore.NewPageIterator(response, &gc.adapter, models.CreateUserCollectionResponseFromDiscriminatorValue) userIterator, err := msgraphgocore.NewPageIterator(response, &gc.adapter, models.CreateUserCollectionResponseFromDiscriminatorValue)
if err != nil { if err != nil {
return err return err
} }
var hasFailed error var iterateError 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 {
errorList = append(errorList, errors.New("unable to iterable to user")) err = WrapAndAppend(gc.adapter.GetBaseUrl(), errors.New("user iteration failure"), err)
return true return true
} }
gc.Users[*user.GetMail()] = *user.GetId() gc.Users[*user.GetMail()] = *user.GetId()
return true return true
} }
hasFailed = userIterator.Iterate(callbackFunc) iterateError = userIterator.Iterate(callbackFunc)
if len(errorList) > 0 { if iterateError != nil {
return errors.New(ConvertErrorList(errorList)) err = WrapAndAppend(gc.adapter.GetBaseUrl(), iterateError, err)
} }
return hasFailed return err
}
// ConvertsErrorList takes a list of errors and converts returns
// a string
// TODO: Place in error package after merged
func ConvertErrorList(errorList []error) string {
errorLog := ""
for idx, err := range errorList {
errorLog = errorLog + fmt.Sprintf("Error# %d\t%v\n", idx, err)
}
return errorLog
} }
// GetUsers returns the email address of users within tenant. // GetUsers returns the email address of users within tenant.
@ -136,6 +125,7 @@ func buildFromMap(isKey bool, mapping map[string]string) []string {
func (gc *GraphConnector) ExchangeDataCollection(user string) (DataCollection, error) { func (gc *GraphConnector) ExchangeDataCollection(user string) (DataCollection, error) {
// TODO replace with completion of Issue 124: // TODO replace with completion of Issue 124:
collection := NewExchangeDataCollection(user, []string{gc.tenant, user}) collection := NewExchangeDataCollection(user, []string{gc.tenant, user})
//TODO: Retry handler to convert return: (DataCollection, error)
return gc.serializeMessages(user, collection) return gc.serializeMessages(user, collection)
} }
@ -166,33 +156,33 @@ func (gc *GraphConnector) serializeMessages(user string, dc ExchangeDataCollecti
return nil, fmt.Errorf("unable to access folders for %s", user) return nil, fmt.Errorf("unable to access folders for %s", user)
} }
folderList := make([]string, 0) folderList := make([]string, 0)
errorList := make([]error, 0)
for _, folderable := range response.GetValue() { for _, folderable := range response.GetValue() {
folderList = append(folderList, *folderable.GetId()) folderList = append(folderList, *folderable.GetId())
} }
fmt.Printf("Folder List: %v\n", folderList)
// Time to create Exchange data Holder // Time to create Exchange data Holder
var byteArray []byte var byteArray []byte
var iterateError error var errs error
for _, aFolder := range folderList { for _, aFolder := range folderList {
result, err := gc.client.UsersById(user).MailFoldersById(aFolder).Messages().Get() result, err := gc.client.UsersById(user).MailFoldersById(aFolder).Messages().Get()
if err != nil { if err != nil {
errorList = append(errorList, err) errs = WrapAndAppend(user, err, errs)
} }
if result == nil { if result == nil {
fmt.Println("Cannot Get result") errs = WrapAndAppend(user, fmt.Errorf("nil response on message query, folder: %s", aFolder), errs)
continue
} }
pageIterator, err := msgraphgocore.NewPageIterator(result, &gc.adapter, models.CreateMessageCollectionResponseFromDiscriminatorValue) pageIterator, err := msgraphgocore.NewPageIterator(result, &gc.adapter, models.CreateMessageCollectionResponseFromDiscriminatorValue)
if err != nil { if err != nil {
errorList = append(errorList, err) errs = WrapAndAppend(user, fmt.Errorf("iterator failed initialization: %v", err), errs)
continue
} }
objectWriter := kw.NewJsonSerializationWriter() objectWriter := kw.NewJsonSerializationWriter()
callbackFunc := func(messageItem interface{}) bool { callbackFunc := func(messageItem interface{}) bool {
message, ok := messageItem.(models.Messageable) message, ok := messageItem.(models.Messageable)
if !ok { if !ok {
errorList = append(errorList, fmt.Errorf("unable to iterate on message for user: %s", user)) errs = WrapAndAppend(user, fmt.Errorf("non-message return for user: %s", user), errs)
return true return true
} }
if *message.GetHasAttachments() { if *message.GetHasAttachments() {
@ -201,20 +191,18 @@ func (gc *GraphConnector) serializeMessages(user string, dc ExchangeDataCollecti
message.SetAttachments(attached.GetValue()) message.SetAttachments(attached.GetValue())
} }
if err != nil { if err != nil {
err = fmt.Errorf("Attachment Error: " + err.Error()) errs = WrapAndAppend(*message.GetId(), fmt.Errorf("attachment failed: %v ", err), errs)
errorList = append(errorList, err)
} }
} }
err = objectWriter.WriteObjectValue("", message) err = objectWriter.WriteObjectValue("", message)
if err != nil { if err != nil {
errorList = append(errorList, err) errs = WrapAndAppend(*message.GetId(), err, errs)
return true return true
} }
byteArray, err = objectWriter.GetSerializedContent() byteArray, err = objectWriter.GetSerializedContent()
objectWriter.Close() objectWriter.Close()
if err != nil { if err != nil {
errorList = append(errorList, err) errs = WrapAndAppend(*message.GetId(), err, errs)
return true return true
} }
if byteArray != nil { if byteArray != nil {
@ -222,18 +210,14 @@ func (gc *GraphConnector) serializeMessages(user string, dc ExchangeDataCollecti
} }
return true return true
} }
iterateError = pageIterator.Iterate(callbackFunc) err = pageIterator.Iterate(callbackFunc)
if iterateError != nil { if err != nil {
errorList = append(errorList, err) errs = WrapAndAppend(user, err, errs)
} }
} }
fmt.Printf("Returning ExchangeDataColection with %d items\n", dc.Length()) fmt.Printf("Returning ExchangeDataColection with %d items\n", dc.Length())
fmt.Printf("Errors: \n%s\n", ConvertErrorList(errorList)) fmt.Printf("Errors: \n%s\n", errs.Error())
dc.FinishPopulation() dc.FinishPopulation()
var errs error
if len(errorList) > 0 {
errs = errors.New(ConvertErrorList(errorList))
}
return &dc, errs return &dc, errs
} }

View File

@ -23,11 +23,6 @@ func TestGraphConnectorSuite(t *testing.T) {
); err != nil { ); err != nil {
t.Skip(err) t.Skip(err)
} }
if err := ctesting.RunOnAny(
"this-is-fake-it-forces-a-skip-until-we-fix-ci-details-here(rkeepers)",
); err != nil {
t.Skip(err)
}
suite.Run(t, new(GraphConnectorIntegrationSuite)) suite.Run(t, new(GraphConnectorIntegrationSuite))
} }