Пример #1
0
        /// <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);
            }
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
        /// <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));
        }