Esempio n. 1
0
        public async Task ToggleDisableServerWideExternalReplicationFails()
        {
            using (var store = GetDocumentStore())
            {
                var putConfiguration = new ServerWideExternalReplication
                {
                    Disabled = true,
                    TopologyDiscoveryUrls = new[] { store.Urls.First() }
                };

                await store.Maintenance.Server.SendAsync(new PutServerWideExternalReplicationOperation(putConfiguration));

                var databaseRecord = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(store.Database));

                var externalReplicationFromDatabaseRecord = databaseRecord.ExternalReplications.First();
                var taskId   = externalReplicationFromDatabaseRecord.TaskId;
                var taskName = externalReplicationFromDatabaseRecord.Name;

                var e = await Assert.ThrowsAsync <RavenException>(() => store.Maintenance.SendAsync(new ToggleOngoingTaskStateOperation(taskId, OngoingTaskType.Replication, false)));

                Assert.Contains($"Can't enable task name '{taskName}', because it is a server-wide external replication task", e.Message);

                e = await Assert.ThrowsAsync <RavenException>(() => store.Maintenance.SendAsync(new ToggleOngoingTaskStateOperation(taskId, OngoingTaskType.Replication, true)));

                Assert.Contains($"Can't disable task name '{taskName}', because it is a server-wide external replication task", e.Message);
            }
        }
Esempio n. 2
0
 private static void ValidateServerWideConfiguration(ServerWideExternalReplication serverWideConfiguration, ServerWideExternalReplication putConfiguration)
 {
     Assert.Equal(serverWideConfiguration.Name, putConfiguration.Name ?? putConfiguration.GetDefaultTaskName());
     Assert.Equal(serverWideConfiguration.Disabled, putConfiguration.Disabled);
     Assert.Equal(serverWideConfiguration.MentorNode, putConfiguration.MentorNode);
     Assert.Equal(serverWideConfiguration.DelayReplicationFor, putConfiguration.DelayReplicationFor);
     Assert.True(putConfiguration.TopologyDiscoveryUrls.SequenceEqual(serverWideConfiguration.TopologyDiscoveryUrls));
 }
Esempio n. 3
0
        public async Task CanStoreServerWideExternalReplication()
        {
            using (var store = GetDocumentStore())
            {
                var putConfiguration = new ServerWideExternalReplication
                {
                    Disabled = true,
                    TopologyDiscoveryUrls = new[] { store.Urls.First() },
                    DelayReplicationFor   = TimeSpan.FromMinutes(3),
                    MentorNode            = "A"
                };

                var result = await store.Maintenance.Server.SendAsync(new PutServerWideExternalReplicationOperation(putConfiguration));

                var serverWideConfiguration = await store.Maintenance.Server.SendAsync(new GetServerWideExternalReplicationOperation(result.Name));

                Assert.NotNull(serverWideConfiguration);

                ValidateServerWideConfiguration(serverWideConfiguration, putConfiguration);

                // the configuration is applied to existing databases
                var record1 = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(store.Database));

                var externalReplications1 = record1.ExternalReplications;
                Assert.Equal(1, externalReplications1.Count);
                ValidateConfiguration(serverWideConfiguration, externalReplications1.First(), store.Database);

                // the configuration is applied to new databases
                var newDbName = store.Database + "-testDatabase";
                await store.Maintenance.Server.SendAsync(new CreateDatabaseOperation(new DatabaseRecord(newDbName)));

                var externalReplications = record1.ExternalReplications;
                Assert.Equal(1, externalReplications.Count);
                var record2 = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(newDbName));

                ValidateConfiguration(serverWideConfiguration, record2.ExternalReplications.First(), newDbName);

                // update the external replication configuration
                putConfiguration.TopologyDiscoveryUrls = new[] { store.Urls.First(), "http://localhost:8080" };
                putConfiguration.Name = serverWideConfiguration.Name;

                result = await store.Maintenance.Server.SendAsync(new PutServerWideExternalReplicationOperation(putConfiguration));

                serverWideConfiguration = await store.Maintenance.Server.SendAsync(new GetServerWideExternalReplicationOperation(result.Name));

                ValidateServerWideConfiguration(serverWideConfiguration, putConfiguration);

                record1 = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(store.Database));

                Assert.Equal(1, record1.ExternalReplications.Count);
                ValidateConfiguration(serverWideConfiguration, record1.ExternalReplications.First(), store.Database);

                record2 = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(newDbName));

                Assert.Equal(1, record2.ExternalReplications.Count);
                ValidateConfiguration(serverWideConfiguration, record2.ExternalReplications.First(), newDbName);
            }
        }
