public async Task Create(CreateArguments arguments) { var(app, service) = Configuration.Setup(); var backupStarted = DateTime.UtcNow.AddMinutes(-5); var backupsClient = service.CreateBackupsClient(); await backupsClient.PostBackupAsync(app); Console.WriteLine("Backup started, waiting for completion..."); BackupJobDto foundBackup = null; using (var tcs = new CancellationTokenSource(TimeSpan.FromMinutes(arguments.Timeout))) { while (!tcs.Token.IsCancellationRequested) { var backups = await backupsClient.GetBackupsAsync(app); var backup = backups.Items.FirstOrDefault(x => x.Started >= backupStarted); if (backup != null && backup.Stopped.HasValue) { foundBackup = backup; break; } } await Task.Delay(5000); } if (foundBackup == null) { Console.WriteLine("Failed to receive the backup in time."); } else if (foundBackup.Status == JobStatus.Completed) { Console.WriteLine("Backup completed. Downloading..."); using (var fs = new FileStream(arguments.File, FileMode.CreateNew)) { using (var download = await backupsClient.GetBackupContentAsync(app, foundBackup.Id.ToString())) { await download.Stream.CopyToAsync(fs); } } Console.WriteLine("Backup completed. Download completed"); if (arguments.DeleteAfterDownload) { Console.WriteLine("Removing backup from app..."); await backupsClient.DeleteBackupAsync(app, foundBackup.Id.ToString()); } } else { Console.WriteLine("Failed to make the backup, check the logs for details."); } }
public async Task Create(CreateArguments arguments) { var session = configuration.StartSession(); var backupStarted = DateTime.UtcNow.AddMinutes(-5); await session.Backups.PostBackupAsync(session.App); log.WriteLine("Backup started, waiting for completion..."); BackupJobDto foundBackup = null; using (var tcs = new CancellationTokenSource(TimeSpan.FromMinutes(arguments.Timeout))) { while (!tcs.Token.IsCancellationRequested) { var backups = await session.Backups.GetBackupsAsync(session.App, tcs.Token); var backup = backups.Items.FirstOrDefault(x => x.Started >= backupStarted); if (backup?.Stopped != null) { foundBackup = backup; break; } } await Task.Delay(5000, tcs.Token); } if (foundBackup == null) { log.WriteLine("Failed to receive the backup in time."); } else if (foundBackup.Status == JobStatus.Completed) { log.WriteLine("Backup completed. Downloading..."); await using (var fs = new FileStream(arguments.File, FileMode.CreateNew)) { using (var download = await session.Backups.GetBackupContentAsync(session.App, foundBackup.Id)) { await download.Stream.CopyToAsync(fs); } } if (arguments.DeleteAfterDownload) { log.WriteLine("Removing backup from app..."); await session.Backups.DeleteBackupAsync(session.App, foundBackup.Id); } log.WriteLine("> Backup completed and downloaded"); } else { log.WriteLine("> Failed to make the backup, check the logs for details."); } }
public async Task Should_backup_and_restore_app() { var timeout = TimeSpan.FromMinutes(2); var appName = Guid.NewGuid().ToString(); var appNameRestore = $"{appName}-restore"; // STEP 1: Create app var createRequest = new CreateAppDto { Name = appName }; await _.Apps.PostAppAsync(createRequest); // STEP 2: Create backup await _.Backups.PostBackupAsync(appName); BackupJobDto backup = null; try { using (var cts = new CancellationTokenSource(TimeSpan.FromMinutes(2))) { while (true) { cts.Token.ThrowIfCancellationRequested(); await Task.Delay(1000); var backups = await _.Backups.GetBackupsAsync(appName); if (backups.Items.Count > 0) { backup = backups.Items.FirstOrDefault(); break; } } } } catch (OperationCanceledException) { Assert.True(false, $"Could not retrieve backup within {timeout}."); } // STEP 3: Restore backup var uri = new Uri($"{_.ServerUrl}{backup._links["download"].Href}"); var restoreRequest = new RestoreRequestDto { Url = uri, Name = appNameRestore }; await _.Backups.PostRestoreJobAsync(restoreRequest); try { using (var cts = new CancellationTokenSource(TimeSpan.FromMinutes(2))) { while (true) { cts.Token.ThrowIfCancellationRequested(); await Task.Delay(1000); var job = await _.Backups.GetRestoreJobAsync(); if (job != null && job.Url == uri && job.Status == JobStatus.Completed) { break; } } } } catch (OperationCanceledException) { Assert.True(false, $"Could not retrieve restored app within {timeout}."); } }