Esempio n. 1
0
        public void GetSubscriptionTaskInfo()
        {
            var subscriptionOption = new SubscriptionCreationOptions <Query.Order>
            {
                Name       = "sub",
                Filter     = x => x.Employee.StartsWith("e"),
                MentorNode = "B"
            };

            using (var store = GetDocumentStore())
            {
                var sub = store.Subscriptions.Create(subscriptionOption);

                var op = new GetOngoingTaskInfoOperation(subscriptionOption.Name, OngoingTaskType.Subscription);
                var subscriptionResult = (OngoingTaskSubscription)store.Maintenance.Send(op);

                Assert.Equal(subscriptionOption.MentorNode, subscriptionResult.MentorNode);
                Assert.NotNull(subscriptionResult.Query);

                var state = store.Subscriptions.GetSubscriptionState(subscriptionOption.Name);
                op = new GetOngoingTaskInfoOperation(state.SubscriptionId, OngoingTaskType.Subscription);
                subscriptionResult = (OngoingTaskSubscription)store.Maintenance.Send(op);

                Assert.Equal(subscriptionOption.MentorNode, subscriptionResult.MentorNode);
                Assert.Equal(subscriptionOption.Name, subscriptionResult.SubscriptionName);
                Assert.NotNull(subscriptionResult.Query);

                op = new GetOngoingTaskInfoOperation(state.SubscriptionId - 1, OngoingTaskType.Subscription);
                Assert.Throws <SubscriptionDoesNotExistException>(() => store.Maintenance.Send(op));
            }
        }
Esempio n. 2
0
        public void GetBackupTaskInfo()
        {
            var backupConfig = Backup.CreateBackupConfiguration(backupPath: NewDataPath(suffix: "BackupFolder"), fullBackupFrequency: "* */1 * * *", incrementalBackupFrequency: "* */2 * * *", azureSettings: new AzureSettings
            {
                StorageContainer = "abc"
            }, disabled: true, name: "backup1");

            using (var store = GetDocumentStore())
            {
                var updateBackupResult = store.Maintenance.Send(new UpdatePeriodicBackupOperation(backupConfig));

                var taskId = updateBackupResult.TaskId;

                var op           = new GetOngoingTaskInfoOperation(taskId, OngoingTaskType.Backup);
                var backupResult = (OngoingTaskBackup)store.Maintenance.Send(op);

                Assert.Equal("Local", backupResult.BackupDestinations[0]);
                Assert.Equal("Azure", backupResult.BackupDestinations[1]);
                Assert.Equal("backup1", backupResult.TaskName);
                Assert.Equal(OngoingTaskState.Disabled, backupResult.TaskState);

                op           = new GetOngoingTaskInfoOperation("backup1", OngoingTaskType.Backup);
                backupResult = (OngoingTaskBackup)store.Maintenance.Send(op);

                Assert.Equal("Local", backupResult.BackupDestinations[0]);
                Assert.Equal("Azure", backupResult.BackupDestinations[1]);
                Assert.Equal(taskId, backupResult.TaskId);
                Assert.Equal(OngoingTaskState.Disabled, backupResult.TaskState);
            }
        }
Esempio n. 3
0
        protected static async Task <OngoingTask> GetTaskInfo(
            DocumentStore store,
            string taskName, OngoingTaskType type)
        {
            var op = new GetOngoingTaskInfoOperation(taskName, type);

            return(await store.Maintenance.SendAsync(op));
        }
Esempio n. 4
0
        protected static async Task <OngoingTask> GetTaskInfo(
            DocumentStore store,
            long taskId, OngoingTaskType type)
        {
            var op = new GetOngoingTaskInfoOperation(store.Database, taskId, type);

            return(await store.Admin.Server.SendAsync(op));
        }
