private async Task <ICollectionFacade> FindOrCreateCollectionAsync( ICosmosAccountFacade cosmosFacade, CollectionConfiguration targetCollection) { var dbs = await cosmosFacade.GetDatabasesAsync(); var db = dbs.Where(d => d.DatabaseName == targetCollection.Db).FirstOrDefault(); if (db == null) { throw new CosbakException($"Can't find database {targetCollection.Db}"); } else { var collections = await db.GetCollectionsAsync(); var collection = collections .Where(c => c.CollectionName == targetCollection.Collection) .FirstOrDefault(); if (collection == null) { throw new CosbakException($"Can't find collection {targetCollection.Collection}"); } else { return(collection); } } }
public BackupScheduler( ILogger logger, ICosmosAccountFacade cosmosFacade, IStorageFacade storageFacade, IImmutableList <CollectionBackupPlan> collectionPlans, TechnicalConstants technicalConstants) { _logger = logger; _cosmosFacade = cosmosFacade; _storageFacade = storageFacade; _collectionBackupPlans = collectionPlans; _technicalConstants = technicalConstants; }
private async static IAsyncEnumerable <CollectionPlan> GetCollectionPlansAsync( IImmutableList <CollectionBackupPlan> collectionBackupPlans, TechnicalConstants technicalConstants, ICosmosAccountFacade cosmosFacade, IStorageFacade storageFacade, ILogger logger) { var byDbs = collectionBackupPlans.GroupBy(p => p.Db).ToDictionary(g => g.Key); var dbs = await cosmosFacade.GetDatabasesAsync(); logger = logger.AddContext("Account", cosmosFacade.AccountName); foreach (var db in dbs) { if (byDbs.ContainsKey(db.DatabaseName)) { var byCollections = byDbs[db.DatabaseName].ToDictionary(c => c.Collection); var collections = await db.GetCollectionsAsync(); foreach (var coll in collections) { if (byCollections.ContainsKey(coll.CollectionName)) { var plan = byCollections[coll.CollectionName].SpecificPlan; var collectionLogger = logger .AddContext("Db", db.DatabaseName) .AddContext("Collection", coll.CollectionName); var logController = new LogCollectionBackupController( coll, storageFacade, plan.Rpo, plan.Included, technicalConstants.LogConstants, collectionLogger); yield return(new CollectionPlan( logController, coll, () => new IndexCollectionController( coll.Parent.Parent.AccountName, coll.Parent.DatabaseName, coll.CollectionName, storageFacade, plan.RetentionInDays, technicalConstants.IndexConstants, collectionLogger), plan)); } } } } }