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

Commit 766497b

Browse files
authored
Moved scan and sign enqueuer to the shared library. (#453)
* Moved scan and sign enqueuer to the shared library. Split the scan and sign configuration in two objects to allow enqueuer have message delay specified without having to carry unrelated settings. * Not passing IValidationRequest anymore into ScanAndSignEnqueuer. Makes code on the other side easier. * No more request passing into scan and sign enqueuer
1 parent 5e13e86 commit 766497b

10 files changed

Lines changed: 90 additions & 65 deletions

File tree

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ private void ConfigureJobServices(IServiceCollection services, IConfigurationRoo
159159
services.Configure<SmtpConfiguration>(configurationRoot.GetSection(SmtpConfigurationSectionName));
160160
services.Configure<EmailConfiguration>(configurationRoot.GetSection(EmailConfigurationSectionName));
161161
services.Configure<ScanAndSignConfiguration>(configurationRoot.GetSection(ScanAndSignSectionName));
162+
services.Configure<ScanAndSignEnqueuerConfiguration>(configurationRoot.GetSection(ScanAndSignSectionName));
162163

163164
services.AddTransient<ConfigurationValidator>();
164165
services.AddTransient<OrchestrationRunner>();

src/NuGet.Services.Validation.Orchestrator/NuGet.Services.Validation.Orchestrator.csproj

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,7 @@
6767
<Compile Include="PackageSigning\ProcessSignature\PackageSignatureProcessor.cs" />
6868
<Compile Include="PackageSigning\ProcessSignature\ProcessSignatureConfiguration.cs" />
6969
<Compile Include="PackageSigning\ProcessSignature\ProcessSignatureEnqueuer.cs" />
70-
<Compile Include="PackageSigning\ScanAndSign\IScanAndSignEnqueuer.cs" />
7170
<Compile Include="PackageSigning\ScanAndSign\ScanAndSignConfiguration.cs" />
72-
<Compile Include="PackageSigning\ScanAndSign\ScanAndSignEnqueuer.cs" />
7371
<Compile Include="PackageSigning\ScanAndSign\ScanAndSignProcessor.cs" />
7472
<Compile Include="PackageSigning\ValidateCertificate\IValidateCertificateEnqueuer.cs" />
7573
<Compile Include="PackageSigning\ValidateCertificate\PackageCertificatesValidator.cs" />

src/NuGet.Services.Validation.Orchestrator/PackageSigning/ScanAndSign/ScanAndSignConfiguration.cs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
// Copyright (c) .NET Foundation. All rights reserved.
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33

4-
using System;
54
using NuGet.Jobs.Configuration;
65
using NuGet.Services.Validation.Vcs;
76

@@ -15,12 +14,7 @@ public class ScanAndSignConfiguration
1514
public ServiceBusConfiguration ServiceBus { get; set; }
1615

1716
/// <summary>
18-
/// The visibility delay to apply to Service Bus messages requesting a new validation.
19-
/// </summary>
20-
public TimeSpan? MessageDelay { get; set; }
21-
22-
/// <summary>
23-
/// The criteria used to determine whether a package should be scanned.
17+
/// The criteria used to determine if a package should be submitted scanning.
2418
/// </summary>
2519
public PackageCriteria PackageCriteria { get; set; } = new PackageCriteria();
2620

src/NuGet.Services.Validation.Orchestrator/PackageSigning/ScanAndSign/ScanAndSignProcessor.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using NuGet.Jobs.Validation;
1212
using NuGet.Jobs.Validation.PackageSigning.Storage;
1313
using NuGet.Jobs.Validation.Storage;
14+
using NuGet.Jobs.Validation.ScanAndSign;
1415
using NuGet.Services.Validation.Vcs;
1516
using NuGetGallery;
1617

@@ -131,7 +132,7 @@ public async Task<IValidationResult> StartAsync(IValidationRequest request)
131132
_configuration.V3ServiceIndexUrl,
132133
owners);
133134

134-
await _scanAndSignEnqueuer.EnqueueScanAndSignAsync(request, _configuration.V3ServiceIndexUrl, owners);
135+
await _scanAndSignEnqueuer.EnqueueScanAndSignAsync(request.ValidationId, request.NupkgUrl, _configuration.V3ServiceIndexUrl, owners);
135136
}
136137
else
137138
{
@@ -140,7 +141,7 @@ public async Task<IValidationResult> StartAsync(IValidationRequest request)
140141
return ValidationResult.Succeeded;
141142
}
142143

