Пример #1
0
        private async Task <ExecutionUpdateApiModel> ToExecutionUpdateApiModelAsync(Core.Models.Execution execution, string signatureRsaKeyXml = null)
        {
            var apiModel = new ExecutionUpdateApiModel
            {
                ExecutionId            = execution.ExecutionId,
                ExecutionStatus        = execution.Status.ToString(),
                ExpirationDateTimeUtc  = execution.ExecutionTimeoutDateTimeUtc,
                LastUpdatedDateTimeUtc = execution.LastUpdatedDateTimeUtc,
                PercentComplete        = execution.PercentComplete,
                ResultData             = execution.ResultData,
                StatusMessage          = execution.StatusMessage,
                GetExecutionStatusUrl  = GetExecutionStatusUrl(execution.ExecutionId),
                PutExecutionStatusUrl  = PutExecutionStatusUrl(execution.ExecutionId),
                ExecutorProperties     = execution.ExecutorProperties
            };

            if (execution.Status == ExecutionStatus.PendingInputObjects)
            {
                apiModel.InputObjects = await extensionObjectApiModelService.CreateInputObjectDictionaryAsync(
                    execution.InputObjects.Where(io => execution.ProvidedInputObjects.Contains(io.Name) == false),
                    execution);
            }

            apiModel.OutputObjects = await extensionObjectApiModelService.CreateOutputObjectDictionaryAsync(
                execution.OutputObjects.Where(oo => execution.ProvidedOutputObjects.Contains(oo.Name)),
                execution);

            if (execution.ValidationErrors?.Any() == true)
            {
                apiModel.ValidationErrors = execution.ValidationErrors.Select(ve => ve.ToApiModel()).ToList();
            }

            return(apiModel);
        }
Пример #2
0
        public async Task <Dictionary <string, OutputObjectApiModel> > CreateOutputObjectDictionaryAsync(
            IEnumerable <ExtensionOutputObject> outputObjects,
            Core.Models.Execution execution)
        {
            var dictionary = new Dictionary <string, OutputObjectApiModel>();

            foreach (var outputObject in outputObjects)
            {
                var accessor = await outputAccessorProvider.GetReadableAccessorAsync(
                    new OutputObjectAccessorRequest
                {
                    ExecutionMetadata  = execution,
                    ObjectMetadata     = outputObject,
                    ObjectProviderName = execution.ObjectProviderName,
                    SignatureRsaKeyXml = execution.SignatureRsaKeyXml
                });

                dictionary[outputObject.Name] =
                    new OutputObjectApiModel
                {
                    Accessor           = accessor,
                    Description        = outputObject.Description,
                    ObjectProviderName = execution.ObjectProviderName,
                    ObjectTypeName     = outputObject.ObjectTypeName,
                    ObjectTypeUrl      = outputObject.ObjectTypeUrl
                };
            }

            return(dictionary);
        }
Пример #3
0
        private async Task <IActionResult> ToExecutionRequestRoutedResultAsync(Core.Models.Execution execution)
        {
            // At this point, the execution request has already been displatched to the execution pipeline (/doc/architecture/execution-pipeline.md),
            // We're taking the result of that processing, converting into an HTTP response, and passing it back to the original caller.

            var updateApiModel = await ToExecutionUpdateApiModelAsync(execution);

            // Map the execution status to the right HTTP status code...

            switch (execution.Status)
            {
            case ExecutionStatus.Processing:
            case ExecutionStatus.Queued:
                return(Accepted(updateApiModel));

            case ExecutionStatus.Canceled:
            case ExecutionStatus.Succeeded:
            case ExecutionStatus.ValidationSucceeded:
                return(Ok(updateApiModel));

            case ExecutionStatus.ValidationFailed:
                return(BadRequest(updateApiModel));

            default:
                return(StatusCode((int)(HttpStatusCode.InternalServerError), updateApiModel));
            }
        }
Пример #4
0
        public async Task <Dictionary <string, InputObjectApiModel> > CreateInputObjectDictionaryAsync(
            IEnumerable <ExtensionInputObject> inputObjects,
            Core.Models.Execution execution)
        {
            var dictionary = new Dictionary <string, InputObjectApiModel>();

            foreach (var inputObject in inputObjects)
            {
                var accessor = await inputAccessorProvider.GetWritableAccessorAsync(
                    new InputObjectAccessorRequest
                {
                    ExecutionMetadata  = execution,
                    ObjectMetadata     = inputObject,
                    ObjectProviderName = execution.ObjectProviderName,
                    SignatureRsaKeyXml = execution.SignatureRsaKeyXml
                });

                dictionary[inputObject.Name] =
                    new InputObjectApiModel
                {
                    Accessor           = accessor,
                    Description        = inputObject.Description,
                    IsRequired         = inputObject.IsRequired,
                    ObjectProviderName = execution.ObjectProviderName,
                    ObjectTypeName     = inputObject.ObjectTypeName,
                    ObjectTypeUrl      = inputObject.ObjectTypeUrl
                };
            }

            return(dictionary);
        }
