소스 검색

HPCC-9569 ConfigMgr - remove extra roxie info

  - remove all RoxieSlaveProcess entries
  - remove duplicate RoxieServerProcess entries
  - add offset attribute
  - add redundancy option (slaveConfig)
  - rename tab PORTS
  - Remove redundancy dialog
  - could cleanup

Signed-off-by: Gleb Aronsky <gleb.aronsky@lexisnexis.com>
Gleb Aronsky 12 년 전
부모
커밋
733dc6e17e

+ 69 - 271
deployment/deployutils/configenvhelper.cpp

@@ -141,7 +141,7 @@ bool CConfigEnvHelper::addRoxieServers(const char* xmlArg)
   StringBuffer sFarmName;
   StringBuffer xpath;
 
-  if (strlen(pszFarm))
+  if (pszFarm && strlen(pszFarm))
   {
     xpath.clear().appendf("RoxieCluster[@name='%s']/"XML_TAG_ROXIE_FARM, pszRoxieCluster);
     pFarm = getSoftwareNode(xpath.str(), pszFarm);
@@ -186,50 +186,6 @@ bool CConfigEnvHelper::addRoxieServers(const char* xmlArg)
     pFarm->addPropInt("@requestArrayThreads", 5);
     pFarm->addProp("@aclName", "");
   }
-
-  Owned<IPropertyTreeIterator> iter = pSrcTree->getElements(XML_TAG_COMPONENT);
-  StringBuffer sNotAdded;
-  xpath.clear().appendf("RoxieCluster[@name='%s']/"XML_TAG_ROXIE_FARM"[@name='%s']/"XML_TAG_ROXIE_SERVER, pszRoxieCluster, sFarmName.str());
-  ForEach (*iter)
-  {
-    IPropertyTree* pFolder = &iter->query();
-
-    const char* pszName = pFolder->queryProp(XML_ATTR_NAME);
-
-    // Check if we can add this computer
-    if (checkComputerUse(pszName, pFarm)) 
-    {
-      StringBuffer sServerName( sFarmName), sbUniqueName;
-      sServerName.append("_s");
-      createUniqueName(sServerName.str(), xpath.str(), sbUniqueName);
-
-      // Add process node
-      IPropertyTree* pServer = createPTree(XML_TAG_ROXIE_SERVER);
-      pServer->setProp(XML_ATTR_NAME, sbUniqueName.str());
-      pServer->addProp(XML_ATTR_COMPUTER, pszName);
-
-      IPropertyTree* pLegacyServer = addLegacyServer(sbUniqueName, pServer, pFarm, pszRoxieCluster);
-    }
-    else
-    {
-      sNotAdded.append('\n');
-      sNotAdded.append(pszName);
-      sNotAdded.append(" ( ");
-      sNotAdded.append( pFolder->queryProp(XML_ATTR_NETADDRESS) );
-      sNotAdded.append(" )");
-    }
-  }
-
-  xpath.clear().appendf("Software/RoxieCluster[@name='%s']", pszRoxieCluster);
-  IPropertyTree* pRoxieCluster = m_pRoot->queryPropTree(xpath.str());   
-  renameInstances(pRoxieCluster);
-
-  if (sNotAdded.length())
-  {
-    StringBuffer sMsg("The following servers were already allocated to the farm and could not be added:\n");
-    sMsg.append(sNotAdded.str());
-  }
-
   return true;
 }
 
