Skip to content

Commit 51ca9a7

Browse files
authored
Fix for broken package delete (#6642)
* Package delete was broken with recent update. This fixes it. * Moved folder names into its own class. Updated tests to include All folders. * Added tests to verify all folders are covered by tests.
1 parent 36acf28 commit 51ca9a7

22 files changed

Lines changed: 193 additions & 167 deletions

src/NuGetGallery.Core/CoreConstants.cs

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,21 +25,24 @@ public static class CoreConstants
2525

2626
public const string DefaultCacheControl = "max-age=120";
2727

28-
public const string UserCertificatesFolderName = "user-certificates";
29-
public const string ContentFolderName = "content";
30-
public const string DownloadsFolderName = "downloads";
31-
public const string PackageBackupsFolderName = "package-backups";
32-
public const string PackageReadMesFolderName = "readmes";
33-
public const string PackagesFolderName = "packages";
34-
public const string PackagesContentFolderName = "packages-content";
35-
public const string UploadsFolderName = "uploads";
36-
public const string ValidationFolderName = "validation";
37-
public const string RevalidationFolderName = "revalidation";
38-
public const string StatusFolderName = "status";
39-
40-
public const string SymbolPackagesFolderName = "symbol-packages";
28+
public static class Folders
29+
{
30+
public const string UserCertificatesFolderName = "user-certificates";
31+
public const string ContentFolderName = "content";
32+
public const string DownloadsFolderName = "downloads";
33+
public const string PackageBackupsFolderName = "package-backups";
34+
public const string PackageReadMesFolderName = "readmes";
35+
public const string PackagesFolderName = "packages";
36+
public const string PackagesContentFolderName = "packages-content";
37+
public const string UploadsFolderName = "uploads";
38+
public const string ValidationFolderName = "validation";
39+
public const string RevalidationFolderName = "revalidation";
40+
public const string StatusFolderName = "status";
41+
public const string SymbolPackagesFolderName = "symbol-packages";
42+
public const string SymbolPackageBackupsFolderName = "symbol-package-backups";
43+
}
44+
4145
public const string NuGetSymbolPackageFileExtension = ".snupkg";
42-
public const string SymbolPackageBackupsFolderName = "symbol-package-backups";
4346

4447
public const string UploadTracingKeyHeaderName = "upload-id";
4548

src/NuGetGallery.Core/Services/CloudBlobCoreFileStorageService.cs

Lines changed: 39 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -28,21 +28,22 @@ public class CloudBlobCoreFileStorageService : ICoreFileStorageService
2828
private static readonly TimeSpan CopyPollFrequency = TimeSpan.FromMilliseconds(500);
2929

3030
private static readonly HashSet<string> KnownPublicFolders = new HashSet<string> {
31-
CoreConstants.PackagesFolderName,
32-
CoreConstants.PackageBackupsFolderName,
33-
CoreConstants.DownloadsFolderName,
34-
CoreConstants.SymbolPackagesFolderName,
35-
CoreConstants.SymbolPackageBackupsFolderName
31+
CoreConstants.Folders.PackagesFolderName,
32+
CoreConstants.Folders.PackageBackupsFolderName,
33+
CoreConstants.Folders.DownloadsFolderName,
34+
CoreConstants.Folders.SymbolPackagesFolderName,
35+
CoreConstants.Folders.SymbolPackageBackupsFolderName
3636
};
3737

3838
private static readonly HashSet<string> KnownPrivateFolders = new HashSet<string> {
39-
CoreConstants.ContentFolderName,
40-
CoreConstants.UploadsFolderName,
41-
CoreConstants.PackageReadMesFolderName,
42-
CoreConstants.ValidationFolderName,
43-
CoreConstants.UserCertificatesFolderName,
44-
CoreConstants.RevalidationFolderName,
45-
CoreConstants.StatusFolderName,
39+
CoreConstants.Folders.ContentFolderName,
40+
CoreConstants.Folders.UploadsFolderName,
41+
CoreConstants.Folders.PackageReadMesFolderName,
42+
CoreConstants.Folders.ValidationFolderName,
43+
CoreConstants.Folders.UserCertificatesFolderName,
44+
CoreConstants.Folders.RevalidationFolderName,
45+
CoreConstants.Folders.StatusFolderName,
46+
CoreConstants.Folders.PackagesContentFolderName,
4647
};
4748

4849
protected readonly ICloudBlobClient _client;
@@ -613,29 +614,29 @@ private static string GetContentType(string folderName)
613614
{
614615
switch (folderName)
615616
{
616-
case CoreConstants.PackagesFolderName:
617-
case CoreConstants.PackageBackupsFolderName:
618-
case CoreConstants.UploadsFolderName:
619-
case CoreConstants.ValidationFolderName:
620-
case CoreConstants.SymbolPackagesFolderName:
621-
case CoreConstants.SymbolPackageBackupsFolderName:
617+
case CoreConstants.Folders.PackagesFolderName:
618+
case CoreConstants.Folders.PackageBackupsFolderName:
619+
case CoreConstants.Folders.UploadsFolderName:
620+
case CoreConstants.Folders.ValidationFolderName:
621+
case CoreConstants.Folders.SymbolPackagesFolderName:
622+
case CoreConstants.Folders.SymbolPackageBackupsFolderName:
622623
return CoreConstants.PackageContentType;
623624

624-
case CoreConstants.DownloadsFolderName:
625+
case CoreConstants.Folders.DownloadsFolderName:
625626
return CoreConstants.OctetStreamContentType;
626627

627-
case CoreConstants.PackageReadMesFolderName:
628+
case CoreConstants.Folders.PackageReadMesFolderName:
628629
return CoreConstants.TextContentType;
629630

630-
case CoreConstants.ContentFolderName:
631-
case CoreConstants.RevalidationFolderName:
632-
case CoreConstants.StatusFolderName:
631+
case CoreConstants.Folders.ContentFolderName:
632+
case CoreConstants.Folders.RevalidationFolderName:
633+
case CoreConstants.Folders.StatusFolderName:
633634
return CoreConstants.JsonContentType;
634635

635-
case CoreConstants.UserCertificatesFolderName:
636+
case CoreConstants.Folders.UserCertificatesFolderName:
636637
return CoreConstants.CertificateContentType;
637638

638-
case CoreConstants.PackagesContentFolderName:
639+
case CoreConstants.Folders.PackagesContentFolderName:
639640
return CoreConstants.OctetStreamContentType;
640641

641642
default:
@@ -648,21 +649,21 @@ private static string GetCacheControl(string folderName)
648649
{
649650
switch (folderName)
650651
{
651-
case CoreConstants.PackagesFolderName:
652-
case CoreConstants.SymbolPackagesFolderName:
653-
case CoreConstants.PackagesContentFolderName:
654-
case CoreConstants.ValidationFolderName:
652+
case CoreConstants.Folders.PackagesFolderName:
653+
case CoreConstants.Folders.SymbolPackagesFolderName:
654+
case CoreConstants.Folders.ValidationFolderName:
655655
return CoreConstants.DefaultCacheControl;
656656

657-
case CoreConstants.PackageBackupsFolderName:
658-
case CoreConstants.UploadsFolderName:
659-
case CoreConstants.SymbolPackageBackupsFolderName:
660-
case CoreConstants.DownloadsFolderName:
661-
case CoreConstants.PackageReadMesFolderName:
662-
case CoreConstants.ContentFolderName:
663-
case CoreConstants.RevalidationFolderName:
664-
case CoreConstants.StatusFolderName:
665-
case CoreConstants.UserCertificatesFolderName:
657+
case CoreConstants.Folders.PackageBackupsFolderName:
658+
case CoreConstants.Folders.UploadsFolderName:
659+
case CoreConstants.Folders.SymbolPackageBackupsFolderName:
660+
case CoreConstants.Folders.DownloadsFolderName:
661+
case CoreConstants.Folders.PackageReadMesFolderName:
662+
case CoreConstants.Folders.ContentFolderName:
663+
case CoreConstants.Folders.RevalidationFolderName:
664+
case CoreConstants.Folders.StatusFolderName:
665+
case CoreConstants.Folders.UserCertificatesFolderName:
666+
case CoreConstants.Folders.PackagesContentFolderName:
666667
return null;
667668

668669
default:

src/NuGetGallery.Core/Services/PackageFileServiceMetadata.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,19 @@ namespace NuGetGallery
55
{
66
public class PackageFileMetadataService : IFileMetadataService
77
{
8-
public string FileFolderName => CoreConstants.PackagesFolderName;
8+
public string FileFolderName => CoreConstants.Folders.PackagesFolderName;
99

10-
public string PackageContentFolderName => CoreConstants.PackagesContentFolderName;
10+
public string PackageContentFolderName => CoreConstants.Folders.PackagesContentFolderName;
1111

1212
public string PackageContentPathTemplate => CoreConstants.PackageContentFileSavePathTemplate;
1313

1414
public string FileSavePathTemplate => CoreConstants.PackageFileSavePathTemplate;
1515

1616
public string FileExtension => CoreConstants.NuGetPackageFileExtension;
1717

18-
public string ValidationFolderName => CoreConstants.ValidationFolderName;
18+
public string ValidationFolderName => CoreConstants.Folders.ValidationFolderName;
1919

20-
public string FileBackupsFolderName => CoreConstants.PackageBackupsFolderName;
20+
public string FileBackupsFolderName => CoreConstants.Folders.PackageBackupsFolderName;
2121

2222
public string FileBackupSavePathTemplate => CoreConstants.PackageFileBackupSavePathTemplate;
2323
}

src/NuGetGallery.Core/Services/RevalidationStateService.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public async Task<RevalidationState> MaybeUpdateStateAsync(Func<RevalidationStat
6767
jsonWriter.Flush();
6868
stream.Position = 0;
6969

70-
await _storage.SaveFileAsync(CoreConstants.RevalidationFolderName, StateFileName, stream, accessCondition);
70+
await _storage.SaveFileAsync(CoreConstants.Folders.RevalidationFolderName, StateFileName, stream, accessCondition);
7171
}
7272

7373
return state;
@@ -80,11 +80,11 @@ public async Task<RevalidationState> MaybeUpdateStateAsync(Func<RevalidationStat
8080

8181
private async Task<InternalState> GetInternalStateAsync()
8282
{
83-
var fileReference = await _storage.GetFileReferenceAsync(CoreConstants.RevalidationFolderName, StateFileName);
83+
var fileReference = await _storage.GetFileReferenceAsync(CoreConstants.Folders.RevalidationFolderName, StateFileName);
8484

8585
if (fileReference == null)
8686
{
87-
throw new InvalidOperationException($"Could not find file '{StateFileName}' in folder '{CoreConstants.RevalidationFolderName}'");
87+
throw new InvalidOperationException($"Could not find file '{StateFileName}' in folder '{CoreConstants.Folders.RevalidationFolderName}'");
8888
}
8989

9090
using (var fileStream = fileReference.OpenRead())
@@ -95,7 +95,7 @@ private async Task<InternalState> GetInternalStateAsync()
9595

9696
if (state == null)
9797
{
98-
throw new InvalidOperationException($"State blob '{StateFileName}' in folder '{CoreConstants.RevalidationFolderName}' is malformed");
98+
throw new InvalidOperationException($"State blob '{StateFileName}' in folder '{CoreConstants.Folders.RevalidationFolderName}' is malformed");
9999
}
100100

101101
return new InternalState(fileReference, state);

src/NuGetGallery.Core/Services/SymbolPackageFileServiceMetadata.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ namespace NuGetGallery
77
{
88
public class SymbolPackageFileMetadataService : IFileMetadataService
99
{
10-
public string FileFolderName => CoreConstants.SymbolPackagesFolderName;
10+
public string FileFolderName => CoreConstants.Folders.SymbolPackagesFolderName;
1111

1212
public string PackageContentFolderName => throw new NotImplementedException();
1313
public string PackageContentPathTemplate => throw new NotImplementedException();
@@ -16,9 +16,9 @@ public class SymbolPackageFileMetadataService : IFileMetadataService
1616

1717
public string FileExtension => CoreConstants.NuGetSymbolPackageFileExtension;
1818

19-
public string ValidationFolderName => CoreConstants.ValidationFolderName;
19+
public string ValidationFolderName => CoreConstants.Folders.ValidationFolderName;
2020

21-
public string FileBackupsFolderName => CoreConstants.SymbolPackageBackupsFolderName;
21+
public string FileBackupsFolderName => CoreConstants.Folders.SymbolPackageBackupsFolderName;
2222

2323
public string FileBackupSavePathTemplate => CoreConstants.PackageFileBackupSavePathTemplate;
2424
}

src/NuGetGallery/Services/CertificateService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ private async Task SaveToFileStorageAsync(CertificateFile certificateFile)
172172
try
173173
{
174174
await _fileStorageService.SaveFileAsync(
175-
CoreConstants.UserCertificatesFolderName,
175+
CoreConstants.Folders.UserCertificatesFolderName,
176176
filePath,
177177
certificateFile.Stream,
178178
overwrite: false);

src/NuGetGallery/Services/CloudBlobFileStorageService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ internal Uri GetRedirectUri(Uri requestUrl, Uri blobUri)
9797

9898
public async Task<bool> IsAvailableAsync()
9999
{
100-
var container = await GetContainerAsync(CoreConstants.PackagesFolderName);
100+
var container = await GetContainerAsync(CoreConstants.Folders.PackagesFolderName);
101101
return await container.ExistsAsync();
102102
}
103103
}

src/NuGetGallery/Services/ContentService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ private async Task<ContentItem> RefreshContentFromFile(string fileName, ContentI
124124
using (Trace.Activity("Downloading Content Item: " + fileName))
125125
{
126126
IFileReference reference = await FileStorage.GetFileReferenceAsync(
127-
CoreConstants.ContentFolderName,
127+
CoreConstants.Folders.ContentFolderName,
128128
fileName,
129129
ifNoneMatch: cachedItem?.ContentId);
130130

src/NuGetGallery/Services/FileSystemFileStorageService.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -299,11 +299,11 @@ private static string GetContentType(string folderName)
299299
{
300300
switch (folderName)
301301
{
302-
case CoreConstants.PackagesFolderName:
303-
case CoreConstants.SymbolPackagesFolderName:
302+
case CoreConstants.Folders.PackagesFolderName:
303+
case CoreConstants.Folders.SymbolPackagesFolderName:
304304
return CoreConstants.PackageContentType;
305305

306-
case CoreConstants.DownloadsFolderName:
306+
case CoreConstants.Folders.DownloadsFolderName:
307307
return CoreConstants.OctetStreamContentType;
308308

309309
default:

src/NuGetGallery/Services/PackageFileService.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,13 @@ public PackageFileService(IFileStorageService fileStorageService)
2828
public Task<ActionResult> CreateDownloadPackageActionResultAsync(Uri requestUrl, Package package)
2929
{
3030
var fileName = BuildFileName(package, CoreConstants.PackageFileSavePathTemplate, CoreConstants.NuGetPackageFileExtension);
31-
return _fileStorageService.CreateDownloadFileActionResultAsync(requestUrl, CoreConstants.PackagesFolderName, fileName);
31+
return _fileStorageService.CreateDownloadFileActionResultAsync(requestUrl, CoreConstants.Folders.PackagesFolderName, fileName);
3232
}
3333

3434
public Task<ActionResult> CreateDownloadPackageActionResultAsync(Uri requestUrl, string id, string version)
3535
{
3636
var fileName = BuildFileName(id, version, CoreConstants.PackageFileSavePathTemplate, CoreConstants.NuGetPackageFileExtension);
37-
return _fileStorageService.CreateDownloadFileActionResultAsync(requestUrl, CoreConstants.PackagesFolderName, fileName);
37+
return _fileStorageService.CreateDownloadFileActionResultAsync(requestUrl, CoreConstants.Folders.PackagesFolderName, fileName);
3838
}
3939

4040
/// <summary>
@@ -50,7 +50,7 @@ public Task DeleteReadMeMdFileAsync(Package package)
5050

5151
var fileName = BuildFileName(package, ReadMeFilePathTemplateActive, GalleryConstants.MarkdownFileExtension);
5252

53-
return _fileStorageService.DeleteFileAsync(CoreConstants.PackageReadMesFolderName, fileName);
53+
return _fileStorageService.DeleteFileAsync(CoreConstants.Folders.PackageReadMesFolderName, fileName);
5454
}
5555

5656
/// <summary>
@@ -69,7 +69,7 @@ public async Task SaveReadMeMdFileAsync(Package package, string readMeMd)
6969

7070
using (var readMeMdStream = new MemoryStream(Encoding.UTF8.GetBytes(readMeMd)))
7171
{
72-
await _fileStorageService.SaveFileAsync(CoreConstants.PackageReadMesFolderName, fileName, readMeMdStream, overwrite: true);
72+
await _fileStorageService.SaveFileAsync(CoreConstants.Folders.PackageReadMesFolderName, fileName, readMeMdStream, overwrite: true);
7373
}
7474
}
7575

@@ -86,7 +86,7 @@ public async Task<string> DownloadReadMeMdFileAsync(Package package)
8686

8787
var fileName = BuildFileName(package, ReadMeFilePathTemplateActive, GalleryConstants.MarkdownFileExtension);
8888

89-
using (var readMeMdStream = await _fileStorageService.GetFileAsync(CoreConstants.PackageReadMesFolderName, fileName))
89+
using (var readMeMdStream = await _fileStorageService.GetFileAsync(CoreConstants.Folders.PackageReadMesFolderName, fileName))
9090
{
9191
// Note that fileStorageService implementations return null if not found.
9292
if (readMeMdStream != null)

0 commit comments

Comments
 (0)