Skip to content

Commit b09e466

Browse files
authored
Add link to search for pending validations (#7925)
Today the on-call engineer has to connect to the database to find the pending validations. This adds a link to the admin panel to fetch the currently pending validations Addresses #7926
1 parent 00362bb commit b09e466

3 files changed

Lines changed: 85 additions & 5 deletions

File tree

src/NuGetGallery/Areas/Admin/Controllers/ValidationController.cs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,35 @@ public virtual ActionResult Index()
2727
return View(nameof(Index), new ValidationPageViewModel());
2828
}
2929

30+
[HttpGet]
31+
public virtual ActionResult Pending()
32+
{
33+
var validationSets = _validationAdminService.GetPending();
34+
var validatedPackages = ToValidatedPackages(validationSets);
35+
var validationSetIds = validatedPackages
36+
.SelectMany(p => p.ValidationSets)
37+
.Select(s => s.ValidationTrackingId);
38+
var query = string.Join("\r\n", validationSetIds);
39+
40+
return View(nameof(Index), new ValidationPageViewModel(query, validatedPackages));
41+
}
42+
3043
[HttpGet]
3144
public virtual ActionResult Search(string q)
3245
{
3346
var packageValidationSets = _validationAdminService.Search(q ?? string.Empty);
47+
var validatedPackages = ToValidatedPackages(packageValidationSets);
48+
49+
return View(nameof(Index), new ValidationPageViewModel(q, validatedPackages));
50+
}
51+
52+
private List<ValidatedPackageViewModel> ToValidatedPackages(IReadOnlyList<PackageValidationSet> packageValidationSets)
53+
{
3454
var validatedPackages = new List<ValidatedPackageViewModel>();
3555
AppendValidatedPackages(validatedPackages, packageValidationSets, ValidatingType.Package);
3656
AppendValidatedPackages(validatedPackages, packageValidationSets, ValidatingType.SymbolPackage);
3757

38-
return View(nameof(Index), new ValidationPageViewModel(q, validatedPackages));
58+
return validatedPackages;
3959
}
4060

4161
private void AppendValidatedPackages(List<ValidatedPackageViewModel> validatedPackages, IEnumerable<PackageValidationSet> validationSets, ValidatingType validatingType)

src/NuGetGallery/Areas/Admin/Services/ValidationAdminService.cs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ namespace NuGetGallery.Areas.Admin.Services
1414
{
1515
public class ValidationAdminService
1616
{
17+
private const int PendingValidationsBatchSize = 100;
18+
1719
private readonly IEntityRepository<PackageValidationSet> _validationSets;
1820
private readonly IEntityRepository<PackageValidation> _validations;
1921
private readonly IEntityRepository<Package> _packages;
@@ -56,6 +58,29 @@ public IReadOnlyList<PackageValidationSet> Search(string query)
5658
.ToList();
5759
}
5860

61+
/// <summary>
62+
/// Fetch the list of validation sets whose packages are in the "validating" status.
63+
/// </summary>
64+
public IReadOnlyList<PackageValidationSet> GetPending()
65+
{
66+
var pendingValidations = new List<PackageValidationSet>();
67+
var pendingPackages = _packages
68+
.GetAll()
69+
.Where(p => p.PackageStatusKey == PackageStatus.Validating)
70+
.Select(p => p.Key)
71+
.ToList();
72+
var pendingSymbolPackages = _symbolPackages
73+
.GetAll()
74+
.Where(s => s.StatusKey == PackageStatus.Validating)
75+
.Select(s => s.Key)
76+
.ToList();
77+
78+
AddPendingValidationSets(pendingValidations, pendingPackages, ValidatingType.Package);
79+
AddPendingValidationSets(pendingValidations, pendingSymbolPackages, ValidatingType.SymbolPackage);
80+
81+
return pendingValidations;
82+
}
83+
5984
public PackageDeletedStatus GetDeletedStatus(int key, ValidatingType validatingType)
6085
{
6186
switch (validatingType)
@@ -200,5 +225,28 @@ private void SearchByPackageId(Dictionary<long, PackageValidationSet> validation
200225
validationSets[validationSet.Key] = validationSet;
201226
}
202227
}
228+
229+
private void AddPendingValidationSets(
230+
List<PackageValidationSet> validationSets,
231+
IReadOnlyList<int> packageKeys,
232+
ValidatingType type)
233+
{
234+
foreach (var packageKeyBatch in Batch(packageKeys, PendingValidationsBatchSize))
235+
{
236+
validationSets.AddRange(
237+
_validationSets
238+
.GetAll()
239+
.Where(v => v.ValidatingType == type)
240+
.Where(v => packageKeys.Contains(v.PackageKey)));
241+
}
242+
}
243+
244+
private IEnumerable<IEnumerable<TElement>> Batch<TElement>(IReadOnlyList<TElement> input, int size)
245+
{
246+
for (var i = 0; i < input.Count; i += size)
247+
{
248+
yield return input.Skip(i).Take(size);
249+
}
250+
}
203251
}
204252
}

src/NuGetGallery/Areas/Admin/Views/Validation/Index.cshtml

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
<section role="main" class="container main-container">
1818
<h2>Package Validations</h2>
1919

20+
<p>Get <a href="@Url.Action(actionName:"Pending")">pending validations</a>.</p>
21+
2022
<form method="get" action="@Url.Action(actionName: "Search")">
2123
<p>
2224
<textarea name="q" placeholder="Search for package validations..." autocomplete="off" autofocus style="width: 100%" rows="5">@Model.Query</textarea>
@@ -28,9 +30,9 @@
2830

2931
@if (Model.HasQuery && !Model.HasResults)
3032
{
31-
<p>No results found.</p>
33+
<p>No results found. Try <a href="@Url.Action(actionName: "Pending")">pending validations</a>.</p>
3234
}
33-
else if(!Model.HasQuery)
35+
else if (!Model.HasQuery)
3436
{
3537
<p>You can search by:</p>
3638
<ul>
@@ -59,7 +61,17 @@
5961
break;
6062
}
6163

62-
<b>@package.ValidatingType Key:</b> @package.PackageKey<br />
64+
@switch (package.ValidatingType)
65+
{
66+
case ValidatingType.SymbolPackage:
67+
<b>Symbol Package Key:</b> @package.PackageKey<br />
68+
break;
69+
70+
default:
71+
<b>@package.ValidatingType Key:</b> @package.PackageKey<br />
72+
break;
73+
}
74+
6375
@if (package.DeletedStatus == PackageDeletedStatus.NotDeleted)
6476
{
6577
if (package.ValidatingType == ValidatingType.Package)
@@ -98,7 +110,7 @@
98110

99111
@if (package.DeletedStatus != PackageDeletedStatus.Unknown)
100112
{
101-
<a href="@Url.Package(package)">Package Details</a>
113+
<a href="@Url.Package(package)">Package details</a>
102114
}
103115
</p>
104116

0 commit comments

Comments
 (0)