@@ -610,30 +566,57 @@ bool CConfigEnvHelper::deleteRoxieServers(const char* xmlArg)
 {
   Owned<IPropertyTree> pSrcTree = createPTreeFromXMLString(xmlArg && *xmlArg ? xmlArg : "<RoxieData/>");
   const char* pszRoxieCluster = pSrcTree->queryProp("@roxieName");
-  unsigned int nComputers = 0;//computers.size();
+  const char* pParentName = pSrcTree->queryPropTree(XML_TAG_ROXIE_FARM) != NULL ? pSrcTree->queryPropTree(XML_TAG_ROXIE_FARM)->queryProp("@parent"): "";
+  const char* pRoxiePortName = pSrcTree->queryPropTree(XML_TAG_ROXIE_FARM) != NULL ? pSrcTree->queryPropTree(XML_TAG_ROXIE_FARM)->queryProp(XML_ATTR_NAME): "";
+  unsigned int nComputers = 0;
   StringBuffer xpath;
   xpath.clear().appendf("Software/RoxieCluster[@name='%s']", pszRoxieCluster);
   IPropertyTree* pRoxieCluster = m_pRoot->queryPropTree(xpath.str());
-  StringBuffer sFarmName;
 
-  Owned<IPropertyTreeIterator> iterFarm = pSrcTree->getElements(XML_TAG_ROXIE_FARM);
-  ForEach (*iterFarm)
+  if (pRoxiePortName && *pRoxiePortName && pParentName && *pParentName && strcmp(pParentName, "Roxie Ports") == 0)
   {
-    IPropertyTree* pFarm = &iterFarm->query();
-    const char* pszFarm = pFarm->queryProp(XML_ATTR_NAME);
-    deleteFarm(pRoxieCluster, pszFarm);
-  }
+    StringBuffer sFarmName;
 
-  Owned<IPropertyTreeIterator> iterServer = pSrcTree->getElements(XML_TAG_ROXIE_SERVER);
-  ForEach (*iterServer)
-  {
-    IPropertyTree* pServer = &iterServer->query();
+    Owned<IPropertyTreeIterator> iterFarm = pSrcTree->getElements(XML_TAG_ROXIE_FARM);
+    ForEach (*iterFarm)
+    {
+      IPropertyTree* pFarm = &iterFarm->query();
+      const char* pszFarm = pFarm->queryProp(XML_ATTR_NAME);
 
-    const char* pszName = pServer->queryProp(XML_ATTR_NAME);
-    const char* pszFarm = pServer->queryProp("@parent");
-    deleteServer(pRoxieCluster, pszFarm, pszName);
+      if (pszFarm == NULL || *pszFarm == 0)
+        return false;
+
+      if (strcmp(pszFarm, pRoxiePortName) == 0)
+      {
+        deleteFarm(pRoxieCluster, pszFarm);
+        return true;
+      }
+    }
+    return false;
   }
 
+  Owned<IPropertyTreeIterator> iter = pRoxieCluster->getElements(XML_TAG_ROXIE_SERVER);
+
+  IPropertyTree *pTree = NULL;
+
+  int count = 1;
+
+  do
+  {
+    StringBuffer xpath2(XML_TAG_ROXIE_SERVER);
+    xpath2.appendf("[%d]", count);
+    count++;
+
+    pTree = pRoxieCluster->queryPropTree(xpath2.str());
+    if (pSrcTree->queryPropTree(XML_TAG_ROXIE_ONLY_SLAVE) == NULL)  //probably an old config
+        throw MakeStringException(-1, "Error modifying roxie cluster!  Possible using an old version of the config?" );
+    if (pTree && (!strcmp(pSrcTree->queryPropTree(XML_TAG_ROXIE_ONLY_SLAVE)->queryProp(XML_ATTR_NAME), "Roxie Cluster") || !strcmp(pTree->queryProp(XML_ATTR_NAME), pSrcTree->queryPropTree(XML_TAG_ROXIE_ONLY_SLAVE)->queryProp(XML_ATTR_NAME))))
+    {
+      pRoxieCluster->removeTree(pTree);
+      count--;
+    }
+  } while (pTree);
+
     Owned<IPropertyTreeIterator> iterSlaves = pSrcTree->getElements(XML_TAG_ROXIE_ONLY_SLAVE);
     ForEach (*iterSlaves)
     {
@@ -776,20 +759,18 @@ bool CConfigEnvHelper::handleRoxieSlaveConfig(const char* xmlArg)
     try
     {
         Owned<IPropertyTree> pSrcTree = createPTreeFromXMLString(xmlArg && *xmlArg ? xmlArg : "<RoxieData/>");
-        const char* type = pSrcTree->queryProp(XML_ATTR_TYPE);
         const char* pszRoxie = pSrcTree->queryProp("@roxieName");
-        const char* val1 = pSrcTree->queryProp("@val1");
-        const char* sOffset = pSrcTree->queryProp("@val2");
 
         StringBuffer xpath;
-        xpath.clear().appendf("Software/RoxieCluster[@name='%s']", pszRoxie);
+        xpath.clear().appendf("%s/%s[%s='%s']", XML_TAG_SOFTWARE, XML_TAG_ROXIECLUSTER, XML_ATTR_NAME, pszRoxie);
         IPropertyTree* pRoxie = m_pRoot->queryPropTree(xpath.str());
 
         if (!pRoxie)
             throw MakeStringException(-1, "Cannot find roxie with name %s", pszRoxie);
 
-        Owned<IPropertyTreeIterator> iterComputers = pSrcTree->getElements("Computer");
+        Owned<IPropertyTreeIterator> iterComputers = pSrcTree->getElements(XML_TAG_INSTANCES"/"XML_TAG_INSTANCE);
         IPropertyTreePtrArray computers;
+
         ForEach (*iterComputers)
         {
             IPropertyTree* pComp = &iterComputers->query();
@@ -801,72 +782,23 @@ bool CConfigEnvHelper::handleRoxieSlaveConfig(const char* xmlArg)
                 computers.push_back(pComputer);
         }
 
-        m_numChannels = atoi(val1);
-        m_numDataCopies = 0;
-        const char* confType;
-        char chDrive;
-
-        if (!strcmp(type, "Circular"))
-        {
-            if (!GenerateCyclicRedConfig(pRoxie, computers, val1, sOffset))
-                return false;
-
-            confType = "cyclic redundancy";
-            chDrive = 'c';
-
-            pRoxie->setProp("@cyclicOffset", sOffset);
-        }
-        else 
-        {
-            if (!strcmp(type, "Overloaded"))
-            {
-                if (!GenerateOverloadedConfig(pRoxie, computers, val1))
-                    return false;
-
-                confType = "overloaded";
-                chDrive = 'c';
-            }
-            else 
-            {
-                if (!strcmp(type, "Full"))
-                {
-                    m_numDataCopies = atoi( val1 );
-                    confType = "full redundancy";
-                }
-                else //no redundancy
-                {
-                    m_numDataCopies = 1;
-                    confType = "simple";
-                }
-
-                if (!GenerateFullRedConfig(pRoxie, m_numDataCopies, computers))
-                    return false;
-            }
+        RemoveSlaves(pRoxie, true);
+        RemoveSlaves(pRoxie, false);
 
-            if (pRoxie->hasProp("@cyclicOffset"))
-                pRoxie->removeProp("@cyclicOffset");
-        }
-        //give legacy slaves unique names
-        UINT i = 1;
-        Owned<IPropertyTreeIterator> it = pRoxie->getElements(XML_TAG_ROXIE_SLAVE);
-        ForEach( *it)
+        for (int i=0; i<computers.size(); i++)
         {
-            StringBuffer name;
-            name.append('s').append(i);
-
-            IPropertyTree* pLegacySlave = &it->query();
-            pLegacySlave->setProp(XML_ATTR_NAME, name.str() );
+          IPropertyTree* pComputer = computers[i];
+          const char* szComputer = pComputer->queryProp(XML_ATTR_NAME);
+          const char* netAddress = pComputer->queryProp(XML_ATTR_NETADDRESS);
+          const char* pCompName = pComputer->queryProp(XML_ATTR_NAME);
+
+          IPropertyTree *pTree = addNode(XML_TAG_ROXIE_SERVER, pRoxie);
+          pTree->setProp(XML_ATTR_NAME, szComputer);
+          pTree->setProp(XML_ATTR_NETADDRESS, netAddress);
+          pTree->setProp(XML_ATTR_COMPUTER, pCompName);
         }
 
-        pRoxie->setProp("@slaveConfig", confType);
-        pRoxie->setPropInt("@clusterWidth", computers.size());
-        pRoxie->setPropInt("@numChannels",   m_numChannels);
-        pRoxie->setPropInt("@numDataCopies", m_numDataCopies);
-        pRoxie->setProp("@localSlave", computers.size() > 1 ? "false" : "true");
-
-        //change all legacy servers
-        Owned<IPropertyTreeIterator> iterServers = pRoxie->getElements(XML_TAG_ROXIE_SERVER);
-    }
+   }
     catch (IException *e)
     {
         StringBuffer msg;
@@ -874,161 +806,27 @@ bool CConfigEnvHelper::handleRoxieSlaveConfig(const char* xmlArg)
     }
     catch (...)
     {
-        throw MakeStringException(-1, "Unknown exception in generating slave configuration!" );
+        throw MakeStringException(-1, "Unknown exception adding servers" );
     }
 
     return true;
 }
 