Esempio n. 5
0
        public void GetRavenEtlTaskInfo()
        {
            var etlConfiguration = new RavenEtlConfiguration()
            {
                Name = "test",
                ConnectionStringName = "cs",
                Transforms           =
                {
                    new Transformation()
                    {
                        Name        = "loadAll",
                        Collections ={ "Users"                   },
                        Script      = "loadToUsers(this)"
                    }
                }
            };

            using (var store = GetDocumentStore())
            {
                var result = store.Maintenance.Send(new PutConnectionStringOperation <RavenConnectionString>(new RavenConnectionString
                {
                    Name = "cs",
                    TopologyDiscoveryUrls = new[] { "http://127.0.0.1:8080" },
                    Database = "Northwind",
                }));
                Assert.NotNull(result.RaftCommandIndex);

                var ravenEtlResult = store.Maintenance.Send(new AddEtlOperation <RavenConnectionString>(etlConfiguration));

                var taskId = ravenEtlResult.TaskId;

                var op        = new GetOngoingTaskInfoOperation(taskId, OngoingTaskType.RavenEtl);
                var etlResult = (OngoingTaskRavenEtlDetails)store.Maintenance.Send(op);

                Assert.Equal("cs", etlResult.Configuration.ConnectionStringName);
                Assert.Equal("test", etlResult.Configuration.Name);
                Assert.Equal("loadAll", etlResult.Configuration.Transforms[0].Name);
                Assert.Equal("loadToUsers(this)", etlResult.Configuration.Transforms[0].Script);
                Assert.Equal("Users", etlResult.Configuration.Transforms[0].Collections[0]);
                Assert.Equal(etlConfiguration.Name, etlResult?.TaskName);

                op        = new GetOngoingTaskInfoOperation("test", OngoingTaskType.RavenEtl);
                etlResult = (OngoingTaskRavenEtlDetails)store.Maintenance.Send(op);

                Assert.Equal("cs", etlResult.Configuration.ConnectionStringName);
                Assert.Equal(taskId, etlResult.TaskId);
                Assert.Equal("loadAll", etlResult.Configuration.Transforms[0].Name);
                Assert.Equal("loadToUsers(this)", etlResult.Configuration.Transforms[0].Script);
                Assert.Equal("Users", etlResult.Configuration.Transforms[0].Collections[0]);
                Assert.Equal(etlConfiguration.Name, etlResult?.TaskName);
            }
        }
Esempio n. 6
0
        public void GetExternalReplicationTaskInfo()
        {
            var watcher = new ExternalReplication("Watcher1", "Connection")
            {
                Name = "MyExternalReplication"
            };

            using (var store = GetDocumentStore())
            {
                var result = store.Maintenance.Send(new PutConnectionStringOperation <RavenConnectionString>(new RavenConnectionString
                {
                    Name     = watcher.ConnectionStringName,
                    Database = watcher.Database,
                    TopologyDiscoveryUrls = store.Urls
                }));
                Assert.NotNull(result.RaftCommandIndex);

                var replicationOperation = new UpdateExternalReplicationOperation(watcher);
                var replication          = store.Maintenance.Send(replicationOperation);

                var taskId = replication.TaskId;

                var op = new GetOngoingTaskInfoOperation(taskId, OngoingTaskType.Replication);
                var replicationResult = (OngoingTaskReplication)store.Maintenance.Send(op);

                Assert.Equal(watcher.Database, replicationResult.DestinationDatabase);
                Assert.Equal(watcher.Url, replicationResult.DestinationUrl);
                Assert.Equal(watcher.Name, replicationResult.TaskName);

                op = new GetOngoingTaskInfoOperation("MyExternalReplication", OngoingTaskType.Replication);
                replicationResult = (OngoingTaskReplication)store.Maintenance.Send(op);

                Assert.Equal(watcher.Database, replicationResult.DestinationDatabase);
                Assert.Equal(watcher.Url, replicationResult.DestinationUrl);
                Assert.Equal(taskId, replicationResult.TaskId);
            }
        }
