public override InitialSessionState GetInitialSessionState(PSSessionConfigurationData sessionConfigurationData, PSSenderInfo senderInfo, string configProviderId) { Tracer tracer = new Tracer(); tracer.Correlate(); if (sessionConfigurationData != null) { if (senderInfo != null) { if (!string.IsNullOrEmpty(configProviderId)) { if (Interlocked.CompareExchange(ref PSWorkflowSessionConfiguration._modulesLoaded, 1, 0) == 0) { try { PSWorkflowConfigurationProvider configuration = WorkflowJobSourceAdapter.GetInstance().GetPSWorkflowRuntime().Configuration; if (configuration != null) { configuration.Populate(sessionConfigurationData.PrivateData, configProviderId, senderInfo); if (sessionConfigurationData.ModulesToImport != null) { foreach (string modulesToImport in sessionConfigurationData.ModulesToImport) { PSWorkflowSessionConfiguration.InitialSessionState.ImportPSModulesFromPath(modulesToImport); } } } else { throw new InvalidOperationException("PSWorkflowConfigurationProvider is null"); } } catch (Exception exception) { Interlocked.CompareExchange(ref PSWorkflowSessionConfiguration._modulesLoaded, 0, 1); throw; } } if (configProviderId.ToLower(CultureInfo.InvariantCulture).Equals("http://schemas.microsoft.com/powershell/microsoft.windows.servermanagerworkflows")) { PSSessionConfigurationData.IsServerManager = true; } return(PSWorkflowSessionConfiguration.InitialSessionState); } else { throw new ArgumentNullException("configProviderId"); } } else { throw new ArgumentNullException("senderInfo"); } } else { throw new ArgumentNullException("sessionConfigurationData"); } }
internal void Save(WorkflowStoreComponents components, Dictionary <string, object> WorkflowContext) { Collection <object> componentsToSave = new Collection <object>(); if ((components & WorkflowStoreComponents.JobState) == WorkflowStoreComponents.JobState) { componentsToSave.Add(PSWorkflowInstance.State); } if (WorkflowContext != null) { componentsToSave.Add(WorkflowContext); } if (((components & WorkflowStoreComponents.Definition) == WorkflowStoreComponents.Definition) && (PSWorkflowInstance.PSWorkflowDefinition != null)) { componentsToSave.Add(PSWorkflowInstance.PSWorkflowDefinition); } if (((components & WorkflowStoreComponents.TerminatingError) == WorkflowStoreComponents.TerminatingError) && (PSWorkflowInstance.Error != null)) { if (!WorkflowJobSourceAdapter.GetInstance().IsShutdownInProgress) { if (PSWorkflowInstance.Error.GetType() != typeof(RemoteException)) { componentsToSave.Add(PSWorkflowInstance.Error); } } } if (((components & WorkflowStoreComponents.Metadata) == WorkflowStoreComponents.Metadata) && (PSWorkflowInstance.PSWorkflowContext != null)) { componentsToSave.Add(PSWorkflowInstance.PSWorkflowContext); } if (((components & WorkflowStoreComponents.Streams) == WorkflowStoreComponents.Streams) && (PSWorkflowInstance.Streams != null)) { componentsToSave.Add(PSWorkflowInstance.Streams); } if (((components & WorkflowStoreComponents.ActivityState) == WorkflowStoreComponents.ActivityState) && (PSWorkflowInstance.RemoteActivityState != null)) { componentsToSave.Add(PSWorkflowInstance.RemoteActivityState); } if (((components & WorkflowStoreComponents.Timer) == WorkflowStoreComponents.Timer) && PSWorkflowInstance.Timer != null) { componentsToSave.Add(PSWorkflowInstance.Timer); } DoSave(componentsToSave); }
private DefinitionCache() { activitiesCleanupIntervalMSec = WorkflowJobSourceAdapter.GetInstance().GetPSWorkflowRuntime().Configuration.ActivitiesCacheCleanupIntervalMSec; _cleanupTimer = new System.Timers.Timer(activitiesCleanupIntervalMSec); _cleanupTimer.Elapsed += HandleCleanupTimerElapsed; _cleanupTimer.AutoReset = false; _cleanupTimer.Start(); }
internal void Save(WorkflowStoreComponents components, Dictionary <string, object> WorkflowContext) { Collection <object> objs = new Collection <object>(); if ((components & WorkflowStoreComponents.JobState) == WorkflowStoreComponents.JobState) { objs.Add(this.PSWorkflowInstance.State); } if (WorkflowContext != null) { objs.Add(WorkflowContext); } if ((components & WorkflowStoreComponents.Definition) == WorkflowStoreComponents.Definition && this.PSWorkflowInstance.PSWorkflowDefinition != null) { objs.Add(this.PSWorkflowInstance.PSWorkflowDefinition); } if ((components & WorkflowStoreComponents.TerminatingError) == WorkflowStoreComponents.TerminatingError && this.PSWorkflowInstance.Error != null && !WorkflowJobSourceAdapter.GetInstance().IsShutdownInProgress&& this.PSWorkflowInstance.Error.GetType() != typeof(RemoteException)) { objs.Add(this.PSWorkflowInstance.Error); } if ((components & WorkflowStoreComponents.Metadata) == WorkflowStoreComponents.Metadata && this.PSWorkflowInstance.PSWorkflowContext != null) { objs.Add(this.PSWorkflowInstance.PSWorkflowContext); } if ((components & WorkflowStoreComponents.Streams) == WorkflowStoreComponents.Streams && this.PSWorkflowInstance.Streams != null) { objs.Add(this.PSWorkflowInstance.Streams); } if ((components & WorkflowStoreComponents.Timer) == WorkflowStoreComponents.Timer && this.PSWorkflowInstance.Timer != null) { objs.Add(this.PSWorkflowInstance.Timer); } this.DoSave(objs); }
private IEnumerable <Job2> CreateJobsFromWorkflows(IEnumerable <Job2> workflowJobs, bool returnParents) { object obj = null; string str = null; string str1 = null; Guid guid; bool item; DynamicActivity workflow; bool flag; ContainerParentJob containerParentJob; Dictionary <Guid, Job2> guids = new Dictionary <Guid, Job2>(); List <Job2> job2s = new List <Job2>(); if (workflowJobs != null) { foreach (Job2 workflowJob in workflowJobs) { PSWorkflowJob pSWorkflowJob = workflowJob as PSWorkflowJob; PSWorkflowInstance pSWorkflowInstance = pSWorkflowJob.PSWorkflowInstance; if (!pSWorkflowInstance.JobStateRetrieved || pSWorkflowInstance.PSWorkflowContext.JobMetadata == null || pSWorkflowInstance.PSWorkflowContext.JobMetadata.Count == 0 || !WorkflowJobSourceAdapter.GetJobInfoFromMetadata(pSWorkflowInstance, out str1, out str, out guid) || !pSWorkflowInstance.PSWorkflowContext.JobMetadata.TryGetValue("ParentInstanceId", out obj)) { continue; } Guid guid1 = (Guid)obj; if (returnParents && !guids.ContainsKey(guid1)) { if (!pSWorkflowInstance.PSWorkflowContext.JobMetadata.TryGetValue("ParentName", out obj)) { continue; } string str2 = (string)obj; if (!pSWorkflowInstance.PSWorkflowContext.JobMetadata.TryGetValue("ParentCommand", out obj)) { continue; } string str3 = (string)obj; JobIdentifier jobIdentifier = base.RetrieveJobIdForReuse(guid1); if (jobIdentifier != null) { containerParentJob = new ContainerParentJob(str3, str2, jobIdentifier, "PSWorkflowJob"); } else { containerParentJob = new ContainerParentJob(str3, str2, guid1, "PSWorkflowJob"); } ContainerParentJob containerParentJob1 = containerParentJob; if (pSWorkflowInstance.PSWorkflowContext.JobMetadata.ContainsKey("ParentSessionId")) { pSWorkflowInstance.PSWorkflowContext.JobMetadata["ParentSessionId"] = containerParentJob1.Id; } guids.Add(guid1, containerParentJob1); } if (pSWorkflowInstance.PSWorkflowContext.JobMetadata.ContainsKey("Id")) { pSWorkflowInstance.PSWorkflowContext.JobMetadata["Id"] = workflowJob.Id; } if (pSWorkflowInstance.PSWorkflowContext.JobMetadata.ContainsKey("ProcessId")) { pSWorkflowInstance.PSWorkflowContext.JobMetadata["ProcessId"] = Process.GetCurrentProcess().Id; } workflowJob.StartParameters = new List <CommandParameterCollection>(); CommandParameterCollection commandParameterCollection = new CommandParameterCollection(); WorkflowJobSourceAdapter.AddStartParametersFromCollection(pSWorkflowInstance.PSWorkflowContext.WorkflowParameters, commandParameterCollection); WorkflowJobSourceAdapter.AddStartParametersFromCollection(pSWorkflowInstance.PSWorkflowContext.PSWorkflowCommonParameters, commandParameterCollection); if (!pSWorkflowInstance.PSWorkflowContext.JobMetadata.ContainsKey("WorkflowTakesPrivateMetadata")) { if (pSWorkflowInstance.PSWorkflowDefinition != null) { workflow = pSWorkflowInstance.PSWorkflowDefinition.Workflow as DynamicActivity; } else { workflow = null; } DynamicActivity dynamicActivity = workflow; if (dynamicActivity == null) { flag = false; } else { flag = dynamicActivity.Properties.Contains("PSPrivateMetadata"); } item = flag; } else { item = (bool)pSWorkflowInstance.PSWorkflowContext.JobMetadata["WorkflowTakesPrivateMetadata"]; } if (pSWorkflowInstance.PSWorkflowContext.PrivateMetadata != null && pSWorkflowInstance.PSWorkflowContext.PrivateMetadata.Count > 0 && !item) { Hashtable hashtables = new Hashtable(); foreach (KeyValuePair <string, object> privateMetadatum in pSWorkflowInstance.PSWorkflowContext.PrivateMetadata) { hashtables.Add(privateMetadatum.Key, privateMetadatum.Value); } commandParameterCollection.Add(new CommandParameter("PSPrivateMetadata", hashtables)); } workflowJob.StartParameters.Add(commandParameterCollection); if (!returnParents) { job2s.Add(workflowJob); } else { ((ContainerParentJob)guids[guid1]).AddChildJob(workflowJob); } if (pSWorkflowJob.WorkflowInstanceLoaded) { continue; } pSWorkflowJob.RestoreFromWorkflowInstance(pSWorkflowInstance); } if (returnParents) { foreach (Job2 value in guids.Values) { PSSQMAPI.InitiateWorkflowStateDataTracking(value); } job2s.AddRange(guids.Values); } return(job2s); } else { return(job2s); } }
static WorkflowJobSourceAdapter() { WorkflowJobSourceAdapter.Instance = new WorkflowJobSourceAdapter(); }
public override IList <Job2> GetJobsByFilter(Dictionary <string, object> filter, bool recurse) { if (filter != null) { object[] objArray = new object[1]; objArray[0] = filter; this._tracer.WriteMessage(string.Format(CultureInfo.InvariantCulture, "WorkflowJobSourceAdapter: Getting Workflow jobs by filter: {0}", objArray)); this.PopulateJobRepositoryIfRequired(); Dictionary <string, object> strs = new Dictionary <string, object>(filter, StringComparer.CurrentCultureIgnoreCase); bool flag = false; bool flag1 = true; if (strs.Keys.Count != 0) { var keys = strs.Keys; if (keys.Any <string>((string key) => { if (key.Equals("Id", StringComparison.OrdinalIgnoreCase) || key.Equals("InstanceId", StringComparison.OrdinalIgnoreCase) || key.Equals("Name", StringComparison.OrdinalIgnoreCase) || key.Equals("Command", StringComparison.OrdinalIgnoreCase)) { return(false); } else { return(!key.Equals("State", StringComparison.OrdinalIgnoreCase)); } } )) { flag1 = false; } } else { flag1 = false; } List <Job2> job2s = new List <Job2>(); if (flag1) { List <ContainerParentJob> items = this._jobRepository.GetItems(); List <Job2> job2s1 = WorkflowJobSourceAdapter.SearchJobsOnV2Parameters(items, strs); items.Clear(); if (job2s1.Count > 0) { job2s.AddRange(job2s1); } } if (recurse) { if (strs.ContainsKey("Id")) { flag = true; } if (flag) { strs.Add("ProcessId", Process.GetCurrentProcess().Id); } if (strs.ContainsKey("State")) { strs.Remove("State"); } this.LoadWorkflowInstancesFromStore(); IEnumerable <Job2> jobs = this.GetJobManager().GetJobs(WorkflowFilterTypes.All, strs); if (!filter.ContainsKey("State")) { job2s.AddRange(jobs); } else { List <Job2> list = jobs.Where <Job2>((Job2 job) => job.JobStateInfo.State == (JobState)LanguagePrimitives.ConvertTo(filter["State"], typeof(JobState), CultureInfo.InvariantCulture)).ToList <Job2>(); job2s.AddRange(list); } } List <Job2> job2s2 = new List <Job2>(); foreach (Job2 job2 in job2s) { if (job2 as ContainerParentJob == null || job2s2.Contains(job2)) { PSWorkflowJob pSWorkflowJob = job2 as PSWorkflowJob; ContainerParentJob item = this._jobRepository.GetItem((Guid)pSWorkflowJob.JobMetadata["ParentInstanceId"]); if (job2s2.Contains(item)) { continue; } job2s2.Add(item); } else { job2s2.Add(job2); } } return(job2s2); } else { throw new ArgumentNullException("filter"); } }
/// <summary> /// /// </summary> /// <param name="sessionConfigurationData"></param> /// <param name="senderInfo"></param> /// <param name="configProviderId"></param> /// <returns></returns> public override InitialSessionState GetInitialSessionState(PSSessionConfigurationData sessionConfigurationData, PSSenderInfo senderInfo, string configProviderId) { Tracer structuredTracer = new Tracer(); structuredTracer.Correlate(); if (sessionConfigurationData == null) { throw new ArgumentNullException("sessionConfigurationData"); } if (senderInfo == null) { throw new ArgumentNullException("senderInfo"); } if (string.IsNullOrEmpty(configProviderId)) { throw new ArgumentNullException("configProviderId"); } if (Interlocked.CompareExchange(ref _modulesLoaded, ModulesLoaded, ModulesNotLoaded) == ModulesNotLoaded) { // it is sufficient if Populate() is called the first time and // modules are loaded once try { IsWorkflowTypeEndpoint = true; PSWorkflowConfigurationProvider workflowConfiguration = WorkflowJobSourceAdapter.GetInstance().GetPSWorkflowRuntime().Configuration; if (workflowConfiguration == null) { throw new InvalidOperationException("PSWorkflowConfigurationProvider is null"); } workflowConfiguration.Populate(sessionConfigurationData.PrivateData, configProviderId, senderInfo); // now get all the modules in the specified path and import the same if (sessionConfigurationData.ModulesToImport != null) { foreach (var module in sessionConfigurationData.ModulesToImport) { ModuleSpecification moduleSpec = null; if (ModuleSpecification.TryParse(module, out moduleSpec)) { var modulesToImport = new Collection <ModuleSpecification> { moduleSpec }; InitialSessionState.ImportPSModule(modulesToImport); } else { InitialSessionState.ImportPSModule(new[] { Environment.ExpandEnvironmentVariables(module) }); } } } // Start the workflow job manager, if not started, to add an event handler for zero active sessions changed events // This is required to auto shutdown the workflow type shared process when no workflow jobs have scheduled/inprogress and when no active sessions WorkflowJobSourceAdapter.GetInstance().GetJobManager(); } catch (Exception) { // if there is an exception in either Populate() or Importing modules // we consider that it is not loaded Interlocked.CompareExchange(ref _modulesLoaded, ModulesNotLoaded, ModulesLoaded); throw; } } if (configProviderId.ToLower(CultureInfo.InvariantCulture).Equals("http://schemas.microsoft.com/powershell/microsoft.windows.servermanagerworkflows")) { PSSessionConfigurationData.IsServerManager = true; } return(InitialSessionState); }