-bool CConfigEnvHelper::GenerateCyclicRedConfig(IPropertyTree* pRoxie, IPropertyTreePtrArray& computers, 
-                                                                                             const char* copies, const char* pszOffset)
-{
-    const int nComputers = computers.size();
-    if (!nComputers)
-        return false;
-
-    if (!EnsureInRange(copies, min(2, nComputers), max(nComputers, 1), "Channel redundancy") ||
-         !EnsureInRange(pszOffset, min(1, nComputers-1), nComputers-1, "Channel offset"))
-    {
-        return false;
-    }
-
-    const int offset = atoi( pszOffset );
-    m_numDataCopies = atoi( copies );
-    
-    const int minOffset = min(1, nComputers-1);
-    if( offset < minOffset )
-         throw MakeStringException(-1, "Offset cannot be less than %d", minOffset);
-    if ( offset > nComputers )
-        throw MakeStringException(-1, "Offset cannot be greater than %d", nComputers);
-
-    RemoveSlaves(pRoxie, true);
-    RemoveSlaves(pRoxie, false);
-
-    for (int i=0; i<nComputers; i++)
-    {
-        IPropertyTree* pComputer = computers[i];
-        const char* szComputer = pComputer->queryProp(XML_ATTR_NAME);
-        const char* netAddress = pComputer->queryProp(XML_ATTR_NETADDRESS);
-
-        StringBuffer name;
-        name.appendf("s%d", i+1);
-
-        IPropertyTree* pSlave = pRoxie->addPropTree(XML_TAG_ROXIE_ONLY_SLAVE, createPTree());
-        pSlave->addProp(XML_ATTR_NAME, name.str());
-        pSlave->addProp(XML_ATTR_COMPUTER, szComputer);
-
-        const int baseChannel = i; //channel for first copy of slave (0 based)
-        int channel;
-        for (int c=0; c<m_numDataCopies; c++)
-        {
-            channel = 1 + ((baseChannel + c*(nComputers-offset)) % nComputers);
-
-            IPropertyTree* pInstance = pSlave->addPropTree(XML_TAG_ROXIE_CHANNEL, createPTree());
-            pInstance->setPropInt("@number", channel);
-
-            StringBuffer strTemp;
-            strTemp.append(c);
-
-            pInstance->addProp(XML_ATTR_LEVEL, strTemp.str());
-        }
-    }
-    m_numChannels = nComputers;
-    return true;
-}
-
-bool CConfigEnvHelper::GenerateOverloadedConfig(IPropertyTree* pRoxie, IPropertyTreePtrArray& computers, const char* copies)
-{
-    const UINT nComputers = computers.size();
-    if (!nComputers)
-        return false;
-
-    if (!EnsureInRange(copies, 1, 0, "Channels per host"))
-        return false;
-
-    m_numDataCopies = atoi( copies );
-        
-    RemoveSlaves(pRoxie, true);
-    RemoveSlaves(pRoxie, false);
-
-    int channel = 1;
-    for (UINT i=0; i<nComputers; i++)
-    {
-        IPropertyTree* pComputer = computers[i];
-        const char* szComputer = pComputer->queryProp(XML_ATTR_NAME);
-        const char* netAddress = pComputer->queryProp(XML_ATTR_NETADDRESS);
-
-        StringBuffer name;
-        name.appendf("s%d", i+1);
-
-        IPropertyTree* pSlave = pRoxie->addPropTree(XML_TAG_ROXIE_ONLY_SLAVE, createPTree());
-        pSlave->addProp(XML_ATTR_NAME, name.str());
-        pSlave->addProp(XML_ATTR_COMPUTER, szComputer);
-
-        for (int c=0; c<m_numDataCopies; c++)
-        {
-            IPropertyTree* pInstance = pSlave->addPropTree(XML_TAG_ROXIE_CHANNEL, createPTree());
-            pInstance->setPropInt("@number", channel + c*nComputers);
-
-            StringBuffer strTemp;
-            strTemp.append(c);
-
-            pInstance->addProp(XML_ATTR_LEVEL, strTemp.str());
-        }
-        channel++;
-    }
-    m_numChannels = m_numDataCopies*nComputers;
-    return true;
-}
-
-bool CConfigEnvHelper::GenerateFullRedConfig(IPropertyTree* pRoxie, int copies, IPropertyTreePtrArray& computers)
-{
-    int nComputers = computers.size();
-    if (!nComputers)
-        return false;
-
-    StringBuffer sbCopies;
-    sbCopies.appendf("%d", copies);
-    //if full redundancy is selected then check channel redundancy
-    if (copies != 1 && !EnsureInRange(sbCopies.str(), min(2, nComputers), (nComputers+1)/2, "Channel redundancy"))
-        return false;
-
-    const int maxChannel = nComputers / copies;
-
-    RemoveSlaves(pRoxie, true);
-    RemoveSlaves(pRoxie, false);
-
-    int channel = 0;
-    nComputers = maxChannel * copies;
-    for (int i=0; i<nComputers; i++)
-    {
-        IPropertyTree* pComputer = computers[i];
-        const char* szComputer = pComputer->queryProp(XML_ATTR_NAME);
-        const char* netAddress = pComputer->queryProp(XML_ATTR_NETADDRESS);
-
-        StringBuffer name;
-        name.appendf("s%d", i+1);
-
-        IPropertyTree* pSlave = pRoxie->addPropTree(XML_TAG_ROXIE_ONLY_SLAVE, createPTree());
-        pSlave->addProp(XML_ATTR_NAME, name.str());
-        pSlave->addProp(XML_ATTR_COMPUTER, szComputer);
-
-        IPropertyTree* pInstance = pSlave->addPropTree(XML_TAG_ROXIE_CHANNEL, createPTree());
-        pInstance->setPropInt("@number", 1 + (channel % maxChannel));
-        pInstance->addProp(XML_ATTR_LEVEL, "0");
-
-        channel++;
-
-    }
-    m_numChannels = maxChannel;
-    return true;
-}
 
 void CConfigEnvHelper::RemoveSlaves(IPropertyTree* pRoxie, bool bLegacySlaves/*=false*/)
 {
     IPropertyTree* pChild;
     while ((pChild = pRoxie->queryPropTree( bLegacySlaves ? XML_TAG_ROXIE_SLAVE "[1]" : "RoxieSlave[1]")) != NULL)
         pRoxie->removeTree( pChild );
+
+    IPropertyTree *pTree = NULL;
+    do
+    {
+        pTree = pRoxie->queryPropTree(XML_TAG_ROXIE_SERVER"[1]");
+
+        if (pTree)
+          pRoxie->removeTree(pTree);
+    } while (pTree);
 }
 
 void CConfigEnvHelper::RenameThorInstances(IPropertyTree* pThor)

