From 8b84f3ee88355e775ae198ddfa6ec24c9920ff91 Mon Sep 17 00:00:00 2001 From: Logan Bussell Date: Mon, 30 Mar 2026 10:23:21 -0700 Subject: [PATCH] Revert "Remove unnecessary Docker login from CleanAcrImagesCommand (#2044)" This reverts commit fb308a55ee46a0fab6baf94a3d294018ffdb65e7. --- .../CleanAcrImagesCommandTest.cs | 14 ++++---- .../Commands/CleanAcrImagesCommand.cs | 32 ++++++++++++------- 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/ImageBuilder.Tests/CleanAcrImagesCommandTest.cs b/src/ImageBuilder.Tests/CleanAcrImagesCommandTest.cs index 47b413590..d19719975 100644 --- a/src/ImageBuilder.Tests/CleanAcrImagesCommandTest.cs +++ b/src/ImageBuilder.Tests/CleanAcrImagesCommandTest.cs @@ -54,7 +54,7 @@ public async Task StagingRepos() IAcrClientFactory acrClientFactory = CreateAcrClientFactory(AcrName, acrClientMock.Object); CleanAcrImagesCommand command = new( - acrClientFactory, Mock.Of(), Mock.Of>(), Mock.Of(), Microsoft.Extensions.Options.Options.Create(new PublishConfiguration())); + acrClientFactory, Mock.Of(), Mock.Of>(), Mock.Of(), Mock.Of(), Microsoft.Extensions.Options.Options.Create(new PublishConfiguration())); command.Options.RegistryName = AcrName; command.Options.RepoName = "build-staging/*"; command.Options.Action = CleanAcrImagesAction.Delete; @@ -121,7 +121,7 @@ public async Task PublicNightlyRepos() AcrName, [repo1ContentClient, repo2ContentClient, repo3ContentClient, repo4ContentClient]); CleanAcrImagesCommand command = new( - acrClientFactory, acrContentClientFactory, Mock.Of>(), Mock.Of(), Microsoft.Extensions.Options.Options.Create(new PublishConfiguration())); + acrClientFactory, acrContentClientFactory, Mock.Of>(), Mock.Of(), Mock.Of(), Microsoft.Extensions.Options.Options.Create(new PublishConfiguration())); command.Options.RegistryName = AcrName; command.Options.RepoName = "public/dotnet/*nightly/*"; command.Options.Action = CleanAcrImagesAction.PruneDangling; @@ -166,7 +166,7 @@ public async Task DeleteEmptyTestRepo() IAcrClientFactory acrClientFactory = CreateAcrClientFactory(AcrName, acrClientMock.Object); CleanAcrImagesCommand command = new( - acrClientFactory, Mock.Of(), Mock.Of>(), Mock.Of(), Microsoft.Extensions.Options.Options.Create(new PublishConfiguration())); + acrClientFactory, Mock.Of(), Mock.Of>(), Mock.Of(), Mock.Of(), Microsoft.Extensions.Options.Options.Create(new PublishConfiguration())); command.Options.RegistryName = AcrName; command.Options.RepoName = "test/*"; command.Options.Action = CleanAcrImagesAction.PruneAll; @@ -205,7 +205,7 @@ public async Task DeleteAllExpiredImagesTestRepo() IAcrClientFactory acrClientFactory = CreateAcrClientFactory(AcrName, acrClientMock.Object); CleanAcrImagesCommand command = new CleanAcrImagesCommand( - acrClientFactory, Mock.Of(), Mock.Of>(), Mock.Of(), Microsoft.Extensions.Options.Options.Create(new PublishConfiguration())); + acrClientFactory, Mock.Of(), Mock.Of>(), Mock.Of(), Mock.Of(), Microsoft.Extensions.Options.Options.Create(new PublishConfiguration())); command.Options.RegistryName = AcrName; command.Options.RepoName = "test/*"; command.Options.Action = CleanAcrImagesAction.PruneAll; @@ -254,7 +254,7 @@ public async Task TestRepos() IAcrContentClientFactory acrContentClientFactory = CreateAcrContentClientFactory(AcrName, [repo1ContentClientMock, repo2ContentClientMock]); CleanAcrImagesCommand command = new CleanAcrImagesCommand( - acrClientFactory, acrContentClientFactory, Mock.Of>(), Mock.Of(), Microsoft.Extensions.Options.Options.Create(new PublishConfiguration())); + acrClientFactory, acrContentClientFactory, Mock.Of>(), Mock.Of(), Mock.Of(), Microsoft.Extensions.Options.Options.Create(new PublishConfiguration())); command.Options.RegistryName = AcrName; command.Options.RepoName = "test/*"; command.Options.Action = CleanAcrImagesAction.PruneAll; @@ -311,7 +311,7 @@ public async Task DeleteEolImages() Mock lifecycleMetadataServiceMock = CreateLifecycleMetadataServiceMock(age, repo1Name); CleanAcrImagesCommand command = new CleanAcrImagesCommand( - acrClientFactory, acrContentClientFactory, Mock.Of>(), lifecycleMetadataServiceMock.Object, Microsoft.Extensions.Options.Options.Create(new PublishConfiguration())); + acrClientFactory, acrContentClientFactory, Mock.Of>(), lifecycleMetadataServiceMock.Object, Mock.Of(), Microsoft.Extensions.Options.Options.Create(new PublishConfiguration())); command.Options.RegistryName = AcrName; command.Options.RepoName = "test/*"; command.Options.Action = CleanAcrImagesAction.PruneEol; @@ -361,7 +361,7 @@ public async Task ExcludedImages() AcrName, [repo1ContentClient, repo2ContentClient]); CleanAcrImagesCommand command = new( - acrClientFactory, acrContentClientFactory, Mock.Of>(), Mock.Of(), Microsoft.Extensions.Options.Options.Create(new PublishConfiguration())); + acrClientFactory, acrContentClientFactory, Mock.Of>(), Mock.Of(), Mock.Of(), Microsoft.Extensions.Options.Options.Create(new PublishConfiguration())); command.Options.RegistryName = AcrName; command.Options.RepoName = "public/dotnet/nightly/*"; command.Options.Action = CleanAcrImagesAction.PruneAll; diff --git a/src/ImageBuilder/Commands/CleanAcrImagesCommand.cs b/src/ImageBuilder/Commands/CleanAcrImagesCommand.cs index 7f57845fe..36904992e 100644 --- a/src/ImageBuilder/Commands/CleanAcrImagesCommand.cs +++ b/src/ImageBuilder/Commands/CleanAcrImagesCommand.cs @@ -25,6 +25,7 @@ public class CleanAcrImagesCommand : Command _logger; private readonly ILifecycleMetadataService _lifecycleMetadataService; + private readonly IRegistryCredentialsProvider _registryCredentialsProvider; private readonly PublishConfiguration _publishConfig; private const int MaxConcurrentDeleteRequestsPerRepo = 5; @@ -34,12 +35,14 @@ public CleanAcrImagesCommand( IAcrContentClientFactory acrContentClientFactory, ILogger logger, ILifecycleMetadataService lifecycleMetadataService, + IRegistryCredentialsProvider registryCredentialsProvider, IOptions publishConfigOptions) { _acrClientFactory = acrClientFactory ?? throw new ArgumentNullException(nameof(acrClientFactory)); _acrContentClientFactory = acrContentClientFactory; _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _lifecycleMetadataService = lifecycleMetadataService ?? throw new ArgumentNullException(nameof(lifecycleMetadataService)); + _registryCredentialsProvider = registryCredentialsProvider ?? throw new ArgumentNullException(nameof(registryCredentialsProvider)); _publishConfig = publishConfigOptions.Value; } @@ -67,18 +70,25 @@ public override async Task ExecuteAsync() List deletedRepos = new List(); List deletedImages = new List(); - IEnumerable cleanupTasks = await repositoryNames - .Where(repoName => repoNameFilterRegex.IsMatch(repoName)) - .Select(repoName => acrClient.GetRepository(repoName)) - .Select(repo => + await _registryCredentialsProvider.ExecuteWithCredentialsAsync( + isDryRun: false, + async () => { - Acr acr = Acr.Parse(Options.RegistryName); - IAcrContentClient acrContentClient = CreateAcrContentClient(acr, repo.Name); - return ProcessRepoAsync(acrClient, acrContentClient, repo, deletedRepos, deletedImages); - }) - .ToArrayAsync(); - - await Task.WhenAll(cleanupTasks); + IEnumerable cleanupTasks = await repositoryNames + .Where(repoName => repoNameFilterRegex.IsMatch(repoName)) + .Select(repoName => acrClient.GetRepository(repoName)) + .Select(repo => + { + Acr acr = Acr.Parse(Options.RegistryName); + IAcrContentClient acrContentClient = CreateAcrContentClient(acr, repo.Name); + return ProcessRepoAsync(acrClient, acrContentClient, repo, deletedRepos, deletedImages); + }) + .ToArrayAsync(); + + await Task.WhenAll(cleanupTasks); + }, + Options.CredentialsOptions, + registryName: Options.RegistryName); await LogSummaryAsync(acrClient, deletedRepos, deletedImages); }