Esempio n. 4
0
 private static void ValidateConfiguration(ServerWideExternalReplication serverWideConfiguration, ExternalReplication externalReplication, string databaseName)
 {
     Assert.Equal(PutServerWideExternalReplicationCommand.GetTaskName(serverWideConfiguration.Name), externalReplication.Name);
     Assert.Equal(serverWideConfiguration.Disabled, externalReplication.Disabled);
     Assert.Equal(serverWideConfiguration.MentorNode, externalReplication.MentorNode);
     Assert.Equal(serverWideConfiguration.DelayReplicationFor, externalReplication.DelayReplicationFor);
     Assert.Equal(databaseName, externalReplication.Database);
     Assert.Equal(PutServerWideExternalReplicationCommand.GetRavenConnectionStringName(serverWideConfiguration.Name), externalReplication.ConnectionStringName);
 }
Esempio n. 5
0
        public async Task CanExcludeDatabase()
        {
            using (var store = GetDocumentStore())
            {
                var serverWideExternalReplication = new ServerWideExternalReplication
                {
                    Disabled = true,
                    TopologyDiscoveryUrls = new[] { store.Urls.First() }
                };

                var result = await store.Maintenance.Server.SendAsync(new PutServerWideExternalReplicationOperation(serverWideExternalReplication));

                serverWideExternalReplication.Name = result.Name;

                var record = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(store.Database));

                Assert.Equal(1, record.ExternalReplications.Count);
                Assert.Equal(1, record.RavenConnectionStrings.Count);

                var dbName = $"db/{Guid.NewGuid()}";
                var csName = $"cs/{Guid.NewGuid()}";

                var connectionString = new RavenConnectionString
                {
                    Name     = csName,
                    Database = dbName,
                    TopologyDiscoveryUrls = new[] { "http://127.0.0.1:12345" }
                };

                var putConnectionStringResult = await store.Maintenance.SendAsync(new PutConnectionStringOperation <RavenConnectionString>(connectionString));

                Assert.NotNull(putConnectionStringResult.RaftCommandIndex);

                var externalReplication = new ExternalReplication(dbName, csName)
                {
                    Name     = "Regular Task",
                    Disabled = true
                };
                await store.Maintenance.SendAsync(new UpdateExternalReplicationOperation(externalReplication));

                record = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(store.Database));

                Assert.Equal(2, record.ExternalReplications.Count);
                Assert.Equal(2, record.RavenConnectionStrings.Count);

                serverWideExternalReplication.ExcludedDatabases = new[] { store.Database };
                await store.Maintenance.Server.SendAsync(new PutServerWideExternalReplicationOperation(serverWideExternalReplication));

                record = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(store.Database));

                Assert.Equal(1, record.ExternalReplications.Count);
                Assert.Equal(1, record.RavenConnectionStrings.Count);
                Assert.Equal(externalReplication.Name, record.ExternalReplications.First().Name);
            }
        }