+ 0 - 3
deployment/deployutils/configenvhelper.hpp

@@ -63,9 +63,6 @@ private:
     bool EnsureInRange(const char* psz, UINT low, UINT high, const char* caption);
     bool handleRoxieSlaveConfig(const char* params);
     bool handleReplaceRoxieServer(const char* xmlArg);
-    bool GenerateCyclicRedConfig(IPropertyTree* pRoxie, IPropertyTreePtrArray& computers, const char* copies, const char* pszOffset);
-    bool GenerateOverloadedConfig(IPropertyTree* pRoxie, IPropertyTreePtrArray& computers, const char* copies);
-    bool GenerateFullRedConfig(IPropertyTree* pRoxie, int copies, IPropertyTreePtrArray& computers);
     void RemoveSlaves(IPropertyTree* pRoxie, bool bLegacySlaves/*=false*/);
     void RenameThorInstances(IPropertyTree* pThor);
     void UpdateThorAttributes(IPropertyTree* pParentNode);

+ 7 - 13
deployment/deployutils/deployutils.cpp

@@ -506,7 +506,6 @@ public:
         addItem(jsStrBuf, m_pEnv.get(), XML_TAG_ROXIE_SERVER, TAG_PROCESS, "", 0, 1, "", 0);
         addItem(jsStrBuf, m_pEnv.get(), XML_TAG_ROXIE_FARM, TAG_NAME, "", 0, 1, "", 0);
         addItem(jsStrBuf, m_pEnv.get(), XML_TAG_ROXIE_FARM, TAG_PROCESS, "", 0, 1, "", 0);
-        addItem(jsStrBuf, m_pEnv.get(), XML_TAG_ROXIE_FARM, TAG_LEVEL, "", 0, 1, "", 0);
         addItem(jsStrBuf, m_pEnv.get(), XML_TAG_ROXIE_FARM, TAG_LISTENQUEUE, "", 0, 1, "", 1);
         addItem(jsStrBuf, m_pEnv.get(), XML_TAG_ROXIE_FARM, TAG_NUMTHREADS, "", 0, 1, "", 1);
         addItem(jsStrBuf, m_pEnv.get(), XML_TAG_ROXIE_FARM, TAG_PORT, "", 0, 1, "", 1);
@@ -520,7 +519,6 @@ public:
         addItem(jsStrBuf, m_pEnv.get(), XML_TAG_ROXIE_CHANNEL, TAG_NAME, "", 0, 1, "", 0);
         addItem(jsStrBuf, m_pEnv.get(), XML_TAG_ROXIE_CHANNEL, TAG_ITEMTYPE, "", 0, 1, "", 0);
         addItem(jsStrBuf, m_pEnv.get(), XML_TAG_ROXIE_CHANNEL, TAG_COMPUTER, "", 0, 1, "", 0);
-        addItem(jsStrBuf, m_pEnv.get(), XML_TAG_ROXIE_CHANNEL, TAG_LEVEL, "", 0, 1, "", 0);
         addItem(jsStrBuf, m_pEnv.get(), XML_TAG_ROXIE_CHANNEL, TAG_NUMBER, "", 0, 1, "", 0);
       }
 
@@ -536,7 +534,6 @@ public:
           m_colIndex.appendf("colIndex['process%s']=%d;", serverStr, index++);
           m_colIndex.appendf("colIndex['netAddress%s']=%d;", serverStr, index++);
           m_colIndex.appendf("colIndex['port%s']=%d;", serverStr, index++);
-          m_colIndex.appendf("colIndex['level%s']=%d;", serverStr, index++);
           m_colIndex.appendf("colIndex['listenQueue%s']=%d;", serverStr, index++);
           m_colIndex.appendf("colIndex['numThreads%s']=%d;", serverStr, index++);
           m_colIndex.appendf("colIndex['requestArrayThreads%s']=%d;", serverStr, index++);
@@ -545,10 +542,7 @@ public:
           index = 0;
           const char* agentStr = "Agents";
           m_colIndex.appendf("colIndex['name%s']=%d;", agentStr, index++); 
-          m_colIndex.appendf("colIndex['itemType%s']=%d;", agentStr, index++);
           m_colIndex.appendf("colIndex['netAddress%s']=%d;", agentStr, index++);
-          m_colIndex.appendf("colIndex['level%s']=%d;", agentStr, index++);
-          m_colIndex.appendf("colIndex['number%s']=%d;", agentStr, index++);
         }
         else if (!strcmp(m_compName.str(), XML_TAG_THORCLUSTER))
         {
@@ -1195,7 +1189,7 @@ public:
             }
 
             if (!strcmp(viewType, "Instance") || !strcmp(viewType, "instance") || 
-              !strcmp(viewType, "RoxieServers") || !strcmp(viewType, "RoxieSlaves"))
+              !strcmp(viewType, "RoxiePorts") || !strcmp(viewType, "RoxieSlaves"))
               bOptSubType = true;
           }
 
