/// <summary> /// Removes a configuration for plugin or a service. /// </summary> /// <param name="serviceOrPluginFullName">The identifier.</param> /// <returns>Detailed result of the operation.</returns> public IYodiiEngineResult Remove(string serviceOrPluginFullName) { if (String.IsNullOrEmpty(serviceOrPluginFullName)) { throw new ArgumentException("serviceOrPluginFullName is null or empty"); } ConfigurationItem target = _items.GetByKey(serviceOrPluginFullName); if (target != null) { if (_layer._owner == null) { target.OnRemoved(); _items.Remove(target); return(SuccessYodiiEngineResult.NullEngineSuccessResult); } IYodiiEngineResult result = _layer._owner.OnConfigurationItemRemoving(target); if (result.Success) { target.OnRemoved(); _items.Remove(target); _layer._owner.OnConfigurationChanged(); return(result); } return(result); } return(new YodiiEngineResult(new ConfigurationFailureResult("Item not found"), _layer._owner != null ? _layer._owner.Engine : null)); }
public static void CheckWantedConfigSolvedStatusIs(this IYodiiEngineResult @this, string pluginOrServiceFullName, SolvedConfigurationStatus wantedStatus) { if (@this.Success) { Assert.Fail("Not implemented ==> TODO: IYodiiEngineResult SHOULD have a 'IYodiiEngine Engine' property!"); } else { var service = @this.StaticFailureResult.StaticSolvedConfiguration.Services.FirstOrDefault(s => s.ServiceInfo.ServiceFullName == pluginOrServiceFullName); if (service != null) { Assert.That(service.WantedConfigSolvedStatus, Is.EqualTo(wantedStatus), String.Format("Service '{0}' has a WantedConfigSolvedStatus = '{1}'. It must be '{2}'.", pluginOrServiceFullName, service.WantedConfigSolvedStatus, wantedStatus)); } else { var plugin = @this.StaticFailureResult.StaticSolvedConfiguration.Plugins.FirstOrDefault(p => p.PluginInfo.PluginFullName == pluginOrServiceFullName); if (plugin != null) { Assert.That(plugin.WantedConfigSolvedStatus, Is.EqualTo(wantedStatus), String.Format("Plugin '{0}' has a WantedConfigSolvedStatus = '{1}'. It must be '{2}'.", pluginOrServiceFullName, plugin.WantedConfigSolvedStatus, wantedStatus)); } else { Assert.Fail(String.Format("Plugin or Service '{0}' not found.", pluginOrServiceFullName)); } } } }
public IYodiiEngineResult Remove(IConfigurationLayer layer) { if (layer == null) { throw new ArgumentNullException("layer"); } if (layer.ConfigurationManager != _parent) { return(_parent.Engine.SuccessResult); } // When called by a hacker. ConfigurationLayer l = layer as ConfigurationLayer; if (l == null) { throw new ArgumentException("Invalid layer.", "layer"); } Debug.Assert(_layers.Contains(layer), "Since layer.ConfigurationManager == _parent, then it necessarily belongs to us."); IYodiiEngineResult result = _parent.OnConfigurationLayerRemoving(l); if (result.Success) { _layers.Remove(l); l.SetConfigurationManager(null); _parent.OnConfigurationChanged(); } return(result); }
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); }
public static void CheckSuccess(this IYodiiEngineResult @this) { Assert.That(@this.Success, Is.True); Assert.That(@this.StaticFailureResult, Is.Null); Assert.That(@this.HostFailureResult, Is.Null); Assert.That(@this.ConfigurationFailureResult, Is.Null); Assert.That(@this.PluginCulprits, Is.Empty); Assert.That(@this.ServiceCulprits, Is.Empty); }
public static IYodiiEngineResult AddSuccess(this IConfigurationItemCollection @this, string name, ConfigurationStatus status, ConfigurationStatus?solvedStatusInFinalConfig = null) { IYodiiEngineResult r = @this.Add(name, status); r.CheckSuccess(); if (solvedStatusInFinalConfig != null) { Assert.That(@this.ParentLayer.ConfigurationManager.FinalConfiguration.GetStatus(name), Is.EqualTo(solvedStatusInFinalConfig)); } return(r); }
public void EngineUseTest() { IYodiiEngine engine = new YodiiEngine(new YodiiEngineHostMock()); Assert.Throws <ArgumentNullException>(() => engine.SetDiscoveredInfo(null)); DiscoveredInfo discoveredInfo = MockInfoFactory.CreateGraph003(); IYodiiEngineResult result = engine.SetDiscoveredInfo(discoveredInfo); Assert.That(result.Success, Is.True); Assert.That(engine.DiscoveredInfo == discoveredInfo); PluginInfo pluginA1 = discoveredInfo.FindPlugin("PluginA-1"); PluginInfo pluginA2 = discoveredInfo.FindPlugin("PluginA-2"); ServiceInfo serviceA = discoveredInfo.FindService("ServiceA"); result = engine.Start(); Assert.That(result.Success, Is.True); Assert.That(engine.LiveInfo, Is.Not.Null); Assert.That(engine.LiveInfo.FindPlugin(pluginA1.PluginFullName).PluginInfo, Is.EqualTo(pluginA1)); Assert.That(engine.LiveInfo.FindPlugin(pluginA2.PluginFullName).PluginInfo, Is.EqualTo(pluginA2)); Assert.That(engine.LiveInfo.FindService(serviceA.ServiceFullName).ServiceInfo, Is.EqualTo(serviceA)); Assert.That(engine.LiveInfo.FindPlugin(pluginA1.PluginFullName).IsRunning, Is.False); Assert.That(engine.LiveInfo.FindPlugin(pluginA2.PluginFullName).IsRunning, Is.False); Assert.That(engine.LiveInfo.FindService(serviceA.ServiceFullName).IsRunning, Is.False); Assert.That(engine.LiveInfo.FindPlugin(pluginA1.PluginFullName).RunningStatus, Is.EqualTo(RunningStatus.Stopped)); Assert.That(engine.LiveInfo.FindPlugin(pluginA2.PluginFullName).RunningStatus, Is.EqualTo(RunningStatus.Stopped)); Assert.That(engine.LiveInfo.FindService(serviceA.ServiceFullName).RunningStatus, Is.EqualTo(RunningStatus.Stopped)); Assert.That(engine.LiveInfo.FindPlugin(pluginA1.PluginFullName).Service, Is.EqualTo(engine.LiveInfo.FindService(serviceA.ServiceFullName))); Assert.That(engine.LiveInfo.FindPlugin(pluginA2.PluginFullName).Service, Is.EqualTo(engine.LiveInfo.FindService(serviceA.ServiceFullName))); Assert.That(engine.LiveInfo.FindService(serviceA.ServiceFullName).Generalization, Is.Null); Assert.That(engine.LiveInfo.FindPlugin(pluginA1.PluginFullName).ConfigOriginalStatus, Is.EqualTo(ConfigurationStatus.Optional)); Assert.That(engine.LiveInfo.FindPlugin(pluginA2.PluginFullName).ConfigOriginalStatus, Is.EqualTo(ConfigurationStatus.Optional)); Assert.That(engine.LiveInfo.FindService(serviceA.ServiceFullName).ConfigOriginalStatus, Is.EqualTo(ConfigurationStatus.Optional)); Assert.That(engine.LiveInfo.FindPlugin(pluginA1.PluginFullName).WantedConfigSolvedStatus, Is.EqualTo(SolvedConfigurationStatus.Runnable)); Assert.That(engine.LiveInfo.FindPlugin(pluginA2.PluginFullName).WantedConfigSolvedStatus, Is.EqualTo(SolvedConfigurationStatus.Runnable)); Assert.That(engine.LiveInfo.FindService(serviceA.ServiceFullName).WantedConfigSolvedStatus, Is.EqualTo(SolvedConfigurationStatus.Runnable)); Assert.That(engine.LiveInfo.FindPlugin(pluginA1.PluginFullName).CurrentError, Is.Null); Assert.That(engine.LiveInfo.FindPlugin(pluginA2.PluginFullName).CurrentError, Is.Null); Assert.That(engine.LiveInfo.FindService(serviceA.ServiceFullName).DisabledReason, Is.Null); engine.Stop(); }
public IYodiiEngineResult SetImpact(StartDependencyImpact newImpact) { IYodiiEngineResult result = _owner.OnConfigurationItemChanging(this, new FinalConfigurationItem(_serviceOrPluginFullName, _status, _impact)); if (result.Success) { _impact = newImpact; NotifyPropertyChanged("Impact"); if (_owner.ConfigurationManager != null) { _owner.ConfigurationManager.OnConfigurationChanged(); } } return(result); }
public static void Trace(this IYodiiEngineResult @this, IActivityMonitor m) { if (@this.Success) { m.Trace().Send("Success!"); } else { m.Trace().Send("Failed!"); if (@this.StaticFailureResult != null) { @this.StaticFailureResult.Trace(m); } } }
public IYodiiEngineResult Clear() { if (_layers.Count == 0) { return(_parent.Engine.SuccessResult); } IYodiiEngineResult result = _parent.OnConfigurationClearing(); if (result.Success) { _layers.Clear(); _parent.OnConfigurationChanged(); } return(result); }
public IYodiiEngineResult Add(string serviceOrPluginFullName, ConfigurationStatus status, string statusReason = "", StartDependencyImpact impact = StartDependencyImpact.Unknown) { if (String.IsNullOrEmpty(serviceOrPluginFullName)) { throw new ArgumentException("serviceOrPluginFullName is null or empty"); } ConfigurationItem existing = _items.GetByKey(serviceOrPluginFullName); if (existing != null) { IYodiiEngineResult res = existing.SetStatus(status); if (res.Success) { return(existing.SetImpact(impact)); } return(res); } ConfigurationItem newItem = new ConfigurationItem(_layer, serviceOrPluginFullName, status, impact, statusReason); if (_layer._owner == null) { _items.Add(newItem); return(SuccessYodiiEngineResult.NullEngineSuccessResult); } IYodiiEngineResult result = _layer._owner.OnConfigurationItemAdding(newItem); if (result.Success) { _items.Add(newItem); _layer._owner.OnConfigurationChanged(); return(result); } newItem.OnRemoved(); return(result); }
public IYodiiEngineResult SetStatus(ConfigurationStatus newStatus, string statusReason = "") { if (_statusReason == null) { throw new InvalidOperationException(); } IYodiiEngineResult result = _owner.OnConfigurationItemChanging(this, new FinalConfigurationItem(_serviceOrPluginFullName, _status, _impact)); if (result.Success) { _status = newStatus; NotifyPropertyChanged("Status"); if (StatusReason != statusReason) { StatusReason = statusReason; } if (_owner.ConfigurationManager != null) { _owner.ConfigurationManager.OnConfigurationChanged(); } } return(result); }
public static void CheckAllBlockingServicesAre(this IYodiiEngineResult @this, string names) { string[] n = names.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); Assert.That([email protected] && @this.StaticFailureResult != null, String.Format("{0} blocking services expected. No error found.", n.Length)); CheckContainsAllWithAlternative(n, @this.StaticFailureResult.BlockingServices.Select(s => s.ServiceInfo.ServiceFullName)); }
public static void CheckNoBlockingServices(this IYodiiEngineResult @this) { Assert.That((@this.StaticFailureResult != null ? @this.StaticFailureResult.BlockingServices : Enumerable.Empty <IStaticSolvedService>()), Is.Empty); }
public static string Describe(this IYodiiEngineResult result) { StringBuilder sb = new StringBuilder(); // ConfigurationFailureResult if (result.ConfigurationFailureResult != null && result.ConfigurationFailureResult.FailureReasons.Count > 0) { sb.AppendLine("Configuration error:"); foreach (var reason in result.ConfigurationFailureResult.FailureReasons) { sb.AppendLine(String.Format("- {0}", reason)); } } // StaticFailureResult if (result.StaticFailureResult != null) { sb.AppendLine("Error during static resolution:"); if (result.StaticFailureResult.BlockingServices.Count > 0) { sb.AppendLine("* These services could not be started:"); foreach (var s in result.StaticFailureResult.BlockingServices) { sb.AppendLine( String.Format(" - Service '{0}':\n {1}", s.ServiceInfo.ServiceFullName, s.DisabledReason) ); } } if (result.StaticFailureResult.BlockingPlugins.Count > 0) { sb.AppendLine("* These plugins could not be started:"); foreach (var p in result.StaticFailureResult.BlockingPlugins) { sb.AppendLine( String.Format(" - Plugin '{0}':\n {1}", p.PluginInfo.PluginFullName, p.DisabledReason) ); } } } if (result.HostFailureResult != null) { sb.AppendLine("There was a runtime error on the plugin host:"); foreach (var r in result.HostFailureResult.ErrorPlugins) { sb.AppendLine( String.Format("For plugin '{0}':\n * {1}", r.Plugin.PluginInfo.PluginFullName, r.Error.Message) ); } } if (result.ServiceCulprits.Count > 0) { sb.AppendLine("These services caused the error:"); foreach (var pc in result.ServiceCulprits) { sb.AppendLine( String.Format("- '{0}'", pc.ServiceFullName) ); } } if (result.PluginCulprits.Count > 0) { sb.AppendLine("These plugins caused the error:"); foreach (var pc in result.PluginCulprits) { sb.AppendLine( String.Format("- '{0}'", pc.PluginFullName) ); } } return(sb.ToString()); }