Ejemplo n.º 1
0
        /// <inheritdoc />
        public object Invoke(IVariableProvider variables, params object[] arguments)
        {
            if (!(variables.GetProvider("log")?["log"] is WorkableLogger logger))
            {
                throw new WorkflowException($"Calling a workflow as method requires an existing logger of type '{nameof(WorkableLogger)}' accessible under variable 'log'");
            }

            if (!(arguments.FirstOrDefault() is IDictionary scriptarguments))
            {
                throw new InvalidOperationException($"Parameters for a workflow call need to be a dictionary ('{arguments.FirstOrDefault()?.GetType()}')");
            }

            if (!(scriptarguments is IDictionary <string, object> parameters))
            {
                parameters = new Dictionary <string, object>();
                foreach (object key in scriptarguments.Keys)
                {
                    parameters[key.ToString() ?? string.Empty] = scriptarguments[key];
                }
            }

            return(Task.Run(async() => {
                WorkflowDetails workflow = await LoadWorkflow();
                WorkflowInstance instance = await compiler.BuildWorkflow(workflow);
                return await executor.Execute(instance, logger, parameters, false, CancellationToken.None);
            }).GetAwaiter().GetResult());
        }
Ejemplo n.º 2
0
        async Task <WorkflowInstance> GetWorkflowInstance(string name)
        {
            WorkflowDetails workflow = await workflowservice.GetWorkflow(name);

            WorkflowInstance instance = await workflowcompiler.BuildWorkflow(workflow);

            return(instance);
        }
Ejemplo n.º 3
0
 /// <inheritdoc />
 public object Execute(IDictionary <string, object> arguments)
 {
     return(Task.Run(async() => {
         WorkflowDetails workflow = await workflowservice.GetWorkflow(name, revision);
         WorkflowInstance instance = await compiler.BuildWorkflow(workflow);
         return await executor.Execute(instance, logger, arguments, false, CancellationToken.None);
     }).GetAwaiter().GetResult());
 }
Ejemplo n.º 4
0
        public async Task <WorkableTask> Execute([FromBody] ExecuteWorkflowParameters parameters)
        {
            logger.LogInformation("Executing {workflow} with parameters '{parameters}'",
                                  parameters.Id?.ToString() ?? parameters.Name,
                                  string.Join(";", parameters.Parameters?.Select(p => $"{p.Key}={p.Value}") ?? new string[0]));

            try {
                if (parameters.Id.HasValue)
                {
                    if (!string.IsNullOrEmpty(parameters.Name))
                    {
                        throw new ArgumentException("Either id or name has to be set, not both");
                    }
                    return(await executionservice.Execute(await compiler.BuildWorkflow(parameters.Id.Value, parameters.Revision), parameters.Parameters, parameters.Profile ?? false, parameters.Wait));
                }

                if (!string.IsNullOrEmpty(parameters.Name))
                {
                    return(await executionservice.Execute(await compiler.BuildWorkflow(parameters.Name, parameters.Revision), parameters.Parameters, parameters.Profile ?? false, parameters.Wait));
                }

                if (parameters.Workflow != null)
                {
                    return(await executionservice.Execute(await compiler.BuildWorkflow(parameters.Workflow), parameters.Parameters, parameters.Profile ?? false, parameters.Wait));
                }
            }
            catch (Exception e) {
                WorkableTask failtask = new WorkableTask {
                    Id       = Guid.NewGuid(),
                    Status   = TaskStatus.Failure,
                    Started  = DateTime.Now,
                    Finished = DateTime.Now,
                    Log      = new List <string>(new[] {
                        e.ToString()
                    }),
                    Parameters = parameters.Parameters,
                    Type       = WorkableType.Workflow,
                };
                await taskservice.StoreTask(failtask);

                return(failtask);
            }

            throw new ArgumentException("Workflow id or name is required");
        }
Ejemplo n.º 5
0
        async Task CheckTasks()
        {
            List <ScheduledTask> tasks  = new List <ScheduledTask>();
            ScheduledTaskFilter  filter = new ScheduledTaskFilter {
                DueTime = DateTime.Now
            };

            while (true)
            {
                Page <ScheduledTask> page = await scheduledtaskservice.List(filter);

                tasks.AddRange(page.Result);
                if (page.Result.Length == 0 || !page.Continue.HasValue)
                {
                    break;
                }
                filter.Continue = page.Continue;
            }

            foreach (ScheduledTask task in tasks)
            {
                switch (task.WorkableType)
                {
                case WorkableType.Workflow:
                    await workflowexecutor.Execute(await workflowcompiler.BuildWorkflow(task.WorkableName), new Dictionary <string, object>(), false);

                    break;

                case WorkableType.Script:
                    await scriptexecutor.Execute(task.WorkableName, task.WorkableRevision);

                    break;
                }

                try {
                    await scheduledtaskservice.UpdateExecution(task.Id, task.NextExecutionTime());
                }
                catch (Exception e) {
                    logger.LogError(e, $"Unable to reschedule task '{task.Id}'");
                }
            }
        }