Esempio n. 6
0
        public async Task CanCreateMoreThanOneServerWideExternalReplication()
        {
            using (var store = GetDocumentStore())
            {
                var putConfiguration = new ServerWideExternalReplication
                {
                    Disabled = true,
                    TopologyDiscoveryUrls = new[] { store.Urls.First() }
                };

                await store.Maintenance.Server.SendAsync(new PutServerWideExternalReplicationOperation(putConfiguration));

                await store.Maintenance.Server.SendAsync(new PutServerWideExternalReplicationOperation(putConfiguration));

                await store.Maintenance.Server.SendAsync(new PutServerWideExternalReplicationOperation(putConfiguration));

                var externalReplications = await store.Maintenance.Server.SendAsync(new GetServerWideExternalReplicationsOperation());

                Assert.Equal(3, externalReplications.Length);

                var databaseRecord = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(store.Database));

                Assert.Equal(3, databaseRecord.ExternalReplications.Count);

                var toUpdate = externalReplications[1];
                toUpdate.ExcludedDatabases = new[] { "ExcludedDatabase" };
                await store.Maintenance.Server.SendAsync(new PutServerWideExternalReplicationOperation(toUpdate));

                externalReplications = await store.Maintenance.Server.SendAsync(new GetServerWideExternalReplicationsOperation());

                Assert.Equal(3, externalReplications.Length);
                databaseRecord = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(store.Database));

                Assert.Equal(3, databaseRecord.ExternalReplications.Count);

                // new database includes all server-wide external replications
                var newDbName = store.Database + "-testDatabase";
                await store.Maintenance.Server.SendAsync(new CreateDatabaseOperation(new DatabaseRecord(newDbName)));

                databaseRecord = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(newDbName));

                Assert.Equal(3, databaseRecord.ExternalReplications.Count);
            }
        }
Esempio n. 7
0
        public async Task ServerWideExternalReplication_WhenRename_ShouldNotCreateNewOne()
        {
            using var store = GetDocumentStore();
            var putConfiguration = new ServerWideExternalReplication
            {
                Disabled = true,
                TopologyDiscoveryUrls = new[] { store.Urls.First() },
                Name = store.Database
            };

            var result = await store.Maintenance.Server.SendAsync(new PutServerWideExternalReplicationOperation(putConfiguration));

            var externalReplications = await store.Maintenance.Server.SendAsync(new GetServerWideExternalReplicationsOperation());

            var databaseRecord = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(store.Database));

            RavenTestHelper.AssertAll(
                () => Assert.Equal(1, externalReplications.Length),
                () => Assert.Equal(1, databaseRecord.ExternalReplications.Count));

            // Changing name
            var          toEdit     = externalReplications.First();
            const string editSuffix = "Edited";

            toEdit.Name += editSuffix;
            var resultAfter = await store.Maintenance.Server.SendAsync(new PutServerWideExternalReplicationOperation(externalReplications.First()));

            var externalReplicationsAfter = await store.Maintenance.Server.SendAsync(new GetServerWideExternalReplicationsOperation());

            var databaseRecordAfter = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(store.Database));

            RavenTestHelper.AssertAll(
                () => Assert.Equal(1, externalReplicationsAfter.Length),
                () => Assert.Equal(1, databaseRecordAfter.ExternalReplications.Count),
                () => Assert.EndsWith(editSuffix, databaseRecordAfter.ExternalReplications.First().Name));

            using var store2 = GetDocumentStore();
            var databaseRecord2After = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(store2.Database));

            RavenTestHelper.AssertAll(
                () => Assert.Equal(1, databaseRecord2After.ExternalReplications.Count),
                () => Assert.EndsWith(editSuffix, databaseRecord2After.ExternalReplications.First().Name));
        }
