Example #1
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);
            }
Example #2
0
        public void ManagerCreationTests()
        {
            YodiiEngine engine = new YodiiEngine(new YodiiEngineHostMock());
            int         managerChangingCount = 0;
            int         managerChangedCount  = 0;

            engine.Configuration.ConfigurationChanging += delegate(object sender, ConfigurationChangingEventArgs e)
            {
                Assert.That(e.IsCanceled == false, "Configuration manager does not cancel by default.");
                Assert.That(e.FinalConfiguration != null, "Proposed FinalConfiguration exists.");

                managerChangingCount++;
            };

            engine.Configuration.ConfigurationChanged += delegate(object sender, ConfigurationChangedEventArgs e)
            {
                Assert.That(e.FinalConfiguration != null, "FinalConfiguration exists.");

                managerChangedCount++;
            };

            IYodiiEngineResult  result;
            IConfigurationLayer layer = engine.Configuration.Layers.Create("BaseConfig");

            result = layer.Items.Add("Yodii.ManagerService", ConfigurationStatus.Runnable);
            Assert.That(result.Success, Is.True);
            result = layer.Items.Add(Guid.NewGuid().ToString(), ConfigurationStatus.Disabled);
            Assert.That(result.Success, Is.True);

            Assert.That(managerChangingCount == 2);
            Assert.That(managerChangedCount == 2);

            Assert.That(engine.Configuration.FinalConfiguration != null, "Non-cancelled FinalConfiguration exists.");
        }
Example #3
0
        private void ExecuteRemoveLayer(object param)
        {
            Debug.Assert(param is IConfigurationLayer);
            IConfigurationLayer layer = (IConfigurationLayer)param;

            bool cancelled = false;

            if (layer.Items.Count != 0)
            {
                var messageBoxResult = MessageBox.Show("Really delete this layer ?\n\nIts configuration will be lost.", "Confirm layer deletion", MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.No, MessageBoxOptions.None);
                if (messageBoxResult != MessageBoxResult.Yes)
                {
                    cancelled = true;
                }
            }
            if (!cancelled)
            {
                var layerRemoveResult = layer.ConfigurationManager.Layers.Remove(layer);

                if (!layerRemoveResult.Success)
                {
                    RaiseUserError("Couldn't remove layer", String.Format("Failed to remove layer.\n\n{1}", String.Join("; ", layerRemoveResult.ConfigurationFailureResult.FailureReasons)));
                }
            }
        }
Example #4
0
        private void ExecuteAddLayer(object param)
        {
            CreateConfigurationLayerWindow w = new CreateConfigurationLayerWindow();

            w.Owner = _window;

            bool?result = w.ShowDialog();

            if (result == true)
            {
                string layerName = w.NewLayerName.Text;

                IConfigurationLayer newLayer = _configurationManager.Layers.Create(layerName);
            }
        }
Example #5
0
        private void ApplyPersistedStateToLab()
        {
            // Stop running engine
            if (state.Engine.IsRunning)
            {
                state.Engine.Stop();
            }

            // Clear configuration manager
            foreach (var l in state.Engine.Configuration.Layers.ToList())
            {
                var result = state.Engine.Configuration.Layers.Remove(l);
                Debug.Assert(result.Success);
            }

            // Clear services and plugins
            state.ClearState();

            // Add services and plugins
            foreach (ServiceInfo s in deserializedState.Services)
            {
                state.LoadServiceInfo(s);
            }
            foreach (PluginInfo p in deserializedState.Plugins)
            {
                state.LoadPluginInfo(p);
            }

            // Load configuration manager data
            foreach (PersistedConfigurationLayer l in deserializedState.ConfigurationLayers)
            {
                IConfigurationLayer newLayer = state.Engine.Configuration.Layers.Create(l.LayerName);

                foreach (PersistedConfigurationItem item in l.Items)
                {
                    var result = newLayer.Items.Add(item.ServiceOrPluginId, item.Status, item.StatusReason);
                    Debug.Assert(result.Success);
                }
            }
        }
Example #6
0
        private void ExecuteAddConfigItem(object param)
        {
            if (_isChangingConfig)
            {
                return;
            }
            if (_disposed)
            {
                return;
            }
            _isChangingConfig = true;
            Debug.Assert(param != null && param is IConfigurationLayer);

            IConfigurationLayer           layer = param as IConfigurationLayer;
            CreateConfigurationItemWindow w     = new CreateConfigurationItemWindow(_serviceInfoManager);

            w.Owner = _window;

            var windowResult = w.ShowDialog();

            if (windowResult == true)
            {
                string serviceOrPluginId = w.ViewModel.SelectedServiceOrPluginId;
                if (serviceOrPluginId != null)
                {
                    var itemAddResult = layer.Items.Add(serviceOrPluginId, w.ViewModel.SelectedStatus);
                    if (!itemAddResult.Success)
                    {
                        string message = itemAddResult.Describe();

                        RaiseUserError("Couldn't add item", String.Format("Configuration of {0} could not be added, as it would cause the following error:\n\n{1}",
                                                                          _serviceInfoManager.GetDescriptionOfServiceOrPluginFullName(serviceOrPluginId),
                                                                          message)
                                       );
                    }
                }
            }
            _isChangingConfig = false;
        }
