bool ApplyAndTellMeIfCommandMustBeKept(YodiiCommand cmd) { if (cmd.ServiceFullName != null) { // If the service does not exist, we keep the command. ServiceData s; if (_services.TryGetValue(cmd.ServiceFullName, out s)) { if (cmd.Start) { return(s.DynamicStartByCommand(cmd.Impact)); } return(s.DynamicStopByCommand()); } return(true); } // Starts or stops the plugin. // If the plugin does not exist, we keep the command. PluginData p; if (_plugins.TryGetValue(cmd.PluginFullName, out p)) { if (cmd.Start) { return(p.DynamicStartByCommand(cmd.Impact)); } else { return(p.DynamicStopByCommand()); } } return(true); }
public IYodiiEngineResult Stop(string callerKey) { if (!_capability.CanStop) { throw new InvalidOperationException("You must call Capability.CanStop and ensure that it returns true before calling Stop."); } YodiiCommand command = new YodiiCommand(false, _fullName, IsPlugin, StartDependencyImpact.Unknown, callerKey); return(_engine.AddYodiiCommand(command)); }
public IYodiiEngineResult Start(string callerKey, StartDependencyImpact impact = StartDependencyImpact.Unknown) { if (!_capability.CanStartWith(impact)) { throw new InvalidOperationException("You must call Capability.CanStart with the wanted impact and ensure that it returns true before calling Start."); } YodiiCommand command = new YodiiCommand(true, _fullName, IsPlugin, impact, callerKey); return(_engine.AddYodiiCommand(command)); }
IYodiiEngineResult DoDynamicResolution(ConfigurationSolver solver, Func <YodiiCommand, bool> existingCommandFilter, YodiiCommand cmd, Action onPreSuccess = null) { var dynResult = solver.DynamicResolution(existingCommandFilter != null ? _yodiiCommands.Where(existingCommandFilter) : _yodiiCommands, cmd); var errors = _host.Apply(dynResult.Disabled, dynResult.Stopped, dynResult.Running); if (errors != null && errors.Any()) { IYodiiEngineResult result = solver.CreateDynamicFailureResult(errors); _liveInfo.UpdateRuntimeErrors(errors, solver.FindExistingPlugin); return(result); } // Success: if (onPreSuccess != null) { onPreSuccess(); } bool wasStopped = _currentSolver == null; if (_currentSolver != solver) { _currentSolver = solver; } _liveInfo.UpdateFrom(_currentSolver); _yodiiCommands.Merge(dynResult.Commands); if (wasStopped) { RaisePropertyChanged("IsRunning"); } return(_successResult); }
internal IYodiiEngineResult AddYodiiCommand(YodiiCommand cmd) { Debug.Assert(IsRunning, "Cannot call this function when the engine is not running"); return(DoDynamicResolution(_currentSolver, null, cmd)); }
/// <summary> /// Solves undetermined status based on commands. /// </summary> /// <param name="commands"></param> /// <returns>This method returns a Tuple <IEnumerable<IPluginInfo>,IEnumerable<IPluginInfo>,IEnumerable<IPluginInfo>> to the host. /// Plugins are either disabled, stopped (but can be started) or running (locked or not).</returns> internal DynamicSolverResult DynamicResolution(IEnumerable <YodiiCommand> pastCommands, YodiiCommand newOne = null) { foreach (var f in _serviceFamilies) { f.DynamicResetState(); } foreach (var p in _plugins.Values) { p.DynamicResetState(); } foreach (var f in _serviceFamilies) { Debug.Assert(!f.Root.Disabled || f.Root.FindFirstPluginData(p => !p.Disabled) == null); f.DynamicOnAllPluginsStateInitialized(); } List <YodiiCommand> commands = new List <YodiiCommand>(); if (newOne != null) { bool alwaysTrue = ApplyAndTellMeIfCommandMustBeKept(newOne); Debug.Assert(alwaysTrue, "The newly added command is necessarily okay."); commands.Add(newOne); } foreach (var previous in pastCommands) { if (newOne == null || newOne.ServiceFullName != previous.ServiceFullName || newOne.PluginFullName != previous.PluginFullName) { if (ApplyAndTellMeIfCommandMustBeKept(previous)) { commands.Add(previous); } } } foreach (var f in _serviceFamilies) { Debug.Assert(!f.Root.Disabled || f.Root.FindFirstPluginData(p => !p.Disabled) == null, "All plugins must be disabled."); if (!f.Root.Disabled) { f.DynamicFinalDecision(true); } } foreach (var f in _serviceFamilies) { Debug.Assert(!f.Root.Disabled || f.Root.FindFirstPluginData(p => !p.Disabled) == null, "All plugins must be disabled."); if (!f.Root.Disabled) { f.DynamicFinalDecision(false); } } List <IPluginInfo> disabled = new List <IPluginInfo>(); List <IPluginInfo> stopped = new List <IPluginInfo>(); List <IPluginInfo> running = new List <IPluginInfo>(); foreach (var p in _plugins.Values) { if (p.DynamicStatus != null) { if (p.DynamicStatus.Value == RunningStatus.Disabled) { disabled.Add(p.PluginInfo); } else if (p.DynamicStatus.Value == RunningStatus.Stopped) { stopped.Add(p.PluginInfo); } else { running.Add(p.PluginInfo); } } else { Debug.Assert(p.Service == null); p.DynamicStopBy(PluginRunningStatusReason.StoppedByFinalDecision); stopped.Add(p.PluginInfo); } } return(new DynamicSolverResult(disabled.AsReadOnlyList(), stopped.AsReadOnlyList(), running.AsReadOnlyList(), commands.AsReadOnlyList())); }