public void Ctor_SetsTheDefaultOptions()
        {
            CosmosStorageOptions storageOptions = new CosmosStorageOptions();

            Assert.Equal("hangfire", storageOptions.Prefix);
            Assert.Null(storageOptions.InvisibilityTimeout);
        }
Esempio n. 2
0
 // This method gets called by the runtime. Use this method to add services to the container.
 public void ConfigureServices(IServiceCollection services)
 {
     // Add framework services.
     services.AddHangfire(config =>
     {
         var connectionString = "put-your-connectionsString-here";
         var mongoUrlBuilder  = new MongoUrlBuilder(connectionString)
         {
             DatabaseName = "jobs"
         };
         var mongoClient = new MongoClient(mongoUrlBuilder.ToMongoUrl());
         var opt         = new CosmosStorageOptions
         {
             MigrationOptions = new MongoMigrationOptions
             {
                 BackupStrategy    = new NoneMongoBackupStrategy(),
                 MigrationStrategy = new DropMongoMigrationStrategy(),
             }
         };
         //config.UseLogProvider(new FileLogProvider());
         config.UseColouredConsoleLogProvider(LogLevel.Info);
         config.UseCosmosStorage(mongoClient, mongoUrlBuilder.DatabaseName, opt);
     });
     services.AddMvc(c => c.EnableEndpointRouting = false);
 }
 public CosmosConfigurationSource(CosmosStorageOptions options, SaveConfigurationOptions saveConfig,
                                  IConfiguration configSeed = null)
 {
     SaveConfig = saveConfig;
     Options    = options;
     ConfigSeed = configSeed;
 }
        public void Ctor_SetsTheDefaultOptions_ShouldGenerateUniqueClientId()
        {
            var storageOptions1 = new CosmosStorageOptions();
            var storageOptions2 = new CosmosStorageOptions();
            var storageOptions3 = new CosmosStorageOptions();

            IEnumerable <string> result = new[] { storageOptions1.ClientId, storageOptions2.ClientId, storageOptions3.ClientId }.Distinct();

            Assert.Equal(3, result.Count());
        }
Esempio n. 5
0
        private static void DefaultStorageOptions(string connectionString, CosmosStorageOptions o)
        {
            var connectionStringBuilder = new CosmosConnectionStringBuilder(connectionString);

            o.AccountKey ??= connectionStringBuilder.AccountKey;
            o.AccountEndpoint ??= connectionStringBuilder.AccountEndpoint;
            o.DatabaseId ??= connectionStringBuilder.Database;
            o.ContainerId ??= connectionStringBuilder.DefaultContainer ?? Constants.Options.DefaultContainer;

            o.SharedCollection  = false;
            o.PartitionKeyPaths = connectionStringBuilder.PartitionKeyPaths ?? new[] { "/id" };
        }
Esempio n. 6
0
        private static void DefaultDbOptions(string connectionString, CosmosStorageOptions o)
        {
            var connectionStringBuilder = new CosmosConnectionStringBuilder(connectionString);

            o.AccountKey      = connectionStringBuilder.AccountKey;
            o.AccountEndpoint = connectionStringBuilder.AccountEndpoint;
            o.ContainerId     = connectionStringBuilder.DefaultContainer ?? "BackgroundTasks";
            o.DatabaseId      = connectionStringBuilder.Database ?? "Default";

            o.SharedCollection  = true;            // Sequence, Document, etc.
            o.PartitionKeyPaths = new[] { "/id" };
        }
Esempio n. 7
0
        public static IConfigurationBuilder AddCosmosConfigurationProvider(this IConfigurationBuilder builder,
                                                                           Action <CosmosStorageOptions> configureDatabase,
                                                                           Action <SaveConfigurationOptions> configureOptions = null,
                                                                           bool reloadOnChange = false, IConfiguration configSeed = null)
        {
            var dbConfig = new CosmosStorageOptions();

            configureDatabase?.Invoke(dbConfig);

            var saveConfig = new SaveConfigurationOptions();

            configureOptions?.Invoke(saveConfig);

            var source = new CosmosConfigurationSource(dbConfig, saveConfig, configSeed)
            {
                ReloadOnChange = reloadOnChange
            };

            builder.Add(source);
            return(builder);
        }
Esempio n. 8
0
        public static BackgroundTaskBuilder AddCosmosBackgroundTasksStore(this BackgroundTaskBuilder builder,
                                                                          Action <CosmosStorageOptions> configureAction = null)
        {
            const string slot = Constants.ConnectionSlots.BackgroundTasks;

            if (configureAction != null)
            {
                builder.Services.Configure(slot, configureAction);
            }

            var dbOptions = new CosmosStorageOptions();

            configureAction?.Invoke(dbOptions);

            var container = MigrateToLatest(slot, new OptionsMonitorShim <CosmosStorageOptions>(dbOptions));

            builder.Services.AddSafeLogging();
            builder.Services.AddSingleton(r => new CosmosRepository(slot, container, r.GetRequiredService <IOptionsMonitor <CosmosStorageOptions> >(), r.GetService <ISafeLogger <CosmosRepository> >()));
            builder.Services.Replace(ServiceDescriptor.Singleton <IBackgroundTaskStore, CosmosBackgroundTaskStore>());

            return(builder);
        }
        public void Set_CosmosHourlyTtl_SetsTheValue()
        {
            var storageOptions = new CosmosStorageOptions(10);

            Assert.Equal(10, storageOptions.CosmosHourlyTtl);
        }
        public void Ctor_SetsTheDefaultOptions_ShouldGenerateClientId()
        {
            var storageOptions = new CosmosStorageOptions();

            Assert.False(String.IsNullOrWhiteSpace(storageOptions.ClientId));
        }
        public static Container MigrateToLatest(string slot, CosmosStorageOptions options,
                                                IConfiguration configSeed = null, SeedStrategy strategy = SeedStrategy.InsertIfNotExists)
        {
            var optionsMonitor = new OptionsMonitorShim <CosmosStorageOptions>(options);

            var runner = new CosmosMigrationRunner(slot, optionsMonitor);

            var container = runner.CreateContainerIfNotExistsAsync().GetAwaiter().GetResult();

            if (configSeed != null && strategy != SeedStrategy.None)
            {
                var repository = new CosmosRepository(slot, container, optionsMonitor, null);

                switch (strategy)
                {
                case SeedStrategy.InsertIfNotExists:
                {
                    InsertIfNotExists(repository);
                    break;
                }

                case SeedStrategy.Initialize:
                {
                    var count = repository.CountAsync <ConfigurationDocument>().GetAwaiter().GetResult();
                    if (count == 0)
                    {
                        InsertIfNotExists(repository);
                    }

                    break;
                }

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }

            void InsertIfNotExists(ICosmosRepository repository)
            {
                var manifest = repository.RetrieveAsync <ConfigurationDocument>()
                               .GetAwaiter().GetResult().Select(x => x.Key).ToImmutableHashSet();

                var changedKeys = new HashSet <string>();

                foreach (var(k, v) in configSeed.AsEnumerable())
                {
                    if (manifest.Contains(k))
                    {
                        continue;
                    }

                    repository.CreateAsync(new ConfigurationDocument {
                        Key = k, Value = v
                    })
                    .GetAwaiter().GetResult();

                    changedKeys.Add(k);
                }

                Trace.TraceInformation(changedKeys.Count > 0
                                        ? $"Configuration updated the following keys: {string.Join(",", changedKeys)}"
                                        : "Configuration is up to date.");
            }

            return(container);
        }