@@ -1387,12 +1381,12 @@ public:
         if (!strcmp(m_compName.str(), "Eclserver"))
           m_compName.clear().append(XML_TAG_ECLSERVERPROCESS);
 
-        m_jsStrBuf.append("var compTabs = new Array(); ");
-        m_jsStrBuf.appendf("compTabs['%s'] = new Array();", m_compName.str());
-        m_jsStrBuf.append("var hiddenTabs = new Array(); ");
-        m_jsStrBuf.appendf("hiddenTabs['%s'] = new Array();", m_compName.str());
-        m_jsStrBuf.append("var compTabToNode = new Array(); ");
-        m_jsStrBuf.append("var cS = new Array();");
+        m_jsStrBuf.append("var compTabs = new Array();\n ");
+        m_jsStrBuf.appendf("compTabs['%s'] = new Array();\n", m_compName.str());
+        m_jsStrBuf.append("var hiddenTabs = new Array();\n ");
+        m_jsStrBuf.appendf("hiddenTabs['%s'] = new Array();\n", m_compName.str());
+        m_jsStrBuf.append("var compTabToNode = new Array();\n");
+        m_jsStrBuf.append("var cS = new Array();\n");
 
         Owned<IPropertyTreeIterator> iter = schemaNode->getElements("*");
         ForEach(*iter)

+ 14 - 16
deployment/deployutils/wizardInputs.cpp

