Пример #1
0
            /// <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));
            }
Пример #2
0
 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));
             }
         }
     }
 }
Пример #3
0
            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);
            }
Пример #4
0
        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);
        }
Пример #5
0
 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);
 }
Пример #6
0
        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);
        }
Пример #7
0
        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();
        }
Пример #8
0
        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);
        }
Пример #9
0
 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);
         }
     }
 }
Пример #10
0
            public IYodiiEngineResult Clear()
            {
                if (_layers.Count == 0)
                {
                    return(_parent.Engine.SuccessResult);
                }
                IYodiiEngineResult result = _parent.OnConfigurationClearing();

                if (result.Success)
                {
                    _layers.Clear();
                    _parent.OnConfigurationChanged();
                }
                return(result);
            }
Пример #11
0
            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);
            }
Пример #12
0
        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);
        }
Пример #13
0
 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));
 }
Пример #14
0
 public static void CheckNoBlockingServices(this IYodiiEngineResult @this)
 {
     Assert.That((@this.StaticFailureResult != null ? @this.StaticFailureResult.BlockingServices : Enumerable.Empty <IStaticSolvedService>()), Is.Empty);
 }
Пример #15
0
        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());
        }