Added method "getResourceOwner" and attribute "nodes" to NXSL "Cluster" class
authorVictor Kirhenshtein <victor@netxms.org>
Sun, 18 Sep 2016 10:35:39 +0000 (13:35 +0300)
committerVictor Kirhenshtein <victor@netxms.org>
Sun, 18 Sep 2016 10:35:39 +0000 (13:35 +0300)
ChangeLog
src/server/core/cluster.cpp
src/server/core/nxsl_classes.cpp
src/server/include/nms_objects.h

index 0d0a778..bc969df 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -22,6 +22,7 @@
 - New method "enableDiscoveryPolling" in NXSL class "Node"
 - Agent effective user and group can be set in configuration file
 - Agent environment variables can be set in configuration file
+- Added method "getResourceOwner" and attribute "nodes" to NXSL "Cluster" class
 - New agent metrics for self-monitoring:
        Agent.SyslogProxy.IsEnabled, Agent.SyslogProxy.ReceivedMessages, Agent.SyslogProxy.QueueSize
 - Management console
index 88b1ecc..6046040 100644 (file)
@@ -639,10 +639,9 @@ void Cluster::statusPoll(ClientSession *pSession, UINT32 dwRqId, PollerInfo *pol
 bool Cluster::isResourceOnNode(UINT32 dwResource, UINT32 dwNode)
 {
        bool bRet = FALSE;
-       UINT32 i;
 
        lockProperties();
-       for(i = 0; i < m_dwNumResources; i++)
+       for(UINT32 i = 0; i < m_dwNumResources; i++)
        {
                if (m_pResourceList[i].dwId == dwResource)
                {
@@ -655,6 +654,26 @@ bool Cluster::isResourceOnNode(UINT32 dwResource, UINT32 dwNode)
        return bRet;
 }
 
+/**
+ * Get node ID of resource owner
+ */
+UINT32 Cluster::getResourceOwnerInternal(UINT32 id, const TCHAR *name)
+{
+   UINT32 ownerId = 0;
+   lockProperties();
+   for(UINT32 i = 0; i < m_dwNumResources; i++)
+   {
+      if (((name != NULL) && !_tcsicmp(name, m_pResourceList[i].szName)) ||
+          (m_pResourceList[i].dwId == id))
+      {
+         ownerId = m_pResourceList[i].dwCurrOwner;
+         break;
+      }
+   }
+   unlockProperties();
+   return ownerId;
+}
+
 /**
  * Collect aggregated data for cluster nodes - single value
  */
@@ -790,3 +809,24 @@ NXSL_Value *Cluster::createNXSLObject()
 {
    return new NXSL_Value(new NXSL_Object(&g_nxslClusterClass, this));
 }
+
+/**
+ * Get cluster nodes as NXSL array
+ */
+NXSL_Array *Cluster::getNodesForNXSL()
+{
+   NXSL_Array *nodes = new NXSL_Array();
+   int index = 0;
+
+   lockChildList(false);
+   for(int i = 0; i < m_childList->size(); i++)
+   {
+      if (m_childList->get(i)->getObjectClass() == OBJECT_NODE)
+      {
+         nodes->set(index++, new NXSL_Value(new NXSL_Object(&g_nxslNodeClass, m_childList->get(i))));
+      }
+   }
+   unlockChildList();
+
+   return nodes;
+}
index f1db2bc..8ca4918 100644 (file)
@@ -836,7 +836,7 @@ NXSL_ChassisClass::NXSL_ChassisClass() : NXSL_NetObjClass()
 }
 
 /**
- * NXSL class "Cluster" attributes
+ * NXSL class "Chassis" attributes
  */
 NXSL_Value *NXSL_ChassisClass::getAttr(NXSL_Object *object, const TCHAR *attr)
 {
@@ -892,12 +892,35 @@ NXSL_Value *NXSL_ChassisClass::getAttr(NXSL_Object *object, const TCHAR *attr)
    return value;
 }
 
+/**
+ * Cluster::getResourceOwner() method
+ */
+NXSL_METHOD_DEFINITION(Cluster, getResourceOwner)
+{
+   if (!argv[0]->isString())
+      return NXSL_ERR_NOT_STRING;
+
+   UINT32 ownerId = ((Cluster *)object->getData())->getResourceOwner(argv[0]->getValueAsCString());
+   if (ownerId != 0)
+   {
+      NetObj *object = FindObjectById(ownerId);
+      *result = (object != NULL) ? object->createNXSLObject() : new NXSL_Value();
+   }
+   else
+   {
+      *result = new NXSL_Value();
+   }
+   return 0;
+}
+
 /**
  * NXSL class "Cluster" constructor
  */
 NXSL_ClusterClass::NXSL_ClusterClass() : NXSL_NetObjClass()
 {
    _tcscpy(m_name, _T("Cluster"));
+
+   NXSL_REGISTER_METHOD(Cluster, getResourceOwner, 1);
 }
 
 /**
@@ -910,7 +933,11 @@ NXSL_Value *NXSL_ClusterClass::getAttr(NXSL_Object *object, const TCHAR *attr)
       return value;
 
    Cluster *cluster = (Cluster *)object->getData();
-   if (!_tcscmp(attr, _T("zone")))
+   if (!_tcscmp(attr, _T("nodes")))
+   {
+      value = new NXSL_Value(cluster->getNodesForNXSL());
+   }
+   else if (!_tcscmp(attr, _T("zone")))
    {
       if (g_flags & AF_ENABLE_ZONING)
       {
index bbf5c8f..a35dc7c 100644 (file)
@@ -1172,6 +1172,8 @@ protected:
 
    virtual void onDataCollectionChange();
 
+   UINT32 getResourceOwnerInternal(UINT32 id, const TCHAR *name);
+
 public:
        Cluster();
    Cluster(const TCHAR *pszName, UINT32 zoneId);
@@ -1190,6 +1192,8 @@ public:
        bool isSyncAddr(const InetAddress& addr);
        bool isVirtualAddr(const InetAddress& addr);
        bool isResourceOnNode(UINT32 dwResource, UINT32 dwNode);
+       UINT32 getResourceOwner(UINT32 resourceId) { return getResourceOwnerInternal(resourceId, NULL); }
+   UINT32 getResourceOwner(const TCHAR *resourceName) { return getResourceOwnerInternal(0, resourceName); }
    UINT32 getZoneId() { return m_zoneId; }
 
    void statusPoll(PollerInfo *poller);
@@ -1205,6 +1209,8 @@ public:
 
    UINT32 collectAggregatedData(DCItem *item, TCHAR *buffer);
    UINT32 collectAggregatedData(DCTable *table, Table **result);
+
+   NXSL_Array *getNodesForNXSL();
 };
 
 /**