예제 #1
0
        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");
            }
        }
예제 #2
0
        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);
        }
예제 #3
0
        private DefinitionCache()
        {
            activitiesCleanupIntervalMSec = WorkflowJobSourceAdapter.GetInstance().GetPSWorkflowRuntime().Configuration.ActivitiesCacheCleanupIntervalMSec;

            _cleanupTimer           = new System.Timers.Timer(activitiesCleanupIntervalMSec);
            _cleanupTimer.Elapsed  += HandleCleanupTimerElapsed;
            _cleanupTimer.AutoReset = false;
            _cleanupTimer.Start();
        }
예제 #4
0
        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);
        }
        /// <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);
        }