e2etest/GuestProxyAgentTest/Utilities/VMHelper.cs (68 lines of code) (raw):
// Copyright (c) Microsoft Corporation
// SPDX-License-Identifier: MIT
using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.Compute;
using Azure.ResourceManager.Resources;
using GuestProxyAgentTest.Settings;
using System.Security.Cryptography.X509Certificates;
namespace GuestProxyAgentTest.Utilities
{
/// <summary>
/// VMHelper class that will be used to VM operations
/// </summary>
internal class VMHelper
{
private static VMHelper _instance = null!;
private ArmClient client = null!;
private VMHelper() { }
/// <summary>
/// Single instance of VMHelper, needs to call Init before using
/// </summary>
public static VMHelper Instance
{
get
{
if(null == _instance)
{
throw new Exception("not init.");
}
return _instance;
}
}
/// <summary>
/// Init the VMHelper, need to be called before using VMHelper.Instance
/// </summary>
/// <param name="tenantId">azure tenant id</param>
/// <param name="appClientId">application principal id</param>
/// <param name="defaultSubId">default subscription id, the resources will be created on the default subscription</param>
/// <param name="cert">certificate that will be used to retrieve the application principal</param>
public static void Init(string tenantId, string appClientId, string defaultSubId)
{
if(null != _instance)
{
return;
}
_instance = new VMHelper();
_instance.client = new ArmClient(new GuestProxyAgentE2ETokenCredential(), defaultSubId);
}
/// <summary>
/// Get VirtualMachineResource of the VM, specified by resource group name and virtual machine name
/// </summary>
/// <param name="rgName">resource group name</param>
/// <param name="vmName">virtual machine name</param>
/// <returns></returns>
public VirtualMachineResource GetVMResource(string rgName, string vmName)
{
var sub = client.GetDefaultSubscription();
return sub.GetResourceGroups().Get(rgName).Value.GetVirtualMachine(vmName);
}
/// <summary>
/// Clean up the test related Azure resources, including resource group and saved azure blob storage,during the test.
/// </summary>
/// <param name="testCaseSetting">test case setting, that contains the information of the resources that needs to be cleaned up</param>
public void CleanupTestResources(TestScenarioSetting testCaseSetting)
{
var sub = client.GetDefaultSubscription();
var rgs = sub.GetResourceGroups();
if(rgs.Exists(testCaseSetting.ResourceGroupName))
{
rgs.Get(testCaseSetting.ResourceGroupName).Value.Delete(Azure.WaitUntil.Completed);
}
StorageHelper.Instance.CleanSharedBlobFolder(Constants.SHARED_E2E_TEST_OUTPUT_CONTAINER_NAME, testCaseSetting.TestScenarioStorageFolderPrefix);
StorageHelper.Instance.CleanSharedBlobFolder(Constants.SHARED_MSI_CONTAINER_NAME, testCaseSetting.TestScenarioStorageFolderPrefix);
}
public async Task CleanupOldTestResourcesAndForget()
{
var sub = await client.GetDefaultSubscriptionAsync();
var rgs = sub.GetResourceGroups().Where(rg =>
rg.Data.Tags.ContainsKey(Constants.COULD_CLEANUP_TAG_NAME)
&& rg.Data.Tags[Constants.COULD_CLEANUP_TAG_NAME].Equals("true", StringComparison.OrdinalIgnoreCase)
);
foreach (var rg in rgs)
{
var firstDeployment = rg.GetArmDeployments().Where(x => x?.Data?.Properties?.Timestamp != null).OrderBy(x => x.Data.Properties.Timestamp).FirstOrDefault();
if(firstDeployment != null && firstDeployment?.Data?.Properties?.Timestamp?.DateTime.AddDays(2) <= DateTime.UtcNow)
{
await rg.DeleteAsync(Azure.WaitUntil.Started);
}
}
}
}
}