diff --git a/pkg/connector/tables.go b/pkg/connector/tables.go index 10b93cd6..34b0d223 100644 --- a/pkg/connector/tables.go +++ b/pkg/connector/tables.go @@ -11,6 +11,10 @@ import ( "github.com/conductorone/baton-sdk/pkg/pagination" rs "github.com/conductorone/baton-sdk/pkg/types/resource" "github.com/conductorone/baton-snowflake/pkg/snowflake" + "github.com/grpc-ecosystem/go-grpc-middleware/logging/zap/ctxzap" + "go.uber.org/zap" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" ) const ( @@ -134,7 +138,9 @@ func (o *tableBuilder) List(ctx context.Context, parentResourceID *v2.ResourceId return nil, nil, wrapError(fmt.Errorf("invalid parent resource type: %s", parentResourceID.ResourceType), "invalid parent resource type") } + l := ctxzap.Extract(ctx) databaseName := parentResourceID.Resource + dbField := zap.String("database_name", databaseName) bag := &pagination.Bag{} if err := bag.Unmarshal(opts.PageToken.Token); err != nil { @@ -154,13 +160,22 @@ func (o *tableBuilder) List(ctx context.Context, parentResourceID *v2.ResourceId return nil, nil, wrapError(err, "failed to get parent database") } + if snowflake.IsUnprocessableEntity(statusCode, err) { + l.Warn("Skipping database: insufficient privileges for GetDatabase", dbField) + return nil, &rs.SyncOpResults{}, nil + } + schemas, err := o.client.ListSchemasInDatabase(ctx, databaseName) if err != nil { + if status.Code(err) == codes.PermissionDenied { + l.Warn("Skipping database: insufficient privileges for ListSchemasInDatabase", dbField) + return nil, &rs.SyncOpResults{}, nil + } return nil, nil, wrapError(err, "failed to list schemas in database") } sharedFlag := "" - if snowflake.IsUnprocessableEntity(statusCode, nil) || (parentDB != nil && parentDB.IsSharedOrSystem()) { + if parentDB != nil && parentDB.IsSharedOrSystem() { sharedFlag = "shared" } @@ -188,6 +203,15 @@ func (o *tableBuilder) List(ctx context.Context, parentResourceID *v2.ResourceId const pageSize = 200 tables, nextTableCursor, err := o.client.ListTablesInSchema(ctx, databaseName, schemaName, tableCursor, pageSize) if err != nil { + if status.Code(err) == codes.PermissionDenied { + l.Warn("Skipping schema: insufficient privileges for ListTablesInSchema", + dbField, zap.String("schema_name", schemaName)) + nextToken, tokenErr := bag.NextToken("") + if tokenErr != nil { + return nil, nil, wrapError(tokenErr, "failed to create next page token") + } + return nil, &rs.SyncOpResults{NextPageToken: nextToken}, nil + } return nil, nil, wrapError(err, "failed to list tables in schema") }