Example #1
0
        protected override void Run()
        {
            if (xo == null)
            {
                return;
            }
            Host theHost = xo as Host;

            // Dom0 Memory usage alert is an exception. While configuration for all the alerts (eg. related to the Host) have to be saved to this "xo",
            // dom0 Memory usage's has to be in the Dom0's other config.
            //
            var dom0_memory_usage = perfmonDefinitions.FirstOrDefault(d => d.IsDom0MemoryUsage);

            if (dom0_memory_usage != null)
            {
                perfmonDefinitions.Remove(dom0_memory_usage);

                var dom0Vm = theHost == null ? null : theHost.ControlDomainZero;
                if (dom0Vm != null)
                {
                    var dom0PerfmonDefinitions = PerfmonDefinition.GetPerfmonDefinitions(dom0Vm).ToList();

                    bool found = false;
                    for (int ii = 0; ii < dom0PerfmonDefinitions.Count; ii++)
                    {
                        var pmd = dom0PerfmonDefinitions[ii];
                        if (pmd != null && pmd.IsDom0MemoryUsage)
                        {
                            dom0PerfmonDefinitions[ii] = dom0_memory_usage;
                            found = true;
                            break;
                        }
                    }

                    if (!found)
                    {
                        dom0PerfmonDefinitions.Add(dom0_memory_usage);
                    }

                    string dom0PerfmonConfigXML = PerfmonDefinition.GetPerfmonDefinitionXML(dom0PerfmonDefinitions);
                    Helpers.SetOtherConfig(Session, dom0Vm, PerfmonDefinition.PERFMON_KEY_NAME, dom0PerfmonConfigXML);
                }
            }
            else
            {
                var dom0Vm = theHost == null ? null : theHost.ControlDomainZero;
                if (dom0Vm != null)
                {
                    var dom0PerfmonDefinitions = PerfmonDefinition.GetPerfmonDefinitions(dom0Vm).ToList();

                    int found = dom0PerfmonDefinitions.RemoveAll(d => d.IsDom0MemoryUsage);
                    if (found > 0)
                    {
                        string dom0PerfmonDefinitionsXml = PerfmonDefinition.GetPerfmonDefinitionXML(dom0PerfmonDefinitions);
                        Helpers.SetOtherConfig(Session, dom0Vm, PerfmonDefinition.PERFMON_KEY_NAME, dom0PerfmonDefinitionsXml);
                    }
                }
            }

            if (perfmonDefinitions == null || perfmonDefinitions.Count == 0)
            {
                Helpers.RemoveFromOtherConfig(Session, xo, PerfmonDefinition.PERFMON_KEY_NAME);
            }
            else
            {
                string perfmonConfigXML = PerfmonDefinition.GetPerfmonDefinitionXML(perfmonDefinitions);
                Helpers.SetOtherConfig(Session, xo, PerfmonDefinition.PERFMON_KEY_NAME, perfmonConfigXML);
            }

            var hosts = new List <Host>();

            if (theHost == null)
            {
                VM vm = xo as VM;
                if (vm == null)
                {
                    SR sr = xo as SR;
                    if (sr != null)
                    {
                        foreach (var pbdRef in sr.PBDs)
                        {
                            PBD pbd = sr.Connection.Resolve(pbdRef);
                            if (pbd == null)
                            {
                                continue;
                            }

                            var host = pbd.Connection.Resolve(pbd.host);
                            if (host != null)
                            {
                                hosts.Add(host);
                            }
                        }
                    }
                }
                else
                {
                    var host = vm.Home();
                    if (host != null)
                    {
                        hosts.Add(host);
                    }
                }
            }
            else
            {
                hosts.Add(theHost);
            }

            foreach (var host in hosts)
            {
                try
                {
                    //NB The refresh causes the server to re-read the configuration
                    //immediately. But even if the refresh fails, the change will be
                    //noticed, just a bit later.

                    new ExecutePluginAction(host.Connection, host,
                                            XenServerPlugins.PLUGIN_PERFMON_PLUGIN,
                                            XenServerPlugins.PLUGIN_PERFMON_FUNCTION_REFRESH,
                                            new Dictionary <string, string>(), true).RunExternal(Session);
                }
                catch (Exception e)
                {
                    // Handle perfmon randomly being stopped
                    if (e.Message.StartsWith(XenServerPlugins.PLUGIN_PERFMON_ERROR_NOT_RUNNING))
                    {
                        // start perfmon and try again
                        try
                        {
                            new ExecutePluginAction(host.Connection, host,
                                                    XenServerPlugins.PLUGIN_PERFMON_PLUGIN,
                                                    XenServerPlugins.PLUGIN_PERFMON_FUNCTION_START,
                                                    new Dictionary <string, string>(), true).RunExternal(Session);

                            new ExecutePluginAction(host.Connection, host,
                                                    XenServerPlugins.PLUGIN_PERFMON_PLUGIN,
                                                    XenServerPlugins.PLUGIN_PERFMON_FUNCTION_REFRESH,
                                                    new Dictionary <string, string>(), true).RunExternal(Session);
                        }
                        catch (Exception ex)
                        {
                            log.DebugFormat("Perfmon refresh failed ({0}). Alerts will start being produced within half an hour.", ex.Message);
                        }
                    }
                    else
                    {
                        log.DebugFormat("Perfmon refresh failed ({0}). Alerts will start being produced within half an hour.", e.Message);
                    }
                }
            }
        }
        protected override void Run()
        {
            if (xo == null)
            {
                return;
            }

            if (perfmonDefinitions == null || perfmonDefinitions.Count == 0)
            {
                Helpers.RemoveFromOtherConfig(Session, xo, PerfmonDefinition.PERFMON_KEY_NAME);
            }
            else
            {
                string perfmonConfigXML = PerfmonDefinition.GetPerfmonDefinitionXML(perfmonDefinitions);
                Helpers.SetOtherConfig(Session, xo, PerfmonDefinition.PERFMON_KEY_NAME, perfmonConfigXML);
            }

            var hosts = new List <Host>();

            Host theHost = xo as Host;

            if (theHost == null)
            {
                VM vm = xo as VM;
                if (vm == null)
                {
                    SR sr = xo as SR;
                    if (sr != null)
                    {
                        foreach (var pbdRef in sr.PBDs)
                        {
                            PBD pbd = sr.Connection.Resolve(pbdRef);
                            if (pbd == null)
                            {
                                continue;
                            }

                            var host = pbd.Connection.Resolve(pbd.host);
                            if (host != null)
                            {
                                hosts.Add(host);
                            }
                        }
                    }
                }
                else
                {
                    var host = vm.Home();
                    if (host != null)
                    {
                        hosts.Add(host);
                    }
                }
            }
            else
            {
                hosts.Add(theHost);
            }

            foreach (var host in hosts)
            {
                try
                {
                    //NB The refresh causes the server to re-read the configuration
                    //immediately. But even if the refresh fails, the change will be
                    //noticed, just a bit later.

                    new ExecutePluginAction(host.Connection, host,
                                            XenServerPlugins.PLUGIN_PERFMON_PLUGIN,
                                            XenServerPlugins.PLUGIN_PERFMON_FUNCTION_REFRESH,
                                            new Dictionary <string, string>(), true).RunExternal(Session);
                }
                catch (Exception e)
                {
                    // Handle perfmon randomly being stopped
                    if (e.Message.StartsWith(XenServerPlugins.PLUGIN_PERFMON_ERROR_NOT_RUNNING))
                    {
                        // start perfmon and try again
                        try
                        {
                            new ExecutePluginAction(host.Connection, host,
                                                    XenServerPlugins.PLUGIN_PERFMON_PLUGIN,
                                                    XenServerPlugins.PLUGIN_PERFMON_FUNCTION_START,
                                                    new Dictionary <string, string>(), true).RunExternal(Session);

                            new ExecutePluginAction(host.Connection, host,
                                                    XenServerPlugins.PLUGIN_PERFMON_PLUGIN,
                                                    XenServerPlugins.PLUGIN_PERFMON_FUNCTION_REFRESH,
                                                    new Dictionary <string, string>(), true).RunExternal(Session);
                        }
                        catch (Exception ex)
                        {
                            log.DebugFormat("Perfmon refresh failed ({0}). Alerts will start being produced within half an hour.", ex.Message);
                        }
                    }
                    else
                    {
                        log.DebugFormat("Perfmon refresh failed ({0}). Alerts will start being produced within half an hour.", e.Message);
                    }
                }
            }
        }