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

Commit 09e4219

Browse files
committed
Copy validation result .nupkg URL from processor (#373)
Progress on NuGet/Engineering#1190
1 parent 028fef4 commit 09e4219

7 files changed

Lines changed: 254 additions & 33 deletions

File tree

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,14 @@ Task CopyValidationSetPackageToPackageFileAsync(
5050
/// <param name="normalizedVersion">The normalized package version.</param>
5151
Task CopyValidationPackageToPackageFileAsync(string id, string normalizedVersion);
5252

53+
/// <summary>
54+
/// Copy a package URL to a location specific for the validation set.
55+
/// </summary>
56+
/// <param name="validationSet">The validation set.</param>
57+
/// <param name="srcPackageUrl">The source package URL.</param>
58+
/// <returns></returns>
59+
Task CopyPackageUrlForValidationSetAsync(PackageValidationSet validationSet, string srcPackageUrl);
60+
5361
/// <summary>
5462
/// Delete a package from a location specific for the validation set.
5563
/// </summary>

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,23 @@ public Task<Uri> GetPackageForValidationSetReadUriAsync(PackageValidationSet val
129129
return _fileStorageService.GetFileReadUriAsync(CoreConstants.ValidationFolderName, fileName, endOfAccess);
130130
}
131131

132+
public Task CopyPackageUrlForValidationSetAsync(PackageValidationSet validationSet, string srcPackageUrl)
133+
{
134+
var destFileName = BuildValidationSetPackageFileName(validationSet);
135+
136+
_logger.LogInformation(
137+
"Copying URL {SrcPackageUrl} to {DestFolderName}/{DestFileName}.",
138+
srcPackageUrl,
139+
CoreConstants.ValidationFolderName,
140+
srcPackageUrl);
141+
142+
return _fileStorageService.CopyFileAsync(
143+
new Uri(srcPackageUrl),
144+
CoreConstants.ValidationFolderName,
145+
destFileName,
146+
AccessConditionWrapper.GenerateEmptyCondition());
147+
}
148+
132149
private Task<string> CopyFileAsync(
133150
string srcFolderName,
134151
string srcFileName,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ private async Task<bool> ProcessIncompleteValidations(PackageValidationSet valid
110110
else
111111
{
112112
_logger.LogDebug(
113-
"Validation {ValidationType} for {PackageId} {PackageVersion} is still " +
113+
"Validation {ValidationType} for {PackageId} {PackageVersion} is already " +
114114
"{ValidationStatus}, validation set {ValidationSetId}, {ValidationId}",
115115
packageValidation.Type,
116116
package.PackageRegistration.Id,

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

Lines changed: 47 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,26 @@
1313
namespace NuGet.Services.Validation.Orchestrator
1414
{
1515
/// <summary>
16-
/// Provides an access layer to the validation information stored in DB
16+
/// Provides an access layer to the validation information stored in DB and blob storage.
1717
/// </summary>
1818
public class ValidationStorageService : IValidationStorageService
1919
{
2020
private readonly IValidationEntitiesContext _validationContext;
21+
private readonly IValidationPackageFileService _packageFileService;
22+
private readonly IValidatorProvider _validatorProvider;
2123
private readonly ITelemetryService _telemetryService;
2224
private readonly ILogger<ValidationStorageService> _logger;
2325

2426
public ValidationStorageService(
2527
IValidationEntitiesContext validationContext,
28+
IValidationPackageFileService packageFileService,
29+
IValidatorProvider validatorProvider,
2630
ITelemetryService telemetryService,
2731
ILogger<ValidationStorageService> logger)
2832
{
2933
_validationContext = validationContext ?? throw new ArgumentNullException(nameof(validationContext));
34+
_packageFileService = packageFileService ?? throw new ArgumentNullException(nameof(packageFileService));
35+
_validatorProvider = validatorProvider ?? throw new ArgumentNullException(nameof(validatorProvider));
3036
_telemetryService = telemetryService ?? throw new ArgumentNullException(nameof(telemetryService));
3137
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
3238
}
@@ -58,12 +64,14 @@ public async Task<PackageValidationSet> CreateValidationSetAsync(PackageValidati
5864
public async Task MarkValidationStartedAsync(PackageValidation packageValidation, IValidationResult validationResult)
5965
{
6066
packageValidation = packageValidation ?? throw new ArgumentNullException(nameof(packageValidation));
67+
6168
_logger.LogInformation("Marking validation {ValidationName} {ValidationId} {PackageId} {PackageVersion} as started with status {ValidationStatus}",
6269
packageValidation.Type,
6370
packageValidation.PackageValidationSet.ValidationTrackingId,
6471
packageValidation.PackageValidationSet.PackageId,
6572
packageValidation.PackageValidationSet.PackageNormalizedVersion,
6673
validationResult.Status);
74+
6775
if (validationResult.Status == ValidationStatus.NotStarted)
6876
{
6977
throw new ArgumentOutOfRangeException(
@@ -74,20 +82,10 @@ public async Task MarkValidationStartedAsync(PackageValidation packageValidation
7482
$"with status {ValidationStatus.NotStarted}");
7583
}
7684

77-
packageValidation.ValidationStatus = validationResult.Status;
78-
79-
// If the validation has completed, save the validation issues to the package's validation.
80-
if (validationResult.Status != ValidationStatus.Incomplete)
81-
{
82-
AddValidationIssues(packageValidation, validationResult.Issues);
83-
}
84-
8585
var now = DateTime.UtcNow;
86-
packageValidation.ValidationStatusTimestamp = now;
8786
packageValidation.Started = now;
88-
await _validationContext.SaveChangesAsync();
8987

90-
TrackValidationStatus(packageValidation);
88+
await SetValidationStatusAsync(packageValidation, validationResult, now);
9189
}
9290

9391
public Task UpdateValidationSetAsync(PackageValidationSet packageValidationSet)
@@ -107,24 +105,56 @@ public Task UpdateValidationSetAsync(PackageValidationSet packageValidationSet)
107105
public async Task UpdateValidationStatusAsync(PackageValidation packageValidation, IValidationResult validationResult)
108106
{
109107
packageValidation = packageValidation ?? throw new ArgumentNullException(nameof(packageValidation));
108+
109+
if (packageValidation.ValidationStatus == validationResult.Status)
110+
{
111+
_logger.LogInformation("Validation {ValidationName} {ValidationId} {PackageId} {PackageVersion} already has status {ValidationStatus}",
112+
packageValidation.Type,
113+
packageValidation.PackageValidationSet.ValidationTrackingId,
114+
packageValidation.PackageValidationSet.PackageId,
115+
packageValidation.PackageValidationSet.PackageNormalizedVersion,
116+
validationResult.Status);
117+
118+
return;
119+
}
120+
110121
_logger.LogInformation("Updating the status of the validation {ValidationName} {ValidationId} {PackageId} {PackageVersion} to {ValidationStatus}",
111122
packageValidation.Type,
112123
packageValidation.PackageValidationSet.ValidationTrackingId,
113124
packageValidation.PackageValidationSet.PackageId,
114125
packageValidation.PackageValidationSet.PackageNormalizedVersion,
115126
validationResult.Status);
116127

117-
if (packageValidation.ValidationStatus == validationResult.Status)
128+
await SetValidationStatusAsync(packageValidation, validationResult, DateTime.UtcNow);
129+
}
130+
131+
private async Task SetValidationStatusAsync(
132+
PackageValidation packageValidation,
133+
IValidationResult validationResult,
134+
DateTime now)
135+
{
136+
if (validationResult.Status != ValidationStatus.Incomplete)
118137
{
119-
return;
138+
AddValidationIssues(packageValidation, validationResult.Issues);
120139
}
121140

122-
var previousValidationStatus = packageValidation.ValidationStatus;
141+
if (validationResult.Status == ValidationStatus.Succeeded
142+
&& validationResult.NupkgUrl != null)
143+
{
144+
if (!_validatorProvider.IsProcessor(packageValidation.Type))
145+
{
146+
throw new InvalidOperationException(
147+
$"The validator '{packageValidation.Type}' is not a processor but returned a .nupkg URL as " +
148+
$"part of the validation result.");
149+
}
123150

124-
AddValidationIssues(packageValidation, validationResult.Issues);
151+
await _packageFileService.CopyPackageUrlForValidationSetAsync(
152+
packageValidation.PackageValidationSet,
153+
validationResult.NupkgUrl);
154+
}
125155

126156
packageValidation.ValidationStatus = validationResult.Status;
127-
packageValidation.ValidationStatusTimestamp = DateTime.UtcNow;
157+
packageValidation.ValidationStatusTimestamp = now;
128158
await _validationContext.SaveChangesAsync();
129159

130160
TrackValidationStatus(packageValidation);

src/Validation.Common.Job/Validation.Common.Job.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@
8484
<Version>2.18.0</Version>
8585
</PackageReference>
8686
<PackageReference Include="NuGetGallery.Core">
87-
<Version>4.4.4-dev-25609</Version>
87+
<Version>4.4.4-dev-25804</Version>
8888
</PackageReference>
8989
<PackageReference Include="Serilog">
9090
<Version>2.5.0</Version>

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,23 @@ public async Task CopyValidationSetPackageToPackageFileAsync()
176176
_fileStorageService.Verify();
177177
}
178178

179+
[Fact]
180+
public async Task CopyPackageUrlForValidationSetAsync()
181+
{
182+
_fileStorageService
183+
.Setup(x => x.CopyFileAsync(
184+
_testUri,
185+
_validationContainerName,
186+
_validationSetPackageFileName,
187+
It.Is<IAccessCondition>(y => y.IfMatchETag == null && y.IfNoneMatchETag == null)))
188+
.Returns(Task.CompletedTask)
189+
.Verifiable();
190+
191+
await _target.CopyPackageUrlForValidationSetAsync(_validationSet, _testUri.AbsoluteUri);
192+
193+
_fileStorageService.Verify();
194+
}
195+
179196
[Fact]
180197
public async Task DeletePackageForValidationSetAsync()
181198
{

0 commit comments

Comments
 (0)