コード例 #1
0
        public async Task <JObject> GetWritableAccessorAsync(OutputObjectAccessorRequest accessorRequest)
        {
            var accessorProvider = GetAccessorProvider(accessorRequest);
            var accessor         = await accessorProvider.GetWritableAccessorAsync(accessorRequest);

            return(accessor);
        }
コード例 #2
0
        public void GetReadableAccessorAsync_GivenUnsupportedObjectProviderName_ShouldThrowException()
        {
            var expectedProviderName = "expected-provider";
            var actualProviderName   = "actual-provider";

            var mockServiceProvider        = new Mock <IServiceProvider>();
            var mockObjectAccessorProvider = new Mock <IOutputObjectAccessorProvider>();

            var accessorProviderFactory = new NamedServiceFactory <IOutputObjectAccessorProvider>(
                new Dictionary <string, Func <IServiceProvider, IOutputObjectAccessorProvider> >
            {
                [expectedProviderName] = sp => mockObjectAccessorProvider.Object
            });

            var accessorRequest = new OutputObjectAccessorRequest
            {
                ExecutionMetadata = new ExecutionRequest {
                    ExecutionId = Guid.NewGuid().ToString()
                },
                ObjectMetadata = new ExtensionOutputObject {
                    Name = "OutputObjectA"
                },
                ObjectProviderName = actualProviderName
            };

            var testAccessorProvider = new CompositeOutputObjectAccessorProvider(
                mockServiceProvider.Object,
                accessorProviderFactory);

            Func <Task> act = async() => await testAccessorProvider.GetReadableAccessorAsync(accessorRequest);

            act.Should().Throw <NotSupportedException>();
        }
コード例 #3
0
        public async Task GetWritableAccessorAsync_GivenValidAccessorRequest_ShouldReturnAccessor()
        {
            var mockUrlProvider = new Mock <IOutputObjectUrlProvider>();
            var mockSigner      = new Mock <ISigner <ObjectUrl> >();

            var objectUrlAccessorProvider = new OutputObjectUrlAccessorProvider(mockUrlProvider.Object, mockSigner.Object);

            var accessorRequest = new OutputObjectAccessorRequest
            {
                ExecutionMetadata = new ExecutionRequest {
                    ExecutionId = Guid.NewGuid().ToString()
                },
                ObjectMetadata = new ExtensionOutputObject {
                    Name = "OutputObjectA"
                }
            };

            var objectUrl = new ObjectUrl
            {
                Url        = "http://test.com/some-object",
                HttpMethod = HttpMethod.Put.Method
            };

            var objectUrlJson = JObject.FromObject(objectUrl);

            mockUrlProvider.Setup(up => up.GetWritableUrlAsync(It.Is <ObjectUrlRequest>(
                                                                   ur => ur.ExecutionMetadata.ExecutionId == accessorRequest.ExecutionMetadata.ExecutionId &&
                                                                   ur.ObjectName == accessorRequest.ObjectMetadata.Name)))
            .Returns(Task.FromResult(objectUrl));

            var accessor = await objectUrlAccessorProvider.GetWritableAccessorAsync(accessorRequest);

            accessor.Should().NotBeNull();
            accessor.Should().BeEquivalentTo(objectUrlJson);
        }
コード例 #4
0
        public Task <JObject> GetWritableAccessorAsync(OutputObjectAccessorRequest accessorRequest)
        {
            if (accessorRequest == null)
            {
                throw new ArgumentNullException(nameof(accessorRequest));
            }

            return(Task.FromResult(JObject.FromObject(accessorRequest)));
        }
コード例 #5
0
 /// <summary>
 /// Converts an output object accessor request core model to an API model
 /// </summary>
 /// <param name="coreModel"></param>
 /// <returns></returns>
 public static OutputObjectAccessorRequestApiModel ToApiModel(this OutputObjectAccessorRequest coreModel) =>
 new OutputObjectAccessorRequestApiModel
 {
     ExecutionMetadata  = coreModel.ExecutionMetadata.ToApiModel(),
     ExpirationPeriod   = coreModel.ExpirationPeriod,
     ObjectMetadata     = coreModel.ObjectMetadata.ToApiModel(),
     ObjectProviderName = coreModel.ObjectProviderName,
     SignatureRsaKeyXml = coreModel.SignatureRsaKeyXml
 };
コード例 #6
0
        public async Task <JObject> GetWritableAccessorAsync(OutputObjectAccessorRequest accessorRequest)
        {
            var urlRequest = CreateUrlRequest(accessorRequest);
            var url        = await urlProvider.GetWritableUrlAsync(urlRequest);

            if (!string.IsNullOrEmpty(accessorRequest.SignatureRsaKeyXml))
            {
                url.Signature = await urlSigner.GenerateSignatureAsync(accessorRequest.SignatureRsaKeyXml, url);
            }

            return(JObject.FromObject(url));
        }
