Example #1
0
        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);
                }
            }
        }
Example #2
0
 public BackupScheduler(
     ILogger logger,
     ICosmosAccountFacade cosmosFacade,
     IStorageFacade storageFacade,
     IImmutableList <CollectionBackupPlan> collectionPlans,
     TechnicalConstants technicalConstants)
 {
     _logger                = logger;
     _cosmosFacade          = cosmosFacade;
     _storageFacade         = storageFacade;
     _collectionBackupPlans = collectionPlans;
     _technicalConstants    = technicalConstants;
 }
Example #3
0
        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));
                        }
                    }
                }
            }
        }