public void restore_s3_settings_tests() { var backupPath = NewDataPath(suffix: "BackupFolder"); using (var store = GetDocumentStore(new Options { ModifyDatabaseName = s => $"{s}_2" })) { var databaseName = $"restored_database-{Guid.NewGuid()}"; var restoreConfiguration = new RestoreFromS3Configuration { DatabaseName = databaseName }; var restoreBackupTask = new RestoreBackupOperation(restoreConfiguration); var e = Assert.Throws<RavenException>(() => store.Maintenance.Server.Send(restoreBackupTask)); Assert.Contains("AWS access key cannot be null or empty", e.InnerException.Message); restoreConfiguration.Settings.AwsAccessKey = "test"; restoreBackupTask = new RestoreBackupOperation(restoreConfiguration); e = Assert.Throws<RavenException>(() => store.Maintenance.Server.Send(restoreBackupTask)); Assert.Contains("AWS secret key cannot be null or empty", e.InnerException.Message); restoreConfiguration.Settings.AwsSecretKey = "test"; restoreBackupTask = new RestoreBackupOperation(restoreConfiguration); e = Assert.Throws<RavenException>(() => store.Maintenance.Server.Send(restoreBackupTask)); Assert.Contains("AWS region cannot be null or empty", e.InnerException.Message); restoreConfiguration.Settings.AwsRegionName = "test"; restoreBackupTask = new RestoreBackupOperation(restoreConfiguration); e = Assert.Throws<RavenException>(() => store.Maintenance.Server.Send(restoreBackupTask)); Assert.Contains("AWS Bucket name cannot be null or empty", e.InnerException.Message); } }
public RestoreFromS3(ServerStore serverStore, RestoreFromS3Configuration restoreFromConfiguration, string nodeTag, OperationCancelToken operationCancelToken) : base(serverStore, restoreFromConfiguration, nodeTag, operationCancelToken) { _client = new RavenAwsS3Client(restoreFromConfiguration.Settings); _remoteFolderName = restoreFromConfiguration.Settings.RemoteFolderName; }
public async Task can_backup_and_restore() { var localS3Settings = CopyLocalS3Settings(); using (var store = GetDocumentStore()) { using (var session = store.OpenAsyncSession()) { await session.StoreAsync(new User { Name = "oren" }, "users/1"); session.CountersFor("users/1").Increment("likes", 100); await session.SaveChangesAsync(); } var config = new PeriodicBackupConfiguration { BackupType = BackupType.Backup, S3Settings = localS3Settings, IncrementalBackupFrequency = "* * * * *" //every minute }; var backupTaskId = (await store.Maintenance.SendAsync(new UpdatePeriodicBackupOperation(config))).TaskId; await store.Maintenance.SendAsync(new StartBackupOperation(true, backupTaskId)); var operation = new GetPeriodicBackupStatusOperation(backupTaskId); var value = WaitForValue(() => { var status = store.Maintenance.Send(operation).Status; return(status?.LastEtag); }, 4); Assert.Equal(4, value); var backupStatus = store.Maintenance.Send(operation); var backupOperationId = backupStatus.Status.LastOperationId; var backupOperation = store.Maintenance.Send(new GetOperationStateOperation(backupOperationId.Value)); var backupResult = backupOperation.Result as BackupResult; Assert.True(backupResult.Counters.Processed); Assert.Equal(1, backupResult.Counters.ReadCount); using (var session = store.OpenAsyncSession()) { await session.StoreAsync(new User { Name = "ayende" }, "users/2"); session.CountersFor("users/2").Increment("downloads", 200); await session.SaveChangesAsync(); } var lastEtag = store.Maintenance.Send(new GetStatisticsOperation()).LastDocEtag; await store.Maintenance.SendAsync(new StartBackupOperation(false, backupTaskId)); value = WaitForValue(() => store.Maintenance.Send(operation).Status.LastEtag, lastEtag); Assert.Equal(lastEtag, value); // restore the database with a different name var databaseName = $"restored_database-{Guid.NewGuid()}"; localS3Settings.RemoteFolderName = $"{backupStatus.Status.FolderName}"; var restoreFromS3Configuration = new RestoreFromS3Configuration { DatabaseName = databaseName, Settings = localS3Settings }; var s3Operation = new RestoreBackupOperation(restoreFromS3Configuration); var restoreOperation = store.Maintenance.Server.Send(s3Operation); restoreOperation.WaitForCompletion(TimeSpan.FromSeconds(30)); { using (var session = store.OpenAsyncSession(databaseName)) { var users = await session.LoadAsync <User>(new[] { "users/1", "users/2" }); Assert.True(users.Any(x => x.Value.Name == "oren")); Assert.True(users.Any(x => x.Value.Name == "ayende")); var val = await session.CountersFor("users/1").GetAsync("likes"); Assert.Equal(100, val); val = await session.CountersFor("users/2").GetAsync("downloads"); Assert.Equal(200, val); } var originalDatabase = await Server.ServerStore.DatabasesLandlord.TryGetOrCreateResourceStore(store.Database); var restoredDatabase = await Server.ServerStore.DatabasesLandlord.TryGetOrCreateResourceStore(databaseName); using (restoredDatabase.DocumentsStorage.ContextPool.AllocateOperationContext(out DocumentsOperationContext ctx)) using (ctx.OpenReadTransaction()) { var databaseChangeVector = DocumentsStorage.GetDatabaseChangeVector(ctx); Assert.Equal($"A:7-{originalDatabase.DbBase64Id}, A:8-{restoredDatabase.DbBase64Id}", databaseChangeVector); } } } }