Created
March 25, 2022 20:18
-
-
Save Ercenk/7398ff3303924ba79f347db76e9302a4 to your computer and use it in GitHub Desktop.
Immutable storage example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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