e2etest/GuestProxyAgentTest/Utilities/StorageHelper.cs (91 lines of code) (raw):
// Copyright (c) Microsoft Corporation
// SPDX-License-Identifier: MIT
using Azure.Core;
using Azure.Identity;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Specialized;
using Azure.Storage.Sas;
using GuestProxyAgentTest.Settings;
using System.Security.Cryptography.X509Certificates;
namespace GuestProxyAgentTest.Utilities
{
/// <summary>
/// Helper class for operation shared storage account 'e2etestsharedstorage'
/// </summary>
internal class StorageHelper
{
private static StorageHelper _instance = null!;
private TokenCredential tokenCredential = null!;
private StorageHelper() { }
/// <summary>
/// Init of the StorageHelper Instance
/// </summary>
/// <param name="tenantId">azure tenant id</param>
/// <param name="appClientId">application id of the app principal</param>
/// <param name="cert">certificate that will be used to retrieved the app principal</param>
public static void Init(string tenantId, string appClientId)
{
if(_instance != null) return;
_instance = new StorageHelper();
_instance.tokenCredential = new GuestProxyAgentE2EStorageAccountTokenCredential();
}
/// <summary>
/// Instance of StorageHelper, need to call Init before using
/// The storageHelper will operate the pre-created storage account 'e2etestsharedstorage'
/// </summary>
public static StorageHelper Instance
{
get
{
if(null == _instance)
{
throw new Exception("");
}
return _instance;
}
}
/// <summary>
/// Create an append blob in the shared blob
/// </summary>
/// <param name="containerName">blob container name</param>
/// <param name="fileName">file name</param>
/// <param name="parentPathInBlob">parent folder path in the blob</param>
/// <returns></returns>
public string CreateAppendBlob(string containerName, string fileName, string parentPathInBlob = null!)
{
var containerClient = new BlobContainerClient(new Uri($"{TestSetting.Instance.sharedStorageAccountUrl}/{containerName}"), this.tokenCredential);
if (null != parentPathInBlob)
{
fileName = $"{parentPathInBlob}/{fileName}";
}
containerClient.GetAppendBlobClient(fileName).CreateIfNotExists();
return GenerateSasUriFromSharedBlob(containerName, fileName);
}
/// <summary>
/// Upload to local file to the shared blob, will use the local file name on the blob file name
/// </summary>
/// <param name="containerName">container name</param>
/// <param name="filePath">local file path(full path)</param>
/// <param name="parentPathInBlob">parent folder name in the blob</param>
/// <returns></returns>
public string Upload2SharedBlob(string containerName, string filePath, string parentPathInBlob = null!)
{
return Upload2SharedBlob(containerName, filePath, Path.GetFileName(filePath), parentPathInBlob);
}
/// <summary>
/// Upload to local file to shared blob with specified file name on the blob file name
/// </summary>
/// <param name="containerName">container name</param>
/// <param name="filePath">local file path (full path)</param>
/// <param name="fileName">file name that will be used as the blob file name</param>
/// <param name="parentPathInBlob">parent folder path in the blob</param>
/// <returns></returns>
public string Upload2SharedBlob(string containerName, string filePath, string fileName, string parentPathInBlob = null!)
{
var containerClient = new BlobContainerClient(new Uri($"{TestSetting.Instance.sharedStorageAccountUrl}/{containerName}"), this.tokenCredential);
if (null != parentPathInBlob)
{
fileName = $"{parentPathInBlob}/{fileName}";
}
containerClient.GetBlobClient(fileName).Upload(filePath, true);
return GenerateSasUriFromSharedBlob(containerName, fileName);
}
/// <summary>
/// Generate the SaS URI for a blob on shared repo
/// </summary>
/// <param name="containerName">container name</param>
/// <param name="fileName">file name including the parent path of the blob</param>
/// <returns></returns>
public string GenerateSasUriFromSharedBlob(string containerName, string fileName)
{
return DoGenerateSasUri(TestSetting.Instance.sharedStorageAccountUrl, containerName, fileName);
}
/// <summary>
/// Clean/delete all the folder under a folder of the shared blob
/// </summary>
/// <param name="containerName">container name</param>
/// <param name="folderPath">folder path in the blob</param>
public void CleanSharedBlobFolder(string containerName, string folderPath)
{
var serviceClient = new BlobServiceClient(new Uri(TestSetting.Instance.sharedStorageAccountUrl), this.tokenCredential);
var containerClient = serviceClient.GetBlobContainerClient(containerName);
foreach(var blob in containerClient.GetBlobs(prefix: folderPath))
{
containerClient.GetBlobClient(blob.Name).DeleteIfExists();
}
}
private string DoGenerateSasUri(string storageAccountUrl, string containerName, string fileName)
{
var bsClient = new BlobServiceClient(new Uri(storageAccountUrl), this.tokenCredential);
Azure.Storage.Blobs.Models.UserDelegationKey userDelegationKey =
bsClient.GetUserDelegationKey(DateTimeOffset.UtcNow.AddHours(-6),
DateTimeOffset.UtcNow.AddDays(1));
// Create a SAS token that's valid for one hour.
BlobSasBuilder sasBuilder = new BlobSasBuilder()
{
BlobContainerName = containerName,
Resource = "c"
};
sasBuilder.ExpiresOn = DateTimeOffset.UtcNow.AddDays(7);
sasBuilder.SetPermissions(BlobContainerSasPermissions.All);
BlobUriBuilder blobUriBuilder = new BlobUriBuilder(new Uri($"{storageAccountUrl}/{containerName}/{fileName}"))
{
Sas = sasBuilder.ToSasQueryParameters(userDelegationKey,
bsClient.AccountName)
};
return blobUriBuilder.ToUri().ToString();
}
}
}