143-
await _scanAndSignEnqueuer.EnqueueScanAsync(request);
144+
await _scanAndSignEnqueuer.EnqueueScanAsync(request.ValidationId, request.NupkgUrl);
144145
}
145146

146147
var result = await _validatorStateService.TryAddValidatorStatusAsync(request, validatorStatus, ValidationStatus.Incomplete);

src/NuGet.Services.Validation.Orchestrator/PackageSigning/ScanAndSign/IScanAndSignEnqueuer.cs renamed to src/Validation.ScanAndSign.Core/IScanAndSignEnqueuer.cs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,28 @@
11
// Copyright (c) .NET Foundation. All rights reserved.
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33

4+
using System;
45
using System.Collections.Generic;
56
using System.Threading.Tasks;
67

7-
namespace NuGet.Services.Validation.Orchestrator.PackageSigning.ScanAndSign
8+
namespace NuGet.Jobs.Validation.ScanAndSign
89
{
910
public interface IScanAndSignEnqueuer
1011
{
1112
/// <summary>
1213
/// Enqueues Scan operation.
1314
/// </summary>
14-
/// <param name="request">Request data</param>
15-
Task EnqueueScanAsync(IValidationRequest request);
15+
/// <param name="validationId">Validation ID for which scan is requested.</param>
16+
/// <param name="nupkgUrl">Url of the package to scan.</param>
17+
Task EnqueueScanAsync(Guid validationId, string nupkgUrl);
1618

1719
/// <summary>
1820
/// Enqueues Scan And Sign operation.
1921
/// </summary>
20-
/// <param name="request">The requested package validation.</param>
22+
/// <param name="validationId">Validation ID for which scan and sign is requested.</param>
23+
/// <param name="nupkgUrl">Url of the package to scan and sign.</param>
2124
/// <param name="v3ServiceIndexUrl">The service index URL that should be put on the package's repository signature.</param>
2225
/// <param name="owners">The list of owners that should be put on the package's repository signature.</param>
23-
Task EnqueueScanAndSignAsync(IValidationRequest request, string v3ServiceIndexUrl, List<string> owners);
26+
Task EnqueueScanAndSignAsync(Guid validationId, string nupkgUrl, string v3ServiceIndexUrl, List<string> owners);
2427
}
2528
}

src/NuGet.Services.Validation.Orchestrator/PackageSigning/ScanAndSign/ScanAndSignEnqueuer.cs renamed to src/Validation.ScanAndSign.Core/ScanAndSignEnqueuer.cs

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,22 @@
66
using System.Threading.Tasks;
77
using Microsoft.Extensions.Logging;
88
using Microsoft.Extensions.Options;
9-
using NuGet.Jobs.Validation.ScanAndSign;
109
using NuGet.Services.ServiceBus;
10+
using NuGet.Services.Validation;
1111

