Skip to content

Instantly share code, notes, and snippets.

@Ercenk
Created March 25, 2022 20:18
Show Gist options
  • Save Ercenk/7398ff3303924ba79f347db76e9302a4 to your computer and use it in GitHub Desktop.
Save Ercenk/7398ff3303924ba79f347db76e9302a4 to your computer and use it in GitHub Desktop.
Immutable storage example
using System.Text;
using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.Storage;
using Azure.ResourceManager.Storage.Models;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
var resourceGroupName = "immutablestorage";
var accountName = "ercstr05882197";
var containerName = "data";
var createStorageAccount = true;
var immutabilityAtContainer = true;
var setImmutabilityAtBlob = true;
var deleteBlobs = false;
try
{
var armClient = new ArmClient(new DefaultAzureCredential());
var subs = await armClient.GetDefaultSubscriptionAsync();
var resourceGroup = subs.GetResourceGroups().FirstOrDefault(rg => rg.Data.Name == resourceGroupName);
var storageAccounts = resourceGroup.GetStorageAccounts();
StorageAccount account;
if (createStorageAccount)
{
var createParameters = new StorageAccountCreateParameters(new Sku(Azure.ResourceManager.Storage.Models.SkuName.StandardLRS), Kind.StorageV2, resourceGroup.Data.Location);
var createOrUpdateOperation = await storageAccounts.CreateOrUpdateAsync(true, accountName, createParameters);
account = createOrUpdateOperation.Value;
account = account.Get();
Console.WriteLine($"Created account {account.Data.Name}, status is {account.Data.ProvisioningState}");
}
else
{
account = await storageAccounts.GetAsync(accountName);
account = account.Get();
Console.WriteLine($"Retrieved account {account.Data.Name}, status is {account.Data.ProvisioningState}");
}
var blobService = account.GetBlobService();
blobService = await blobService.GetAsync();
if (createStorageAccount)
{
blobService.Data.IsVersioningEnabled = true;
await blobService.CreateOrUpdateAsync(true, blobService.Data);
Console.WriteLine($"Set versioning state {blobService.Data.Name}, status is {blobService.Data.IsVersioningEnabled}");
var blobContainers = blobService.GetBlobContainers();
if (immutabilityAtContainer)
{
var container = (await blobContainers.CreateOrUpdateAsync(true, containerName, new BlobContainerData() { ImmutableStorageWithVersioning = new ImmutableStorageWithVersioning { Enabled = true } })).Value;
var immutabilityPolicy = (await container.GetImmutabilityPolicy().CreateOrUpdateAsync(true, new ImmutabilityPolicyData() { ImmutabilityPeriodSinceCreationInDays = 1 })).Value;
container = await container.GetAsync();
immutabilityPolicy = await container.GetImmutabilityPolicy().LockImmutabilityPolicyAsync(immutabilityPolicy.Data.Etag);
var policy = await container.GetImmutabilityPolicy().GetAsync();
var state = policy.Value.Data.State;
Console.WriteLine($"Set immutability policy for container {container.Data.Name}, status is {state}");
}
else
{
var container = (await blobContainers.CreateOrUpdateAsync(true, containerName, new BlobContainerData())).Value;
Console.WriteLine($"Create container with no immutable policy.");
}
}
var fileName = $"erc{DateTime.UtcNow.ToString("HHmmddmmyy")}.txt";
var folderPath = @"C:\Projects\wormstorage";
var fullPath = Path.Combine(folderPath, fileName);
await File.WriteAllTextAsync(fullPath, "Version 1");
var keys = (await account.GetKeysAsync());
var key = keys.Value.Keys.FirstOrDefault();
var blobServiceClient = new BlobServiceClient($"DefaultEndpointsProtocol=https;AccountName={accountName};AccountKey={key.Value};EndpointSuffix=core.windows.net");
var containerClient = blobServiceClient.GetBlobContainerClient(containerName);
var blobClient = containerClient.GetBlobClient(fileName);
await blobClient.UploadAsync(fullPath, true);
var blob = await blobClient.GetPropertiesAsync();
if (setImmutabilityAtBlob)
{
var immutabilityPolicy = new BlobImmutabilityPolicy
{
ExpiresOn = DateTime.UtcNow.AddDays(5),
PolicyMode = BlobImmutabilityPolicyMode.Locked
};
await blobClient.SetImmutabilityPolicyAsync(immutabilityPolicy);
var blobProperties = await blobClient.GetPropertiesAsync();
Console.WriteLine($"Blob expires on {blobProperties.Value.ExpiresOn} status {blobProperties.Value.ImmutabilityPolicy.PolicyMode}");
}
Console.WriteLine($"Uploaded verison 1");
if (deleteBlobs)
{
await blobClient.DeleteAsync(Azure.Storage.Blobs.Models.DeleteSnapshotsOption.IncludeSnapshots);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment