diff --git a/src/internal/connector/exchange_data_collection.go b/src/internal/connector/exchange_data_collection.go index 777b777b5..ad52d019f 100644 --- a/src/internal/connector/exchange_data_collection.go +++ b/src/internal/connector/exchange_data_collection.go @@ -5,49 +5,18 @@ import ( "io" "github.com/alcionai/corso/internal/connector/support" + "github.com/alcionai/corso/internal/data" "github.com/alcionai/corso/pkg/backup/details" ) +var _ data.DataCollection = &ExchangeDataCollection{} +var _ data.DataStream = &ExchangeData{} +var _ data.DataStreamInfo = &ExchangeData{} + const ( - // TODO: Reduce this when https://github.com/alcionai/corso/issues/124 is closed - // and we make channel population async (decouple from collection initialization) - collectionChannelBufferSize = 1000 + collectionChannelBufferSize = 120 ) -// A DataCollection represents a collection of data of the -// same type (e.g. mail) -type DataCollection interface { - // Items returns a channel from which items in the collection can be read. - // Each returned struct contains the next item in the collection - // The channel is closed when there are no more items in the collection or if - // an unrecoverable error caused an early termination in the sender. - Items() <-chan DataStream - // FullPath returns a slice of strings that act as metadata tags for this - // DataCollection. Returned items should be ordered from most generic to least - // generic. For example, a DataCollection for emails from a specific user - // would be {"", "", "emails"}. - FullPath() []string -} - -// DataStream represents a single item within a DataCollection -// that can be consumed as a stream (it embeds io.Reader) -type DataStream interface { - // ToReader returns an io.Reader for the DataStream - ToReader() io.ReadCloser - // UUID provides a unique identifier for this data - UUID() string -} - -// DataStreamInfo is used to provide service specific -// information about the DataStream -type DataStreamInfo interface { - Info() details.ItemInfo -} - -var _ DataCollection = &ExchangeDataCollection{} -var _ DataStream = &ExchangeData{} -var _ DataStreamInfo = &ExchangeData{} - // ExchangeDataCollection represents exchange mailbox // data for a single user. // @@ -55,7 +24,7 @@ var _ DataStreamInfo = &ExchangeData{} type ExchangeDataCollection struct { // M365 user user string - data chan DataStream + data chan data.DataStream tasks []string updateCh chan support.ConnectorOperationStatus service graphService @@ -70,7 +39,7 @@ type ExchangeDataCollection struct { func NewExchangeDataCollection(aUser string, pathRepresentation []string) ExchangeDataCollection { collection := ExchangeDataCollection{ user: aUser, - data: make(chan DataStream, collectionChannelBufferSize), + data: make(chan data.DataStream, collectionChannelBufferSize), fullPath: pathRepresentation, } return collection @@ -88,7 +57,7 @@ func (edc *ExchangeDataCollection) FinishPopulation() { } } -func (edc *ExchangeDataCollection) Items() <-chan DataStream { +func (edc *ExchangeDataCollection) Items() <-chan data.DataStream { return edc.data } diff --git a/src/internal/connector/exchange_data_collection_test.go b/src/internal/connector/exchange_data_collection_test.go index 60ef51c74..a634efbf9 100644 --- a/src/internal/connector/exchange_data_collection_test.go +++ b/src/internal/connector/exchange_data_collection_test.go @@ -64,22 +64,3 @@ func (suite *ExchangeDataCollectionSuite) TestExchangeDataCollection_PopulateCol } suite.Equal(expected, len(edc.data)) } - -func (suite *ExchangeDataCollectionSuite) TestExchangeDataCollection_NextItem() { - inputStrings := []string{"Jack", "and", "Jill", "went", "up", "the", "hill to", - "fetch", "a", "pale", "of", "water"} - expected := len(inputStrings) / 2 // We are using pairs - edc := NewExchangeDataCollection("Fletcher", []string{"sugar", "horses", "painted red"}) - for i := 0; i < expected; i++ { - edc.PopulateCollection(&ExchangeData{id: inputStrings[i*2], message: []byte(inputStrings[i*2+1])}) - } - edc.FinishPopulation() // finished writing - - count := 0 - for data := range edc.Items() { - assert.NotNil(suite.T(), data) - count++ - } - - assert.Equal(suite.T(), expected, count) -} diff --git a/src/internal/connector/graph_connector.go b/src/internal/connector/graph_connector.go index 45d43865b..1cf8645da 100644 --- a/src/internal/connector/graph_connector.go +++ b/src/internal/connector/graph_connector.go @@ -19,6 +19,7 @@ import ( "github.com/alcionai/corso/internal/connector/exchange" "github.com/alcionai/corso/internal/connector/support" + "github.com/alcionai/corso/internal/data" "github.com/alcionai/corso/pkg/account" "github.com/alcionai/corso/pkg/logger" "github.com/alcionai/corso/pkg/selectors" @@ -190,13 +191,13 @@ func buildFromMap(isKey bool, mapping map[string]string) []string { // use to read mailbox data out for the specified user // Assumption: User exists // Add iota to this call -> mail, contacts, calendar, etc. -func (gc *GraphConnector) ExchangeDataCollection(ctx context.Context, selector selectors.Selector) ([]DataCollection, error) { +func (gc *GraphConnector) ExchangeDataCollection(ctx context.Context, selector selectors.Selector) ([]data.DataCollection, error) { eb, err := selector.ToExchangeBackup() if err != nil { return nil, errors.Wrap(err, "collecting exchange data") } - collections := []DataCollection{} + collections := []data.DataCollection{} scopes := eb.Scopes() var errs error @@ -235,7 +236,7 @@ func (gc *GraphConnector) ExchangeDataCollection(ctx context.Context, selector s // RestoreMessages: Utility function to connect to M365 backstore // and upload messages from DataCollection. // FullPath: tenantId, userId, , FolderId -func (gc *GraphConnector) RestoreMessages(ctx context.Context, dcs []DataCollection) error { +func (gc *GraphConnector) RestoreMessages(ctx context.Context, dcs []data.DataCollection) error { var ( pathCounter = map[string]bool{} attempts, successes int @@ -421,7 +422,7 @@ func messageToDataCollection( client *msgraphsdk.GraphServiceClient, ctx context.Context, objectWriter *kw.JsonSerializationWriter, - dataChannel chan<- DataStream, + dataChannel chan<- data.DataStream, message models.Messageable, user string, ) error { diff --git a/src/internal/connector/graph_connector_test.go b/src/internal/connector/graph_connector_test.go index 6363f711e..a3783c9e4 100644 --- a/src/internal/connector/graph_connector_test.go +++ b/src/internal/connector/graph_connector_test.go @@ -11,6 +11,7 @@ import ( "github.com/stretchr/testify/suite" "github.com/alcionai/corso/internal/connector/support" + "github.com/alcionai/corso/internal/data" ctesting "github.com/alcionai/corso/internal/testing" "github.com/alcionai/corso/pkg/account" "github.com/alcionai/corso/pkg/credentials" @@ -88,7 +89,7 @@ func (suite *GraphConnectorIntegrationSuite) TestGraphConnector_restoreMessages( edc := NewExchangeDataCollection("tenant", []string{"tenantId", evs[user], mailCategory, "Inbox"}) edc.PopulateCollection(&ds) edc.FinishPopulation() - err = suite.connector.RestoreMessages(context.Background(), []DataCollection{&edc}) + err = suite.connector.RestoreMessages(context.Background(), []data.DataCollection{&edc}) assert.NoError(suite.T(), err) } @@ -172,7 +173,7 @@ func (suite *DisconnectedGraphConnectorSuite) TestBuild() { } func (suite *DisconnectedGraphConnectorSuite) TestInterfaceAlignment() { - var dc DataCollection + var dc data.DataCollection concrete := NewExchangeDataCollection("Check", []string{"interface", "works"}) dc = &concrete assert.NotNil(suite.T(), dc) diff --git a/src/internal/connector/mockconnector/mock_data_collection.go b/src/internal/connector/mockconnector/mock_data_collection.go index e90b57432..a7d1df15d 100644 --- a/src/internal/connector/mockconnector/mock_data_collection.go +++ b/src/internal/connector/mockconnector/mock_data_collection.go @@ -7,7 +7,7 @@ import ( "github.com/google/uuid" - "github.com/alcionai/corso/internal/connector" + "github.com/alcionai/corso/internal/data" "github.com/alcionai/corso/pkg/backup/details" ) @@ -20,9 +20,9 @@ type MockExchangeDataCollection struct { } var ( - _ connector.DataCollection = &MockExchangeDataCollection{} - _ connector.DataStream = &MockExchangeData{} - _ connector.DataStreamInfo = &MockExchangeData{} + _ data.DataCollection = &MockExchangeDataCollection{} + _ data.DataStream = &MockExchangeData{} + _ data.DataStreamInfo = &MockExchangeData{} ) // NewMockExchangeDataCollection creates an data collection that will return the specified number of @@ -49,8 +49,8 @@ func (medc *MockExchangeDataCollection) FullPath() []string { // Items returns a channel that has the next items in the collection. The // channel is closed when there are no more items available. -func (medc *MockExchangeDataCollection) Items() <-chan connector.DataStream { - res := make(chan connector.DataStream) +func (medc *MockExchangeDataCollection) Items() <-chan data.DataStream { + res := make(chan data.DataStream) go func() { defer close(res) diff --git a/src/internal/data/data_collection.go b/src/internal/data/data_collection.go new file mode 100644 index 000000000..403b5a09a --- /dev/null +++ b/src/internal/data/data_collection.go @@ -0,0 +1,37 @@ +package data + +import ( + "io" + + "github.com/alcionai/corso/pkg/backup/details" +) + +// A DataCollection represents a collection of data of the +// same type (e.g. mail) +type DataCollection interface { + // Items returns a channel from which items in the collection can be read. + // Each returned struct contains the next item in the collection + // The channel is closed when there are no more items in the collection or if + // an unrecoverable error caused an early termination in the sender. + Items() <-chan DataStream + // FullPath returns a slice of strings that act as metadata tags for this + // DataCollection. Returned items should be ordered from most generic to least + // generic. For example, a DataCollection for emails from a specific user + // would be {"", "", "emails"}. + FullPath() []string +} + +// DataStream represents a single item within a DataCollection +// that can be consumed as a stream (it embeds io.Reader) +type DataStream interface { + // ToReader returns an io.Reader for the DataStream + ToReader() io.ReadCloser + // UUID provides a unique identifier for this data + UUID() string +} + +// DataStreamInfo is used to provide service specific +// information about the DataStream +type DataStreamInfo interface { + Info() details.ItemInfo +} diff --git a/src/internal/data/data_collection_test.go b/src/internal/data/data_collection_test.go new file mode 100644 index 000000000..064223f3d --- /dev/null +++ b/src/internal/data/data_collection_test.go @@ -0,0 +1,15 @@ +package data + +import ( + "testing" + + "github.com/stretchr/testify/suite" +) + +type DataCollectionSuite struct { + suite.Suite +} + +func TestDataCollectionSuite(t *testing.T) { + suite.Run(t, new(DataCollectionSuite)) +} diff --git a/src/internal/kopia/data_collection.go b/src/internal/kopia/data_collection.go index d130cabcb..2bf48974e 100644 --- a/src/internal/kopia/data_collection.go +++ b/src/internal/kopia/data_collection.go @@ -3,19 +3,19 @@ package kopia import ( "io" - "github.com/alcionai/corso/internal/connector" + "github.com/alcionai/corso/internal/data" ) -var _ connector.DataCollection = &kopiaDataCollection{} -var _ connector.DataStream = &kopiaDataStream{} +var _ data.DataCollection = &kopiaDataCollection{} +var _ data.DataStream = &kopiaDataStream{} type kopiaDataCollection struct { path []string - streams []connector.DataStream + streams []data.DataStream } -func (kdc *kopiaDataCollection) Items() <-chan connector.DataStream { - res := make(chan connector.DataStream) +func (kdc *kopiaDataCollection) Items() <-chan data.DataStream { + res := make(chan data.DataStream) go func() { defer close(res) diff --git a/src/internal/kopia/data_collection_test.go b/src/internal/kopia/data_collection_test.go index 9701c9927..e067ccb71 100644 --- a/src/internal/kopia/data_collection_test.go +++ b/src/internal/kopia/data_collection_test.go @@ -10,7 +10,7 @@ import ( "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" - "github.com/alcionai/corso/internal/connector" + "github.com/alcionai/corso/internal/data" ) // --------------- @@ -30,7 +30,7 @@ func (suite *KopiaDataCollectionUnitSuite) TestReturnsPath() { path := []string{"some", "path", "for", "data"} c := kopiaDataCollection{ - streams: []connector.DataStream{}, + streams: []data.DataStream{}, path: path, } @@ -38,7 +38,7 @@ func (suite *KopiaDataCollectionUnitSuite) TestReturnsPath() { } func (suite *KopiaDataCollectionUnitSuite) TestReturnsStreams() { - data := [][]byte{ + testData := [][]byte{ []byte("abcdefghijklmnopqrstuvwxyz"), []byte("zyxwvutsrqponmlkjihgfedcba"), } @@ -50,26 +50,26 @@ func (suite *KopiaDataCollectionUnitSuite) TestReturnsStreams() { table := []struct { name string - streams []connector.DataStream + streams []data.DataStream }{ { name: "SingleStream", - streams: []connector.DataStream{ + streams: []data.DataStream{ &kopiaDataStream{ - reader: io.NopCloser(bytes.NewReader(data[0])), + reader: io.NopCloser(bytes.NewReader(testData[0])), uuid: uuids[0], }, }, }, { name: "MultipleStreams", - streams: []connector.DataStream{ + streams: []data.DataStream{ &kopiaDataStream{ - reader: io.NopCloser(bytes.NewReader(data[0])), + reader: io.NopCloser(bytes.NewReader(testData[0])), uuid: uuids[0], }, &kopiaDataStream{ - reader: io.NopCloser(bytes.NewReader(data[1])), + reader: io.NopCloser(bytes.NewReader(testData[1])), uuid: uuids[1], }, }, @@ -91,7 +91,7 @@ func (suite *KopiaDataCollectionUnitSuite) TestReturnsStreams() { buf, err := ioutil.ReadAll(returnedStream.ToReader()) require.NoError(t, err) - assert.Equal(t, buf, data[count]) + assert.Equal(t, buf, testData[count]) count++ } diff --git a/src/internal/kopia/wrapper.go b/src/internal/kopia/wrapper.go index a33eb148e..ae595ecbe 100644 --- a/src/internal/kopia/wrapper.go +++ b/src/internal/kopia/wrapper.go @@ -14,7 +14,7 @@ import ( "github.com/kopia/kopia/snapshot/snapshotfs" "github.com/pkg/errors" - "github.com/alcionai/corso/internal/connector" + "github.com/alcionai/corso/internal/data" "github.com/alcionai/corso/pkg/backup/details" "github.com/alcionai/corso/pkg/logger" ) @@ -80,7 +80,7 @@ func (w *Wrapper) Close(ctx context.Context) error { // kopia callbacks on directory entries. It binds the directory to the given // DataCollection. func getStreamItemFunc( - collection connector.DataCollection, + collection data.DataCollection, details *details.Details, ) func(context.Context, func(context.Context, fs.Entry) error) error { return func(ctx context.Context, cb func(context.Context, fs.Entry) error) error { @@ -93,7 +93,7 @@ func getStreamItemFunc( if !ok { return nil } - ei, ok := e.(connector.DataStreamInfo) + ei, ok := e.(data.DataStreamInfo) if !ok { return errors.New("item does not implement DataStreamInfo") } @@ -143,7 +143,7 @@ func buildKopiaDirs(dirName string, dir *treeMap, details *details.Details) (fs. type treeMap struct { childDirs map[string]*treeMap - collection connector.DataCollection + collection data.DataCollection } func newTreeMap() *treeMap { @@ -156,7 +156,7 @@ func newTreeMap() *treeMap { // ancestor of the streams and uses virtualfs.StaticDirectory for internal nodes // in the hierarchy. Leaf nodes are virtualfs.StreamingDirectory with the given // DataCollections. -func inflateDirTree(ctx context.Context, collections []connector.DataCollection, details *details.Details) (fs.Directory, error) { +func inflateDirTree(ctx context.Context, collections []data.DataCollection, details *details.Details) (fs.Directory, error) { roots := make(map[string]*treeMap) for _, s := range collections { @@ -228,7 +228,7 @@ func inflateDirTree(ctx context.Context, collections []connector.DataCollection, func (w Wrapper) BackupCollections( ctx context.Context, - collections []connector.DataCollection, + collections []data.DataCollection, ) (*BackupStats, *details.Details, error) { if w.c == nil { return nil, nil, errNotConnected @@ -332,7 +332,7 @@ func (w Wrapper) collectItems( snapshotID string, itemPath []string, isDirectory bool, -) ([]connector.DataCollection, error) { +) ([]data.DataCollection, error) { e, err := w.getEntry(ctx, snapshotID, itemPath) if err != nil { return nil, err @@ -362,7 +362,7 @@ func (w Wrapper) collectItems( return nil, err } - return []connector.DataCollection{c}, nil + return []data.DataCollection{c}, nil } // RestoreSingleItem looks up the item at the given path in the snapshot with id @@ -376,7 +376,7 @@ func (w Wrapper) RestoreSingleItem( ctx context.Context, snapshotID string, itemPath []string, -) (connector.DataCollection, error) { +) (data.DataCollection, error) { c, err := w.collectItems(ctx, snapshotID, itemPath, false) if err != nil { return nil, err @@ -396,14 +396,14 @@ func restoreSingleItem( ctx context.Context, f fs.File, itemPath []string, -) (connector.DataCollection, error) { +) (data.DataCollection, error) { r, err := f.Open(ctx) if err != nil { return nil, errors.Wrap(err, "opening file") } return &kopiaDataCollection{ - streams: []connector.DataStream{ + streams: []data.DataStream{ &kopiaDataStream{ uuid: f.Name(), reader: r, @@ -457,8 +457,8 @@ func restoreSubtree( ctx context.Context, dir fs.Directory, relativePath []string, -) ([]connector.DataCollection, *multierror.Error) { - collections := []connector.DataCollection{} +) ([]data.DataCollection, *multierror.Error) { + collections := []data.DataCollection{} // Want a local copy of relativePath with our new element. fullPath := append(append([]string{}, relativePath...), dir.Name()) var errs *multierror.Error @@ -475,7 +475,7 @@ func restoreSubtree( return nil, errs } - streams := make([]connector.DataStream, 0, len(files)) + streams := make([]data.DataStream, 0, len(files)) for _, f := range files { r, err := f.Open(ctx) @@ -524,7 +524,7 @@ func (w Wrapper) RestoreDirectory( ctx context.Context, snapshotID string, basePath []string, -) ([]connector.DataCollection, error) { +) ([]data.DataCollection, error) { return w.collectItems(ctx, snapshotID, basePath, true) } @@ -539,9 +539,9 @@ func (w Wrapper) RestoreMultipleItems( ctx context.Context, snapshotID string, paths [][]string, -) ([]connector.DataCollection, error) { +) ([]data.DataCollection, error) { var ( - dcs = []connector.DataCollection{} + dcs = []data.DataCollection{} errs *multierror.Error ) for _, path := range paths { diff --git a/src/internal/kopia/wrapper_test.go b/src/internal/kopia/wrapper_test.go index 501bcca81..cb6eeff88 100644 --- a/src/internal/kopia/wrapper_test.go +++ b/src/internal/kopia/wrapper_test.go @@ -16,8 +16,8 @@ import ( "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" - "github.com/alcionai/corso/internal/connector" "github.com/alcionai/corso/internal/connector/mockconnector" + "github.com/alcionai/corso/internal/data" "github.com/alcionai/corso/internal/kopia/mockkopia" ctesting "github.com/alcionai/corso/internal/testing" "github.com/alcionai/corso/pkg/backup/details" @@ -63,7 +63,7 @@ func entriesToNames(entries []fs.Entry) []string { func testForFiles( t *testing.T, expected map[string][]byte, - collections []connector.DataCollection, + collections []data.DataCollection, ) { count := 0 for _, c := range collections { @@ -119,7 +119,7 @@ func (suite *KopiaUnitSuite) TestBuildDirectoryTree() { details := &details.Details{} - collections := []connector.DataCollection{ + collections := []data.DataCollection{ mockconnector.NewMockExchangeDataCollection( []string{tenant, user1, emails}, expectedFileCount[user1], @@ -181,7 +181,7 @@ func (suite *KopiaUnitSuite) TestBuildDirectoryTree_NoAncestorDirs() { expectedFileCount := 42 details := &details.Details{} - collections := []connector.DataCollection{ + collections := []data.DataCollection{ mockconnector.NewMockExchangeDataCollection( []string{emails}, expectedFileCount, @@ -203,7 +203,7 @@ func (suite *KopiaUnitSuite) TestBuildDirectoryTree_NoAncestorDirs() { func (suite *KopiaUnitSuite) TestBuildDirectoryTree_Fails() { table := []struct { name string - layout []connector.DataCollection + layout []data.DataCollection }{ { "MultipleRoots", @@ -214,7 +214,7 @@ func (suite *KopiaUnitSuite) TestBuildDirectoryTree_Fails() { // - user2 // - emails // - 42 separate files - []connector.DataCollection{ + []data.DataCollection{ mockconnector.NewMockExchangeDataCollection( []string{"user1", "emails"}, 5, @@ -227,7 +227,7 @@ func (suite *KopiaUnitSuite) TestBuildDirectoryTree_Fails() { }, { "NoCollectionPath", - []connector.DataCollection{ + []data.DataCollection{ mockconnector.NewMockExchangeDataCollection( nil, 5, @@ -242,7 +242,7 @@ func (suite *KopiaUnitSuite) TestBuildDirectoryTree_Fails() { // - emails // - 5 separate files // - 42 separate files - []connector.DataCollection{ + []data.DataCollection{ mockconnector.NewMockExchangeDataCollection( []string{"a-tenant", "user1", "emails"}, 5, @@ -401,7 +401,7 @@ func (suite *KopiaIntegrationSuite) TearDownTest() { func (suite *KopiaIntegrationSuite) TestBackupCollections() { t := suite.T() - collections := []connector.DataCollection{ + collections := []data.DataCollection{ mockconnector.NewMockExchangeDataCollection( []string{"a-tenant", "user1", "emails"}, 5, @@ -456,10 +456,10 @@ func (suite *KopiaSimpleRepoIntegrationSuite) SetupTest() { suite.w = &Wrapper{c} - collections := []connector.DataCollection{ + collections := []data.DataCollection{ &kopiaDataCollection{ path: testPath, - streams: []connector.DataStream{ + streams: []data.DataStream{ &mockconnector.MockExchangeData{ ID: testFileName, Reader: io.NopCloser(bytes.NewReader(testFileData)), @@ -472,7 +472,7 @@ func (suite *KopiaSimpleRepoIntegrationSuite) SetupTest() { }, &kopiaDataCollection{ path: testPath2, - streams: []connector.DataStream{ + streams: []data.DataStream{ &mockconnector.MockExchangeData{ ID: testFileName3, Reader: io.NopCloser(bytes.NewReader(testFileData3)), @@ -688,7 +688,7 @@ func (suite *KopiaSimpleRepoIntegrationSuite) TestRestoreMultipleItems() { fp1 := append(p1, dc1.Names[0]) fp2 := append(p2, dc2.Names[0]) - stats, _, err := w.BackupCollections(ctx, []connector.DataCollection{dc1, dc2}) + stats, _, err := w.BackupCollections(ctx, []data.DataCollection{dc1, dc2}) require.NoError(t, err) expected := map[string][]byte{ diff --git a/src/internal/operations/backup.go b/src/internal/operations/backup.go index 9571acaf7..7646af269 100644 --- a/src/internal/operations/backup.go +++ b/src/internal/operations/backup.go @@ -8,6 +8,7 @@ import ( "github.com/alcionai/corso/internal/connector" "github.com/alcionai/corso/internal/connector/support" + "github.com/alcionai/corso/internal/data" "github.com/alcionai/corso/internal/kopia" "github.com/alcionai/corso/internal/model" "github.com/alcionai/corso/internal/stats" @@ -98,7 +99,7 @@ func (op *BackupOperation) Run(ctx context.Context) (err error) { return errors.Wrap(err, "connecting to graph api") } - var cs []connector.DataCollection + var cs []data.DataCollection cs, err = gc.ExchangeDataCollection(ctx, op.Selectors) if err != nil { stats.readErr = err diff --git a/src/internal/operations/restore.go b/src/internal/operations/restore.go index 1c4ed4e25..89ca47468 100644 --- a/src/internal/operations/restore.go +++ b/src/internal/operations/restore.go @@ -9,6 +9,7 @@ import ( "github.com/alcionai/corso/internal/connector" "github.com/alcionai/corso/internal/connector/support" + "github.com/alcionai/corso/internal/data" "github.com/alcionai/corso/internal/kopia" "github.com/alcionai/corso/internal/model" "github.com/alcionai/corso/internal/stats" @@ -68,7 +69,7 @@ func (op RestoreOperation) validate() error { // pointer wrapping the values, while those values // get populated asynchronously. type restoreStats struct { - cs []connector.DataCollection + cs []data.DataCollection gc *support.ConnectorOperationStatus readErr, writeErr error } diff --git a/src/internal/operations/restore_test.go b/src/internal/operations/restore_test.go index 7800834a5..e2e77b82c 100644 --- a/src/internal/operations/restore_test.go +++ b/src/internal/operations/restore_test.go @@ -12,6 +12,7 @@ import ( "github.com/alcionai/corso/internal/connector" "github.com/alcionai/corso/internal/connector/support" + "github.com/alcionai/corso/internal/data" "github.com/alcionai/corso/internal/kopia" ctesting "github.com/alcionai/corso/internal/testing" "github.com/alcionai/corso/pkg/account" @@ -45,7 +46,7 @@ func (suite *RestoreOpSuite) TestRestoreOperation_PersistResults() { stats = restoreStats{ readErr: multierror.Append(nil, assert.AnError), writeErr: assert.AnError, - cs: []connector.DataCollection{&connector.ExchangeDataCollection{}}, + cs: []data.DataCollection{&connector.ExchangeDataCollection{}}, gc: &support.ConnectorOperationStatus{ ObjectCount: 1, },