Ejemplo n.º 1
0
            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.");
                }
            }
Ejemplo n.º 2
0
            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.");
                }
            }
Ejemplo n.º 3
0
        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}.");
            }
        }