コード例 #7
0
        private IOutputObjectAccessorProvider GetAccessorProvider(OutputObjectAccessorRequest accessorRequest)
        {
            if (accessorRequest == null)
            {
                throw new ArgumentNullException(nameof(accessorRequest));
            }

            if (accessorProviderFactory.CanCreateService(accessorRequest.ObjectProviderName) == false)
            {
                throw new NotSupportedException($"Object provider [{accessorRequest.ObjectProviderName}] not supported.");
            }

            return(accessorProviderFactory.CreateService(accessorRequest.ObjectProviderName, serviceProvider));
        }
コード例 #8
0
        private ObjectUrlRequest CreateUrlRequest(OutputObjectAccessorRequest accessorRequest)
        {
            if (accessorRequest == null)
            {
                throw new ArgumentNullException(nameof(accessorRequest));
            }

            return(new ObjectUrlRequest
            {
                ExecutionMetadata = accessorRequest.ExecutionMetadata,
                ObjectName = accessorRequest.ObjectMetadata.Name,
                UrlExpirationPeriod = accessorRequest.ExpirationPeriod
            });
        }
コード例 #9
0
        public async Task GetReadableAccessorAsync_GivenSupportedObjectProviderName_ShouldReturnAccessor()
        {
            var providerName = "provider";

            var mockServiceProvider        = new Mock <IServiceProvider>();
            var mockObjectAccessorProvider = new Mock <IOutputObjectAccessorProvider>();
            var objectMetadata             = new ExtensionOutputObject {
                Name = "OutputObjectA"
            };

            var accessorProviderFactory = new NamedServiceFactory <IOutputObjectAccessorProvider>(
                new Dictionary <string, Func <IServiceProvider, IOutputObjectAccessorProvider> >
            {
                [providerName] = sp => mockObjectAccessorProvider.Object
            });

            var accessorRequest = new OutputObjectAccessorRequest
            {
                ExecutionMetadata = new ExecutionRequest {
                    ExecutionId = Guid.NewGuid().ToString()
                },
                ObjectMetadata     = objectMetadata,
                ObjectProviderName = providerName
            };

            var expectedAccessor = JObject.FromObject(new OutputObjectAccessor
            {
                ObjectAccessor = JObject.FromObject(accessorRequest),
                ObjectMetadata = objectMetadata
            });

            mockObjectAccessorProvider.Setup(ap => ap.GetReadableAccessorAsync(accessorRequest))
            .Returns(Task.FromResult(expectedAccessor));

            var testAccessorProvider = new CompositeOutputObjectAccessorProvider(
                mockServiceProvider.Object,
                accessorProviderFactory);

            var actualAccessor = await testAccessorProvider.GetReadableAccessorAsync(accessorRequest);

            actualAccessor.Should().NotBeNull();
            actualAccessor.Should().BeEquivalentTo(expectedAccessor);
        }
コード例 #10
0
        public async Task <JObject> GetWritableAccessorAsync(OutputObjectAccessorRequest accessorRequest)
        {
            if (accessorRequest == null)
            {
                throw new ArgumentNullException(nameof(accessorRequest));
            }

            var apiModel    = accessorRequest.ToApiModel();
            var apiUrl      = $"{proxyConfig.BaseUrl.TrimEnd('/')}/writable";
            var apiResponse = await jsonHttpClient.PostAsync <JObject>(apiUrl, apiModel);

            switch (apiResponse.StatusCode)
            {
            case HttpStatusCode.OK:
                return(apiResponse.Content);

            default:
                throw new HttpRequestException($"[Request {accessorRequest.ExecutionMetadata.ExecutionId}]: " +
                                               $"[Output Object {accessorRequest.ObjectMetadata.Name}]: " +
                                               $"Object provider API [{apiUrl}] responded with an unexpected status code: [{apiResponse.StatusCode}].");
            }
        }
コード例 #11
0
        /// <summary>
        /// Creates an execution-scoped collection of output object accessors to be provided to the target extension.
        /// For more information on execution objects, see /doc/architecture/execution-objects.md.
        /// </summary>
        /// <param name="execRequest">The execution request</param>
        /// <returns></returns>
        protected virtual async Task <Dictionary <string, OutputObjectAccessor> > CreateOutputObjectAccessorDictionaryAsync(ExecutionRequest execRequest)
        {
            var accessorDictionary = new Dictionary <string, OutputObjectAccessor>();

            foreach (var outputObjectName in execRequest.OutputObjects.Keys)
            {
                var outputObject = execRequest.OutputObjects[outputObjectName];

                var accessorRequest = new OutputObjectAccessorRequest
                {
                    ExecutionMetadata  = execRequest,
                    ExpirationPeriod   = execRequest.ExecutionTimeoutDuration,
                    ObjectMetadata     = outputObject,
                    ObjectProviderName = execRequest.ObjectProviderName,
                    SignatureRsaKeyXml = execRequest.SignatureRsaKeyXml
                };

                var accessor = await outputObjectAccessorProvider.GetWritableAccessorAsync(accessorRequest);

                accessorDictionary[outputObjectName] = new OutputObjectAccessor(outputObject, accessor);
            }

            return(accessorDictionary);
        }