12-
namespace NuGet.Services.Validation.Orchestrator.PackageSigning.ScanAndSign
12+
namespace NuGet.Jobs.Validation.ScanAndSign
1313
{
1414
public class ScanAndSignEnqueuer : IScanAndSignEnqueuer
1515
{
1616
private readonly ITopicClient _topicClient;
1717
private readonly IBrokeredMessageSerializer<ScanAndSignMessage> _serializer;
18-
private readonly ScanAndSignConfiguration _configuration;
18+
private readonly ScanAndSignEnqueuerConfiguration _configuration;
1919
private readonly ILogger<IScanAndSignEnqueuer> _logger;
2020

2121
public ScanAndSignEnqueuer(
2222
ITopicClient topicClient,
2323
IBrokeredMessageSerializer<ScanAndSignMessage> serializer,
24-
IOptionsSnapshot<ScanAndSignConfiguration> configurationAccessor,
24+
IOptionsSnapshot<ScanAndSignEnqueuerConfiguration> configurationAccessor,
2525
ILogger<IScanAndSignEnqueuer> logger)
2626
{
2727
_topicClient = topicClient ?? throw new ArgumentNullException(nameof(topicClient));
@@ -39,23 +39,27 @@ public ScanAndSignEnqueuer(
3939
_configuration = configurationAccessor.Value;
4040
}
4141

42-
public Task EnqueueScanAsync(IValidationRequest request)
42+
public Task EnqueueScanAsync(Guid validationId, string nupkgUrl)
4343
{
44-
if (request == null)
44+
if (nupkgUrl == null)
4545
{
46-
throw new ArgumentNullException(nameof(request));
46+
throw new ArgumentNullException(nameof(nupkgUrl));
4747
}
4848

4949
return SendScanAndSignMessageAsync(
5050
new ScanAndSignMessage(
5151
OperationRequestType.Scan,
52-
request.ValidationId,
53-
new Uri(request.NupkgUrl)));
52+
validationId,
53+
new Uri(nupkgUrl)));
5454
}
5555

56-
public Task EnqueueScanAndSignAsync(IValidationRequest request, string v3ServiceIndexUrl, List<string> owners)
56+
public Task EnqueueScanAndSignAsync(Guid validationId, string nupkgUrl, string v3ServiceIndexUrl, List<string> owners)
5757
{
58-
if (request == null) throw new ArgumentNullException(nameof(request));
58+
if (nupkgUrl == null)
59+
{
60+
throw new ArgumentNullException(nameof(nupkgUrl));
61+
}
62+
5963
if (owners == null) throw new ArgumentNullException(nameof(owners));
6064

6165
if (string.IsNullOrEmpty(v3ServiceIndexUrl))
@@ -64,17 +68,17 @@ public Task EnqueueScanAndSignAsync(IValidationRequest request, string v3Service
6468
}
6569

6670
_logger.LogInformation(
67-
"Requested scan and sign for package {PackageId} {PackageVersion} using service index {ServiceIndex} and owners {Owners}",
68-
request.PackageId,
69-
request.PackageVersion,
71+
"Requested scan and sign for validation {ValidationId} {BlobUrl} using service index {ServiceIndex} and owners {Owners}",
72+
validationId,
73+
nupkgUrl,
7074
v3ServiceIndexUrl,
7175
owners);
7276

7377
return SendScanAndSignMessageAsync(
7478
new ScanAndSignMessage(
7579
OperationRequestType.Sign,
76-
request.ValidationId,
77-
new Uri(request.NupkgUrl),
80+
validationId,
81+
new Uri(nupkgUrl),
7882
v3ServiceIndexUrl,
7983
owners));
8084
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System;
5+
6+
namespace NuGet.Jobs.Validation.ScanAndSign
7+
{
8+
public class ScanAndSignEnqueuerConfiguration
9+
{
10+
/// <summary>
11+
/// The visibility delay to apply to Service Bus messages requesting a new validation.
12+
/// </summary>
13+
public TimeSpan? MessageDelay { get; set; }
14+
}
15+
}

src/Validation.ScanAndSign.Core/Validation.ScanAndSign.Core.csproj

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,22 @@
3737
<Reference Include="System.Data.DataSetExtensions" />
3838
<Reference Include="Microsoft.CSharp" />
3939
<Reference Include="System.Data" />
40-
<Reference Include="System.Net.Http" />
4140
<Reference Include="System.Xml" />
4241
</ItemGroup>
4342
<ItemGroup>
43+
<Compile Include="IScanAndSignEnqueuer.cs" />
4444
<Compile Include="OperationRequestType.cs" />
45+
<Compile Include="ScanAndSignEnqueuer.cs" />
46+
<Compile Include="ScanAndSignEnqueuerConfiguration.cs" />
4547
<Compile Include="ScanAndSignMessage.cs" />
4648
<Compile Include="Properties\AssemblyInfo.cs" />
4749
<Compile Include="Properties\AssemblyInfo.*.cs" />
4850
<Compile Include="ScanAndSignMessageSerializer.cs" />
4951
</ItemGroup>
5052
<ItemGroup>
53+
<PackageReference Include="Microsoft.Extensions.Options">
54+
<Version>1.1.2</Version>
55+
</PackageReference>
5156
<PackageReference Include="NuGet.Services.ServiceBus">
5257
<Version>2.22.0</Version>
5358
</PackageReference>

tests/Validation.PackageSigning.ScanAndSign.Tests/ScanAndSignEnqueuerFacts.cs

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
using NuGet.Services.ServiceBus;
1212
using NuGet.Services.Validation;
1313
using NuGet.Services.Validation.Orchestrator;
14-
using NuGet.Services.Validation.Orchestrator.PackageSigning.ScanAndSign;
1514
using Xunit;
1615

1716
namespace Validation.PackageSigning.ScanAndSign.Tests
@@ -59,7 +58,7 @@ public void ThrowsWhenConfigurationAccessorValueIsNull()
5958
{
6059
_configurationAccessorMock
6160
.SetupGet(ca => ca.Value)
62-
.Returns((ScanAndSignConfiguration)null);
61+
.Returns((ScanAndSignEnqueuerConfiguration)null);
6362

6463
var ex = Assert.Throws<ArgumentException>(() => new ScanAndSignEnqueuer(
6564
_topicClientMock.Object,
@@ -86,16 +85,16 @@ public void ThrowsWhenLoggerIsNull()
8685
public class TheEnqueueScanAsyncMethod : ScanAndSignEnqueuerFactsBase
8786
{
8887
[Fact]
89-
public async Task ThrowsWhenRequestIsNull()
88+
public async Task ThrowsWhenUrlIsNull()
9089
{
91-
var ex = await Assert.ThrowsAsync<ArgumentNullException>(() => _target.EnqueueScanAsync(null));
92-
Assert.Equal("request", ex.ParamName);
90+
var ex = await Assert.ThrowsAsync<ArgumentNullException>(() => _target.EnqueueScanAsync(Guid.NewGuid(), null));
91+
Assert.Equal("nupkgUrl", ex.ParamName);
9392
}
9493

9594
[Fact]
9695
public async Task PassesDataToSerializedMessage()
9796
{
98-
await _target.EnqueueScanAsync(_validationRequest);
97+
await _target.EnqueueScanAsync(_validationRequest.ValidationId, _validationRequest.NupkgUrl);
9998

10099
_serializerMock
101100
.Verify(s => s.Serialize(It.IsAny<ScanAndSignMessage>()), Times.Once);
@@ -113,7 +112,7 @@ public async Task SetsEnqueueTime()
113112
const int messageDelayDays = 137;
114113
_configuration.MessageDelay = TimeSpan.FromDays(messageDelayDays);
115114

116-
await _target.EnqueueScanAsync(_validationRequest);
115+
await _target.EnqueueScanAsync(_validationRequest.ValidationId, _validationRequest.NupkgUrl);
117116

118117
Assert.Equal(messageDelayDays, (_serializedMessage.ScheduledEnqueueTimeUtc - DateTimeOffset.UtcNow).TotalDays, 0);
119118
}
@@ -122,38 +121,43 @@ public async Task SetsEnqueueTime()
122121
public async Task SendsMessage()
123122
{
124123
var request = new ValidationRequest(Guid.NewGuid(), 42, "somepackage", "someversion", "https://example.com/testpackage.nupkg");
125-
await _target.EnqueueScanAsync(request);
124+
await _target.EnqueueScanAsync(request.ValidationId, request.NupkgUrl);
126125

127126
Assert.Same(_serializedMessage, _capturedBrokeredMessage);
128127
}
129128
}
130129

131130
public class TheEnqueueScanAndSignAsyncMethod : ScanAndSignEnqueuerFactsBase
132131
{
132+
public const string V3ServiceIndexUrl = "https://someurl";
133+
133134
[Fact]
134135
public async Task ThrowsWhenParametersAreMissing()
135136
{
136-
var ex1 = await Assert.ThrowsAsync<ArgumentNullException>(() => _target.EnqueueScanAndSignAsync(null, _configuration.V3ServiceIndexUrl, _owners));
137-
var ex2 = await Assert.ThrowsAsync<ArgumentException>(() => _target.EnqueueScanAndSignAsync(_validationRequest, null, _owners));
138-
var ex3 = await Assert.ThrowsAsync<ArgumentNullException>(() => _target.EnqueueScanAndSignAsync(_validationRequest, _configuration.V3ServiceIndexUrl, null));
139-
140-
Assert.Equal("request", ex1.ParamName);
137+
var ex1 = await Assert.ThrowsAsync<ArgumentNullException>(()
138+
=> _target.EnqueueScanAndSignAsync(_validationRequest.ValidationId, null, V3ServiceIndexUrl, _owners));
139+
var ex2 = await Assert.ThrowsAsync<ArgumentException>(()
140+
=> _target.EnqueueScanAndSignAsync(_validationRequest.ValidationId, _validationRequest.NupkgUrl, null, _owners));
141+
var ex3 = await Assert.ThrowsAsync<ArgumentNullException>(()
142+
=> _target.EnqueueScanAndSignAsync(_validationRequest.ValidationId, _validationRequest.NupkgUrl, V3ServiceIndexUrl, null));
143+
144+
Assert.Equal("nupkgUrl", ex1.ParamName);
141145
Assert.Equal("v3ServiceIndexUrl", ex2.ParamName);
142146
Assert.Equal("owners", ex3.ParamName);
143147
}
144148

145149
[Fact]
146150
public async Task PassesDataToSerializedMessage()
147151
{
148-
await _target.EnqueueScanAndSignAsync(_validationRequest, _configuration.V3ServiceIndexUrl, _owners);
152+
await _target.EnqueueScanAndSignAsync(_validationRequest.ValidationId, _validationRequest.NupkgUrl, V3ServiceIndexUrl, _owners);
149153

150154
_serializerMock
151155
.Verify(s => s.Serialize(It.IsAny<ScanAndSignMessage>()), Times.Once);
152156

153157
Assert.Equal(_validationRequest.ValidationId, _capturedMessage.PackageValidationId);
154158
Assert.Equal(OperationRequestType.Sign, _capturedMessage.OperationRequestType);
155159
Assert.Equal(_validationRequest.NupkgUrl, _capturedMessage.BlobUri.AbsoluteUri);
156-
Assert.Equal(_configuration.V3ServiceIndexUrl, _capturedMessage.V3ServiceIndexUrl);
160+
Assert.Equal(V3ServiceIndexUrl, _capturedMessage.V3ServiceIndexUrl);
157161
Assert.Equal(_owners, _capturedMessage.Owners);
158162
}
159163

@@ -163,15 +167,15 @@ public async Task SetsEnqueueTime()
163167
const int messageDelayDays = 137;
164168
_configuration.MessageDelay = TimeSpan.FromDays(messageDelayDays);
165169

166-
await _target.EnqueueScanAndSignAsync(_validationRequest, _configuration.V3ServiceIndexUrl, _owners);
170+
await _target.EnqueueScanAndSignAsync(_validationRequest.ValidationId, _validationRequest.NupkgUrl, V3ServiceIndexUrl, _owners);
167171

168172
Assert.Equal(messageDelayDays, (_serializedMessage.ScheduledEnqueueTimeUtc - DateTimeOffset.UtcNow).TotalDays, 0);
169173
}
170174

171175
[Fact]
172176
public async Task SendsMessage()
173177
{
174-
await _target.EnqueueScanAndSignAsync(_validationRequest, _configuration.V3ServiceIndexUrl, _owners);
178+
await _target.EnqueueScanAndSignAsync(_validationRequest.ValidationId, _validationRequest.NupkgUrl, V3ServiceIndexUrl, _owners);
175179

176180
Assert.Same(_serializedMessage, _capturedBrokeredMessage);
177181
}
@@ -181,9 +185,9 @@ public class ScanAndSignEnqueuerFactsBase
181185
{
182186
protected Mock<ITopicClient> _topicClientMock;
183187
protected Mock<IBrokeredMessageSerializer<ScanAndSignMessage>> _serializerMock;
184-
protected Mock<IOptionsSnapshot<ScanAndSignConfiguration>> _configurationAccessorMock;
185188
protected ILogger<ScanAndSignEnqueuer> _logger;
186-
protected ScanAndSignConfiguration _configuration;
189+
protected Mock<IOptionsSnapshot<ScanAndSignEnqueuerConfiguration>> _configurationAccessorMock;
190+
protected ScanAndSignEnqueuerConfiguration _configuration;
187191
protected ScanAndSignEnqueuer _target;
188192

189193
protected ScanAndSignMessage _capturedMessage;
@@ -197,13 +201,10 @@ public ScanAndSignEnqueuerFactsBase()
197201
{
198202
_topicClientMock = new Mock<ITopicClient>();
199203
_serializerMock = new Mock<IBrokeredMessageSerializer<ScanAndSignMessage>>();
200-
_configurationAccessorMock = new Mock<IOptionsSnapshot<ScanAndSignConfiguration>>();
201204
_logger = Mock.Of<ILogger<ScanAndSignEnqueuer>>();
205+
_configurationAccessorMock = new Mock<IOptionsSnapshot<ScanAndSignEnqueuerConfiguration>>();
202206

203-
_configuration = new ScanAndSignConfiguration();
204-
205-
_configuration.V3ServiceIndexUrl = "http://awesome.v3/service/index.json";
206-
207+
_configuration = new ScanAndSignEnqueuerConfiguration();
207208
_configurationAccessorMock
208209
.SetupGet(ca => ca.Value)
209210
.Returns(_configuration);

0 commit comments

Comments
 (0)