Example #1
0
        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"));
        }
Example #2
0
        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
        }
Example #3
0
        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"));
        }