Esempio n. 7
0
        public void GetSqlEtlTaskInfo()
        {
            var sqlScript = @"
var orderData = {
    Id: __document_id,
    OrderLinesCount: this.OrderLines.length,
    TotalCost: 0
};

loadToOrders(orderData);
";

            var sqlConfiguration = new SqlEtlConfiguration()
            {
                Name = "abc",
                ConnectionStringName = "abc",
                SqlTables            =
                {
                    new SqlEtlTable {
                        TableName = "Orders", DocumentIdColumn = "Id", InsertOnlyMode = false
                    },
                    new SqlEtlTable {
                        TableName = "OrderLines", DocumentIdColumn = "OrderId", InsertOnlyMode = false
                    },
                },
                Transforms =
                {
                    new Transformation()
                    {
                        Name        = "OrdersAndLines",
                        Collections = new List <string>{
                            "Orders"
                        },
                        Script = sqlScript
                    }
                }
            };

            using (var store = GetDocumentStore())
            {
                var sqlConnectionString = new SqlConnectionString
                {
                    Name             = "abc",
                    ConnectionString = @"Data Source=localhost\sqlexpress;Integrated Security=SSPI;Connection Timeout=3" + $";Initial Catalog=SqlReplication-{store.Database};",
                    FactoryName      = "System.Data.SqlClient"
                };

                var result = store.Maintenance.Send(new PutConnectionStringOperation <SqlConnectionString>(sqlConnectionString));
                Assert.NotNull(result.RaftCommandIndex);

                var sqlEtlResult = store.Maintenance.Send(new AddEtlOperation <SqlConnectionString>(sqlConfiguration));

                var taskId = sqlEtlResult.TaskId;

                var op        = new GetOngoingTaskInfoOperation(taskId, OngoingTaskType.SqlEtl);
                var sqlResult = (OngoingTaskSqlEtlDetails)store.Maintenance.Send(op);

                Assert.Equal("abc", sqlResult.Configuration.ConnectionStringName);
                Assert.Equal("abc", sqlResult.Configuration.Name);
                Assert.Equal("OrdersAndLines", sqlResult.Configuration.Transforms[0].Name);
                Assert.Equal(sqlScript, sqlResult.Configuration.Transforms[0].Script);
                Assert.Equal("Orders", sqlResult.Configuration.Transforms[0].Collections[0]);
                Assert.NotNull(sqlResult.Configuration.SqlTables);
                Assert.Equal(sqlConfiguration.Name, sqlResult?.TaskName);

                op        = new GetOngoingTaskInfoOperation("abc", OngoingTaskType.SqlEtl);
                sqlResult = (OngoingTaskSqlEtlDetails)store.Maintenance.Send(op);

                Assert.Equal("abc", sqlResult.Configuration.ConnectionStringName);
                Assert.Equal("abc", sqlResult.Configuration.Name);
                Assert.Equal("OrdersAndLines", sqlResult.Configuration.Transforms[0].Name);
                Assert.Equal(sqlScript, sqlResult.Configuration.Transforms[0].Script);
                Assert.Equal("Orders", sqlResult.Configuration.Transforms[0].Collections[0]);
                Assert.NotNull(sqlResult.Configuration.SqlTables);
                Assert.Equal(taskId, sqlResult.TaskId);
            }
        }
        public async Task BackupTaskShouldStayOnTheOriginalNode()
        {
            var backupPath = NewDataPath(suffix: "BackupFolder");
            var cluster    = await CreateRaftCluster(5);

            using (var store = GetDocumentStore(new Options
            {
                ReplicationFactor = 5,
                Server = cluster.Leader
            }))
            {
                using (var session = store.OpenAsyncSession())
                {
                    await session.StoreAsync(new User { Name = "oren" }, "users/1");

                    await session.SaveChangesAsync();

                    Assert.True(await WaitForDocumentInClusterAsync <User>(session.Advanced.RequestExecutor.TopologyNodes, "users/1", u => u.Name == "oren",
                                                                           TimeSpan.FromSeconds(15)));
                }

                var config = new PeriodicBackupConfiguration
                {
                    LocalSettings = new LocalSettings
                    {
                        FolderPath = backupPath
                    },
                    IncrementalBackupFrequency = "* * * * *" //every minute
                };
                var operation = new UpdatePeriodicBackupOperation(config);
                var result    = await store.Maintenance.SendAsync(operation);

                var periodicBackupTaskId = result.TaskId;

                await WaitForRaftIndexToBeAppliedInCluster(periodicBackupTaskId, TimeSpan.FromSeconds(15));

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

                var getPeriodicBackupStatus = new GetPeriodicBackupStatusOperation(periodicBackupTaskId);
                var done = SpinWait.SpinUntil(() => store.Maintenance.Send(getPeriodicBackupStatus).Status?.LastFullBackup != null, TimeSpan.FromSeconds(180));
                Assert.True(done, "Failed to complete the backup in time");

                var backupInfo       = new GetOngoingTaskInfoOperation(result.TaskId, OngoingTaskType.Backup);
                var backupInfoResult = await store.Maintenance.SendAsync(backupInfo);

                var originalNode = backupInfoResult.ResponsibleNode.NodeTag;

                var toDelete = cluster.Nodes.First(n => n.ServerStore.NodeTag != originalNode);
                await store.Maintenance.Server.SendAsync(new DeleteDatabasesOperation(store.Database, hardDelete : true, fromNode : toDelete.ServerStore.NodeTag, timeToWaitForConfirmation : TimeSpan.FromSeconds(30)));

                var nodesCount = await WaitForValueAsync(async() =>
                {
                    var res = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(store.Database));
                    if (res == null)
                    {
                        return(-1);
                    }

                    return(res.Topology.Count);
                }, 4);

                Assert.Equal(4, nodesCount);

                backupInfoResult = await store.Maintenance.SendAsync(backupInfo);

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

                getPeriodicBackupStatus = new GetPeriodicBackupStatusOperation(periodicBackupTaskId);
                done = SpinWait.SpinUntil(() => store.Maintenance.Send(getPeriodicBackupStatus).Status?.LastFullBackup != null, TimeSpan.FromSeconds(180));
                Assert.True(done, "Failed to complete the backup in time");

                backupInfoResult = await store.Maintenance.SendAsync(backupInfo);

                Assert.Equal(originalNode, backupInfoResult.ResponsibleNode.NodeTag);
            }
        }