示例#1
0
        /// <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);
        }
示例#2
0
        /// <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);
        }