Skip to content
This repository was archived by the owner on Jul 30, 2024. It is now read-only.

Commit 2289f91

Browse files
committed
Make PackageSigningValidator into an IProcessor (#389)
Progress on NuGet/Engineering#1207
1 parent 60e5f4e commit 2289f91

6 files changed

Lines changed: 94 additions & 15 deletions

File tree

src/NuGet.Services.Validation.Orchestrator/Job.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
using NuGet.Jobs.Validation.Common;
2424
using NuGet.Jobs.Validation.PackageSigning.Messages;
2525
using NuGet.Jobs.Validation.PackageSigning.Storage;
26+
using NuGet.Jobs.Validation.Storage;
2627
using NuGet.Services.Configuration;
2728
using NuGet.Services.KeyVault;
2829
using NuGet.Services.Logging;
@@ -203,6 +204,7 @@ private void ConfigureJobServices(IServiceCollection services, IConfigurationRoo
203204
services.AddTransient<IBrokeredMessageSerializer<SignatureValidationMessage>, SignatureValidationMessageSerializer>();
204205
services.AddTransient<IBrokeredMessageSerializer<CertificateValidationMessage>, CertificateValidationMessageSerializer>();
205206
services.AddTransient<IValidatorStateService, ValidatorStateService>();
207+
services.AddTransient<ISimpleCloudBlobProvider, SimpleCloudBlobProvider>();
206208
services.AddTransient<PackageSigningValidator>();
207209
services.AddTransient<MailSenderConfiguration>(serviceProvider =>
208210
{

src/NuGet.Services.Validation.Orchestrator/PackageSigning/ProcessSignature/PackageSigningValidator.cs

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,29 @@
66
using System.Threading.Tasks;
77
using Microsoft.Extensions.Logging;
88
using NuGet.Jobs.Validation.PackageSigning.Storage;
9-
using NuGet.Services.Validation.Orchestrator;
9+
using NuGet.Jobs.Validation.Storage;
1010
using NuGet.Services.Validation.Orchestrator.Telemetry;
1111

1212
namespace NuGet.Services.Validation.PackageSigning.ProcessSignature
1313
{
14-
public class PackageSigningValidator : BaseValidator, IValidator
14+
public class PackageSigningValidator : IProcessor
1515
{
1616
private readonly IValidatorStateService _validatorStateService;
1717
private readonly IProcessSignatureEnqueuer _signatureVerificationEnqueuer;
18+
private readonly ISimpleCloudBlobProvider _blobProvider;
1819
private readonly ITelemetryService _telemetryService;
1920
private readonly ILogger<PackageSigningValidator> _logger;
2021

2122
public PackageSigningValidator(
2223
IValidatorStateService validatorStateService,
2324
IProcessSignatureEnqueuer signatureVerificationEnqueuer,
25+
ISimpleCloudBlobProvider blobProvider,
2426
ITelemetryService telemetryService,
2527
ILogger<PackageSigningValidator> logger)
2628
{
2729
_validatorStateService = validatorStateService ?? throw new ArgumentNullException(nameof(validatorStateService));
2830
_signatureVerificationEnqueuer = signatureVerificationEnqueuer ?? throw new ArgumentNullException(nameof(signatureVerificationEnqueuer));
31+
_blobProvider = blobProvider ?? throw new ArgumentNullException(nameof(blobProvider));
2932
_telemetryService = telemetryService ?? throw new ArgumentNullException(nameof(telemetryService));
3033
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
3134
}
@@ -44,6 +47,25 @@ public async Task<IValidationResult> StartAsync(IValidationRequest request)
4447
return validatorStatus.ToValidationResult();
4548
}
4649

50+
public async Task CleanUpAsync(IValidationRequest request)
51+
{
52+
var validatorStatus = await _validatorStateService.GetStatusAsync(request);
53+
54+
if (validatorStatus.NupkgUrl == null)
55+
{
56+
return;
57+
}
58+
59+
_logger.LogInformation(
60+
"Cleaning up the .nupkg URL for validation ID {ValidationId} ({PackageId} {PackageVersion}).",
61+
request.ValidationId,
62+
request.PackageId,
63+
request.PackageVersion);
64+
65+
var blob = _blobProvider.GetBlobFromUrl(validatorStatus.NupkgUrl);
66+
await blob.DeleteIfExistsAsync();
67+
}
68+
4769
private async Task<ValidatorStatus> StartInternalAsync(IValidationRequest request)
4870
{
4971
// Check that this is the first validation for this specific request.

src/NuGet.Services.Validation.Orchestrator/settings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
{
55
"name": "VcsValidator",
66
"TrackAfter": "1:00:00:00",
7-
"requiredValidations": [],
7+
"requiredValidations": [ "PackageSigningValidator" ],
88
"ShouldStart": true,
99
"FailureBehavior": "MustSucceed"
1010
},

src/Validation.PackageSigning.ProcessSignature/Validation.PackageSigning.ProcessSignature.csproj

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,6 @@
7676
<Project>{fa87d075-a934-4443-8d0b-5db32640b6d7}</Project>
7777
<Name>Validation.Common.Job</Name>
7878
</ProjectReference>
79-
<ProjectReference Include="..\Validation.Common\Validation.Common.csproj">
80-
<Project>{2539DDF3-0CC5-4A03-B5F9-39B47744A7BD}</Project>
81-
<Name>Validation.Common</Name>
82-
</ProjectReference>
8379
<ProjectReference Include="..\Validation.PackageSigning.Core\Validation.PackageSigning.Core.csproj">
8480
<Project>{91c060da-736f-4da9-a57f-cb3ac0e6cb10}</Project>
8581
<Name>Validation.PackageSigning.Core</Name>

tests/NuGet.Services.Validation.Orchestrator.Tests/PackageSigning/ProcessSignature/PackageSigningValidatorFacts.cs

Lines changed: 66 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,12 @@
88
using Microsoft.Extensions.Logging;
99
using Moq;
1010
using NuGet.Jobs.Validation.PackageSigning.Storage;
11+
using NuGet.Jobs.Validation.Storage;
1112
using NuGet.Services.Validation.Orchestrator.Telemetry;
1213
using NuGet.Services.Validation.PackageSigning.ProcessSignature;
14+
using NuGetGallery;
1315
using Xunit;
16+
using Xunit.Abstractions;
1417

1518
namespace NuGet.Services.Validation.PackageSigning
1619
{
@@ -32,6 +35,10 @@ public class TheGetStatusMethod : FactsBase
3235
ValidationStatus.Succeeded,
3336
};
3437

38+
public TheGetStatusMethod(ITestOutputHelper output) : base(output)
39+
{
40+
}
41+
3542
[Theory]
3643
[MemberData(nameof(PossibleValidationStatuses))]
3744
public async Task ReturnsPersistedStatus(ValidationStatus status)
@@ -107,6 +114,10 @@ public class TheStartValidationAsyncMethod : FactsBase
107114
ValidationStatus.Succeeded,
108115
};
109116

117+
public TheStartValidationAsyncMethod(ITestOutputHelper output) : base(output)
118+
{
119+
}
120+
110121
[Theory]
111122
[MemberData(nameof(StartedValidationStatuses))]
112123
public async Task ReturnsPersistedStatusesIfValidationAlreadyStarted(ValidationStatus status)
@@ -204,21 +215,68 @@ public async Task StartsValidationIfNotStarted()
204215
public static IEnumerable<object[]> StartedValidationStatuses => startedValidationStatuses.Select(s => new object[] { s });
205216
}
206217

218+
public class TheCleanUpAsyncMethod : FactsBase
219+
{
220+
private readonly ValidatorStatus _validatorStatus;
221+
private readonly Mock<ISimpleCloudBlob> _blob;
222+
223+
public TheCleanUpAsyncMethod(ITestOutputHelper output) : base(output)
224+
{
225+
_validatorStatus = new ValidatorStatus();
226+
_validatorStateService
227+
.Setup(x => x.GetStatusAsync(It.IsAny<IValidationRequest>()))
228+
.ReturnsAsync(() => _validatorStatus);
229+
230+
_blob = new Mock<ISimpleCloudBlob>(MockBehavior.Strict);
231+
_blobProvider
232+
.Setup(x => x.GetBlobFromUrl(It.IsAny<string>()))
233+
.Returns(() => _blob.Object);
234+
}
235+
236+
[Fact]
237+
public async Task DeletesNothingWhenThereIsNoNupkgUrl()
238+
{
239+
await _target.CleanUpAsync(_validationRequest.Object);
240+
241+
_validatorStateService.Verify(x => x.GetStatusAsync(_validationRequest.Object), Times.Once);
242+
_blobProvider.Verify(x => x.GetBlobFromUrl (It.IsAny<string>()), Times.Never);
243+
}
244+
245+
[Fact]
246+
public async Task DeletesTheBlobWhenThereIsNupkgUrl()
247+
{
248+
var nupkgUrl = "http://example/packages/nuget.versioning.4.6.0.nupkg";
249+
_validatorStatus.NupkgUrl = nupkgUrl;
250+
_blob
251+
.Setup(x => x.DeleteIfExistsAsync())
252+
.Returns(Task.CompletedTask);
253+
254+
await _target.CleanUpAsync(_validationRequest.Object);
255+
256+
_validatorStateService.Verify(x => x.GetStatusAsync(_validationRequest.Object), Times.Once);
257+
_blobProvider.Verify(x => x.GetBlobFromUrl(nupkgUrl), Times.Once);
258+
_blob.Verify(x => x.DeleteIfExistsAsync(), Times.Once);
259+
}
260+
}
261+
207262
public abstract class FactsBase
208263
{
209264
protected readonly Mock<IValidatorStateService> _validatorStateService;
210265
protected readonly Mock<IProcessSignatureEnqueuer> _packageSignatureVerifier;
266+
protected readonly Mock<ISimpleCloudBlobProvider> _blobProvider;
211267
protected readonly Mock<ITelemetryService> _telemetryService;
212-
protected readonly Mock<ILogger<PackageSigningValidator>> _logger;
268+
protected readonly ILogger<PackageSigningValidator> _logger;
213269
protected readonly Mock<IValidationRequest> _validationRequest;
214270
protected readonly PackageSigningValidator _target;
215271

216-
public FactsBase()
272+
public FactsBase(ITestOutputHelper output)
217273
{
218274
_validatorStateService = new Mock<IValidatorStateService>();
219275
_packageSignatureVerifier = new Mock<IProcessSignatureEnqueuer>();
276+
_blobProvider = new Mock<ISimpleCloudBlobProvider>();
220277
_telemetryService = new Mock<ITelemetryService>();
221-
_logger = new Mock<ILogger<PackageSigningValidator>>();
278+
var loggerFactory = new LoggerFactory().AddXunit(output);
279+
_logger = loggerFactory.CreateLogger<PackageSigningValidator>();
222280

223281
_validationRequest = new Mock<IValidationRequest>();
224282
_validationRequest.Setup(x => x.NupkgUrl).Returns(NupkgUrl);
@@ -228,10 +286,11 @@ public FactsBase()
228286
_validationRequest.Setup(x => x.ValidationId).Returns(ValidationId);
229287

230288
_target = new PackageSigningValidator(
231-
_validatorStateService.Object,
232-
_packageSignatureVerifier.Object,
233-
_telemetryService.Object,
234-
_logger.Object);
289+
_validatorStateService.Object,
290+
_packageSignatureVerifier.Object,
291+
_blobProvider.Object,
292+
_telemetryService.Object,
293+
_logger);
235294
}
236295
}
237296
}

tests/NuGet.Services.Validation.Orchestrator.Tests/ValidationProviderFacts.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public class GetValidator : BaseFacts
8585
/// </summary>
8686
[Theory]
8787
[InlineData("VcsValidator", false)]
88-
[InlineData("PackageSigningValidator", false)]
88+
[InlineData("PackageSigningValidator", true)]
8989
[InlineData("PackageCertificatesValidator", false)]
9090
public void KnownValidatorsDoNotChangeNames(string validatorName, bool isProcessor)
9191
{

0 commit comments

Comments
 (0)