XEN subagent: added domain state parameters
authorVictor Kirhenshtein <victor@netxms.org>
Tue, 25 Jul 2017 09:09:31 +0000 (12:09 +0300)
committerVictor Kirhenshtein <victor@netxms.org>
Tue, 25 Jul 2017 09:09:31 +0000 (12:09 +0300)
src/agent/subagents/xen/domain.cpp
src/agent/subagents/xen/xen.cpp

index 5259674..5c73246 100644 (file)
@@ -155,3 +155,90 @@ LONG H_XenDomainTable(const TCHAR *param, const TCHAR *arg, Table *value, Abstra
    libxl_ctx_free(ctx);
    return rc;
 }
+
+/**
+ * Handler for domain state parameters
+ */
+LONG H_XenDomainState(const TCHAR *param, const TCHAR *arg, TCHAR *value, AbstractCommSession *session)
+{
+   char domName[256];
+   if (!AgentGetParameterArgA(param, 1, domName, 256))
+      return SYSINFO_RC_UNSUPPORTED;
+
+   libxl_ctx *ctx;
+   XEN_CONNECT(ctx);
+
+   char *eptr;
+   uint32_t domId = strtoul(domName, &eptr, 0);
+   if (*eptr != 0)
+   {
+      if (libxl_name_to_domid(ctx, domName, &domId) != 0)
+      {
+         if (*arg == '?')
+         {
+            ret_string(value, _T("MISSING"));
+         }
+         else
+         {
+            ret_int(value, 0);
+         }
+         return SYSINFO_RC_SUCCESS;
+      }
+   }
+
+   LONG ret = SYSINFO_RC_SUCCESS;
+
+   libxl_dominfo dom;
+   libxl_dominfo_init(&dom);
+   int rc = libxl_domain_info(ctx, &dom, domId);
+   if (rc == 0)
+   {
+      switch(*arg)
+      {
+         case 'E':
+            ret_int(value, 1);
+            break;
+         case 'O':
+            ret_int(value, dom.running || dom.blocked ? 1 : 0);
+            break;
+         case 'P':
+            ret_int(value, dom.paused ? 1 : 0);
+            break;
+         case '?':
+            if (dom.running)
+               ret_string(value, _T("RUNNING"));
+            else if (dom.blocked)
+               ret_string(value, _T("BLOCKED"));
+            else if (dom.paused)
+               ret_string(value, _T("PAUSED"));
+            else if (dom.shutdown)
+               ret_string(value, _T("SHUTDOWN"));
+            else if (dom.dying)
+               ret_string(value, _T("DYING"));
+            else
+               ret_string(value, _T("UNKNOWN"));
+            break;
+         default:
+            ret = SYSINFO_RC_UNSUPPORTED;
+            break;
+      }
+   }
+   else if (rc == ERROR_DOMAIN_NOTFOUND)
+   {
+      if (*arg == '?')
+      {
+         ret_string(value, _T("MISSING"));
+      }
+      else
+      {
+         ret_int(value, 0);
+      }
+   }
+   else
+   {
+      ret = SYSINFO_RC_ERROR;
+   }
+
+   libxl_ctx_free(ctx);
+   return ret;
+}
index 186d344..75687d9 100644 (file)
@@ -29,6 +29,7 @@ LONG H_XenDomainCPUUsage(const TCHAR *param, const TCHAR *arg, TCHAR *value, Abs
 LONG H_XenDomainList(const TCHAR *param, const TCHAR *arg, StringList *value, AbstractCommSession *session);
 LONG H_XenDomainNetIfTable(const TCHAR *param, const TCHAR *arg, Table *value, AbstractCommSession *session);
 LONG H_XenDomainNetStats(const TCHAR *param, const TCHAR *arg, TCHAR *value, AbstractCommSession *session);
+LONG H_XenDomainState(const TCHAR *param, const TCHAR *arg, TCHAR *value, AbstractCommSession *session);
 LONG H_XenDomainTable(const TCHAR *param, const TCHAR *arg, Table *value, AbstractCommSession *session);
 LONG H_XenHostCPUUsage(const TCHAR *param, const TCHAR *arg, TCHAR *value, AbstractCommSession *session);
 LONG H_XenHostOnlineCPUs(const TCHAR *param, const TCHAR *arg, TCHAR *value, AbstractCommSession *session);
@@ -112,10 +113,14 @@ static NETXMS_SUBAGENT_PARAM s_parameters[] =
    { _T("XEN.Domain.CPU.Usage(*)"), H_XenDomainCPUUsage, _T("1"), DCI_DT_FLOAT, _T("XEN domain {instance}: average CPU utilization for last minute") },
    { _T("XEN.Domain.CPU.Usage15(*)"), H_XenDomainCPUUsage, _T("F"), DCI_DT_FLOAT, _T("XEN domain {instance}: average CPU utilization for last 15 minutes") },
    { _T("XEN.Domain.CPU.Usage5(*)"), H_XenDomainCPUUsage, _T("5"), DCI_DT_FLOAT, _T("XEN domain {instance}: average CPU utilization for last 5 minutes") },
+   { _T("XEN.Domain.IsExist(*)"), H_XenDomainState, _T("E"), DCI_DT_INT, _T("XEN domain {instance}: existence flag") },
+   { _T("XEN.Domain.IsOperational(*)"), H_XenDomainState, _T("O"), DCI_DT_INT, _T("XEN domain {instance}: operational flag") },
+   { _T("XEN.Domain.IsPaused(*)"), H_XenDomainState, _T("P"), DCI_DT_INT, _T("XEN domain {instance}: paused flag") },
    { _T("XEN.Domain.Net.RxBytes(*)"), H_XenDomainNetStats, _T("RB"), DCI_DT_UINT64, _T("XEN domain {instance}: network usage (bytes received)") },
    { _T("XEN.Domain.Net.RxPackets(*)"), H_XenDomainNetStats, _T("RP"), DCI_DT_UINT64, _T("XEN domain {instance}: network usage (packets received)") },
    { _T("XEN.Domain.Net.TxBytes(*)"), H_XenDomainNetStats, _T("TB"), DCI_DT_UINT64, _T("XEN domain {instance}: network usage (bytes transmitted)") },
    { _T("XEN.Domain.Net.TxPackets(*)"), H_XenDomainNetStats, _T("TP"), DCI_DT_UINT64, _T("XEN domain {instance}: network usage (packets transmitted)") },
+   { _T("XEN.Domain.State(*)"), H_XenDomainState, _T("?"), DCI_DT_INT, _T("XEN domain {instance}: state") },
    { _T("XEN.Host.CPU.Cores"), H_XenHostPhyInfo, _T("c"), DCI_DT_INT, _T("XEN host: number of CPU cores") },
    { _T("XEN.Host.CPU.CurrentUsage"), H_XenHostCPUUsage, _T("0"), DCI_DT_FLOAT, _T("XEN host: current CPU utilization") },
    { _T("XEN.Host.CPU.Frequency"), H_XenHostPhyInfo, _T("F"), DCI_DT_INT, _T("XEN host: number of CPU cores") },