Esempio n. 8
0
        public async Task FailToAddNullOrEmptyDatabaseNames()
        {
            using (var store = GetDocumentStore())
            {
                var serverWideExternalReplication = new ServerWideExternalReplication
                {
                    Disabled = true,
                    TopologyDiscoveryUrls = new[]
                    {
                        store.Urls.First()
                    },
                    ExcludedDatabases = new[]
                    {
                        null,
                        "test"
                    }
                };

                await SaveAndAssertError();

                serverWideExternalReplication.ExcludedDatabases = new[]
                {
                    string.Empty
                };

                await SaveAndAssertError();

                serverWideExternalReplication.ExcludedDatabases = new[]
                {
                    " "
                };

                await SaveAndAssertError();

                async Task SaveAndAssertError()
                {
                    var error = await Assert.ThrowsAsync <RavenException>(async() => await store.Maintenance.Server.SendAsync(new PutServerWideExternalReplicationOperation(serverWideExternalReplication)));

                    Assert.Contains($"{nameof(ServerWideExternalReplication.ExcludedDatabases)} cannot contain null or empty database names", error.Message);
                }
            }
        }
Esempio n. 9
0
        public async Task UpdateServerWideReplicationThroughUpdateReplicationTaskFails()
        {
            using (var store = GetDocumentStore())
            {
                var putConfiguration = new ServerWideExternalReplication
                {
                    Disabled = true,
                    TopologyDiscoveryUrls = new[] { store.Urls.First() },
                    Name = store.Database
                };

                await store.Maintenance.Server.SendAsync(new PutServerWideExternalReplicationOperation(putConfiguration));

                var databaseRecord = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(store.Database));

                var externalReplicationFromDatabaseRecord = databaseRecord.ExternalReplications.First();
                var taskId = externalReplicationFromDatabaseRecord.TaskId;

                var externalReplication = new ExternalReplication
                {
                    Disabled             = true,
                    TaskId               = externalReplicationFromDatabaseRecord.TaskId,
                    Name                 = externalReplicationFromDatabaseRecord.Name,
                    ConnectionStringName = externalReplicationFromDatabaseRecord.ConnectionStringName
                };

                var e = await Assert.ThrowsAsync <RavenException>(() => store.Maintenance.SendAsync(new UpdateExternalReplicationOperation(externalReplication)));

                Assert.Contains("A regular (non server-wide) external replication name can't start with prefix 'Server Wide External Replication'", e.Message);

                e = await Assert.ThrowsAsync <RavenException>(() => store.Maintenance.SendAsync(new DeleteOngoingTaskOperation(taskId, OngoingTaskType.Replication)));

                var expectedError = $"Can't delete task id: {taskId}, name: '{externalReplicationFromDatabaseRecord.Name}', because it is a server-wide external replication task";
                Assert.Contains(expectedError, e.Message);

                var recordConnectionString = databaseRecord.RavenConnectionStrings.First().Value;
                e = await Assert.ThrowsAsync <RavenException>(() => store.Maintenance.SendAsync(new PutConnectionStringOperation <RavenConnectionString>(recordConnectionString)));

                Assert.Contains("connection string name can't start with prefix 'Server Wide Raven Connection String'", e.Message);
            }
        }
Esempio n. 10
0
        public async Task ServerWideExternalReplication_WhenToggleState_ShouldWork()
        {
            using var store = GetDocumentStore();
            var disabled         = true;
            var putConfiguration = new ServerWideExternalReplication
            {
                Disabled = disabled,
                TopologyDiscoveryUrls = new[] { store.Urls.First() },
                Name = store.Database
            };

            var result = await store.Maintenance.Server.SendAsync(new PutServerWideExternalReplicationOperation(putConfiguration));

            await AssertDisabled(disabled);

            disabled = !disabled;
            await store.Maintenance.Server.SendAsync(new ToggleServerWideTaskStateOperation(result.Name, OngoingTaskType.Replication, disabled));

            await AssertDisabled(disabled);

            disabled = !disabled;
            await store.Maintenance.Server.SendAsync(new ToggleServerWideTaskStateOperation(result.Name, OngoingTaskType.Replication, disabled));

            await AssertDisabled(disabled);

            async Task AssertDisabled(bool shouldBeDisabled)
            {
                var externalReplications = await store.Maintenance.Server.SendAsync(new GetServerWideExternalReplicationsOperation());

                var databaseRecord = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(store.Database));

                var assert = shouldBeDisabled ? (Action <bool>)Assert.True : Assert.False;

                RavenTestHelper.AssertAll(
                    () => assert(externalReplications.First().Disabled),
                    () => assert(databaseRecord.ExternalReplications.First().Disabled));
            }
        }
