Replace fmt prints with the logger (#220)

Now that we have the logger in place, we should use it
in place of fmt.Print calls for development and debugging output.
This commit is contained in:
Keepers 2022-06-17 13:45:22 -06:00 committed by GitHub
parent ccb3fa46a3
commit 243343c0e9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 84 additions and 46 deletions

View File

@ -9,6 +9,7 @@ import (
"github.com/alcionai/corso/cli/config" "github.com/alcionai/corso/cli/config"
"github.com/alcionai/corso/cli/utils" "github.com/alcionai/corso/cli/utils"
"github.com/alcionai/corso/pkg/credentials" "github.com/alcionai/corso/pkg/credentials"
"github.com/alcionai/corso/pkg/logger"
"github.com/alcionai/corso/pkg/repository" "github.com/alcionai/corso/pkg/repository"
) )
@ -40,6 +41,12 @@ var exchangeCreateCmd = &cobra.Command{
// initializes a s3 repo. // initializes a s3 repo.
func createExchangeCmd(cmd *cobra.Command, args []string) error { func createExchangeCmd(cmd *cobra.Command, args []string) error {
ctx := cmd.Context()
if utils.HasNoFlagsAndShownHelp(cmd) {
return nil
}
s, cfgTenantID, err := config.MakeS3Config(true, nil) s, cfgTenantID, err := config.MakeS3Config(true, nil)
if err != nil { if err != nil {
return err return err
@ -55,25 +62,24 @@ func createExchangeCmd(cmd *cobra.Command, args []string) error {
a.TenantID = cfgTenantID a.TenantID = cfgTenantID
} }
fmt.Printf( logger.Ctx(ctx).Debugw(
"Called - %s\n\t365TenantID:\t%s\n\t356Client:\t%s\n\tfound 356Secret:\t%v\n", "Called - "+cmd.CommandPath(),
cmd.CommandPath(), "tenantID", m365.TenantID,
m365.TenantID, "clientID", m365.ClientID,
m365.ClientID, "hasClientSecret", len(m365.ClientSecret) > 0)
len(m365.ClientSecret) > 0)
r, err := repository.Connect(cmd.Context(), a, s) r, err := repository.Connect(ctx, a, s)
if err != nil { if err != nil {
return errors.Wrapf(err, "Failed to connect to the %s repository", s.Provider) return errors.Wrapf(err, "Failed to connect to the %s repository", s.Provider)
} }
defer utils.CloseRepo(cmd.Context(), r) defer utils.CloseRepo(ctx, r)
bo, err := r.NewBackup(cmd.Context(), []string{user}) bo, err := r.NewBackup(ctx, []string{user})
if err != nil { if err != nil {
return errors.Wrap(err, "Failed to initialize Exchange backup") return errors.Wrap(err, "Failed to initialize Exchange backup")
} }
if _, err := bo.Run(cmd.Context()); err != nil { if _, err := bo.Run(ctx); err != nil {
return errors.Wrap(err, "Failed to run Exchange backup") return errors.Wrap(err, "Failed to run Exchange backup")
} }

View File

@ -52,7 +52,12 @@ var s3InitCmd = &cobra.Command{
// initializes a s3 repo. // initializes a s3 repo.
func initS3Cmd(cmd *cobra.Command, args []string) error { func initS3Cmd(cmd *cobra.Command, args []string) error {
log := logger.Ctx(cmd.Context()) ctx := cmd.Context()
log := logger.Ctx(ctx)
if utils.HasNoFlagsAndShownHelp(cmd) {
return nil
}
overrides := map[string]string{ overrides := map[string]string{
credentials.AWSAccessKeyID: accessKey, credentials.AWSAccessKeyID: accessKey,
@ -87,11 +92,11 @@ func initS3Cmd(cmd *cobra.Command, args []string) error {
"accessKey", s3Cfg.AccessKey, "accessKey", s3Cfg.AccessKey,
"hasSecretKey", len(s3Cfg.SecretKey) > 0) "hasSecretKey", len(s3Cfg.SecretKey) > 0)
r, err := repository.Initialize(cmd.Context(), a, s) r, err := repository.Initialize(ctx, a, s)
if err != nil { if err != nil {
return errors.Wrap(err, "Failed to initialize a new S3 repository") return errors.Wrap(err, "Failed to initialize a new S3 repository")
} }
defer utils.CloseRepo(cmd.Context(), r) defer utils.CloseRepo(ctx, r)
fmt.Printf("Initialized a S3 repository within bucket %s.\n", s3Cfg.Bucket) fmt.Printf("Initialized a S3 repository within bucket %s.\n", s3Cfg.Bucket)
@ -112,7 +117,12 @@ var s3ConnectCmd = &cobra.Command{
// connects to an existing s3 repo. // connects to an existing s3 repo.
func connectS3Cmd(cmd *cobra.Command, args []string) error { func connectS3Cmd(cmd *cobra.Command, args []string) error {
log := logger.Ctx(cmd.Context()) ctx := cmd.Context()
log := logger.Ctx(ctx)
if utils.HasNoFlagsAndShownHelp(cmd) {
return nil
}
overrides := map[string]string{ overrides := map[string]string{
credentials.AWSAccessKeyID: accessKey, credentials.AWSAccessKeyID: accessKey,
@ -147,11 +157,11 @@ func connectS3Cmd(cmd *cobra.Command, args []string) error {
"accessKey", s3Cfg.AccessKey, "accessKey", s3Cfg.AccessKey,
"hasSecretKey", len(s3Cfg.SecretKey) > 0) "hasSecretKey", len(s3Cfg.SecretKey) > 0)
r, err := repository.Connect(cmd.Context(), a, s) r, err := repository.Connect(ctx, a, s)
if err != nil { if err != nil {
return errors.Wrap(err, "Failed to connect to the S3 repository") return errors.Wrap(err, "Failed to connect to the S3 repository")
} }
defer utils.CloseRepo(cmd.Context(), r) defer utils.CloseRepo(ctx, r)
fmt.Printf("Connected to S3 bucket %s.\n", s3Cfg.Bucket) fmt.Printf("Connected to S3 bucket %s.\n", s3Cfg.Bucket)

View File

@ -9,6 +9,7 @@ import (
"github.com/alcionai/corso/cli/config" "github.com/alcionai/corso/cli/config"
"github.com/alcionai/corso/cli/utils" "github.com/alcionai/corso/cli/utils"
"github.com/alcionai/corso/pkg/credentials" "github.com/alcionai/corso/pkg/credentials"
"github.com/alcionai/corso/pkg/logger"
"github.com/alcionai/corso/pkg/repository" "github.com/alcionai/corso/pkg/repository"
) )
@ -41,8 +42,9 @@ var exchangeCmd = &cobra.Command{
// initializes a s3 repo. // initializes a s3 repo.
func createExchangeCmd(cmd *cobra.Command, args []string) error { func createExchangeCmd(cmd *cobra.Command, args []string) error {
if cmd.Flags().NFlag() == 0 { ctx := cmd.Context()
cmd.Help()
if utils.HasNoFlagsAndShownHelp(cmd) {
return nil return nil
} }
@ -65,25 +67,24 @@ func createExchangeCmd(cmd *cobra.Command, args []string) error {
a.TenantID = cfgTenantID a.TenantID = cfgTenantID
} }
fmt.Printf( logger.Ctx(ctx).Debugw(
"Called - %s\n\t365TenantID:\t%s\n\t356Client:\t%s\n\tfound 356Secret:\t%v\n", "Called - "+cmd.CommandPath(),
cmd.CommandPath(), "tenantID", m365.TenantID,
m365.TenantID, "clientID", m365.ClientID,
m365.ClientID, "hasClientSecret", len(m365.ClientSecret) > 0)
len(m365.ClientSecret) > 0)
r, err := repository.Connect(cmd.Context(), a, s) r, err := repository.Connect(ctx, a, s)
if err != nil { if err != nil {
return errors.Wrapf(err, "Failed to connect to the %s repository", s.Provider) return errors.Wrapf(err, "Failed to connect to the %s repository", s.Provider)
} }
defer utils.CloseRepo(cmd.Context(), r) defer utils.CloseRepo(ctx, r)
ro, err := r.NewRestore(cmd.Context(), []string{user, folder, mail}) ro, err := r.NewRestore(ctx, []string{user, folder, mail})
if err != nil { if err != nil {
return errors.Wrap(err, "Failed to initialize Exchange restore") return errors.Wrap(err, "Failed to initialize Exchange restore")
} }
if _, err := ro.Run(cmd.Context()); err != nil { if _, err := ro.Run(ctx); err != nil {
return errors.Wrap(err, "Failed to run Exchange restore") return errors.Wrap(err, "Failed to run Exchange restore")
} }

View File

@ -6,6 +6,7 @@ import (
"fmt" "fmt"
"github.com/alcionai/corso/pkg/repository" "github.com/alcionai/corso/pkg/repository"
"github.com/spf13/cobra"
) )
// RequireProps validates the existence of the properties // RequireProps validates the existence of the properties
@ -25,3 +26,16 @@ func CloseRepo(ctx context.Context, r *repository.Repository) {
fmt.Print("Error closing repository:", err) fmt.Print("Error closing repository:", err)
} }
} }
// HasNoFlagsAndShownHelp shows the Help output if no flags
// were provided to the command. Returns true if the help
// was shown.
// Use for when the non-flagged usage of a command
// (ex: corso backup restore exchange) is expected to no-op.
func HasNoFlagsAndShownHelp(cmd *cobra.Command) bool {
if cmd.Flags().NFlag() == 0 {
cmd.Help()
return true
}
return false
}

View File

@ -1,13 +1,15 @@
package connector package connector
import ( import (
"context"
"fmt" "fmt"
"strings" "strings"
"github.com/pkg/errors"
multierror "github.com/hashicorp/go-multierror" multierror "github.com/hashicorp/go-multierror"
msgraph_errors "github.com/microsoftgraph/msgraph-sdk-go/models/odataerrors" msgraph_errors "github.com/microsoftgraph/msgraph-sdk-go/models/odataerrors"
"github.com/pkg/errors"
"github.com/alcionai/corso/pkg/logger"
) )
// WrapErrorAndAppend helper function used to attach identifying information to an error // WrapErrorAndAppend helper function used to attach identifying information to an error
@ -24,10 +26,10 @@ func WrapAndAppendf(identifier interface{}, e error, previous error) error {
// ListErrors is a helper method used to return the string of errors when // ListErrors is a helper method used to return the string of errors when
// the multiError library is used. // the multiError library is used.
// depends on ConnectorStackErrorTrace // depends on ConnectorStackErrorTrace
func ListErrors(multi multierror.Error) string { func ListErrors(ctx context.Context, multi multierror.Error) string {
aString := "" aString := ""
for idx, err := range multi.Errors { for idx, err := range multi.Errors {
detail := ConnectorStackErrorTrace(err) detail := ConnectorStackErrorTrace(ctx, err)
if detail == "" { if detail == "" {
detail = fmt.Sprintf("%v", err) detail = fmt.Sprintf("%v", err)
} }
@ -49,7 +51,7 @@ func concatenateStringFromPointers(orig string, pointers []*string) string {
// ConnectorStackErrorTrace is a helper function that wraps the // ConnectorStackErrorTrace is a helper function that wraps the
// stack trace for oDataError types from querying the M365 back store. // stack trace for oDataError types from querying the M365 back store.
func ConnectorStackErrorTrace(e error) string { func ConnectorStackErrorTrace(ctx context.Context, e error) string {
eMessage := "" eMessage := ""
if oDataError, ok := e.(msgraph_errors.ODataErrorable); ok { if oDataError, ok := e.(msgraph_errors.ODataErrorable); ok {
// Get MainError // Get MainError
@ -81,7 +83,7 @@ func ConnectorStackErrorTrace(e error) string {
} }
} }
if inners != nil { if inners != nil {
fmt.Println("Inners not nil") logger.Ctx(ctx).Debug("error contains inner errors")
eMessage = eMessage + "\nConnector Section:" eMessage = eMessage + "\nConnector Section:"
client := inners.GetClientRequestId() client := inners.GetClientRequestId()
rId := inners.GetRequestId() rId := inners.GetRequestId()

View File

@ -1,6 +1,7 @@
package connector package connector
import ( import (
"context"
"errors" "errors"
"fmt" "fmt"
"strings" "strings"
@ -26,8 +27,8 @@ func (suite *GraphConnectorErrorSuite) TestWrapAndAppend() {
suite.True(strings.Contains(returnErr.Error(), "arc376")) suite.True(strings.Contains(returnErr.Error(), "arc376"))
suite.Error(returnErr) suite.Error(returnErr)
multi := &multierror.Error{Errors: []error{err1, err2}} multi := &multierror.Error{Errors: []error{err1, err2}}
suite.True(strings.Contains(ListErrors(*multi), "two")) // Does not contain the wrapped information suite.True(strings.Contains(ListErrors(context.Background(), *multi), "two")) // Does not contain the wrapped information
suite.T().Log(ListErrors(*multi)) suite.T().Log(ListErrors(context.Background(), *multi))
} }
func (suite *GraphConnectorErrorSuite) TestWrapAndAppend_OnVar() { func (suite *GraphConnectorErrorSuite) TestWrapAndAppend_OnVar() {

View File

@ -4,6 +4,7 @@ package connector
import ( import (
"bytes" "bytes"
"context"
"fmt" "fmt"
"io" "io"
@ -17,6 +18,8 @@ import (
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" "github.com/pkg/errors"
"github.com/alcionai/corso/pkg/logger"
) )
const ( const (
@ -130,11 +133,11 @@ func buildFromMap(isKey bool, mapping map[string]string) []string {
// Assumption: User exists // Assumption: User exists
// TODO: https://github.com/alcionai/corso/issues/135 // TODO: https://github.com/alcionai/corso/issues/135
// Add iota to this call -> mail, contacts, calendar, etc. // Add iota to this call -> mail, contacts, calendar, etc.
func (gc *GraphConnector) ExchangeDataCollection(user string) ([]DataCollection, error) { func (gc *GraphConnector) ExchangeDataCollection(ctx context.Context, user string) ([]DataCollection, error) {
// TODO replace with completion of Issue 124: // TODO replace with completion of Issue 124:
//TODO: Retry handler to convert return: (DataCollection, error) //TODO: Retry handler to convert return: (DataCollection, error)
return gc.serializeMessages(user) return gc.serializeMessages(ctx, user)
} }
// optionsForMailFolders creates transforms the 'select' into a more dynamic call for MailFolders. // optionsForMailFolders creates transforms the 'select' into a more dynamic call for MailFolders.
@ -154,7 +157,7 @@ func optionsForMailFolders(moreOps []string) *msfolder.MailFoldersRequestBuilder
// restoreMessages: Utility function to connect to M365 backstore // restoreMessages: Utility function to connect to M365 backstore
// and upload messages from DataCollection. // and upload messages from DataCollection.
// FullPath: tenantId, userId, <mailCategory>, FolderId // FullPath: tenantId, userId, <mailCategory>, FolderId
func (gc *GraphConnector) restoreMessages(dc DataCollection) error { func (gc *GraphConnector) restoreMessages(ctx context.Context, dc DataCollection) error {
var errs error var errs error
// must be user.GetId(), PrimaryName no longer works 6-15-2022 // must be user.GetId(), PrimaryName no longer works 6-15-2022
user := dc.FullPath()[1] user := dc.FullPath()[1]
@ -188,7 +191,7 @@ func (gc *GraphConnector) restoreMessages(dc DataCollection) error {
clone.SetIsDraft(&draft) clone.SetIsDraft(&draft)
sentMessage, err := gc.client.UsersById(user).MailFoldersById(address).Messages().Post(clone) sentMessage, err := gc.client.UsersById(user).MailFoldersById(address).Messages().Post(clone)
if err != nil { if err != nil {
details := ConnectorStackErrorTrace(err) details := ConnectorStackErrorTrace(ctx, err)
errs = WrapAndAppend(data.UUID()+": "+details, err, errs) errs = WrapAndAppend(data.UUID()+": "+details, err, errs)
continue continue
// TODO: Add to retry Handler for the for failure // TODO: Add to retry Handler for the for failure
@ -206,7 +209,7 @@ func (gc *GraphConnector) restoreMessages(dc DataCollection) error {
// serializeMessages: Temp Function as place Holder until Collections have been added // serializeMessages: Temp Function as place Holder until Collections have been added
// to the GraphConnector struct. // to the GraphConnector struct.
func (gc *GraphConnector) serializeMessages(user string) ([]DataCollection, error) { func (gc *GraphConnector) serializeMessages(ctx context.Context, user string) ([]DataCollection, error) {
options := optionsForMailFolders([]string{}) options := optionsForMailFolders([]string{})
response, err := gc.client.UsersById(user).MailFolders().GetWithRequestConfigurationAndResponseHandler(options, nil) response, err := gc.client.UsersById(user).MailFolders().GetWithRequestConfigurationAndResponseHandler(options, nil)
if err != nil { if err != nil {
@ -258,7 +261,7 @@ func (gc *GraphConnector) serializeMessages(user string) ([]DataCollection, erro
} }
} }
if err != nil { if err != nil {
fmt.Println("Retries exceeded") logger.Ctx(ctx).Debug("exceeded maximum retries")
errs = WrapAndAppend(*message.GetId(), fmt.Errorf("attachment failed: %v ", err), errs) errs = WrapAndAppend(*message.GetId(), fmt.Errorf("attachment failed: %v ", err), errs)
} }
} }
@ -286,7 +289,7 @@ func (gc *GraphConnector) serializeMessages(user string) ([]DataCollection, erro
// Todo Retry Handler to be implemented // Todo Retry Handler to be implemented
edc.FinishPopulation() edc.FinishPopulation()
//fmt.Printf("Storing ExchangeDataColection with %d items\n", edc.Length()) logger.Ctx(ctx).Debugw("finished storing ExchangeDataColection", "itemCount", edc.Length())
collections = append(collections, &edc) collections = append(collections, &edc)
} }
return collections, errs return collections, errs

View File

@ -1,6 +1,7 @@
package connector package connector
import ( import (
"context"
"testing" "testing"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
@ -63,7 +64,7 @@ func (suite *GraphConnectorIntegrationSuite) TestGraphConnector_ExchangeDataColl
if err := ctesting.RunOnAny(ctesting.CorsoCITests); err != nil { if err := ctesting.RunOnAny(ctesting.CorsoCITests); err != nil {
suite.T().Skip(err) suite.T().Skip(err)
} }
collectionList, err := suite.connector.ExchangeDataCollection("lidiah@8qzvrj.onmicrosoft.com") collectionList, err := suite.connector.ExchangeDataCollection(context.Background(), "lidiah@8qzvrj.onmicrosoft.com")
assert.NotNil(suite.T(), collectionList) assert.NotNil(suite.T(), collectionList)
assert.Error(suite.T(), err) // TODO Remove after https://github.com/alcionai/corso/issues/140 assert.Error(suite.T(), err) // TODO Remove after https://github.com/alcionai/corso/issues/140
if err != nil { if err != nil {
@ -89,7 +90,7 @@ func (suite *GraphConnectorIntegrationSuite) TestGraphConnector_restoreMessages(
edc := NewExchangeDataCollection("tenant", []string{"tenantId", evs[user], mailCategory, "Inbox"}) edc := NewExchangeDataCollection("tenant", []string{"tenantId", evs[user], mailCategory, "Inbox"})
edc.PopulateCollection(ds) edc.PopulateCollection(ds)
edc.FinishPopulation() edc.FinishPopulation()
err = suite.connector.restoreMessages(&edc) err = suite.connector.restoreMessages(context.Background(), &edc)
assert.NoError(suite.T(), err) assert.NoError(suite.T(), err)
} }

View File

@ -55,7 +55,7 @@ func (op *BackupOperation) Run(ctx context.Context) (*kopia.BackupStats, error)
return nil, errors.Wrap(err, "connecting to graph api") return nil, errors.Wrap(err, "connecting to graph api")
} }
cs, err := gc.ExchangeDataCollection(op.Targets[0]) cs, err := gc.ExchangeDataCollection(ctx, op.Targets[0])
if err != nil { if err != nil {
return nil, errors.Wrap(err, "retrieving application data") return nil, errors.Wrap(err, "retrieving application data")
} }