Пример #5
0
 public static Execution ToCosmosModel(this Core.Models.Execution coreModel) => new Execution
 {
     CreatedDateTimeUtc     = coreModel.CreatedDateTimeUtc,
     ExecutionId            = coreModel.ExecutionId,
     Executor               = coreModel.Executor,
     ExpiresDateTimeUtc     = coreModel.ExecutionTimeoutDateTimeUtc,
     ExtensionId            = coreModel.ExtensionId,
     ExtensionVersionId     = coreModel.ExtensionVersionId,
     LastUpdatedDateTimeUtc = coreModel.LastUpdatedDateTimeUtc,
     PercentageComplete     = coreModel.PercentComplete,
     Priority               = coreModel.Priority,
     Status                = coreModel.Status,
     StatusMessage         = coreModel.StatusMessage,
     StatusUpdateKey       = coreModel.StatusUpdateKey,
     ValidateOnly          = coreModel.ValidateOnly,
     ExecutionModelName    = coreModel.ExecutionModelName,
     ExecutionProfileName  = coreModel.ExecutionProfileName,
     ObjectProviderName    = coreModel.ObjectProviderName,
     ProvidedInputObjects  = coreModel.ProvidedInputObjects,
     ProvidedOutputObjects = coreModel.ProvidedOutputObjects,
     InputObjects          = coreModel.InputObjects,
     OutputObjects         = coreModel.OutputObjects,
     RequestData           = coreModel.RequestData,
     ResultData            = coreModel.ResultData,
     Mode = coreModel.Mode,
     SignatureRsaKeyXml = coreModel.SignatureRsaKeyXml,
     ExecutorProperties = coreModel.ExecutorProperties
 };
Пример #6
0
        private async Task UpdateExecutionAsync(Core.Models.Execution execution)
        {
            // Save the execution model to the execution repository...

            await execRepository.UpsertExecutionAsync(execution);

            // And publish an execution update event.

            await execUpdatePublisher.PublishUpdateAsync(execution);
        }
        public async Task UpsertExecutionAsync(Core.Models.Execution execution)
        {
            if (execution == null)
            {
                throw new ArgumentNullException(nameof(execution));
            }

            await DocumentClient.UpsertDocumentAsync(
                DocumentCollectionUri,
                execution.ToCosmosModel());
        }
Пример #8
0
        public async Task PublishUpdateAsync(Core.Models.Execution execution)
        {
            if (execution == null)
            {
                throw new ArgumentNullException(nameof(execution));
            }

            await eventGridClient.PublishEventsAsync(topicHostName, new List <EventGridEvent>
            {
                new EventGridEvent
                {
                    Id          = Guid.NewGuid().ToString(),
                    EventType   = EventType,
                    Data        = execution.ToEvent(),
                    EventTime   = DateTime.UtcNow,
                    Subject     = execution.ExecutionId,
                    DataVersion = EventVersion
                }
            });
        }
Пример #9
0
        private Core.Models.Execution ApplyExecutionContext(Core.Models.ExecutionContext execContext, Core.Models.Execution execution)
        {
            execution.LastUpdatedDateTimeUtc = DateTime.UtcNow;
            execution.PercentComplete        = execContext.PercentComplete;

            if (execContext.ProvidedOutputObjects != null)
            {
                execution.ProvidedInputObjects.AddRange(
                    execContext.ProvidedInputObjects.Except(execution.ProvidedInputObjects));
            }

            if (execContext.ProvidedOutputObjects != null)
            {
                execution.ProvidedOutputObjects.AddRange(
                    execContext.ProvidedOutputObjects.Except(execution.ProvidedOutputObjects));
            }

            execution.ResultData    = (execContext.ResultData ?? execution.ResultData);
            execution.Status        = execContext.Status;
            execution.StatusMessage = execContext.StatusMessage;
            execution.ExecutionTimeoutDateTimeUtc = execContext.ExecutionTimeoutDateTimeUtc.GetValueOrDefault();

            if (execContext.ValidationErrors != null)
            {
                execution.ValidationErrors.AddRange(execContext.ValidationErrors);
            }

            return(execution);
        }
Пример #10
0
        private Core.Models.Execution ApplyExecutionUpdate(UpdateExecutionStatusApiModel updateApiModel, Core.Models.Execution execution)
        {
            execution.LastUpdatedDateTimeUtc = (updateApiModel.LastUpdatedDateTimeUtc ?? DateTime.UtcNow);
            execution.PercentComplete        = updateApiModel.PercentComplete;
            execution.ProvidedOutputObjects.AddRange(updateApiModel.ProvidedOutputObjects.Except(execution.ProvidedOutputObjects));
            execution.ResultData    = (updateApiModel.ResultData ?? execution.ResultData);
            execution.StatusMessage = updateApiModel.StatusMessage;
            execution.ExecutionTimeoutDateTimeUtc = updateApiModel.ExecutionTimeoutDateTimeUtc.GetValueOrDefault();

            execution.ValidationErrors.AddRange(
                updateApiModel.ValidationErrors
                .Where(ve => execution.ValidationErrors.None(eve => (ve.ErrorId == eve.ErrorId)))
                .Select(ve => ve.ToCoreModel()));

            return(execution);
        }