public async Task BlobContainerSoftDelete() { //update storage account to v2 PatchableStorageAccountData updateParameters = new PatchableStorageAccountData() { Kind = StorageKind.StorageV2 }; await _storageAccount.UpdateAsync(updateParameters); _blobService = await _blobService.GetAsync(); BlobServiceData properties = _blobService.Data; //enable container softdelete properties.ContainerDeleteRetentionPolicy = new DeleteRetentionPolicy(); properties.ContainerDeleteRetentionPolicy.Enabled = true; properties.ContainerDeleteRetentionPolicy.Days = 30; _blobService = (await _blobService.CreateOrUpdateAsync(WaitUntil.Completed, properties)).Value; //create two blob containers and delete 1 string containerName1 = Recording.GenerateAssetName("testblob1"); string containerName2 = Recording.GenerateAssetName("testblob2"); BlobContainerResource container1 = (await _blobContainerCollection.CreateOrUpdateAsync(WaitUntil.Completed, containerName1, new BlobContainerData())).Value; BlobContainerResource container2 = (await _blobContainerCollection.CreateOrUpdateAsync(WaitUntil.Completed, containerName2, new BlobContainerData())).Value; await container2.DeleteAsync(WaitUntil.Completed); //list delete included List <BlobContainerResource> blobContainers = await _blobContainerCollection.GetAllAsync(include : ListContainersInclude.Deleted).ToEnumerableAsync(); Assert.AreEqual(2, blobContainers.Count); foreach (BlobContainerResource con in blobContainers) { if (con.Data.Name == containerName1) { Assert.IsFalse(con.Data.Deleted); } else { Assert.IsTrue(con.Data.Deleted); Assert.NotNull(con.Data.RemainingRetentionDays); } } //list without delete included blobContainers = await _blobContainerCollection.GetAllAsync().ToEnumerableAsync(); Assert.AreEqual(1, blobContainers.Count); //disable container softdelete properties = _blobService.Data; properties.ContainerDeleteRetentionPolicy = new DeleteRetentionPolicy(); properties.DeleteRetentionPolicy.Enabled = false; _blobService = (await _blobService.CreateOrUpdateAsync(WaitUntil.Completed, properties)).Value; properties = _blobService.Data; Assert.IsFalse(properties.ContainerDeleteRetentionPolicy.Enabled); }
public async Task BlobContainersVLW() { //update storage account to v2 PatchableStorageAccountData updateParameters = new PatchableStorageAccountData() { Kind = StorageKind.StorageV2 }; _storageAccount = await _storageAccount.UpdateAsync(updateParameters); _blobService = await _blobService.GetAsync(); //enable blob versioning BlobServiceData properties = _blobService.Data; properties.IsVersioningEnabled = true; _blobService = (await _blobService.CreateOrUpdateAsync(WaitUntil.Completed, properties)).Value; Assert.IsTrue(properties.IsVersioningEnabled); //create container with VLW string containerName1 = Recording.GenerateAssetName("testblob1"); BlobContainerData parameters1 = new BlobContainerData() { ImmutableStorageWithVersioning = new ImmutableStorageWithVersioning() { Enabled = true } }; BlobContainerResource container1 = (await _blobContainerCollection.CreateOrUpdateAsync(WaitUntil.Completed, containerName1, parameters1)).Value; Assert.IsTrue(container1.Data.ImmutableStorageWithVersioning.Enabled); Assert.IsNull(container1.Data.ImmutableStorageWithVersioning.MigrationState); //update container to enabled Immutability Policy string containerName2 = Recording.GenerateAssetName("testblob2"); BlobContainerData parameters2 = new BlobContainerData(); BlobContainerResource container2 = (await _blobContainerCollection.CreateOrUpdateAsync(WaitUntil.Completed, containerName2, parameters2)).Value; await container2.GetImmutabilityPolicy().CreateOrUpdateAsync(WaitUntil.Completed, data: new ImmutabilityPolicyData() { ImmutabilityPeriodSinceCreationInDays = 1 }); await container2.ObjectLevelWormAsync(WaitUntil.Completed); container2 = await container2.GetAsync(); Assert.IsTrue(container2.Data.ImmutableStorageWithVersioning.Enabled); Assert.AreEqual("Completed", container2.Data.ImmutableStorageWithVersioning.MigrationState); }
public async Task PITR() { //update storage account to v2 StorageAccountPatch updateParameters = new StorageAccountPatch() { Kind = StorageKind.StorageV2 }; _storageAccount = await _storageAccount.UpdateAsync(updateParameters); _blobService = await _blobService.GetAsync(); BlobServiceData properties = _blobService.Data; properties.DeleteRetentionPolicy = new DeleteRetentionPolicy(); properties.DeleteRetentionPolicy.Enabled = true; properties.DeleteRetentionPolicy.Days = 30; properties.ChangeFeed = new ChangeFeed(); properties.ChangeFeed.Enabled = true; properties.IsVersioningEnabled = true; properties.RestorePolicy = new RestorePolicyProperties(true) { Days = 5 }; _blobService = (await _blobService.CreateOrUpdateAsync(WaitUntil.Completed, properties)).Value; if (Mode != RecordedTestMode.Playback) { await Task.Delay(10000); } //create restore ranges //start restore BlobRestoreContent restoreContent = new BlobRestoreContent( Recording.Now.AddSeconds(-1).ToUniversalTime(), new List <BlobRestoreRange>() { new BlobRestoreRange("", "container1/blob1"), new BlobRestoreRange("container1/blob2", "container2/blob3"), new BlobRestoreRange("container3/blob3", "") }); ArmOperation <BlobRestoreStatus> restoreOperation = await _storageAccount.RestoreBlobRangesAsync(WaitUntil.Started, restoreContent); //wait for restore completion BlobRestoreStatus restoreStatus = await restoreOperation.WaitForCompletionAsync(); Assert.IsTrue(restoreStatus.Status == BlobRestoreProgressStatus.Complete || restoreStatus.Status == BlobRestoreProgressStatus.InProgress); }
public async Task UpdateBlobService() { //validate current file service properties Assert.False(_blobService.Data.DeleteRetentionPolicy.Enabled); Assert.Null(_blobService.Data.DeleteRetentionPolicy.Days); //update delete retention policy BlobServiceData serviceData = _blobService.Data; serviceData.DeleteRetentionPolicy = new DeleteRetentionPolicy { Enabled = true, Days = 100 }; BlobServiceResource service = (await _blobService.CreateOrUpdateAsync(WaitUntil.Completed, serviceData)).Value; //validate update Assert.True(service.Data.DeleteRetentionPolicy.Enabled); Assert.AreEqual(service.Data.DeleteRetentionPolicy.Days, 100); }
public async Task UpdateBlobService() { //validate current file service properties Assert.False(_blobService.Data.DeleteRetentionPolicy.Enabled); Assert.Null(_blobService.Data.DeleteRetentionPolicy.Days); //update delete retention policy BlobServiceData serviceData = _blobService.Data; serviceData.DeleteRetentionPolicy = new DeleteRetentionPolicy { Enabled = true, Days = 100 }; BlobService service = await _blobService.SetServicePropertiesAsync(serviceData); //validate update Assert.True(service.Data.DeleteRetentionPolicy.Enabled); Assert.AreEqual(service.Data.DeleteRetentionPolicy.Days, 100); }
internal static BlobServiceItems DeserializeBlobServiceItems(JsonElement element) { Optional <IReadOnlyList <BlobServiceData> > value = default; foreach (var property in element.EnumerateObject()) { if (property.NameEquals("value")) { if (property.Value.ValueKind == JsonValueKind.Null) { property.ThrowNonNullablePropertyIsNull(); continue; } List <BlobServiceData> array = new List <BlobServiceData>(); foreach (var item in property.Value.EnumerateArray()) { array.Add(BlobServiceData.DeserializeBlobServiceData(item)); } value = array; continue; } } return(new BlobServiceItems(Optional.ToList(value))); }
public async Task BlobServiceCors() { BlobServiceData properties2 = new BlobServiceData(); properties2.DeleteRetentionPolicy = new DeleteRetentionPolicy(); properties2.DeleteRetentionPolicy.Enabled = true; properties2.DeleteRetentionPolicy.Days = 300; properties2.DefaultServiceVersion = "2017-04-17"; properties2.Cors = new CorsRules(); properties2.Cors.CorsRulesValue.Add(new CorsRule(new string[] { "http://www.contoso.com", "http://www.fabrikam.com" }, new CorsRuleAllowedMethodsItem[] { CorsRuleAllowedMethodsItem.GET, CorsRuleAllowedMethodsItem.PUT }, 100, new string[] { "x-ms-meta-*" }, new string[] { "x-ms-meta-abc", "x-ms-meta-data*", "x-ms-meta-target*" } )); properties2.Cors.CorsRulesValue.Add(new CorsRule(new string[] { "*" }, new CorsRuleAllowedMethodsItem[] { CorsRuleAllowedMethodsItem.GET }, 2, new string[] { "*" }, new string[] { "*" } )); properties2.Cors.CorsRulesValue.Add(new CorsRule(new string[] { "http://www.abc23.com", "https://www.fabrikam.com/*" }, new CorsRuleAllowedMethodsItem[] { CorsRuleAllowedMethodsItem.GET, CorsRuleAllowedMethodsItem.PUT, CorsRuleAllowedMethodsItem.Post }, 2000, new string[] { "x-ms-meta-12345675754564*" }, new string[] { "x-ms-meta-abc", "x-ms-meta-data*", "x-ms-meta-target*" } )); _blobService = (await _blobService.CreateOrUpdateAsync(WaitUntil.Completed, properties2)).Value; BlobServiceData properties3 = _blobService.Data; Assert.IsTrue(properties3.DeleteRetentionPolicy.Enabled); Assert.AreEqual(300, properties3.DeleteRetentionPolicy.Days); Assert.AreEqual("2017-04-17", properties3.DefaultServiceVersion); //validate CORS rules Assert.AreEqual(properties2.Cors.CorsRulesValue.Count, properties3.Cors.CorsRulesValue.Count); for (int i = 0; i < properties2.Cors.CorsRulesValue.Count; i++) { CorsRule putRule = properties2.Cors.CorsRulesValue[i]; CorsRule getRule = properties3.Cors.CorsRulesValue[i]; Assert.AreEqual(putRule.AllowedHeaders, getRule.AllowedHeaders); Assert.AreEqual(putRule.AllowedMethods, getRule.AllowedMethods); Assert.AreEqual(putRule.AllowedOrigins, getRule.AllowedOrigins); Assert.AreEqual(putRule.ExposedHeaders, getRule.ExposedHeaders); Assert.AreEqual(putRule.MaxAgeInSeconds, getRule.MaxAgeInSeconds); } _blobService = await _blobService.GetAsync(); BlobServiceData properties4 = _blobService.Data; Assert.IsTrue(properties4.DeleteRetentionPolicy.Enabled); Assert.AreEqual(300, properties4.DeleteRetentionPolicy.Days); Assert.AreEqual("2017-04-17", properties4.DefaultServiceVersion); //validate CORS rules Assert.AreEqual(properties2.Cors.CorsRulesValue.Count, properties4.Cors.CorsRulesValue.Count); for (int i = 0; i < properties2.Cors.CorsRulesValue.Count; i++) { CorsRule putRule = properties2.Cors.CorsRulesValue[i]; CorsRule getRule = properties4.Cors.CorsRulesValue[i]; Assert.AreEqual(putRule.AllowedHeaders, getRule.AllowedHeaders); Assert.AreEqual(putRule.AllowedMethods, getRule.AllowedMethods); Assert.AreEqual(putRule.AllowedOrigins, getRule.AllowedOrigins); Assert.AreEqual(putRule.ExposedHeaders, getRule.ExposedHeaders); Assert.AreEqual(putRule.MaxAgeInSeconds, getRule.MaxAgeInSeconds); } }
public async Task BlobServiceCors() { BlobServiceData blobServiceData = new BlobServiceData() { DeleteRetentionPolicy = new DeleteRetentionPolicy() { Enabled = true, Days = 300, }, DefaultServiceVersion = "2017-04-17", Cors = new CorsRules() { CorsRulesValue = { new CorsRule(new[] { "http://www.contoso.com", "http://www.fabrikam.com" }, new[] { CorsRuleAllowedMethodsItem.GET, CorsRuleAllowedMethodsItem.PUT }, 100, new[] { "x-ms-meta-*" }, new[] { "x-ms-meta-abc", "x-ms-meta-data*", "x-ms-meta-target*"}), new CorsRule(new[] { "*" }, new[] { CorsRuleAllowedMethodsItem.GET }, 2, new[] { "*" }, new[] { "*" }), new CorsRule(new[] { "http://www.abc23.com", "https://www.fabrikam.com/*" }, new[] { CorsRuleAllowedMethodsItem.GET, CorsRuleAllowedMethodsItem.PUT, CorsRuleAllowedMethodsItem.Post}, 2000, new[] { "x-ms-meta-12345675754564*" }, new[] { "x-ms-meta-abc", "x-ms-meta-data*", "x-ms-meta-target*"}) } } }; _blobService = (await _blobService.CreateOrUpdateAsync(WaitUntil.Completed, blobServiceData)).Value; Assert.AreEqual(blobServiceData.DeleteRetentionPolicy.Enabled, _blobService.Data.DeleteRetentionPolicy.Enabled); Assert.AreEqual(blobServiceData.DeleteRetentionPolicy.Days, _blobService.Data.DeleteRetentionPolicy.Days); Assert.AreEqual(blobServiceData.DefaultServiceVersion, _blobService.Data.DefaultServiceVersion); //validate CORS rules Assert.AreEqual(blobServiceData.Cors.CorsRulesValue.Count, _blobService.Data.Cors.CorsRulesValue.Count); for (int i = 0; i < blobServiceData.Cors.CorsRulesValue.Count; i++) { CorsRule putRule = blobServiceData.Cors.CorsRulesValue[i]; CorsRule getRule = _blobService.Data.Cors.CorsRulesValue[i]; Assert.AreEqual(putRule.AllowedHeaders, getRule.AllowedHeaders); Assert.AreEqual(putRule.AllowedMethods, getRule.AllowedMethods); Assert.AreEqual(putRule.AllowedOrigins, getRule.AllowedOrigins); Assert.AreEqual(putRule.ExposedHeaders, getRule.ExposedHeaders); Assert.AreEqual(putRule.MaxAgeInSeconds, getRule.MaxAgeInSeconds); } _blobService = await _blobService.GetAsync(); Assert.AreEqual(blobServiceData.DeleteRetentionPolicy.Enabled, _blobService.Data.DeleteRetentionPolicy.Enabled); Assert.AreEqual(blobServiceData.DeleteRetentionPolicy.Days, _blobService.Data.DeleteRetentionPolicy.Days); Assert.AreEqual(blobServiceData.DefaultServiceVersion, _blobService.Data.DefaultServiceVersion); //validate CORS rules Assert.AreEqual(blobServiceData.Cors.CorsRulesValue.Count, _blobService.Data.Cors.CorsRulesValue.Count); for (int i = 0; i < blobServiceData.Cors.CorsRulesValue.Count; i++) { CorsRule putRule = blobServiceData.Cors.CorsRulesValue[i]; CorsRule getRule = _blobService.Data.Cors.CorsRulesValue[i]; Assert.AreEqual(putRule.AllowedHeaders, getRule.AllowedHeaders); Assert.AreEqual(putRule.AllowedMethods, getRule.AllowedMethods); Assert.AreEqual(putRule.AllowedOrigins, getRule.AllowedOrigins); Assert.AreEqual(putRule.ExposedHeaders, getRule.ExposedHeaders); Assert.AreEqual(putRule.MaxAgeInSeconds, getRule.MaxAgeInSeconds); } }