Esempio n. 11
0
        public async Task CanExcludeForNewDatabase()
        {
            using (var store = GetDocumentStore())
            {
                var newDbName = store.Database + "-testDatabase";
                var serverWideExternalReplication = new ServerWideExternalReplication
                {
                    Disabled = true,
                    TopologyDiscoveryUrls = new[]
                    {
                        store.Urls.First()
                    },
                    ExcludedDatabases = new []
                    {
                        newDbName
                    }
                };

                var result = await store.Maintenance.Server.SendAsync(new PutServerWideExternalReplicationOperation(serverWideExternalReplication));

                serverWideExternalReplication.Name = result.Name;
                await store.Maintenance.Server.SendAsync(new CreateDatabaseOperation(new DatabaseRecord(newDbName)));

                var record = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(newDbName));

                Assert.Equal(0, record.ExternalReplications.Count);

                var dbName = $"db/{Guid.NewGuid()}";
                var csName = $"cs/{Guid.NewGuid()}";

                var connectionString = new RavenConnectionString
                {
                    Name     = csName,
                    Database = dbName,
                    TopologyDiscoveryUrls = new[] { "http://127.0.0.1:12345" }
                };

                var putConnectionStringResult = await store.Maintenance.ForDatabase(newDbName).SendAsync(new PutConnectionStringOperation <RavenConnectionString>(connectionString));

                Assert.NotNull(putConnectionStringResult.RaftCommandIndex);

                var externalReplication = new ExternalReplication(dbName, csName)
                {
                    Name     = "Regular Task",
                    Disabled = true
                };
                await store.Maintenance.ForDatabase(newDbName).SendAsync(new UpdateExternalReplicationOperation(externalReplication));

                record = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(store.Database));

                Assert.Equal(1, record.ExternalReplications.Count);
                Assert.Equal(1, record.RavenConnectionStrings.Count);

                serverWideExternalReplication.ExcludedDatabases = new[] { store.Database };
                await store.Maintenance.Server.SendAsync(new PutServerWideExternalReplicationOperation(serverWideExternalReplication));

                record = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(store.Database));

                Assert.Equal(0, record.ExternalReplications.Count);
                Assert.Equal(0, record.RavenConnectionStrings.Count);

                record = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(newDbName));

                Assert.Equal(2, record.ExternalReplications.Count);
                Assert.Equal(2, record.RavenConnectionStrings.Count);
                Assert.Equal(externalReplication.Name, record.ExternalReplications[0].Name);
                Assert.Equal(PutServerWideExternalReplicationCommand.GetTaskName(serverWideExternalReplication.Name), record.ExternalReplications[1].Name);

                serverWideExternalReplication.ExcludedDatabases = null;
                await store.Maintenance.Server.SendAsync(new PutServerWideExternalReplicationOperation(serverWideExternalReplication));

                using (Server.ServerStore.ContextPool.AllocateOperationContext(out TransactionOperationContext context))
                    using (context.OpenReadTransaction())
                    {
                        var tasks = Server.ServerStore.Cluster.GetServerWideConfigurations(context, OngoingTaskType.Replication, serverWideExternalReplication.Name).ToList();
                        Assert.Equal(1, tasks.Count);

                        tasks[0].TryGet(nameof(ServerWideExternalReplication.ExcludedDatabases), out BlittableJsonReaderArray excludedDatabases);
                        Assert.NotNull(excludedDatabases);
                        Assert.Equal(0, excludedDatabases.Length);
                    }

                var newDbName2 = store.Database + "-testDatabase2";
                await store.Maintenance.Server.SendAsync(new CreateDatabaseOperation(new DatabaseRecord(newDbName2)));

                record = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(newDbName));

                Assert.Equal(2, record.ExternalReplications.Count);
                Assert.Equal(2, record.RavenConnectionStrings.Count);

                record = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(newDbName2));

                Assert.Equal(1, record.ExternalReplications.Count);
                Assert.Equal(1, record.RavenConnectionStrings.Count);
            }
        }
