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

Commit 6632e8e

Browse files
committed
Add support for "check validator" message in orchestrator (#303)
Progress on NuGet/NuGetGallery#7354
1 parent 77e8ec5 commit 6632e8e

10 files changed

Lines changed: 344 additions & 132 deletions

src/NuGet.Services.ServiceBus/BrokeredMessageSerializer.cs

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,6 @@ namespace NuGet.Services.ServiceBus
1414
/// <typeparam name="TMessage">A type decorated with a <see cref="SchemaAttribute"/>.</typeparam>
1515
public class BrokeredMessageSerializer<TMessage> : IBrokeredMessageSerializer<TMessage>
1616
{
17-
private const string SchemaNameKey = "SchemaName";
18-
private const string SchemaVersionKey = "SchemaVersion";
19-
2017
private static readonly string SchemaName;
2118
private static readonly int SchemaVersion;
2219

@@ -40,43 +37,49 @@ public IBrokeredMessage Serialize(TMessage message)
4037
var json = JsonConvert.SerializeObject(message);
4138
var brokeredMessage = new BrokeredMessageWrapper(json);
4239

43-
brokeredMessage.Properties[SchemaNameKey] = SchemaName;
44-
brokeredMessage.Properties[SchemaVersionKey] = SchemaVersion;
40+
brokeredMessage.Properties[BrokeredMessageSerializer.SchemaNameKey] = SchemaName;
41+
brokeredMessage.Properties[BrokeredMessageSerializer.SchemaVersionKey] = SchemaVersion;
4542

4643
return brokeredMessage;
4744
}
4845

4946
public TMessage Deserialize(IBrokeredMessage message)
5047
{
51-
AssertTypeAndSchemaVersion(message, SchemaName, SchemaVersion);
48+
message.AssertTypeAndSchemaVersion(SchemaName, SchemaVersion);
5249

5350
return JsonConvert.DeserializeObject<TMessage>(message.GetBody());
5451
}
52+
}
53+
54+
public static class BrokeredMessageSerializer
55+
{
56+
public const string SchemaNameKey = "SchemaName";
57+
public const string SchemaVersionKey = "SchemaVersion";
5558

56-
private static void AssertTypeAndSchemaVersion(IBrokeredMessage message, string type, int schemaVersion)
59+
public static void AssertTypeAndSchemaVersion(this IBrokeredMessage message, string type, int schemaVersion)
5760
{
58-
if (GetType(message) != type)
61+
if (message.GetSchemaName() != type)
5962
{
6063
throw new FormatException($"The provided message should have {SchemaNameKey} property '{type}'.");
6164
}
6265

63-
if (GetSchemaVersion(message) != schemaVersion)
66+
if (message.GetSchemaVersion() != schemaVersion)
6467
{
6568
throw new FormatException($"The provided message should have {SchemaVersionKey} property '{schemaVersion}'.");
6669
}
6770
}
6871

69-
private static int GetSchemaVersion(IBrokeredMessage message)
72+
public static int GetSchemaVersion(this IBrokeredMessage message)
7073
{
7174
return GetProperty<int>(message, SchemaVersionKey, "an integer");
7275
}
7376

74-
private static string GetType(IBrokeredMessage message)
77+
public static string GetSchemaName(this IBrokeredMessage message)
7578
{
7679
return GetProperty<string>(message, SchemaNameKey, "a string");
7780
}
7881

79-
private static T GetProperty<T>(IBrokeredMessage message, string key, string typeLabel)
82+
private static T GetProperty<T>(this IBrokeredMessage message, string key, string typeLabel)
8083
{
8184
object value;
8285
if (!message.Properties.TryGetValue(key, out value))
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
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.Services.Validation
7+
{
8+
public class CheckValidatorData
9+
{
10+
public CheckValidatorData(Guid validationId)
11+
{
12+
if (validationId == Guid.Empty)
13+
{
14+
throw new ArgumentOutOfRangeException(nameof(validationId));
15+
}
16+
17+
ValidationId = validationId;
18+
}
19+
20+
public Guid ValidationId { get; }
21+
}
22+
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
<Reference Include="System.Xml" />
4949
</ItemGroup>
5050
<ItemGroup>
51+
<Compile Include="CheckValidatorData.cs" />
5152
<Compile Include="Entities\BaseValidationIssue.cs" />
5253
<Compile Include="Entities\CertificateChainLink.cs" />
5354
<Compile Include="Entities\EndCertificate.cs" />
@@ -167,6 +168,8 @@
167168
<Compile Include="Migrations\ValidationMigrationsConfiguration.cs" />
168169
<Compile Include="PackageValidationEnqueuer.cs" />
169170
<Compile Include="PackageValidationMessageData.cs" />
171+
<Compile Include="PackageValidationMessageType.cs" />
172+
<Compile Include="ProcessValidationSetData.cs" />
170173
<Compile Include="Properties\AssemblyInfo.cs" />
171174
<Compile Include="Properties\AssemblyInfo.*.cs" />
172175
<Compile Include="ServiceBusMessageSerializer.cs" />

src/NuGet.Services.Validation/PackageValidationMessageData.cs

Lines changed: 54 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,58 +2,80 @@
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33

44
using System;
5-
using NuGet.Versioning;
65

76
namespace NuGet.Services.Validation
87
{
98
public class PackageValidationMessageData
109
{
11-
public PackageValidationMessageData(
12-
string packageId,
13-
string packageVersion,
14-
Guid validationTrackingId)
15-
: this(packageId, packageVersion, validationTrackingId, validatingType: ValidatingType.Package, deliveryCount: 0, entityKey: null)
16-
{
17-
}
18-
19-
public PackageValidationMessageData(
10+
public static PackageValidationMessageData NewProcessValidationSet(
2011
string packageId,
2112
string packageVersion,
2213
Guid validationTrackingId,
2314
ValidatingType validatingType,
24-
int? entityKey = null)
25-
: this(packageId, packageVersion, validationTrackingId, validatingType, deliveryCount: 0, entityKey: entityKey)
15+
int? entityKey)
2616
{
17+
return new PackageValidationMessageData(
18+
PackageValidationMessageType.ProcessValidationSet,
19+
processValidationSet: new ProcessValidationSetData(
20+
packageId,
21+
packageVersion,
22+
validationTrackingId,
23+
validatingType,
24+
entityKey),
25+
checkValidator: null,
26+
deliveryCount: 0);
27+
}
28+
29+
public static PackageValidationMessageData NewCheckValidator(Guid validationId)
30+
{
31+
return new PackageValidationMessageData(
32+
PackageValidationMessageType.CheckValidator,
33+
processValidationSet: null,
34+
checkValidator: new CheckValidatorData(validationId),
35+
deliveryCount: 0);
2736
}
2837

2938
internal PackageValidationMessageData(
30-
string packageId,
31-
string packageVersion,
32-
Guid validationTrackingId,
33-
ValidatingType validatingType,
34-
int deliveryCount,
35-
int? entityKey = null)
39+
PackageValidationMessageType type,
40+
ProcessValidationSetData processValidationSet,
41+
CheckValidatorData checkValidator,
42+
int deliveryCount)
3643
{
37-
if (validationTrackingId == Guid.Empty)
44+
switch (type)
45+
{
46+
case PackageValidationMessageType.ProcessValidationSet:
47+
if (processValidationSet == null)
48+
{
49+
throw new ArgumentNullException(nameof(processValidationSet));
50+
}
51+
break;
52+
case PackageValidationMessageType.CheckValidator:
53+
if (checkValidator == null)
54+
{
55+
throw new ArgumentNullException(nameof(checkValidator));
56+
}
57+
break;
58+
default:
59+
throw new NotSupportedException($"The package validation message type '{type}' is not supported.");
60+
}
61+
62+
var notNullCount = 0;
63+
notNullCount += processValidationSet != null ? 1 : 0;
64+
notNullCount += checkValidator != null ? 1 : 0;
65+
if (notNullCount > 1)
3866
{
39-
throw new ArgumentOutOfRangeException(nameof(validationTrackingId));
67+
throw new ArgumentException("There should be exactly one non-null data instance provided.");
4068
}
4169

42-
PackageId = packageId ?? throw new ArgumentNullException(nameof(packageId));
43-
PackageVersion = packageVersion ?? throw new ArgumentNullException(nameof(packageVersion));
44-
PackageNormalizedVersion = NuGetVersion.Parse(packageVersion).ToNormalizedString();
45-
ValidationTrackingId = validationTrackingId;
70+
Type = type;
71+
ProcessValidationSet = processValidationSet;
72+
CheckValidator = checkValidator;
4673
DeliveryCount = deliveryCount;
47-
ValidatingType = validatingType;
48-
EntityKey = entityKey;
4974
}
5075

51-
public string PackageId { get; }
52-
public string PackageVersion { get; }
53-
public string PackageNormalizedVersion { get; }
54-
public Guid ValidationTrackingId { get; }
76+
public PackageValidationMessageType Type { get; }
77+
public ProcessValidationSetData ProcessValidationSet { get; }
78+
public CheckValidatorData CheckValidator { get; }
5579
public int DeliveryCount { get; }
56-
public ValidatingType ValidatingType { get; }
57-
public int? EntityKey { get; }
5880
}
5981
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
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+
namespace NuGet.Services.Validation
5+
{
6+
public enum PackageValidationMessageType
7+
{
8+
ProcessValidationSet,
9+
CheckValidator,
10+
}
11+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
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+
using NuGet.Versioning;
6+
7+
namespace NuGet.Services.Validation
8+
{
9+
public class ProcessValidationSetData
10+
{
11+
public ProcessValidationSetData(
12+
string packageId,
13+
string packageVersion,
14+
Guid validationTrackingId,
15+
ValidatingType validatingType,
16+
int? entityKey)
17+
{
18+
if (validationTrackingId == Guid.Empty)
19+
{
20+
throw new ArgumentOutOfRangeException(nameof(validationTrackingId));
21+
}
22+
23+
PackageId = packageId;
24+
PackageVersion = packageVersion;
25+
PackageNormalizedVersion = NuGetVersion.Parse(packageVersion).ToNormalizedString();
26+
ValidationTrackingId = validationTrackingId;
27+
ValidatingType = validatingType;
28+
EntityKey = entityKey;
29+
}
30+
31+
public string PackageId { get; }
32+
public string PackageVersion { get; }
33+
public string PackageNormalizedVersion { get; }
34+
public Guid ValidationTrackingId { get; }
35+
public ValidatingType ValidatingType { get; }
36+
public int? EntityKey { get; }
37+
}
38+
}

src/NuGet.Services.Validation/ServiceBusMessageSerializer.cs

Lines changed: 56 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,38 +8,67 @@ namespace NuGet.Services.Validation
88
{
99
public class ServiceBusMessageSerializer : IServiceBusMessageSerializer
1010
{
11-
private const string PackageValidationSchemaName = "PackageValidationMessageData";
11+
private const string ProcessValidationSetSchemaName = "PackageValidationMessageData";
12+
private const string CheckValidatorSchemaName = "PackageValidationCheckValidatorMessageData";
1213

13-
private static readonly BrokeredMessageSerializer<PackageValidationMessageData1> _serializer = new BrokeredMessageSerializer<PackageValidationMessageData1>();
14+
private static readonly BrokeredMessageSerializer<ProcessValidationSetData1> _processValidationSetSerializer = new BrokeredMessageSerializer<ProcessValidationSetData1>();
15+
private static readonly BrokeredMessageSerializer<CheckValidatorData1> _checkValidatorSerializer = new BrokeredMessageSerializer<CheckValidatorData1>();
1416

1517
public IBrokeredMessage SerializePackageValidationMessageData(PackageValidationMessageData message)
1618
{
17-
return _serializer.Serialize(new PackageValidationMessageData1
19+
switch (message.Type)
1820
{
19-
PackageId = message.PackageId,
20-
PackageVersion = message.PackageVersion,
21-
PackageNormalizedVersion = message.PackageNormalizedVersion,
22-
ValidationTrackingId = message.ValidationTrackingId,
23-
ValidatingType = message.ValidatingType,
24-
EntityKey = message.EntityKey
25-
});
21+
case PackageValidationMessageType.ProcessValidationSet:
22+
return _processValidationSetSerializer.Serialize(new ProcessValidationSetData1
23+
{
24+
PackageId = message.ProcessValidationSet.PackageId,
25+
PackageVersion = message.ProcessValidationSet.PackageVersion,
26+
PackageNormalizedVersion = message.ProcessValidationSet.PackageNormalizedVersion,
27+
ValidationTrackingId = message.ProcessValidationSet.ValidationTrackingId,
28+
ValidatingType = message.ProcessValidationSet.ValidatingType,
29+
EntityKey = message.ProcessValidationSet.EntityKey,
30+
});
31+
case PackageValidationMessageType.CheckValidator:
32+
return _checkValidatorSerializer.Serialize(new CheckValidatorData1
33+
{
34+
ValidationId = message.CheckValidator.ValidationId,
35+
});
36+
default:
37+
throw new NotSupportedException($"The package validation message type '{message.Type}' is not supported.");
38+
}
2639
}
2740

2841
public PackageValidationMessageData DeserializePackageValidationMessageData(IBrokeredMessage message)
2942
{
30-
var data = _serializer.Deserialize(message);
31-
32-
return new PackageValidationMessageData(
33-
data.PackageId,
34-
data.PackageVersion,
35-
data.ValidationTrackingId,
36-
data.ValidatingType,
37-
message.DeliveryCount,
38-
data.EntityKey);
43+
var schemaName = message.GetSchemaName();
44+
switch (schemaName)
45+
{
46+
case ProcessValidationSetSchemaName:
47+
var processValidationSet = _processValidationSetSerializer.Deserialize(message);
48+
return new PackageValidationMessageData(
49+
PackageValidationMessageType.ProcessValidationSet,
50+
processValidationSet: new ProcessValidationSetData(
51+
processValidationSet.PackageId,
52+
processValidationSet.PackageVersion,
53+
processValidationSet.ValidationTrackingId,
54+
processValidationSet.ValidatingType,
55+
processValidationSet.EntityKey),
56+
checkValidator: null,
57+
deliveryCount: message.DeliveryCount);
58+
case CheckValidatorSchemaName:
59+
var checkValidator = _checkValidatorSerializer.Deserialize(message);
60+
return new PackageValidationMessageData(
61+
PackageValidationMessageType.CheckValidator,
62+
processValidationSet: null,
63+
checkValidator: new CheckValidatorData(checkValidator.ValidationId),
64+
deliveryCount: message.DeliveryCount);
65+
default:
66+
throw new FormatException($"The provided schema name '{schemaName}' is not supported.");
67+
}
3968
}
4069

41-
[Schema(Name = PackageValidationSchemaName, Version = 1)]
42-
private class PackageValidationMessageData1
70+
[Schema(Name = ProcessValidationSetSchemaName, Version = 1)]
71+
private class ProcessValidationSetData1
4372
{
4473
public string PackageId { get; set; }
4574
public string PackageVersion { get; set; }
@@ -48,5 +77,11 @@ private class PackageValidationMessageData1
4877
public ValidatingType ValidatingType { get; set; }
4978
public int? EntityKey { get; set; }
5079
}
80+
81+
[Schema(Name = CheckValidatorSchemaName, Version = 1)]
82+
private class CheckValidatorData1
83+
{
84+
public Guid ValidationId { get; set; }
85+
}
5186
}
5287
}

0 commit comments

Comments
 (0)