@@ -795,7 +795,7 @@ unsigned CWizardInputs::getCntForAlreadyAssignedIPS(const char* buildSetName)
 
 void CWizardInputs::addRoxieThorClusterToEnv(IPropertyTree* pNewEnvTree, CInstDetails* pInstDetails, const char* buildSetName, bool genRoxieOnDemand)
 {
-  StringBuffer xmlForRoxieServer, xmlForRoxieSlave, xpath, compName, computerName, msg;
+  StringBuffer xmlForRoxiePorts, xmlForRoxieServers, xpath, compName, computerName, msg;
     
   if(!strcmp(buildSetName, "roxie"))
   {
@@ -803,39 +803,37 @@ void CWizardInputs::addRoxieThorClusterToEnv(IPropertyTree* pNewEnvTree, CInstDe
     xpath.clear().appendf("./%s/%s/%s", XML_TAG_SOFTWARE, XML_TAG_ROXIECLUSTER, XML_ATTR_NAME);
     compName.clear().append(pNewEnvTree->queryProp(xpath.str()));
     
-    xmlForRoxieServer.clear().appendf("<RoxieData type=\"RoxieFarm\" parentName=\"\" roxieName=\"%s\" ", compName.str());
+    xmlForRoxiePorts.clear().appendf("<RoxieData type=\"RoxieFarm\" parentName=\"\" roxieName=\"%s\" ", compName.str());
 
     if (genRoxieOnDemand)
-      xmlForRoxieServer.append("port=\"0\" >");
+      xmlForRoxiePorts.append("port=\"0\" >");
     else
-      xmlForRoxieServer.append(">");
+      xmlForRoxiePorts.append(">");
 
-    if (m_roxieNodes == 1)
-      xmlForRoxieSlave.clear().appendf("<RoxieData type=\"None\" val1=\"undefined\" val2=\"undefined\" roxieName=\"%s\" >", compName.str());
-    else
-      xmlForRoxieSlave.clear().appendf("<RoxieData type=\"%s\" val1=\"%d\" val2=\"%d\" roxieName=\"%s\" >", 
-                                        m_roxieAgentRedType.str(), 
-                                        m_roxieAgentRedChannels, m_roxieAgentRedOffset, compName.str());
+    if (m_roxieNodes >= 1)
+      xmlForRoxieServers.clear().appendf("<RoxieData type=\"None\" roxieName=\"%s\" >", compName.str());
 
     if(pInstDetails)
     {
       StringArray& ipAssignedToComp = pInstDetails->getIpAssigned();
 
+      xmlForRoxieServers.append("<Instances>");
       ForEachItemIn(i, ipAssignedToComp)
       {
         xpath.clear().appendf("./%s/%s/[%s=\"%s\"]", XML_TAG_HARDWARE, XML_TAG_COMPUTER, XML_ATTR_NETADDRESS, ipAssignedToComp.item(i));
         IPropertyTree* pHardTemp = pNewEnvTree->queryPropTree(xpath.str());
         if(pHardTemp){
-         xmlForRoxieServer.appendf("<Component name=\"%s\" />", pHardTemp->queryProp("./@name"));
-         xmlForRoxieSlave.appendf("<Computer name=\"%s\" />", pHardTemp->queryProp("./@name"));
+         xmlForRoxiePorts.appendf("<Component name=\"%s\" />", pHardTemp->queryProp("./@name"));
+         xmlForRoxieServers.appendf("<Instance name=\"%s\"/>", pHardTemp->queryProp("./@name"));
         }
       }
-      xmlForRoxieServer.append("</RoxieData>");
-      xmlForRoxieSlave.append("</RoxieData>");
-      handleRoxieOperation(pNewEnvTree, "AddRoxieFarm", xmlForRoxieServer.str());
+      xmlForRoxieServers.append("</Instances>");
+      xmlForRoxiePorts.append("</RoxieData>");
+      xmlForRoxieServers.append("</RoxieData>");
+      handleRoxieOperation(pNewEnvTree, "AddRoxieFarm", xmlForRoxiePorts.str());
 
       if (!genRoxieOnDemand)
-        handleRoxieOperation(pNewEnvTree, "RoxieSlaveConfig" ,xmlForRoxieSlave.str());
+        handleRoxieOperation(pNewEnvTree, "RoxieSlaveConfig" ,xmlForRoxieServers.str());
     }
     xpath.clear().appendf("./%s/%s[%s=\"%s\"]/%s[%s=\"\"]", XML_TAG_SOFTWARE, XML_TAG_ROXIECLUSTER, XML_ATTR_NAME, compName.str(), XML_TAG_ROXIE_SERVER, XML_ATTR_NETADDRESS);
     pNewEnvTree->removeProp(xpath.str());

+ 17 - 36
esp/files/scripts/configmgr/configmgr.js

@@ -29,7 +29,7 @@ function createTablesForComp(compName, rows) {
 
   for (var i = 0; i < compTabs[compName].length; i++) {
     if (compTabs[compName][i] !== 'Servers' &&
-        compTabs[compName][i] !== 'Farms' &&
+        compTabs[compName][i] !== 'Ports' &&
         compTabs[compName][i] !== 'Topology')
       createTable(rows[compTabs[compName][i]], compTabs[compName][i], i, compName);
   }
@@ -699,21 +699,15 @@ function createDivsInTabsForComp(tabName, compType) {
   return htmlString;
 }
 
-function initItemForRoxieSlaves(item) {
+function initItemForRoxieServers(item) {
   item.depth = 0;
-  item.name = "Roxie Cluster";
+  item.name = "Roxie Servers";
   item.name_extra = "";
   item.name_ctrlType = 0;
   item.parent = -1;
   item.netAddress = "";
   item.netAddress_extra = "";
   item.netAddress_ctrlType = 0;
-  item.level = "";
-  item.level_extra = "";
-  item.level_ctrlType = 0;
-  item.itemType = "";
-  item.itemType_extra = "";
-  item.itemType_ctrlType = 0;
   item.compType = "";
 }
 
@@ -733,21 +727,15 @@ function initItemForThorTopology(item) {
   item._processId = "";
 }
 
-function initItemForRoxieServers(item) {
+function initItemForRoxiePorts(item) {
   item.depth = 0;
-  item.name = "Roxie Cluster";
+  item.name = "Roxie Ports";
   item.name_extra = "";
   item.name_ctrlType = 0;
   item.parent = -1;
-  item.netAddress = "";
-  item.netAddress_extra = "";
-  item.netAddress_ctrlType = 0;
   item.port = "";
   item.port_extra = "";
   item.port_ctrlType = 0;
-  item.level = "";
-  item.level_extra = "";
-  item.level_ctrlType = 0;
   item.listenQueue = "";
   item.listenQueue_extra = "";
   item.listenQueue_ctrlType = 0;
@@ -1284,7 +1272,6 @@ function createMultiColTreeCtrlForComp(rows, compName, subRecordIndex) {
           else if (i === 'name')
             myColumnDefs[colIndex1++] = { key: "name", resizeable: true, width: 250, maxAutoWidth: 250, formatter: function(el, oRecord, oColumn, oData) {
               el.innerHTML = "<div id='depth" + oRecord.getData('depth') + "'>" + oData + "</div>";
-              Dom.addClass(el, 'yui-dt-liner depth' + oRecord.getData('depth'));
             }, scrollable: true
             };
           else
@@ -2346,10 +2333,10 @@ function createEnvXmlView(allrows, compName, subRecordIndex) {
 function initRowsForComplexComps(rows, compName) {
   var item = {};
   item.id = 0;
-  if (compName === 'RoxieServers')
-    initItemForRoxieServers(item);
+  if (compName === 'RoxiePorts')
+    initItemForRoxiePorts(item);
   else if (compName === 'RoxieSlaves')
-    initItemForRoxieSlaves(item);
+    initItemForRoxieServers(item);
   else if (compName === 'Topology')
     initItemForThorTopology(item);
 
@@ -2357,7 +2344,7 @@ function initRowsForComplexComps(rows, compName) {
 }
 
 function setParentIds(item, rows, parentIds) {
-  if (item.depth > rows[parentIds[parentIds.length - 1]].depth)
+  if (rows.length < 1 || item.depth > rows[parentIds[parentIds.length - 1]].depth)
     parentIds[parentIds.length] = item.id;
   else if (item.depth === rows[parentIds[parentIds.length - 1]].depth) {
     item.parent = parentIds[parentIds.length - 2];
@@ -2632,22 +2619,15 @@ function onContextMenuBeforeShow(p_sType, p_aArgs) {
   if (!this.configContextMenuItems) {
     this.configContextMenuItems = {
       "Roxie Cluster": [
-                                { text: "Add Farm", onclick: { fn: onMenuItemClickAddFarm} }
+                                { text: "Add Ports", onclick: { fn: onMenuItemClickAddFarm} }
                                 ],
       "RoxieFarmProcess": [
-      //{text: "AddFarm", onclick: { fn: onMenuItemClickAddFarm}},
-                                {text: "Add Servers", onclick: { fn: onMenuItemClickAddServers}}//,
-                                //{ text: "Replace...", onclick: { fn: onMenuItemClickFarmReplace}}//,
-                                //{text: "ImportServers...", onclick: { fn: onMenuItemClickImportServers}},
-                                //{text: "ExportServers...", onclick: { fn: onMenuItemClickExportServers}}
-                            ],
+                                {text: "Add Port", onclick: { fn: onMenuItemClickAddFarm} }                            ],
       "RoxieServerProcess": [
-                                { text: "Replace...", onclick: { fn: onMenuItemClickFarmReplace}}//,
-                                //{text: "ImportServers", onclick: { fn: onMenuItemClickImportServers}},
-                                //{text: "ExportServers", onclick: { fn: onMenuItemClickExportServers}}
+                                { text: "Replace...", onclick: { fn: onMenuItemClickFarmReplace}}
                             ],
       "RoxieSlave": [
-                                { text: "Reconfigure Agents...", onclick: { fn: onMenuItemClickSlaveConfig}}
+                                { text: "Reconfigure Servers", onclick: { fn: onMenuItemClickSlaveConfig}}
                             ],
       "Delete": [
                                 { text: "Delete", onclick: { fn: onMenuItemClickDelete} }
@@ -2708,12 +2688,13 @@ function onContextMenuBeforeShow(p_sType, p_aArgs) {
     var dt = this.dt;
     var recSet = dt.getRecordSet();
     var record = recSet.getRecord(oSelectedTR.id);
-    var parentName = record.getData('compType');
+
+    var parentName = (record == null) ? "" : record.getData('compType');
 
     if (parentName.length <= 0) {
-      if (dt.configs.element === "FarmsTab")
+      if (dt.configs.element === "ServersTab")
         parentName = "RoxieSlave";
-      else if (dt.configs.element === "ServersTab")
+      else if (dt.configs.element === "PortsTab")
         parentName = "Roxie Cluster";
     }
     else if (parentName === "Topology") {

+ 26 - 9
esp/files/scripts/configmgr/navtree.js

@@ -1861,13 +1861,10 @@ function roxieSelectionToXML(table, type, parentName, selectedRows, compName) {
 function displayAddFarmDlg(self, farmName) {
   var tmpdt = self;
   var handleSubmit = function() {
-    this.hide();
     top.document.startWait();
-    var selRows = selectComputersDTDiv.selectComputersTable.getUserSelectedRows();
     var compName = tmpdt.getRecord(tmpdt.getSelectedRows()[0]).getData('Name');
-    var xmlStr = roxieSelectionToXML(selectComputersDTDiv.selectComputersTable, "RoxieFarm", tmpdt.selectComputersPanel.currentFarmName, selRows, compName);
+    var xmlStr = "<RoxieData roxieName='" + compName + "'></RoxieData>";
 
-    clearSelectComputersTable();
     YAHOO.util.Connect.asyncRequest('POST', '/WsDeploy/HandleRoxieOperation', {
       success: function(o) {
         var form = top.window.document.forms['treeForm'];
@@ -1887,10 +1884,7 @@ function displayAddFarmDlg(self, farmName) {
   initSelectComputersPanel(tmpdt, handleSubmit);
 
   tmpdt.selectComputersPanel.currentFarmName = farmName;
-  document.getElementById('selectComputersPanel').style.display = 'block';
-  tmpdt.selectComputersPanel.render(document.body);
-  tmpdt.selectComputersPanel.center();
-  tmpdt.selectComputersPanel.show();
+  handleSubmit();
 }
 
 function displayReplaceServerDlg() {
@@ -2791,7 +2785,30 @@ function promptSlaveConfig(self) {
     top.document.startWait();
     var compName = tmpdt.getRecord(tmpdt.getSelectedRows()[0]).getData('Name');
     var xmlStr = instanceSelectionToXML(selectComputersDTDiv.selectComputersTable, selRows, tmpdt);
-    displaySlaveConfigDlg(tmpdt, selRows.length);
+
+        YAHOO.util.Connect.asyncRequest('POST', '/WsDeploy/HandleRoxieOperation', {
+          success: function(o) {
+            clearSelectComputersTable();
+            if (o.responseText.indexOf("<html") === 0) {
+              var temp = o.responseText.split(/td align=\"left\">/g);
+              var temp1 = temp[1].split(/<\/td>/g);
+              top.document.stopWait();
+              alert(temp1[0]);
+            }
+            else {
+              var form = top.window.document.forms['treeForm'];
+              form.isChanged.value = "true";
+              top.document.stopWait();
+              clickCurrentSelOrName(tmpdt);
+            }
+          },
+          failure: function(o) {
+            top.document.stopWait();
+            alert(o.statusText);
+          },
+          scope: this
+        },
+            getFileName(true) + 'Cmd=RoxieSlaveConfig&XmlArgs=' + '<RoxieData ' + 'roxieName=\'' + compName + '\'>' + xmlStr + '</RoxieData>');
   }
   initSelectComputersPanel(tmpdt, handleSubmit);
   document.getElementById('selectComputersPanel').style.display = 'block';

+ 2 - 9
esp/services/WsDeploy/WsDeployService.cpp

@@ -3280,22 +3280,15 @@ bool CWsDeployFileInfo::displaySettings(IEspContext &context, IEspDisplaySetting
 
         if (!strcmp(pszCompType, "RoxieCluster"))
         {
-          xpath.clear().append("RoxieFarmProcess/RoxieServerProcess");
+          xpath.clear().append(XML_TAG_ROXIE_SERVER);
           Owned<IPropertyTreeIterator> iterRoxieServers = pSrcTree->getElements(xpath.str());
 
           ForEach (*iterRoxieServers )
           {
             IPropertyTree* pRoxieServer = &iterRoxieServers->query();
-            const char* pszComputer = pRoxieServer->queryProp(XML_ATTR_COMPUTER);
-
-            if (pszComputer)
-            {
-              xpath.clear().appendf("Hardware/Computer/[@name='%s']", pszComputer);
-              IPropertyTree* pComputer= pEnvRoot->queryPropTree(xpath.str());
-              const char* pszNetAddr = pComputer->queryProp(XML_ATTR_NETADDRESS);
+             const char* pszNetAddr = pRoxieServer->queryProp(XML_ATTR_NETADDRESS);
               if (pszNetAddr)
                 pRoxieServer->addProp(XML_ATTR_NETADDRESS, pszNetAddr);
-            }
           }
 
           xpath.clear().append(XML_TAG_ROXIE_ONLY_SLAVE);

+ 13 - 18
esp/xslt/ui_configmgr.xslt

@@ -255,14 +255,14 @@
             </xsl:choose>
             <script type="text/javascript">
               var rows = new Array();
+              var rowsPorts = new Array();
               var rowsServers = new Array();
-              var rowsSlaves = new Array();
               var rowsTopology = new Array();
               var menuEnabled = new Array();
               var viewChildNodes = new Array();
               var multiRowNodes = new Array();
-              initRowsForComplexComps(rowsServers, "RoxieServers");
-              initRowsForComplexComps(rowsSlaves, "RoxieSlaves");
+              initRowsForComplexComps(rowsPorts, "RoxiePorts");
+              initRowsForComplexComps(rowsServers, "RoxieSlaves");
               initRowsForComplexComps(rowsTopology, "Topology");
               <xsl:call-template name="fillenableMenu"/>
               createDivInTabsForComp('<xsl:value-of select="$Component"/>');
@@ -596,7 +596,7 @@
                       </xsl:for-each>
                     </xsl:when>
                     <xsl:when test="(name() = 'RoxieFarmProcess')">
-                    id = rowsServers.length;
+                    id = rowsPorts.length;
                     parent = 0;
                     parentIds.splice(0, parentIds.length);
                     parentIds[parentIds.length] = parent;
@@ -608,7 +608,7 @@
                       i.parent = parentIds[parentIds.length-1];
                       parent = id;
                       i.id = id++;
-                      setParentIds(i, rowsServers, parentIds);
+                      setParentIds(i, rowsPorts, parentIds);
                       var subTypeKey = '<xsl:value-of select="@name"/>';
                       <xsl:for-each select="@*">
                         i.<xsl:value-of select="name()"/> = "<xsl:value-of select="."/>";
@@ -617,12 +617,11 @@
                       </xsl:for-each>
                       i.params = "pcType=<xsl:value-of select="$Component"/>::pcName=" + cN;
                       i.params +=  "::subType=" + subCompType + "::subTypeKey=" + subTypeKey;
-                      rowsServers[rowsServers.length] = i;
+                      rowsPorts[rowsPorts.length] = i;
                     </xsl:for-each>
                   </xsl:when>
-                    <xsl:when test="(name() = 'RoxieServerProcess')"/>
-                    <xsl:when test="(name() = 'RoxieSlave')">
-                      id = rowsSlaves.length;
+                    <xsl:when test="(name() = 'RoxieServerProcess')">
+                      id = rowsServers.length;
                       parent = 0;
                       parentIds.splice(0, parentIds.length);
                       parentIds[parentIds.length] = parent;
@@ -634,16 +633,11 @@
                         i.parent = parentIds[parentIds.length-1];
                         parent = id;
                         i.id = id++;
-                        setParentIds(i, rowsSlaves, parentIds);
+                        setParentIds(i, rowsServers, parentIds);
                         <xsl:for-each select="@*">
                           i.<xsl:value-of select="name()"/> = "<xsl:value-of select="."/>";
                         </xsl:for-each>
-                        if (i.depth > 1)
-                          i.name = '<xsl:value-of select="@number"/>';
-                        else
-                          i.name = '<xsl:value-of select="@computer"/>';
-                          
-                        rowsSlaves[rowsSlaves.length] = i;
+                        rowsServers[rowsServers.length] = i;
                       </xsl:for-each>
                     </xsl:when>
                     <xsl:when test="name() = /*[1]/ViewChildNodes/viewChildNodes/*">
@@ -787,7 +781,8 @@
                               i.value_onChangeMsg = aS.onChangeMsg;
                               i.params = "pcType=<xsl:value-of select="$Component"/>::pcName=" + cN + "::subType=" + eN;
                               i.params +="::subTypeKey=" + subTypeKey;
-                              rows[aS.tab][rows[aS.tab].length] = i;
+                              if (typeof(rows[aS.tab]) != 'undefined')
+                                rows[aS.tab][rows[aS.tab].length] = i;
                             }
                           }
                         }
@@ -799,7 +794,7 @@
                 createTablesForComp('<xsl:value-of select="$Component"/>', rows);
                 if ('<xsl:value-of select="$Component"/>'==='RoxieCluster') {
                   createMultiColTreeCtrlForComp(rowsServers, "Servers", 0);
-                  createMultiColTreeCtrlForComp(rowsSlaves, "Farms", 0);
+                  createMultiColTreeCtrlForComp(rowsPorts, "Ports", 0);
                 }
                 else if ('<xsl:value-of select="$Component"/>'==='ThorCluster')
                   createMultiColTreeCtrlForComp(rowsTopology, "Topology", 0);

+ 29 - 11
initfiles/componentfiles/configxml/roxie.xsd.in

@@ -29,7 +29,7 @@
         <xs:element name="RoxieFarmProcess" maxOccurs="unbounded">
           <xs:annotation>
             <xs:appinfo>
-              <title>Farms</title>
+              <title>Servers</title>
             </xs:appinfo>
           </xs:annotation>
           <xs:complexType>
@@ -77,19 +77,11 @@
         <xs:element name="RoxieServerProcess" maxOccurs="unbounded">
           <xs:annotation>
             <xs:appinfo>
-              <viewType>RoxieServers</viewType>
-              <title>Servers</title>
+              <title>Ports</title>
             </xs:appinfo>
           </xs:annotation>
           <xs:complexType>
             <xs:attribute name="computer" type="computerType" use="required"/>
-            <xs:attribute name="netAddress" type="ipAddress">
-              <xs:annotation>
-                <xs:appinfo>
-                  <viewType>readonly</viewType>
-                </xs:appinfo>
-              </xs:annotation>
-            </xs:attribute>
           </xs:complexType>
         </xs:element>
 
@@ -683,7 +675,33 @@
         </xs:appinfo>
       </xs:annotation>
     </xs:attribute>
-    <xs:attribute name="slaveThreads" type="xs:nonNegativeInteger" use="optional" default="30">
+
+    <xs:attribute name="slaveConfig" use="optional" default="">
+      <xs:annotation>
+        <xs:appinfo>
+           <tooltip>Roxie Server Redundancy</tooltip>
+           <title>redundancy</title>
+        </xs:appinfo>
+      </xs:annotation>
+      <xs:simpleType>
+        <xs:restriction base="xs:string">
+          <xs:enumeration value=""/>
+          <xs:enumeration value="overloaded"/>
+          <xs:enumeration value="full redundancy"/>
+          <xs:enumeration value="cyclic redundancy"/>
+        </xs:restriction>
+      </xs:simpleType>
+    </xs:attribute>
+
+    <xs:attribute name="offSet" type="xs:nonNegativeInteger" use="optional" default="1">
+      <xs:annotation>
+        <xs:appinfo>
+          <tooltip>Roxie Channel offset</tooltip>
+        </xs:appinfo>
+      </xs:annotation>
+    </xs:attribute>
+
+   <xs:attribute name="slaveThreads" type="xs:nonNegativeInteger" use="optional" default="30">
       <xs:annotation>
         <xs:appinfo>
           <tooltip>Number of threads processing agent requests</tooltip>