/// <summary> /// Preps and calls the Flip API to encode a video. /// </summary> /// <param name="sasUri">Generated asset Uri with SAS token.</param> /// <param name="requestorFlipEncodeCreateDTO">Encode specific data object.</param> /// /// <returns>A "Video" object.</returns> private async Task <Video> CreateVideoAsync(string sasUri, RequestFlipEncodeCreateDTO requestorFlipEncodeCreateDTO) { // Get or create the TelestreamCloud storage reference to our output container. var store = await _telestreamCloudStorageProvider.GetStoreByNameAsync(new Uri(requestorFlipEncodeCreateDTO.OutputContainer)).ConfigureAwait(false); var newVideo = new CreateVideoBody { Profiles = requestorFlipEncodeCreateDTO.Profiles, SourceUrl = sasUri, StoreId = store.Id }; var factory = await GetFactoryByNameAsync(requestorFlipEncodeCreateDTO.FactoryName).ConfigureAwait(false); // configure the encode payload for Correlation Vector var payload = new FlipPayload() { OperationContext = requestorFlipEncodeCreateDTO.OperationContext, FactoryId = factory.Id, OutputContainer = requestorFlipEncodeCreateDTO.OutputContainer }; newVideo.Payload = JsonConvert.SerializeObject(payload); try { var video = await _telestreamCloudClientProvider.FlipApi.CreateVideoAsync(factory.Id, newVideo).ConfigureAwait(false); return(video); } catch (ApiException ae) { throw new GridwichFlipApiException("Error calling CreateVideoAsync.", requestorFlipEncodeCreateDTO.OperationContext, ae); } }
public async void FlipTestWithGoodAndBadData(RequestFlipEncodeCreateDTO encodeCreateData, bool blobShouldExist, Type shouldThrowThis, Uri sasUri) { // Arrange var video = new Video(); var factoryList = new PaginatedFactoryCollection { Factories = new List <Factory> { new Factory() { Name = "GoodFactory" } } }; // Arrange Mocks Mock.Get(_telestreamCloudClientProvider.FlipApi) .Setup(x => x.CreateVideoAsync(It.IsAny <string>(), It.IsAny <CreateVideoBody>())) .ReturnsAsync(video); Mock.Get(_telestreamCloudClientProvider.FlipApi) .Setup(x => x.ListFactoriesAsync(It.IsAny <int?>(), It.IsAny <int?>())) .ReturnsAsync(factoryList); Mock.Get(_storageService) .Setup(x => x.GetBlobExistsAsync(It.IsAny <Uri>(), It.IsAny <StorageClientProviderContext>())) .ReturnsAsync(blobShouldExist); Mock.Get(_storageService) .Setup(x => x.GetSasUrlForBlob(It.IsAny <Uri>(), It.IsAny <TimeSpan>(), It.IsAny <StorageClientProviderContext>())) .Returns(sasUri?.ToString()); Mock.Get(_telestreamCloudStorageProvider) .Setup(x => x.GetStoreByNameAsync(It.IsAny <Uri>())) .ReturnsAsync(new Store()); // Act var flipService = new FlipService(_storageService, _telestreamCloudClientProvider, _telestreamCloudStorageProvider); var ex = await Record.ExceptionAsync(async() => await flipService.EncodeCreateAsync(encodeCreateData).ConfigureAwait(false)).ConfigureAwait(false); // Assert if (shouldThrowThis is null) { // if there are no throws, test is successful. Assert.Null(ex); } else { Assert.NotNull(ex); Assert.IsType(shouldThrowThis, ex); } }
/// <inheritdoc/> public async Task <ServiceOperationResultEncodeDispatched> EncodeCreateAsync(RequestFlipEncodeCreateDTO requestorFlipEncodeCreateDTO) { _ = requestorFlipEncodeCreateDTO ?? throw new ArgumentNullException(nameof(requestorFlipEncodeCreateDTO)); TimeSpan ttl = requestorFlipEncodeCreateDTO.SecToLive == 0 ? _defaultTTL : TimeSpan.FromSeconds(requestorFlipEncodeCreateDTO.SecToLive); var inputs = requestorFlipEncodeCreateDTO.Inputs.ToArray(); var context = new StorageClientProviderContext(requestorFlipEncodeCreateDTO.OperationContext); var input = new Uri(inputs[0].BlobUri); // EncodeAsync is broken into 2 parts // 1. Configure any storage needs for the encoder // 2. Call the encoder // 1. configure storage for encoder // 1a. Input must exist var exists = await _storageService.GetBlobExistsAsync(input, context).ConfigureAwait(false); if (!exists) { throw new GridwichFlipMissingInputException( $"Attempt to use nonexistent blob as input: {input}", input.AbsoluteUri, context.ClientRequestIdAsJObject); } // 1b. SAS URI needed for input. string sasUri; try { sasUri = _storageService.GetSasUrlForBlob(input, ttl, context); if (string.IsNullOrEmpty(sasUri)) { throw new GridwichFlipSASException($"Failed to generate SAS for: {input}", requestorFlipEncodeCreateDTO.OperationContext); } } catch (Exception e) { throw new GridwichFlipSASException($"Failed to generate SAS for: {input}", requestorFlipEncodeCreateDTO.OperationContext, e); } // 2. Execute Encode var result = await CreateVideoAsync(sasUri, requestorFlipEncodeCreateDTO).ConfigureAwait(false); return(new ServiceOperationResultEncodeDispatched( workflowJobName: result.Id, null, requestorFlipEncodeCreateDTO.OperationContext)); }