public async Task <JObject> GetWritableAccessorAsync(OutputObjectAccessorRequest accessorRequest) { var accessorProvider = GetAccessorProvider(accessorRequest); var accessor = await accessorProvider.GetWritableAccessorAsync(accessorRequest); return(accessor); }
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>(); }
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); }
public Task <JObject> GetWritableAccessorAsync(OutputObjectAccessorRequest accessorRequest) { if (accessorRequest == null) { throw new ArgumentNullException(nameof(accessorRequest)); } return(Task.FromResult(JObject.FromObject(accessorRequest))); }
/// <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 };
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)); }
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)); }
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 }); }
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); }
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}]."); } }
/// <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); }