Example #7
0
        public void LayerCreationTest()
        {
            YodiiEngine e = new YodiiEngine(new YodiiEngineHostMock());

            IConfigurationLayer layer = e.Configuration.Layers.Create("TestConfig");

            Assert.That(layer.Items.Count == 0);
            Assert.That(layer.LayerName == "TestConfig");

            string             pluginIdentifier;
            IYodiiEngineResult result;

            // Add a random plugin GUID
            pluginIdentifier = Guid.NewGuid().ToString();
            result           = layer.Items.Add(pluginIdentifier, ConfigurationStatus.Disabled);
            Assert.That(result.Success, Is.True);
            Assert.That(layer.Items.Count == 1);
            Assert.That(layer.Items[pluginIdentifier], Is.InstanceOf <ConfigurationItem>());

            // Add another random plugin GUID
            pluginIdentifier = Guid.NewGuid().ToString();
            result           = layer.Items.Add(pluginIdentifier, ConfigurationStatus.Runnable);
            Assert.That(result.Success, Is.True);
            Assert.That(layer.Items.Count == 2);
            Assert.That(layer.Items[pluginIdentifier], Is.InstanceOf <ConfigurationItem>());

            // Remove last plugin GUID
            result = layer.Items.Remove(pluginIdentifier);
            Assert.That(result.Success, Is.True);
            Assert.That(layer.Items.Count == 1);

            // Add some service
            pluginIdentifier = "Yodii.ManagerService";
            result           = layer.Items.Add(pluginIdentifier, ConfigurationStatus.Runnable);
            Assert.That(result.Success, Is.True);
            Assert.That(layer.Items.Count == 2);
            Assert.That(layer.Items[pluginIdentifier], Is.InstanceOf <ConfigurationItem>());
        }
