public override void ExecuteCommand()

in Source/NuGetGallery.Operations/Tasks/Backups/CleanOfflineDatabaseBackupsTask.cs [15:69]


        public override void ExecuteCommand()
        {
            var today = DateTime.UtcNow.Date;

            // List available backups
            var toKeep = new HashSet<string>();
            var client = CreateBlobClient();
            var container = client.GetContainerReference("database-backups");
            var backups = container
                .ListBlobs(useFlatBlobListing: true, blobListingDetails: BlobListingDetails.Metadata)
                .Cast<CloudBlockBlob>()
                .Where(b => OfflineDatabaseBackup.IsOfflineBackup(b))
                .Select(b => new OfflineDatabaseBackup(b))
                .ToList();

            // Group by days
            var days = backups.GroupBy(b => b.Timestamp.Date).OrderByDescending(g => g.Key);

            // Keep the last backup of each day for the past 7 days where we have backups
            foreach (var backup in days.Take(7).Select(g => g.OrderByDescending(b => b.Timestamp).First()))
            {
                if (backup.Timestamp < today.AddDays(-7))
                {
                    Log.Warn("Backup '{0}' is in the last 7 days of backups but is older than 7 days!", backup.Blob.Name);
                }
                toKeep.Add(backup.Blob.Name);
            }

            // Group previous backups in to months
            var months = backups
                .GroupBy(b => new { b.Timestamp.Month, b.Timestamp.Year })
                .Where(g => g.Key.Month != today.Month || g.Key.Year != today.Year);

            // Keep the last chronological backup for each month
            foreach(var backup in months.Select(g => g.OrderByDescending(b => b.Timestamp).First()))
            {
                toKeep.Add(backup.Blob.Name);
            }

            // Remove anything older than a year
            foreach (var backup in backups.Where(b => b.Timestamp < today.AddYears(-1) && toKeep.Contains(b.Blob.Name)))
            {
                toKeep.Remove(backup.Blob.Name);
            }

            foreach (var backup in backups)
            {
                if (!toKeep.Contains(backup.Blob.Name))
                {
                    DeleteBackup(backup.Blob);
                }
            }

            Log.Info("Finished cleaning backups!");
        }