ServiceData RegisterService(FinalConfiguration finalConfig, IServiceInfo s) { ServiceData data; if (_services.TryGetValue(s.ServiceFullName, out data)) { return(data); } //Set default status ConfigurationStatus serviceStatus = finalConfig.GetStatus(s.ServiceFullName); // Handle generalization. ServiceData dataGen = null; if (s.Generalization != null) { dataGen = RegisterService(finalConfig, s.Generalization); } Debug.Assert((s.Generalization == null) == (dataGen == null)); if (dataGen == null) { data = new ServiceData(this, s, serviceStatus); _serviceFamilies.Add(data.Family); } else { data = new ServiceData(s, dataGen, serviceStatus); } _services.Add(s.ServiceFullName, data); return(data); }
IYodiiEngineResult OnConfigurationChanging(Dictionary <string, FinalConfigurationItem> final, Func <FinalConfiguration, ConfigurationChangingEventArgs> createChangingEvent) { FinalConfiguration finalConfiguration = new FinalConfiguration(final); if (Engine.IsRunning) { Tuple <IYodiiEngineStaticOnlyResult, ConfigurationSolver> t = Engine.StaticResolutionByConfigurationManager(finalConfiguration); if (t.Item1 != null) { Debug.Assert(!t.Item1.Success); Debug.Assert(t.Item1.Engine == Engine); return(t.Item1); } return(OnConfigurationChangingForExternalWorld(createChangingEvent(finalConfiguration)) ?? Engine.OnConfigurationChanging(t.Item2)); } return(OnConfigurationChangingForExternalWorld(createChangingEvent(finalConfiguration)) ?? Engine.SuccessResult); }
internal void OnConfigurationChanged() { Debug.Assert(_currentEventArgs != null); FinalConfiguration = _currentEventArgs.FinalConfiguration; if (_currentEventArgs.FinalConfigurationChange == FinalConfigurationChange.StatusChanged || _currentEventArgs.FinalConfigurationChange == FinalConfigurationChange.ItemAdded || _currentEventArgs.FinalConfigurationChange == FinalConfigurationChange.ItemRemoved || _currentEventArgs.FinalConfigurationChange == FinalConfigurationChange.ImpactChanged) { RaiseConfigurationChanged(new ConfigurationChangedEventArgs(FinalConfiguration, _currentEventArgs.FinalConfigurationChange, _currentEventArgs.ConfigurationItemChanged)); } else { RaiseConfigurationChanged(new ConfigurationChangedEventArgs(FinalConfiguration, _currentEventArgs.FinalConfigurationChange, _currentEventArgs.ConfigurationLayerChanged)); } _currentEventArgs = null; }
PluginData RegisterPlugin(FinalConfiguration finalConfig, IPluginInfo p) { PluginData data; if (_plugins.TryGetValue(p.PluginFullName, out data)) { return(data); } ConfigurationStatus pluginStatus = finalConfig.GetStatus(p.PluginFullName); ServiceData service = p.Service != null ? _services[p.Service.ServiceFullName] : null; if (service == null) { ++_independentPluginsCount; } data = new PluginData(this, p, service, pluginStatus); _plugins.Add(p.PluginFullName, data); return(data); }
private void UpdateVerticesWithConfiguration(FinalConfiguration config) { if (config == null) { foreach (var v in Vertices) { v.HasConfiguration = false; v.ConfigurationStatus = ConfigurationStatus.Optional; } } else { foreach (var v in Vertices) { string identifier; if (v.IsService) { identifier = v.LabServiceInfo.ServiceInfo.ServiceFullName; } else { identifier = v.LabPluginInfo.PluginInfo.PluginFullName; } var items = config.Items.Where(x => x.ServiceOrPluginFullName == identifier); if (items.Count() > 0) { v.HasConfiguration = true; v.ConfigurationStatus = items.First().Status; } else { v.HasConfiguration = false; v.ConfigurationStatus = ConfigurationStatus.Optional; } } } }
internal ConfigurationManager(YodiiEngine engine) { Engine = engine; _configurationLayerCollection = new ConfigurationLayerCollection(this); _finalConfiguration = new FinalConfiguration(); }
internal Tuple <IYodiiEngineStaticOnlyResult, ConfigurationSolver> StaticResolutionByConfigurationManager(FinalConfiguration finalConfiguration) { Debug.Assert(IsRunning); return(ConfigurationSolver.CreateAndApplyStaticResolution(this, finalConfiguration, _discoveredInfo, false, false, false)); }
internal static Tuple <IYodiiEngineStaticOnlyResult, ConfigurationSolver> CreateAndApplyStaticResolution(YodiiEngine engine, FinalConfiguration finalConfiguration, IDiscoveredInfo discoveredInfo, bool revertServices, bool revertPlugins, bool createStaticSolvedConfigOnSuccess) { ConfigurationSolver temporarySolver = new ConfigurationSolver(engine, revertServices, revertPlugins); IYodiiEngineStaticOnlyResult result = temporarySolver.StaticResolution(finalConfiguration, discoveredInfo, createStaticSolvedConfigOnSuccess); // StaticResolution returns null on success. // If there is a result, it is either an error or createStaticSolvedConfigOnSuccess is true and this is a StaticResolutionOnly: in both // case we do not need to keep the temporary solver. if (result != null) { temporarySolver = null; } return(Tuple.Create(result, temporarySolver)); }
IYodiiEngineStaticOnlyResult StaticResolution(FinalConfiguration finalConfig, IDiscoveredInfo info, bool createStaticSolvedConfigOnSuccess) { // Registering all Services. Step = Engine.ConfigurationSolverStep.RegisterServices; { // In order to be deterministic, works on an ordered list of IServiceInfo to build the graph. List <IServiceInfo> orderedServicesInfo = info.ServiceInfos.Where(s => s != null && !String.IsNullOrWhiteSpace(s.ServiceFullName)).OrderBy(s => s.ServiceFullName).ToList(); if (_revertServicesOrder) { orderedServicesInfo.Reverse(); } foreach (IServiceInfo sI in orderedServicesInfo) { // This creates services and applies solved configuration to them: directly disabled services // and specializations disabled by their generalizations' configuration are handled. RegisterService(finalConfig, sI); } _orderedServices = orderedServicesInfo.Select(s => _services[s.ServiceFullName]).ToArray(); } // Service trees have been built. // We can now instantiate plugin data. Step = Engine.ConfigurationSolverStep.RegisterPlugins; { // In order to be deterministic, works on an ordered list of IPluginInfo to build the graph. List <IPluginInfo> orderedPluginsInfo = info.PluginInfos.Where(p => p != null).OrderBy(p => p.PluginFullName).ToList(); if (_revertPluginsOrder) { orderedPluginsInfo.Reverse(); } foreach (IPluginInfo p in orderedPluginsInfo) { RegisterPlugin(finalConfig, p); } _orderedPlugins = orderedPluginsInfo.Select(p => _plugins[p.PluginFullName]).ToArray(); } // All possible plugins are registered. Services without any available plugins are de facto disabled. // Propagation for each service is deferred. Step = Engine.ConfigurationSolverStep.OnAllPluginsAdded; { foreach (var f in _serviceFamilies) { f.OnAllPluginsAdded(); } ProcessDeferredPropagations(); } // Now, we apply ServiceReference Running constraints from every plugins to their referenced services. Step = ConfigurationSolverStep.PropagatePluginStatus; { foreach (PluginData p in _orderedPlugins) { if (p.FinalConfigSolvedStatus == SolvedConfigurationStatus.Running) { p.PropagateRunningStatus(); } } ProcessDeferredPropagations(); } // Finalizes static resolution by computing final Runnable statuses per impact for Optional and Runnable plugins or services. Step = ConfigurationSolverStep.InitializeFinalStartableStatus; { foreach (ServiceData s in _orderedServices) { s.InitializeFinalStartableStatus(); } foreach (PluginData p in _orderedPlugins) { p.InitializeFinalStartableStatus(); } } List <PluginData> blockingPlugins = null; List <ServiceData> blockingServices = null; Step = ConfigurationSolverStep.BlockingDetection; { // Time to conclude about configuration and to initialize dynamic resolution. // Any Plugin that has a ConfigOriginalStatus greater or equal to Runnable and is Disabled leads to an impossible configuration. foreach (PluginData p in _orderedPlugins) { if (p.Disabled) { if (p.ConfigOriginalStatus >= ConfigurationStatus.Runnable) { if (blockingPlugins == null) { blockingPlugins = new List <PluginData>(); } blockingPlugins.Add(p); } } } // Any Service that has a ConfigOriginalStatus greater or equal to Runnable and is Disabled leads to an impossible configuration. foreach (ServiceData s in _orderedServices) { if (s.Disabled) { if (s.ConfigOriginalStatus >= ConfigurationStatus.Runnable) { if (blockingServices == null) { blockingServices = new List <ServiceData>(); } blockingServices.Add(s); } } } } if (blockingPlugins != null || blockingServices != null) { Step = ConfigurationSolverStep.StaticError; return(new YodiiEngineResult(this, blockingPlugins, blockingServices, _engine)); } Step = ConfigurationSolverStep.WaitingForDynamicResolution; if (createStaticSolvedConfigOnSuccess) { return(new YodiiEngineResult(this, _engine)); } return(null); }