Example #8
0
        public void ConfigChanged()
        {
            /**
             *  +--------+
             *  |ServiceA+ ------+
             *  |        |       |
             *  +---+----+       |
             *      |            |
             *      |            |
             *      |            |
             *      |        +---+---*-+
             *  +---+-----+  |PluginA-2|
             *  |PluginA-1|  |         |
             *  |         |  +---------+
             *  +---------+
             */
            DiscoveredInfo info   = MockInfoFactory.CreateGraph003();
            YodiiEngine    engine = new YodiiEngine(new YodiiEngineHostMock());

            engine.SetDiscoveredInfo(info);
            engine.Start();
            ILiveServiceInfo sA = engine.LiveInfo.FindService("ServiceA");
            ILivePluginInfo  p1 = engine.LiveInfo.FindPlugin("PluginA-1");
            ILivePluginInfo  p2 = engine.LiveInfo.FindPlugin("PluginA-2");

            Assert.That(sA != null && p1 != null && p2 != null);

            Assert.That(p1.Capability.CanStart && p2.Capability.CanStart && sA.Capability.CanStart, Is.True);
            Assert.That(p1.Capability.CanStartWithFullStart && p2.Capability.CanStartWithFullStart && sA.Capability.CanStartWithFullStart, Is.True);
            Assert.That(p1.Capability.CanStartWithStartRecommended && p2.Capability.CanStartWithStartRecommended && sA.Capability.CanStartWithStartRecommended, Is.True);
            Assert.That(p1.Capability.CanStartWithStopOptionalAndRunnable && p2.Capability.CanStartWithStopOptionalAndRunnable && sA.Capability.CanStartWithStopOptionalAndRunnable, Is.True);
            Assert.That(p1.Capability.CanStartWithFullStop && p2.Capability.CanStartWithFullStop && sA.Capability.CanStartWithFullStop, Is.True);

            HashSet <string> propertyChanged = new HashSet <string>();

            p1.PropertyChanged += (s, e) =>
            {
                Assert.That(s, Is.SameAs(p1));
                Assert.That(propertyChanged.Add("p1." + e.PropertyName));
            };
            p1.Capability.PropertyChanged += (s, e) =>
            {
                Assert.That(s, Is.SameAs(p1.Capability));
                Assert.That(propertyChanged.Add("p1.Capablity." + e.PropertyName));
            };
            p2.PropertyChanged += (s, e) =>
            {
                Assert.That(s, Is.SameAs(p2));
                Assert.That(propertyChanged.Add("p2." + e.PropertyName));
            };
            p2.Capability.PropertyChanged += (s, e) =>
            {
                Assert.That(s, Is.SameAs(p2.Capability));
                Assert.That(propertyChanged.Add("p2.Capablity." + e.PropertyName));
            };
            sA.PropertyChanged += (s, e) =>
            {
                Assert.That(s, Is.SameAs(sA));
                Assert.That(propertyChanged.Add("sA." + e.PropertyName));
            };
            sA.Capability.PropertyChanged += (s, e) =>
            {
                Assert.That(s, Is.SameAs(sA.Capability));
                Assert.That(propertyChanged.Add("sA.Capablity." + e.PropertyName));
            };

            IConfigurationLayer config = engine.Configuration.Layers.Create("Default");

            config.Items.Add(p1.FullName, ConfigurationStatus.Disabled);

            Assert.That(p1.Capability.CanStart && p1.Capability.CanStartWithFullStart &&
                        p1.Capability.CanStartWithStartRecommended && p1.Capability.CanStartWithStopOptionalAndRunnable &&
                        p1.Capability.CanStartWithFullStop, Is.False);

            Assert.That(p2.Capability.CanStart && sA.Capability.CanStart, Is.True);
            Assert.That(p2.Capability.CanStartWithFullStart && sA.Capability.CanStartWithFullStart, Is.True);
            Assert.That(p2.Capability.CanStartWithStartRecommended && sA.Capability.CanStartWithStartRecommended, Is.True);
            Assert.That(p2.Capability.CanStartWithStopOptionalAndRunnable && sA.Capability.CanStartWithStopOptionalAndRunnable, Is.True);
            Assert.That(p2.Capability.CanStartWithFullStop && sA.Capability.CanStartWithFullStop, Is.True);


            CollectionAssert.AreEquivalent(new string[] {
                "p1.Capablity.CanStart",
                "p1.Capablity.CanStartWithFullStart",
                "p1.Capablity.CanStartWithStartRecommended",
                "p1.Capablity.CanStartWithStopOptionalAndRunnable",
                "p1.Capablity.CanStartWithFullStop",
                "p1.DisabledReason",
                "p1.RunningStatus",
                "p1.ConfigOriginalStatus",
                "p1.WantedConfigSolvedStatus",
                "p1.FinalConfigSolvedStatus"
            }, propertyChanged);
            propertyChanged.Clear();

            config.Items.Add(p1.FullName, ConfigurationStatus.Optional);

            CollectionAssert.AreEquivalent(new string[] {
                "p1.Capablity.CanStart",
                "p1.Capablity.CanStartWithFullStart",
                "p1.Capablity.CanStartWithStartRecommended",
                "p1.Capablity.CanStartWithStopOptionalAndRunnable",
                "p1.Capablity.CanStartWithFullStop",
                "p1.DisabledReason",
                "p1.RunningStatus",
                "p1.ConfigOriginalStatus",
                "p1.WantedConfigSolvedStatus",
                "p1.FinalConfigSolvedStatus"
            }, propertyChanged);
        }
 internal void CheckPosition( IConfigurationLayer layer )
 {
     _layers.CheckPosition( _layers.IndexOf( layer ) );
 }
            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;
            }
 internal void OnLayerNameChanged( IConfigurationLayer layer )
 {
     _configurationLayerCollection.CheckPosition( layer );
 }
Example #12
0
 /// <summary>
 /// Creates a new instance of ConfigurationChangingEventArgs when change is triggered by a ConfigurationLayer.
 /// </summary>
 /// <param name="finalConfiguration">New FinalConfiguration</param>
 /// <param name="finalConfigurationChanged">Details of changes in the new FinalConfiguration</param>
 /// <param name="configurationLayer">Layer that provoked this change</param>
 public ConfigurationChangingEventArgs(FinalConfiguration finalConfiguration, FinalConfigurationChange finalConfigurationChanged, IConfigurationLayer configurationLayer)
 {
     _finalConfiguration        = finalConfiguration;
     _finalConfigurationChange  = finalConfigurationChanged;
     _configurationLayerChanged = configurationLayer;
 }
