/// <inheritdoc/> public async Task <bool> ChangeBlobTierAsync(Uri blobUri, BlobAccessTier accessTier, BlobRehydratePriority rehydratePriority, StorageClientProviderContext context) { _ = blobUri ?? throw new ArgumentNullException(nameof(blobUri)); _ = accessTier ?? throw new ArgumentNullException(nameof(accessTier)); _ = context ?? throw new ArgumentNullException(nameof(context)); IStorageBlobClientSleeve blobSleeve = _blobBaseClientProvider.GetBlobClientSleeveForUri(blobUri, context); Response response; try { response = await blobSleeve.Client.SetAccessTierAsync(accessTier.ToAzureEnum(), null, rehydratePriority.ToAzureEnum()).ConfigureAwait(false); } catch (Exception e) { _log.LogExceptionObject(LogEventIds.FailedToChangeTierInStorageService, e, blobUri); throw new GridwichStorageServiceException(blobUri, "Could not change tier of the blob.", LogEventIds.FailedToChangeTierInStorageService, context.ClientRequestIdAsJObject, e); } if (response.Status == 200) { return(true); } _log.LogEventObject(LogEventIds.ChangeBlobTierUnexpectedResponse, new { blobUri, response }); throw new GridwichStorageServiceException(blobUri, $"Unexpected response when changing the blob's tier: {response}", LogEventIds.ChangeBlobTierUnexpectedResponse, context.ClientRequestIdAsJObject); }
/// <summary> /// Convert BlobAccessTier to Azure's AccessTier. /// </summary> /// <param name="tier">The tier to convert.</param> /// <returns>A valid AccessTier</returns> public static AccessTier ToAzureEnum(this BlobAccessTier tier) { foreach (var pair in BlobAccessTier.ValidTiers) { if (pair.Key == tier) { return(pair.Value); } } return(null); }
public async Task HandleAsync_ShouldThrow_WhenInvalidEvent() { // Arrange var accessTier = BlobAccessTier.Lookup("Invalid"); var blobUri = "https://gridwichasset00sasb.com/container1/la_macarena.mp4"; var changeBlobTierData = new RequestBlobTierChangeDTO { AccessTier = accessTier, BlobUri = blobUri, RehydratePriority = BlobRehydratePriority.High }; var testEvent = new EventGridEvent { EventType = CustomEventTypes.RequestCreateMetadata, DataVersion = "1.0", Data = JObject.FromObject(changeBlobTierData) }; // Act & Assert await Assert.ThrowsAsync <ArgumentException>(async() => await _handler.HandleAsync(testEvent).ConfigureAwait(true)).ConfigureAwait(true); }
public async Task HandleAsync_ShouldPublishFailureEvent_WhenAccessTierIsInvalid() { // Arrange var accessTier = BlobAccessTier.Lookup("Invalid"); var blobUri = "https://gridwichasset00sasb.com/container1/la_macarena.mp4"; var appInsightsUri = new Uri("https://www.appinsights.com"); var changeBlobTierData = new RequestBlobTierChangeDTO { AccessTier = accessTier, BlobUri = blobUri, RehydratePriority = BlobRehydratePriority.High }; var testEvent = new EventGridEvent { EventType = CustomEventTypes.RequestBlobTierChange, EventTime = DateTime.UtcNow, DataVersion = "1.0", Data = JObject.FromObject(changeBlobTierData) }; var expectedEventToPublishCaptureMatch = new CaptureMatch <EventGridEvent>(x => { // Assert values in the object passed to the publisher: x.EventTime.ShouldBeInRange(testEvent.EventTime, testEvent.EventTime.AddMinutes(1)); x.Data.ShouldBeOfType(typeof(ResponseFailureDTO)); var data = (ResponseFailureDTO)x.Data; data.ShouldNotBeNull(); }); Mock.Get(_eventGridPublisher) .Setup(x => x.PublishEventToTopic(Capture.With(expectedEventToPublishCaptureMatch))) .ReturnsAsync(true); Mock.Get(_logger) .Setup(x => x.LogExceptionObject( out appInsightsUri, LogEventIds.GridwichUnhandledException, It.IsAny <Exception>(), It.IsAny <object>())); // Act var handleAsyncResult = await _handler.HandleAsync(testEvent).ConfigureAwait(true); // Assert handleAsyncResult.ShouldBe(false); }