Exemple #1
0
        /// <summary>
        /// Start a workflow and and wait for it to complete or pause.
        /// </summary>
        /// <returns></returns>
        public WorkflowRun RunWorkflow(WorkflowStartEvent startEvent)
        {
            if (startEvent.Workflow == null)
            {
                throw new ArgumentException($"{nameof(startEvent)} missing mandatory field Workflow.");
            }

            // deny workflow run when tenant is disabled
            if (TenantHelper.IsDisabled())
            {
                EventLog.Application.WriteWarning("Workflow run denied, tenant is disabled. \"{0\"({1})", startEvent.Workflow.Name, startEvent.Workflow.Id);
                return(null);
            }

            using (Profiler.Measure("WorkflowRunner.Instance.RunWorkflow"))
            {
                using (new SecurityBypassContext())
                {
                    if (startEvent.Workflow.WfNewerVersion != null)
                    {
                        throw new ArgumentException("Attempted to run a workflow that is not the newest version.");
                    }


                    // create a wf run then pass into the workflow
                    var run = new WorkflowRunDeferred(startEvent.Workflow, startEvent.Trigger)
                    {
                        RunTrace  = startEvent.Trace,
                        ParentRun = startEvent.ParentRun
                    };

                    return(ProcessWorkflowInContext(run, startEvent));
                }
            }
        }
Exemple #2
0
        /// <summary>
        /// Factory to create a workflow run , the workflow starts async
        /// </summary>
        /// <param name="workflowToRun"></param>
        /// <param name="args"></param>
        /// <param name="trace"></param>
        /// <param name="invoker"></param>
        /// <returns>The workflow run task ID</returns>
        public string RunWorkflowAsync(WorkflowStartEvent startEvent)
        {
            if (startEvent == null)
            {
                throw new ArgumentNullException(nameof(startEvent));
            }

            if (startEvent.Workflow == null)
            {
                throw new ArgumentException("Missing mandatory argument workflow to on WorkflowStartEvent.");
            }

            using (Profiler.Measure("WorkflowRunner.Instance.StartWorkflowAsync"))
            {
                using (new SecurityBypassContext())
                {
                    if (startEvent.Workflow.WfNewerVersion != null)
                    {
                        throw new ArgumentException("Attempted to run a workflow that is not the newest version.");
                    }
                }

                // create a wf run then pass into the workflow
                var run = new WorkflowRunDeferred(startEvent.Workflow)
                {
                    RunTrace = startEvent.Trace
                };

                var stopWatch = new Stopwatch();
                stopWatch.Start();

                Factory.WorkflowRunTaskManager.RegisterStart(run.TaskId);

                HandleDiagnostics(run, WorkflowRunState_Enumeration.WorkflowRunStarted.ToString( ));

                WorkflowRunContext.Current.QueueAction(() =>
                {
                    stopWatch.Stop();

                    perfCounters.GetPerformanceCounter <AverageTimer32PerformanceCounter>(WorkflowPerformanceCounters.QueueDurationCounterName).AddTiming(stopWatch);

                    using (new WorkflowRunContext(true)
                    {
                        RunTriggersInCurrentThread = true
                    })                                                                         // need to ensure that all deferred saves occur before we register complete.
                    {
                        ProcessWorkflowInContext(run, startEvent);
                    }
                });

                return(run.TaskId);
            }
        }
        public void TriggeringUserIsSet()
        {
            var userAccount = new UserAccount();

            userAccount.Name = "foo" + Guid.NewGuid().ToString();
            userAccount.Save();

            using (var setUser = new SetUser(userAccount))
            {
                var run = new WorkflowRunDeferred(new Workflow());

                Assert.That(run.TriggeringUserId, Is.EqualTo(userAccount.Id));
                Assert.That(run.TriggeringUser.Id, Is.EqualTo(userAccount.Id));
            }
        }
        public void EffectiveUserIsTriggeringUser()
        {
            var triggerer = new UserAccount();

            triggerer.Name = "foo" + Guid.NewGuid().ToString();
            triggerer.Save();

            using (var setUser = new SetUser(triggerer))
            {
                var run      = new WorkflowRunDeferred(new Workflow());
                var runState = new TestRunState(new WorkflowMetadata(), run);

                Assert.That(runState.EffectiveSecurityContext.Identity, Is.Not.Null);
                Assert.That(runState.EffectiveSecurityContext.Identity.Id, Is.EqualTo(triggerer.Id));
                Assert.That(runState.EffectiveSecurityContext.SecondaryIdentity, Is.Null);
            }
        }
        public void SecondaryIdentityIsTriggeringWhenWfIsRunAsOwner()
        {
            var triggerer = new UserAccount();

            triggerer.Name = "foo" + Guid.NewGuid().ToString();
            triggerer.Save();

            var owner = new UserAccount();

            owner.Name = "foo2" + Guid.NewGuid().ToString();
            owner.Save();

            var wf = new Workflow()
            {
                SecurityOwner = owner, WorkflowRunAsOwner = true
            };

            wf.Save();

            using (var setUser = new SetUser(triggerer))
            {
                using (new SecurityBypassContext())
                {
                    var metadata = new WorkflowMetadata(wf);

                    var run      = new WorkflowRunDeferred(new Workflow());
                    var runState = DefaultRunStateFactory.Singleton.CreateRunState(metadata, run);
                    //var runState = new TestRunState(metadata, run);

                    Assert.That(runState.EffectiveSecurityContext.Identity, Is.Not.Null);
                    Assert.That(runState.EffectiveSecurityContext.Identity.Id, Is.EqualTo(owner.Id));
                    Assert.That(runState.EffectiveSecurityContext.SecondaryIdentity, Is.Not.Null);
                    Assert.That(runState.EffectiveSecurityContext.SecondaryIdentity.Id, Is.EqualTo(triggerer.Id));
                }
            }
        }