private async Task DeleteElementsAsync()

in src/Amazon.AspNetCore.DataProtection.SSM/SSMXmlRepository.cs [219:299]


        private async Task<bool> DeleteElementsAsync(Action<IReadOnlyCollection<IDeletableElement>> chooseElements)
        {
            if (chooseElements == null)
            {
                throw new ArgumentNullException(nameof(chooseElements));
            }

            var deletableElements = new List<DeletableElement>();
            var request = new GetParametersByPathRequest
            {
                Path = _parameterNamePrefix,
                WithDecryption = true
            };
            GetParametersByPathResponse response = null;

            do
            {
                request.NextToken = response?.NextToken;
                try
                {
                    response = await _ssmClient.GetParametersByPathAsync(request).ConfigureAwait(false);
                }
                catch (Exception e)
                {
                    _logger.LogError(
                        e,
                        "Error calling SSM to get parameters starting with {ParameterNamePrefix}: {ExceptionMessage}",
                        _parameterNamePrefix,
                        e.Message);

                    throw;
                }

                foreach (var parameter in response.Parameters ?? new())
                {
                    try
                    {
                        var xml = XElement.Parse(parameter.Value);
                        deletableElements.Add(new DeletableElement(parameter, xml));
                    }
#pragma warning disable CA1031 // Do not catch general exception types
                    catch (Exception e)
#pragma warning restore CA1031 // Do not catch general exception types
                    {
                        _logger.LogError(e, "Error parsing key {ParameterName}, key will be skipped: {ExceptionMessage}", parameter.Name, e.Message);
                    }
                }

            } while (!string.IsNullOrEmpty(response.NextToken));

            chooseElements(deletableElements);

            var elementsToDelete = deletableElements
                .Where(e => e.DeletionOrder.HasValue)
                .OrderBy(e => e.DeletionOrder.GetValueOrDefault());

            foreach (var deletableElement in elementsToDelete)
            {
                var parameter = deletableElement.Parameter;

                _logger.LogDebug("Deleting DataProtection key from SSM Parameter Store with parameter name {ParameterName}", parameter.Name);
                try
                {
                    var deleteParameterRequest = new DeleteParameterRequest
                    {
                        Name = parameter.Name
                    };

                    await _ssmClient.DeleteParameterAsync(deleteParameterRequest).ConfigureAwait(false);
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex, "Failed to delete DataProtection key from SSM Parameter Store with parameter name {ParameterName}: {ExceptionMessage}", parameter.Name, ex.Message);

                    // Stop processing deletions to avoid deleting a revocation entry for a key that we failed to delete.
                    return false;
                }
            }

            return true;
        }