Example #13
0
        public void LayerAddPrecedenceTest()
        {
            var engine = new YodiiEngine(new YodiiEngineHostMock());
            IConfigurationLayer layer = engine.Configuration.Layers.Create("TestConfig");

            IYodiiEngineResult result;

            // Precedence test for Disabled
            string pluginId = Guid.NewGuid().ToString();

            result = layer.Items.Add(pluginId, ConfigurationStatus.Disabled);
            Assert.That(result.Success, Is.True);
            Assert.That(layer.Items[pluginId].Status == ConfigurationStatus.Disabled);

            result = layer.Items.Add(pluginId, ConfigurationStatus.Disabled);
            Assert.That(result.Success, Is.True, "Adding the same plugin twice, in the same state, is a valid operation.");
            Assert.That(layer.Items.Count == 1, "Adding the same plugin twice, in the same state, does not actually add it and increment the count.");

            result = layer.Items.Add(pluginId, ConfigurationStatus.Optional);
            Assert.That(result.Success, Is.True);
            result = layer.Items.Add(pluginId, ConfigurationStatus.Runnable);
            Assert.That(result.Success, Is.True);
            result = layer.Items.Add(pluginId, ConfigurationStatus.Running);
            Assert.That(result.Success, Is.True);

            result = layer.Items.Add(pluginId, ConfigurationStatus.Disabled);
            Assert.That(result.Success, Is.True);

            result = layer.Items.Remove(pluginId);
            Assert.That(result.Success, Is.True, "Plugin can always be removed if it exists and layer isn't bound to a parent.");

            // Precedence test for Running
            pluginId = Guid.NewGuid().ToString();

            result = layer.Items.Add(pluginId, ConfigurationStatus.Running);
            Assert.That(result.Success, Is.True);
            Assert.That(layer.Items[pluginId].Status == ConfigurationStatus.Running);

            result = layer.Items.Add(pluginId, ConfigurationStatus.Running);
            Assert.That(result.Success, Is.True, "Adding the same plugin twice, in the same state, is a valid operation.");
            Assert.That(layer.Items.Count == 1, "Adding the same plugin twice, in the same state, does not actually add it and increment the count.");

            result = layer.Items.Add(pluginId, ConfigurationStatus.Optional);
            Assert.That(result.Success, Is.True);
            result = layer.Items.Add(pluginId, ConfigurationStatus.Runnable);
            Assert.That(result.Success, Is.True);
            result = layer.Items.Add(pluginId, ConfigurationStatus.Disabled);
            Assert.That(result.Success, Is.True);

            result = layer.Items.Remove(pluginId);
            Assert.That(result.Success, Is.True, "Plugin can always be removed if it exists and layer isn't bound to a parent.");

            // Precedence test for Optional -> Runnable -> Running
            pluginId = Guid.NewGuid().ToString();

            result = layer.Items.Add(pluginId, ConfigurationStatus.Optional);
            Assert.That(result.Success, Is.True);
            Assert.That(layer.Items[pluginId].Status == ConfigurationStatus.Optional);

            result = layer.Items.Add(pluginId, ConfigurationStatus.Optional);
            Assert.That(result.Success, Is.True, "Adding the same plugin twice, in the same state, is a valid operation.");
            Assert.That(layer.Items.Count == 1, "Adding the same plugin twice, in the same state, does not actually add it and increment the count.");

            result = layer.Items.Add(pluginId, ConfigurationStatus.Runnable);
            Assert.That(result.Success, Is.True, "Layer override precedence: Optional -> Runnable is a valid operation.");
            Assert.That(layer.Items[pluginId].Status == ConfigurationStatus.Runnable);

            result = layer.Items.Add(pluginId, ConfigurationStatus.Running);
            Assert.That(result.Success, Is.True, "Layer override precedence: Runnable -> Running is a valid operation.");
            Assert.That(layer.Items[pluginId].Status == ConfigurationStatus.Running);

            Assert.That(layer.Items.Count == 1, "Adding the same plugin over and over does not actually increment the count.");

            result = layer.Items.Remove(pluginId);
            Assert.That(result.Success, Is.True, "Plugin can always be removed if it exists and layer isn't bound to a parent.");
        }
Example #14
0
 internal void OnLayerNameChanged(IConfigurationLayer layer)
 {
     _configurationLayerCollection.CheckPosition(layer);
 }
Example #15
0
 internal void CheckPosition(IConfigurationLayer layer)
 {
     _layers.CheckPosition(_layers.IndexOf(layer));
 }
 /// <summary>
 /// Creates a new instance of ConfigurationChangingEventArgs when change is triggered by a ConfigurationLayer.
 /// </summary>
 /// <param name="finalConfiguration">New FinalConfiguration</param>
 /// <param name="finalConfigurationChanged">Details of changes in the new FinalConfiguration</param>
 /// <param name="configurationLayer">Layer that provoked this change</param>
 public ConfigurationChangingEventArgs( FinalConfiguration finalConfiguration, FinalConfigurationChange finalConfigurationChanged, IConfigurationLayer configurationLayer )
 {
     _finalConfiguration = finalConfiguration;
     _finalConfigurationChange = finalConfigurationChanged;
     _configurationLayerChanged = configurationLayer;
 }