public void CloudBlobContainerSetMetadata() { CloudBlobContainer container = GetRandomContainerReference(); try { container.Create(); CloudBlobContainer container2 = container.ServiceClient.GetContainerReference(container.Name); container2.FetchAttributes(); Assert.AreEqual(0, container2.Metadata.Count); container.Metadata.Add("key1", "value1"); container.SetMetadata(); container2.FetchAttributes(); Assert.AreEqual(1, container2.Metadata.Count); Assert.AreEqual("value1", container2.Metadata["key1"]); CloudBlobContainer container3 = container.ServiceClient.ListContainers(container.Name, ContainerListingDetails.Metadata).First(); Assert.AreEqual(1, container3.Metadata.Count); Assert.AreEqual("value1", container3.Metadata["key1"]); container.Metadata.Clear(); container.SetMetadata(); container2.FetchAttributes(); Assert.AreEqual(0, container2.Metadata.Count); } finally { container.DeleteIfExists(); } }
public void CloudBlobContainerConditionalAccess() { CloudBlobContainer container = GetRandomContainerReference(); try { container.Create(); container.FetchAttributes(); string currentETag = container.Properties.ETag; DateTimeOffset currentModifiedTime = container.Properties.LastModified.Value; // ETag conditional tests container.Metadata["ETagConditionalName"] = "ETagConditionalValue"; container.SetMetadata(); container.FetchAttributes(); string newETag = container.Properties.ETag; Assert.AreNotEqual(newETag, currentETag, "ETage should be modified on write metadata"); // LastModifiedTime tests currentModifiedTime = container.Properties.LastModified.Value; container.Metadata["DateConditionalName"] = "DateConditionalValue"; TestHelper.ExpectedException( () => container.SetMetadata(AccessCondition.GenerateIfModifiedSinceCondition(currentModifiedTime), null), "IfModifiedSince conditional on current modified time should throw", HttpStatusCode.PreconditionFailed, "ConditionNotMet"); container.Metadata["DateConditionalName"] = "DateConditionalValue2"; currentETag = container.Properties.ETag; DateTimeOffset pastTime = currentModifiedTime.Subtract(TimeSpan.FromMinutes(5)); container.SetMetadata(AccessCondition.GenerateIfModifiedSinceCondition(pastTime), null); pastTime = currentModifiedTime.Subtract(TimeSpan.FromHours(5)); container.SetMetadata(AccessCondition.GenerateIfModifiedSinceCondition(pastTime), null); pastTime = currentModifiedTime.Subtract(TimeSpan.FromDays(5)); container.SetMetadata(AccessCondition.GenerateIfModifiedSinceCondition(pastTime), null); container.FetchAttributes(); newETag = container.Properties.ETag; Assert.AreNotEqual(newETag, currentETag, "ETage should be modified on write metadata"); } finally { container.DeleteIfExists(); } }
/// <summary> /// create a container with random properties and metadata /// </summary> /// <param name="containerName">container name</param> /// <returns>the created container object with properties and metadata</returns> public StorageBlob.CloudBlobContainer CreateContainer(string containerName = "") { if (String.IsNullOrEmpty(containerName)) { containerName = Utility.GenNameString("container"); } StorageBlob.CloudBlobContainer container = client.GetContainerReference(containerName); container.CreateIfNotExists(); //there is no properties to set container.FetchAttributes(); int minMetaCount = 1; int maxMetaCount = 5; int minMetaValueLength = 10; int maxMetaValueLength = 20; int count = random.Next(minMetaCount, maxMetaCount); for (int i = 0; i < count; i++) { string metaKey = Utility.GenNameString("metatest"); int valueLength = random.Next(minMetaValueLength, maxMetaValueLength); string metaValue = Utility.GenNameString("metavalue-", valueLength); container.Metadata.Add(metaKey, metaValue); } container.SetMetadata(); Test.Info(string.Format("create container '{0}'", containerName)); return(container); }
/// <summary> /// Updates the container metadata. /// </summary> /// <param name="package">The package.</param> /// <param name="container">The container.</param> /// <param name="exists">if set to <c>true</c> [exists].</param> private void UpdateContainerMetadata(IPackage package, CloudBlobContainer container, bool exists) { container.Metadata[Constants.LatestModificationDate] = DateTimeOffset.Now.ToString(); if (!exists) { container.Metadata[Constants.Created] = DateTimeOffset.Now.ToString(); } container.Metadata[Constants.LastUploadedVersion] = package.Version.ToString(); container.Metadata[Constants.PackageId] = package.Id; container.SetMetadata(); }
/// <summary> /// Test container reads and writes, expecting success. /// </summary> /// <param name="testContainer">The container.</param> /// <param name="testAccessCondition">The access condition to use.</param> private void ContainerReadWriteExpectLeaseSuccess(CloudBlobContainer testContainer, AccessCondition testAccessCondition) { testContainer.FetchAttributes(testAccessCondition, null /* options */); testContainer.GetPermissions(testAccessCondition, null /* options */); testContainer.SetMetadata(testAccessCondition, null /* options */); testContainer.SetPermissions(new BlobContainerPermissions(), testAccessCondition, null /* options */); }
/// <summary> /// Test container reads and writes, expecting lease failure. /// </summary> /// <param name="testContainer">The container.</param> /// <param name="testAccessCondition">The failing access condition to use.</param> /// <param name="expectedErrorCode">The expected error code.</param> /// <param name="description">The reason why these calls should fail.</param> private void ContainerReadWriteExpectLeaseFailure(CloudBlobContainer testContainer, AccessCondition testAccessCondition, HttpStatusCode expectedStatusCode, string expectedErrorCode, string description) { // FetchAttributes is a HEAD request with no extended error info, so it returns with the generic ConditionFailed error code. TestHelper.ExpectedException( () => testContainer.FetchAttributes(testAccessCondition, null /* options */), description + "(Fetch Attributes)", HttpStatusCode.PreconditionFailed); TestHelper.ExpectedException( () => testContainer.GetPermissions(testAccessCondition, null /* options */), description + " (Get Permissions)", expectedStatusCode, expectedErrorCode); TestHelper.ExpectedException( () => testContainer.SetMetadata(testAccessCondition, null /* options */), description + " (Set Metadata)", expectedStatusCode, expectedErrorCode); TestHelper.ExpectedException( () => testContainer.SetPermissions(new BlobContainerPermissions(), testAccessCondition, null /* options */), description + " (Set Permissions)", expectedStatusCode, expectedErrorCode); }
/// <summary> /// Verifies the behavior of a lease while the lease holds. Once the lease expires, this method confirms that write operations succeed. /// The test is cut short once the <c>testLength</c> time has elapsed. /// </summary> /// <param name="leasedContainer">The container.</param> /// <param name="duration">The duration of the lease.</param> /// <param name="testLength">The maximum length of time to run the test.</param> /// <param name="tolerance">The allowed lease time error.</param> internal void ContainerAcquireRenewLeaseTest(CloudBlobContainer leasedContainer, TimeSpan? duration, TimeSpan testLength, TimeSpan tolerance) { DateTime beginTime = DateTime.UtcNow; while (true) { try { // Attempt to delete the container with no lease ID. leasedContainer.Delete(); // The delete succeeded, which means that the lease must have expired. // If the lease was infinite then there is an error because it should not have expired. Assert.IsNotNull(duration, "An infinite lease should not expire."); // The lease should be past its expiration time. Assert.IsTrue(DateTime.UtcNow - beginTime > duration - tolerance, "Deletes should not succeed while lease is present."); // Since the lease has expired (and the container was deleted), the test is over. return; } catch (StorageException exception) { if (exception.RequestInformation.ExtendedErrorInformation.ErrorCode == BlobErrorCodeStrings.LeaseIdMissing) { // We got this error because the lease has not expired yet. // Make sure the lease is not past its expiration time yet. DateTime currentTime = DateTime.UtcNow; if (duration.HasValue) { Assert.IsTrue(currentTime - beginTime < duration + tolerance, "Deletes should succeed after a lease expires."); } // End the test early if necessary if (currentTime - beginTime > testLength) { // The lease has not expired, but we're not waiting any longer. return; } } else { throw; } } // Attempt to write to and read from the container. This should always succeed. leasedContainer.SetMetadata(); leasedContainer.FetchAttributes(); // Wait 1 second before trying again. Thread.Sleep(TimeSpan.FromSeconds(1)); } }
private static void Initialize(CloudBlobContainer container) { container.Metadata.Add("Author", MethodInfo.GetCurrentMethod().GetType().Assembly.GetName().Name); container.Metadata.Add("DateCreated", DateTime.UtcNow.ToString()); container.SetMetadata(); }
private void UpdateAccessTimeStamp(CloudBlobContainer container) { container.Metadata[AzureFileSystem.LastAccessed] = DateTimeOffset.Now.ToString(); container.SetMetadata(); }