Esempio n. 12
0
        public async Task SkipExportingTheServerWideExternalReplication2()
        {
            var backupPath = NewDataPath(suffix: "BackupFolder");

            using (var store = GetDocumentStore())
            {
                var putConfiguration1 = new ServerWideExternalReplication
                {
                    Name     = "1",
                    Disabled = true,
                    TopologyDiscoveryUrls = new[] { store.Urls.First() }
                };

                var putConfiguration2 = new ServerWideExternalReplication
                {
                    Name     = "2",
                    Disabled = true,
                    TopologyDiscoveryUrls = new[] { store.Urls.First() }
                };

                await store.Maintenance.Server.SendAsync(new PutServerWideExternalReplicationOperation(putConfiguration1));

                await store.Maintenance.Server.SendAsync(new PutServerWideExternalReplicationOperation(putConfiguration2));

                var dbName = $"db/{Guid.NewGuid()}";
                var csName = $"cs/{Guid.NewGuid()}";

                var connectionString = new RavenConnectionString
                {
                    Name     = csName,
                    Database = dbName,
                    TopologyDiscoveryUrls = new[] { "http://127.0.0.1:12345" }
                };

                var result = await store.Maintenance.SendAsync(new PutConnectionStringOperation <RavenConnectionString>(connectionString));

                Assert.NotNull(result.RaftCommandIndex);

                await store.Maintenance.SendAsync(new UpdateExternalReplicationOperation(new ExternalReplication(dbName, csName)
                {
                    Disabled = true
                }));

                var databaseRecord = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(store.Database));

                Assert.Equal(3, databaseRecord.ExternalReplications.Count);

                var serverWideBackupConfiguration = new ServerWideBackupConfiguration
                {
                    Disabled                   = false,
                    FullBackupFrequency        = "0 2 * * 0",
                    IncrementalBackupFrequency = "0 2 * * 1",
                    LocalSettings              = new LocalSettings
                    {
                        FolderPath = backupPath
                    }
                };

                await store.Maintenance.Server.SendAsync(new PutServerWideBackupConfigurationOperation(serverWideBackupConfiguration));

                var record = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(store.Database));

                var backup       = record.PeriodicBackups.First();
                var backupTaskId = backup.TaskId;

                await store.Maintenance.SendAsync(new StartBackupOperation(true, backupTaskId));

                string backupDirectory = null;
                var    value           = WaitForValue(() =>
                {
                    var status      = store.Maintenance.Send(new GetPeriodicBackupStatusOperation(backupTaskId)).Status;
                    backupDirectory = status?.LocalBackup.BackupDirectory;
                    return(status?.LastEtag);
                }, 0);

                Assert.Equal(0, value);

                var files = Directory.GetFiles(backupDirectory)
                            .Where(BackupUtils.IsBackupFile)
                            .OrderBackups()
                            .ToArray();

                var databaseName  = GetDatabaseName() + "restore";
                var restoreConfig = new RestoreBackupConfiguration
                {
                    BackupLocation        = backupDirectory,
                    DatabaseName          = databaseName,
                    LastFileNameToRestore = files.OrderBackups().Last()
                };

                var restoreOperation = new RestoreBackupOperation(restoreConfig);
                store.Maintenance.Server.Send(restoreOperation)
                .WaitForCompletion(TimeSpan.FromSeconds(30));

                // new server should have only 0 external replications
                var server = GetNewServer();

                using (Databases.EnsureDatabaseDeletion(databaseName, store))
                    using (var store2 = GetDocumentStore(new Options
                    {
                        CreateDatabase = false,
                        ModifyDatabaseName = s => databaseName,
                        Server = server
                    }))
                    {
                        store2.Maintenance.Server.Send(restoreOperation)
                        .WaitForCompletion(TimeSpan.FromSeconds(30));

                        var record2 = await store2.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(databaseName));

                        Assert.Equal(1, record2.ExternalReplications.Count);
                    }
            }
        }
