/// <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)); } } }
/// <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)); } } }