public async Task PersistResourceGroupToStorage([QueueTrigger("%ResourceGroupPersistQueueName%", Connection = "MainStorageConnection")] ResourceSearchResult request, Binder binder) { _log.LogTrace($"Exporting template for {request.ResourceId} in {request.SubscriptionId}"); // get template from ARM var previouslyExported = await _resourceManager.GetTagValue(request.SubscriptionId, request.ResourceId, "exported", x => bool.Parse(x), () => false); _log.LogTrace($"Template for {request.ResourceId} in {request.SubscriptionId} has been exported previously: {previouslyExported}"); if (previouslyExported) { return; } var templateData = await _resourceManager.ExportResourceGroupTemplateByName(request.SubscriptionId, request.ResourceId); if (string.IsNullOrWhiteSpace(templateData)) { return; } var exportFilename = $"thrazman-export/{DateTime.UtcNow:yyyy-MM-dd}/{request.ResourceId}-{Guid.NewGuid().ToString().Substring(0, 8)}.json"; _log.LogTrace($"Got template data, writing to {exportFilename}"); var attributes = new Attribute[] { new BlobAttribute(exportFilename), new StorageAccountAttribute("MainStorageConnection") }; using var writer = await binder.BindAsync <TextWriter>(attributes).ConfigureAwait(false); writer.Write(templateData); await _resourceManager.AddTags(request.ResourceId, request.SubscriptionId, new KeyValuePair <string, string>("exported", "true")); }
public async Task ResourceGroupExpired( [QueueTrigger("%ResourceGroupExpiredQueueName%", Connection = "MainStorageConnection")] ResourceSearchResult request, [Queue("%ResourceGroupPersistQueueName%", Connection = "MainStorageConnection")] IAsyncCollector <ResourceSearchResult> persistQueue, [Queue("%ResourceGroupNotifyQueueName%", Connection = "MainStorageConnection")] IAsyncCollector <ResourceSearchResult> notifyQueue ) // at this point, the deletion is committed and will happen { // notify deletion --> this await notifyQueue.AddAsync(request); // persist resource group template to storage --> that await persistQueue.AddAsync(request); // queue up for deletion --> don't do this until this and that are done }
public async Task Notify([QueueTrigger("%ResourceGroupNotifyQueueName%", Connection = "MainStorageConnection")] ResourceSearchResult request) { // query for resource var group = await _resourceManager.GetResourceGroup(request.SubscriptionId, request.ResourceId); var expirationDate = group.Tags.FirstOrDefault(x => x.Key == "expires").Value; var hasExpired = DateTime.TryParse(expirationDate, out var exp) && exp < DateTime.UtcNow; var previouslyNotified = await _resourceManager.GetTagValue(request.SubscriptionId, request.ResourceId, "notified", x => bool.Parse(x), () => false); _log.LogTrace($"{request.ResourceId} in {request.SubscriptionId} has been notified of impending deletion previously: {previouslyNotified}"); if (previouslyNotified) { return; } var message = new StringBuilder(); message.Append("THRAZMAN HERE. "); message.Append(group.Name); if (hasExpired) { message.Append($" expired on {exp.ToShortDateString()} and will be deleted shortly."); } else { message.Append($" will expire on {exp.ToShortDateString()}. Extend the date before then to keep the resources."); } // build message await _notifier.Notify(new NotificationMessage() { Message = message.ToString() }); // prevent duplicates await _resourceManager.AddTags(request.ResourceId, request.SubscriptionId, new KeyValuePair <string, string>("notified", "true")); }