Esempio n. 13
0
        public async Task CanDeleteServerWideExternalReplication()
        {
            using (var store = GetDocumentStore())
            {
                var putConfiguration = new ServerWideExternalReplication
                {
                    Disabled = true,
                    TopologyDiscoveryUrls = new[] { store.Urls.First() }
                };

                var result1 = await store.Maintenance.Server.SendAsync(new PutServerWideExternalReplicationOperation(putConfiguration));

                var result2 = await store.Maintenance.Server.SendAsync(new PutServerWideExternalReplicationOperation(putConfiguration));

                var record1 = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(store.Database));

                Assert.Equal(2, record1.ExternalReplications.Count);
                Assert.Equal(2, record1.RavenConnectionStrings.Count);
                var serverWideExternalReplications = await store.Maintenance.Server.SendAsync(new GetServerWideExternalReplicationsOperation());

                Assert.Equal(2, serverWideExternalReplications.Length);

                // the configuration is applied to new databases
                var newDbName = store.Database + "-testDatabase";
                await store.Maintenance.Server.SendAsync(new CreateDatabaseOperation(new DatabaseRecord(newDbName)));

                var record2 = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(newDbName));

                Assert.Equal(2, record2.ExternalReplications.Count);
                Assert.Equal(2, record2.RavenConnectionStrings.Count);

                await store.Maintenance.Server.SendAsync(new DeleteServerWideTaskOperation(result1.Name, OngoingTaskType.Replication));

                var serverWideExternalReplication = await store.Maintenance.Server.SendAsync(new GetServerWideExternalReplicationOperation(result1.Name));

                Assert.Null(serverWideExternalReplication);
                serverWideExternalReplications = await store.Maintenance.Server.SendAsync(new GetServerWideExternalReplicationsOperation());

                Assert.Equal(1, serverWideExternalReplications.Length);

                // verify that the server-wide external replication was deleted from all databases
                record1 = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(store.Database));

                Assert.Equal(1, record1.ExternalReplications.Count);
                Assert.Equal(1, record1.RavenConnectionStrings.Count);
                Assert.Equal($"{ServerWideExternalReplication.NamePrefix}, {putConfiguration.GetDefaultTaskName()} #2", record1.ExternalReplications.First().Name);
                record2 = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(newDbName));

                Assert.Equal(1, record2.ExternalReplications.Count);
                Assert.Equal(1, record2.RavenConnectionStrings.Count);
                Assert.Equal($"{ServerWideExternalReplication.NamePrefix}, {putConfiguration.GetDefaultTaskName()} #2", record2.ExternalReplications.First().Name);

                await store.Maintenance.Server.SendAsync(new DeleteServerWideTaskOperation(result2.Name, OngoingTaskType.Replication));

                serverWideExternalReplication = await store.Maintenance.Server.SendAsync(new GetServerWideExternalReplicationOperation(result2.Name));

                Assert.Null(serverWideExternalReplication);
                serverWideExternalReplications = await store.Maintenance.Server.SendAsync(new GetServerWideExternalReplicationsOperation());

                Assert.Equal(0, serverWideExternalReplications.Length);

                record1 = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(store.Database));

                Assert.Equal(0, record1.ExternalReplications.Count);
                Assert.Equal(0, record1.RavenConnectionStrings.Count);
                record2 = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(newDbName));

                Assert.Equal(0, record2.ExternalReplications.Count);
                Assert.Equal(0, record2.RavenConnectionStrings.Count);
            }
        }