wizardInputs.cpp 49 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300
  1. /*#############################################################################
  2. HPCC SYSTEMS software Copyright (C) 2012 HPCC Systems®.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. #############################################################################*/
  13. /////////////////////////////////////////////////////////////////////////////
  14. //
  15. // WizardInputs.cpp : implementation file
  16. //
  17. /////////////////////////////////////////////////////////////////////////////
  18. #include "wizardInputs.hpp"
  19. #include "XMLTags.h"
  20. #include "jencrypt.hpp"
  21. #include "buildset.hpp"
  22. #include "confighelper.hpp"
  23. #include "build-config.h"
  24. #define STANDARD_CONFIGXMLDIR COMPONENTFILES_DIR"/configxml/"
  25. #define STANDARD_CONFIG_DIR CONFIG_DIR
  26. CInstDetails::CInstDetails(StringBuffer compName, const StringArray &ipAssigned) : m_compName(compName)
  27. {
  28. m_ipAssigned.clear();
  29. for (int i = 0; i < ipAssigned.ordinality(); i++)
  30. {
  31. m_ipAssigned.append(ipAssigned.item(i));
  32. }
  33. }
  34. //---------------------------------------------------------------------------
  35. // CWizardInputs
  36. //---------------------------------------------------------------------------
  37. CWizardInputs::CWizardInputs(const char* xmlArg,const char *service,
  38. IPropertyTree * cfg,
  39. MapStringTo<StringBuffer>* dirMap,
  40. StringArray &arrBuildSetsWithAssignedIPs,
  41. StringArray &arrAssignedIPs): m_service(service),
  42. m_cfg(cfg), m_overrideDirs(dirMap), m_roxieOnDemand(true),
  43. m_supportNodes(0), m_arrBuildSetsWithAssignedIPs(arrBuildSetsWithAssignedIPs), m_arrAssignedIPs(arrAssignedIPs)
  44. {
  45. m_pXml.setown(createPTreeFromXMLString(xmlArg && *xmlArg ? xmlArg : "<XmlArgs/>"));
  46. }
  47. //----------------------------------------------------------------------
  48. CWizardInputs::~CWizardInputs()
  49. {
  50. m_pXml.clear();
  51. HashIterator info(m_invalidServerCombo);
  52. for(info.first();info.isValid();info.next())
  53. {
  54. StringArray *a = *m_invalidServerCombo.mapToValue(&info.query());
  55. delete a;
  56. }
  57. HashIterator iter(m_compIpMap);
  58. ForEach(iter)
  59. {
  60. IMapping &cur = iter.query();
  61. CInstDetails* pInfo = m_compIpMap.mapToValue(&cur);
  62. pInfo->Release();
  63. }
  64. HashIterator sIter(m_compForTopology);
  65. for(sIter.first();sIter.isValid();sIter.next())
  66. {
  67. StringArray* a = *m_compForTopology.mapToValue(&sIter.query());
  68. delete a;
  69. }
  70. }
  71. //-----------------------------------------------------------------------
  72. // SetEnvironment
  73. //-----------------------------------------------------------------------
  74. void CWizardInputs::setEnvironment()
  75. {
  76. StringBuffer xpath;
  77. if(m_pXml->hasProp("@ipList"))
  78. formIPList(m_pXml->queryProp("@ipList"), m_ipaddress);
  79. if(m_pXml->hasProp("@supportNodes"))
  80. {
  81. m_supportNodes = atoi(m_pXml->queryProp("@supportNodes"));
  82. if (m_supportNodes)
  83. {
  84. if (m_ipaddress.length() > 0 && m_ipaddress.length() > m_supportNodes)
  85. {
  86. for(unsigned i = 0; i < m_supportNodes; i++)
  87. m_ipaddressSupport.append(m_ipaddress.item(i));
  88. m_ipaddress.removen(0, m_supportNodes);
  89. }
  90. else
  91. m_supportNodes = 0;
  92. }
  93. }
  94. if(m_pXml->hasProp("@roxieNodes"))
  95. m_roxieNodes = atoi(m_pXml->queryProp("@roxieNodes"));
  96. if(m_pXml->hasProp("@thorNodes"))
  97. m_thorNodes = atoi(m_pXml->queryProp("@thorNodes"));
  98. m_espNodes = 1;
  99. if(m_pXml->hasProp("@thorNodes"))
  100. m_espNodes = atoi(m_pXml->queryProp("@espNodes"));
  101. if(m_pXml->hasProp("@dbuser"))
  102. m_dbuser = m_pXml->queryProp("@dbuser");
  103. if(m_pXml->hasProp("@dbpassword"))
  104. m_dbpassword = m_pXml->queryProp("@dbpassword");
  105. m_thorSlavesPerNode = 1;
  106. if(m_pXml->hasProp("@slavesPerNode"))
  107. m_thorSlavesPerNode = atoi( m_pXml->queryProp("@slavesPerNode"));
  108. if (m_thorSlavesPerNode < 1)
  109. m_thorSlavesPerNode = 1;
  110. m_roxieOnDemand = m_pXml->getPropBool("@roxieOnDemand", true);
  111. xpath.clear().appendf("Software/EspProcess/EspService[@name='%s']/LocalConfFile", m_service.str());
  112. const char* pConfFile = m_cfg->queryProp(xpath.str());
  113. xpath.clear().appendf("Software/EspProcess/EspService[@name='%s']/LocalEnvConfFile", m_service.str());
  114. const char* pEnvConfFile = m_cfg->queryProp(xpath.str());
  115. if (pConfFile && *pConfFile && pEnvConfFile && *pEnvConfFile)
  116. {
  117. Owned<IProperties> pParams = createProperties(pConfFile);
  118. Owned<IProperties> pEnvParams = createProperties(pEnvConfFile);
  119. StringBuffer sb, fileName;
  120. CConfigHelper *pConfigHelper = CConfigHelper::getInstance(m_cfg, m_service.str());
  121. if (pConfigHelper == NULL)
  122. {
  123. throw MakeStringException( -1 , "Error loading buildset from configuration");
  124. }
  125. IPropertyTree* pBuildSet = pConfigHelper->getBuildSetTree();
  126. if (strlen(pConfigHelper->getBuildSetFileName()) == 0 || pBuildSet == NULL)
  127. {
  128. throw MakeStringException( -1 , "The buildset file %s/%s does not exist", pConfigHelper->getBuildSetFilePath(), pConfigHelper->getBuildSetFileName());
  129. }
  130. m_buildSetTree.setown(pBuildSet);
  131. fileName.clear().append((pEnvParams->queryProp("configs") != NULL ? (sb.clear().append(pEnvParams->queryProp("configs")).append("/")): STANDARD_CONFIG_DIR));
  132. fileName.append((pParams->queryProp("wizardalgorithm") != NULL ? (sb.clear().append(pParams->queryProp("wizardalgorithm"))) : STANDARD_CONFIG_ALGORITHMFILE));
  133. if(fileName.length() && checkFileExists(fileName.str()))
  134. m_algProp.setown(createProperties(fileName.str()));
  135. else
  136. throw MakeStringException( -1 , "The algorithm file %s does not exists", fileName.str());
  137. }
  138. setWizardRules();
  139. setTopologyParam();
  140. }
  141. void CWizardInputs::setWizardRules()
  142. {
  143. const char* roxieRedTypes[] = {"Full", "Circular", "None", "Overloaded"};
  144. m_roxieAgentRedType.clear().append("Circular");
  145. m_roxieAgentRedChannels = 2;
  146. m_roxieAgentRedOffset = 1;
  147. if(m_algProp)
  148. {
  149. CConfigHelper::getInstance()->addPluginsToGenEnvRules(m_algProp.get());
  150. Owned<IPropertyIterator> iter = m_algProp->getIterator();
  151. StringBuffer prop;
  152. ForEach(*iter)
  153. {
  154. m_algProp->getProp(iter->getPropKey(), prop.clear());
  155. if(prop.length() && prop.charAt(prop.length()-1) == ',')
  156. prop.setCharAt((prop.length()-1),' ');
  157. if(!strcmp(iter->getPropKey(), "max_comps_per_node"))
  158. {
  159. m_maxCompOnNode = atoi(prop.str());
  160. }
  161. else if(!strcmp(iter->getPropKey(), "avoid_combo"))
  162. {
  163. StringArray pairValue;
  164. pairValue.appendList(prop.str(), ",");
  165. if( pairValue.ordinality() > 0)
  166. {
  167. for( unsigned i = 0; i < pairValue.ordinality() ; i++)
  168. {
  169. StringArray eachpair;
  170. eachpair.appendList(pairValue.item(i), "-");
  171. if(eachpair.ordinality() == 2 )
  172. {
  173. StringArray* serverCompArr = 0;
  174. ForEachItemIn(x, eachpair)
  175. {
  176. StringArrayPtr* pairServerArr = m_invalidServerCombo.getValue(eachpair.item(x));
  177. if(pairServerArr)
  178. {
  179. serverCompArr = (*pairServerArr);
  180. serverCompArr->append(x == 0 ? eachpair.item(1): eachpair.item(0));
  181. }
  182. else
  183. {
  184. serverCompArr = new StringArray();
  185. serverCompArr->append(x == 0 ? eachpair.item(1): eachpair.item(0));
  186. m_invalidServerCombo.setValue(eachpair.item(x),serverCompArr);
  187. }
  188. }
  189. }
  190. }
  191. }
  192. }
  193. else if(!strcmp (iter->getPropKey(),"do_not_generate"))
  194. m_doNotGenComp.appendList(prop.str(), ",");
  195. else if(!strcmp (iter->getPropKey(),"comps_on_all_nodes"))
  196. m_compOnAllNodes.appendList(prop.str(), ",");
  197. else if(!strcmp(iter->getPropKey(), "topology_for_comps"))
  198. m_clusterForTopology.appendList(prop.str(), ",");
  199. else if (!strcmp(iter->getPropKey(), "roxie_agent_redundancy"))
  200. {
  201. StringArray sbarr;
  202. sbarr.appendList(prop.str(), ",");
  203. if (sbarr.length() > 1)
  204. {
  205. int type = atoi(sbarr.item(0));
  206. if (type == 0)
  207. continue;
  208. if (type > 0 && type < 5)
  209. m_roxieAgentRedType.clear().append(roxieRedTypes[type-1]);
  210. else
  211. continue;
  212. m_roxieAgentRedChannels = atoi(sbarr.item(1));
  213. if (m_roxieAgentRedChannels <= 0)
  214. m_roxieAgentRedChannels = 1;
  215. if (sbarr.length() > 2)
  216. {
  217. m_roxieAgentRedOffset = atoi(sbarr.item(2));
  218. if (m_roxieAgentRedOffset <= 0)
  219. m_roxieAgentRedOffset = 1;
  220. }
  221. else
  222. m_roxieAgentRedOffset = 0;
  223. }
  224. }
  225. }
  226. }
  227. }
  228. CInstDetails* CWizardInputs::getServerIPMap(const char* compName, const char* buildSetName,const IPropertyTree* pEnvTree, unsigned numOfNodes)
  229. {
  230. StringBuffer xPath;
  231. xPath.appendf("./Programs/Build/BuildSet[@name=\"%s\"]",buildSetName);
  232. IPropertyTree* pBuildSet = pEnvTree->queryPropTree(xPath.str());
  233. CInstDetails* instDetails = NULL;
  234. if(pBuildSet)
  235. {
  236. if(m_doNotGenComp.find(buildSetName) != NotFound)
  237. return instDetails;
  238. if(m_compOnAllNodes.find(buildSetName) != NotFound)
  239. return instDetails;
  240. if (m_arrBuildSetsWithAssignedIPs.find(buildSetName) != NotFound)
  241. instDetails = new CInstDetails(compName, getIpAddrMap(buildSetName));
  242. if (m_ipaddress.ordinality() + m_supportNodes == 1 && instDetails == NULL)
  243. {
  244. instDetails = new CInstDetails(compName, m_ipaddress.item(0));
  245. m_compIpMap.setValue(buildSetName,instDetails);
  246. return instDetails;
  247. }
  248. else if (m_supportNodes == 1 && strcmp(buildSetName, "roxie") && strcmp(buildSetName, "thor" ) && instDetails == NULL)
  249. {
  250. instDetails = new CInstDetails(compName, m_ipaddressSupport.item(0));
  251. m_compIpMap.setValue(buildSetName,instDetails);
  252. return instDetails;
  253. }
  254. else
  255. {
  256. unsigned x = 0;
  257. for(; x < numOfNodes ; x++)
  258. {
  259. StringArray* pIpAddrMap = NULL;
  260. if (m_arrBuildSetsWithAssignedIPs.find(buildSetName) != NotFound || !(x == 0 && m_supportNodes > 0 && !strcmp(buildSetName, "thor")))
  261. pIpAddrMap = &getIpAddrMap(buildSetName);
  262. else
  263. pIpAddrMap = &m_ipaddressSupport;
  264. unsigned numOfIPSAlreadyTaken = getCntForAlreadyAssignedIPS(buildSetName);
  265. if( numOfIPSAlreadyTaken < pIpAddrMap->ordinality())
  266. addToCompIPMap(buildSetName, pIpAddrMap->item(numOfIPSAlreadyTaken), compName);
  267. else if (!applyOverlappingRules(compName, buildSetName, numOfIPSAlreadyTaken, pIpAddrMap))
  268. break;
  269. }
  270. if(m_compIpMap.find(buildSetName) != NULL)
  271. {
  272. instDetails = m_compIpMap.getValue(buildSetName);
  273. if( (instDetails->getIpAssigned()).ordinality() != numOfNodes)
  274. {
  275. StringBuffer sb("support");
  276. StringBuffer sbBuildSet(buildSetName);
  277. unsigned ips = m_ipaddressSupport.length();
  278. unsigned ipns = m_ipaddress.length();
  279. if (!strcmp(buildSetName, "thor") && m_supportNodes > 0)
  280. {
  281. if (x == 0)
  282. {
  283. sb.clear().append(m_supportNodes == 0?"non-support":"support");
  284. sbBuildSet.clear().append("Thor Master");
  285. numOfNodes = 1;
  286. }
  287. else
  288. {
  289. sb.clear().append("non-support");
  290. sbBuildSet.clear().append("Thor Slaves");
  291. numOfNodes--;
  292. }
  293. }
  294. else if (!strcmp(buildSetName, "roxie"))
  295. sb.clear().append("non-support ");
  296. throw MakeStringException(-1, \
  297. "Total nodes: %d (%d Support Nodes + %d Non-support Nodes)\nError: Cannot assign %d number of nodes for %s due to insufficient %s nodes available. Please enter different values", \
  298. ips + ipns, ips, ipns, numOfNodes, sbBuildSet.str(), sb.str());
  299. }
  300. else{
  301. return m_compIpMap.getValue(buildSetName);
  302. }
  303. }
  304. }
  305. return instDetails;
  306. }
  307. return NULL;
  308. }
  309. bool CWizardInputs::applyOverlappingRules(const char* compName,const char* buildSetName, unsigned startpos, StringArray* pIpAddrMap)
  310. {
  311. StringArray dontAssign , ignoredForOverlap;
  312. bool assignedIP = false;
  313. CInstDetails* compPtr = NULL;
  314. if(m_invalidServerCombo.find(buildSetName) != NULL)
  315. {
  316. StringArray* serverCompArr = 0;
  317. StringArrayPtr* pairServerArr = m_invalidServerCombo.getValue(buildSetName);
  318. if(pairServerArr)
  319. serverCompArr = (*pairServerArr);
  320. for(unsigned i = 0 ; i < serverCompArr->ordinality() ; i++)
  321. {
  322. compPtr = m_compIpMap.getValue(serverCompArr->item(i));
  323. if(compPtr)
  324. {
  325. StringArray& ipArr = compPtr->getIpAssigned();
  326. ForEachItemIn(i, ipArr)
  327. dontAssign.append(ipArr.item(i));
  328. }
  329. }
  330. }
  331. //Since Roxie and thor might already have some ips asssigned we need to ignore those too.
  332. if(m_compIpMap.find(buildSetName) != NULL)
  333. {
  334. compPtr = m_compIpMap.getValue(buildSetName);
  335. StringArray& ipArr = compPtr->getIpAssigned();
  336. ForEachItemIn(i, ipArr)
  337. dontAssign.append(ipArr.item(i));
  338. }
  339. unsigned pos = startpos % pIpAddrMap->ordinality();
  340. for (unsigned j=pos; j < pos + pIpAddrMap->ordinality(); j++)
  341. {
  342. unsigned ii = (j >= pIpAddrMap->ordinality()) ? 0 : j;
  343. count_t ipAssignedCount = getNumOfInstForIP(pIpAddrMap->item(ii));
  344. if(dontAssign.ordinality() > 0)
  345. {
  346. if( dontAssign.find(pIpAddrMap->item(ii)) == NotFound)
  347. {
  348. if(ipAssignedCount >= m_maxCompOnNode )
  349. {
  350. ignoredForOverlap.append(pIpAddrMap->item(ii));
  351. }
  352. else
  353. {
  354. assignedIP = true;
  355. addToCompIPMap(buildSetName, pIpAddrMap->item(ii), compName);
  356. break;
  357. }
  358. }
  359. }
  360. else
  361. {
  362. if(ipAssignedCount >= m_maxCompOnNode )
  363. {
  364. ignoredForOverlap.append(pIpAddrMap->item(ii));
  365. }
  366. else
  367. {
  368. assignedIP = true;
  369. addToCompIPMap(buildSetName, pIpAddrMap->item(ii), compName);
  370. break;
  371. }
  372. }
  373. }
  374. if(!assignedIP && ignoredForOverlap.ordinality() > 0)
  375. {
  376. addToCompIPMap(buildSetName, ignoredForOverlap.item(0), compName);
  377. assignedIP = true;
  378. }
  379. return assignedIP;
  380. }
  381. count_t CWizardInputs::getNumOfInstForIP(StringBuffer ip)
  382. {
  383. count_t cnt = 0;
  384. HashIterator ips(m_compIpMap);
  385. ForEach(ips)
  386. {
  387. CInstDetails* comp = m_compIpMap.mapToValue(&ips.query());
  388. StringArray& ipArray = comp->getIpAssigned();
  389. if(ipArray.find(ip) != NotFound)
  390. cnt++;
  391. }
  392. return cnt;
  393. }
  394. bool CWizardInputs::generateEnvironment(StringBuffer& envXml)
  395. {
  396. if(m_algProp)
  397. {
  398. Owned<IPropertyTree> pEnvTree = createEnvironment();
  399. if(pEnvTree)
  400. {
  401. toXML(pEnvTree,envXml, 0, XML_SortTags | XML_Format);
  402. }
  403. }
  404. else
  405. {
  406. DBGLOG("not yet decided");//use default algorithm
  407. }
  408. return true;
  409. }
  410. IPropertyTree* CWizardInputs::createEnvironment()
  411. {
  412. StringBuffer xpath, sbTemp, name ;
  413. sbTemp.clear().appendf("<%s><%s></%s>", XML_HEADER, XML_TAG_ENVIRONMENT, XML_TAG_ENVIRONMENT);
  414. IPropertyTree* pNewEnvTree = createPTreeFromXMLString(sbTemp.str());
  415. IPropertyTree* pSettings = pNewEnvTree->addPropTree(XML_TAG_ENVSETTINGS, createPTree());
  416. xpath.clear().appendf("%s/%s/%s[%s='%s']/LocalEnvFile", XML_TAG_SOFTWARE, XML_TAG_ESPPROCESS, XML_TAG_ESPSERVICE, XML_ATTR_NAME, m_service.str());
  417. const char* pConfFile = m_cfg->queryProp(xpath.str());
  418. xpath.clear().appendf("%s/%s/%s[%s='%s']/LocalEnvConfFile", XML_TAG_SOFTWARE, XML_TAG_ESPPROCESS, XML_TAG_ESPSERVICE, XML_ATTR_NAME, m_service.str());
  419. const char* tmp = m_cfg->queryProp(xpath.str());
  420. if (tmp && *tmp)
  421. {
  422. Owned<IProperties> pParams = createProperties(tmp);
  423. Owned<IPropertyIterator> iter = pParams->getIterator();
  424. ForEach(*iter)
  425. {
  426. StringBuffer prop;
  427. pParams->getProp(iter->getPropKey(), prop);
  428. pSettings->addProp(iter->getPropKey(), prop.length() ? prop.str():"");
  429. }
  430. }
  431. Owned<IPropertyTree> pProgramTree = createPTreeFromIPT(m_buildSetTree);
  432. pNewEnvTree->addPropTree(XML_TAG_PROGRAMS, createPTreeFromIPT(pProgramTree->queryPropTree("./" XML_TAG_PROGRAMS)));
  433. Owned<IPropertyTree> pCompTree = createPTree(XML_TAG_HARDWARE);
  434. generateHardwareHeaders(pNewEnvTree, sbTemp, false, pCompTree);
  435. pCompTree->removeProp(XML_TAG_COMPUTER);
  436. xpath.clear().appendf("./%s/%s", XML_TAG_COMPUTERTYPE, XML_ATTR_MEMORY);
  437. pCompTree->removeProp(xpath.str());
  438. xpath.clear().appendf("./%s/%s", XML_TAG_COMPUTERTYPE, XML_ATTR_NICSPEED);
  439. pCompTree->removeProp(xpath.str());
  440. xpath.clear().append(XML_TAG_SWITCH).append("/").append(XML_ATTR_NAME);
  441. pCompTree->setProp(xpath.str(), "Switch") ;
  442. xpath.clear().append(XML_TAG_DOMAIN).append("/").append(XML_ATTR_NAME);
  443. pCompTree->setProp(xpath.str(), "localdomain");
  444. xpath.clear().append(XML_TAG_DOMAIN).append("/").append(XML_ATTR_PASSWORD);
  445. pCompTree->setProp(xpath.str(), m_pXml->queryProp("@password"));
  446. xpath.clear().append(XML_TAG_DOMAIN).append("/").append(XML_ATTR_USERNAME);
  447. pCompTree->setProp(xpath.str(), m_pXml->queryProp("@username"));
  448. xpath.clear().appendf("./%s/@snmpSecurityString", XML_TAG_DOMAIN);
  449. pCompTree->removeProp(xpath.str());
  450. xpath.clear().append(XML_TAG_COMPUTERTYPE).append("/").append(XML_ATTR_COMPUTERTYPE);
  451. pCompTree->setProp(xpath.str(), "linuxmachine");
  452. xpath.clear().append(XML_TAG_COMPUTERTYPE).append("/").append(XML_ATTR_MANUFACTURER);
  453. pCompTree->setProp(xpath.str(), "unknown");
  454. xpath.clear().append(XML_TAG_COMPUTERTYPE).append("/").append(XML_ATTR_NAME);
  455. pCompTree->setProp(xpath.str(), "linuxmachine");
  456. xpath.clear().append(XML_TAG_COMPUTERTYPE).append("/").append(XML_ATTR_OPSYS);
  457. pCompTree->setProp(xpath.str(), "linux");
  458. xpath.clear().append(XML_TAG_COMPUTERTYPE).append("/").append(XML_ATTR_NICSPEED);
  459. pCompTree->setProp(xpath.str(), "1000");
  460. unsigned x;
  461. IpAddress ipaddr;
  462. for(unsigned i = 0; i < m_ipaddressSupport.ordinality(); i++)
  463. {
  464. IPropertyTree* pComputer = pCompTree->addPropTree(XML_TAG_COMPUTER,createPTree());
  465. ipaddr.ipset(m_ipaddressSupport.item(i));
  466. ipaddr.getNetAddress(sizeof(x),&x);
  467. name.clear().appendf("node%03d%03d", (x >> 16) & 0xFF, (x >> 24) & 0xFF);
  468. getUniqueName(pCompTree, name, XML_TAG_COMPUTER, "");
  469. pComputer->addProp(XML_ATTR_COMPUTERTYPE, "linuxmachine");
  470. pComputer->addProp(XML_ATTR_DOMAIN, "localdomain");
  471. pComputer->addProp(XML_ATTR_NAME, name.str());
  472. pComputer->addProp(XML_ATTR_NETADDRESS, m_ipaddressSupport.item(i));
  473. }
  474. for(unsigned i = 0; i < m_ipaddress.ordinality(); i++)
  475. {
  476. IPropertyTree* pComputer = pCompTree->addPropTree(XML_TAG_COMPUTER,createPTree());
  477. ipaddr.ipset(m_ipaddress.item(i));
  478. ipaddr.getNetAddress(sizeof(x),&x);
  479. name.clear().appendf("node%03d%03d", (x >> 16) & 0xFF, (x >> 24) & 0xFF);
  480. getUniqueName(pCompTree, name, XML_TAG_COMPUTER, "");
  481. pComputer->addProp(XML_ATTR_COMPUTERTYPE, "linuxmachine");
  482. pComputer->addProp(XML_ATTR_DOMAIN, "localdomain");
  483. pComputer->addProp(XML_ATTR_NAME, name.str());
  484. pComputer->addProp(XML_ATTR_NETADDRESS, m_ipaddress.item(i));
  485. }
  486. for(unsigned i = 0; i < m_arrBuildSetsWithAssignedIPs.ordinality(); i++)
  487. {
  488. const StringArray &strIPs = getIpAddrMap(m_arrBuildSetsWithAssignedIPs.item(i));
  489. for (unsigned i2 = 0; i2 < strIPs.ordinality(); i2++)
  490. {
  491. VStringBuffer strXPath("./%s/[%s=\"%s\"]", XML_TAG_COMPUTER, XML_ATTR_NETADDRESS, strIPs.item(i2));
  492. if (pCompTree->hasProp(strXPath.str()))
  493. continue;
  494. IPropertyTree* pComputer = pCompTree->addPropTree(XML_TAG_COMPUTER,createPTree());
  495. ipaddr.ipset(strIPs.item(i2));
  496. ipaddr.getNetAddress(sizeof(x),&x);
  497. name.setf("node%03d%03d", (x >> 16) & 0xFF, (x >> 24) & 0xFF);
  498. getUniqueName(pCompTree, name, XML_TAG_COMPUTER, "");
  499. pComputer->addProp(XML_ATTR_COMPUTERTYPE, "linuxmachine");
  500. pComputer->addProp(XML_ATTR_DOMAIN, "localdomain");
  501. pComputer->addProp(XML_ATTR_NAME, name.str());
  502. pComputer->addProp(XML_ATTR_NETADDRESS, strIPs.item(i2));
  503. }
  504. }
  505. pNewEnvTree->addPropTree(XML_TAG_HARDWARE, createPTreeFromIPT(pCompTree));
  506. //Before we generate software tree check for dependencies of component for do_not_generate ,roxie, thor
  507. checkForDependencies();
  508. generateSoftwareTree(pNewEnvTree);
  509. return pNewEnvTree;
  510. }
  511. void CWizardInputs::generateSoftwareTree(IPropertyTree* pNewEnvTree)
  512. {
  513. StringBuffer xpath;
  514. if(m_buildSetTree)
  515. {
  516. bool ovrLog = true, ovrRun = true;
  517. if (m_overrideDirs && m_overrideDirs->count() > 0)
  518. {
  519. HashIterator iter(*m_overrideDirs);
  520. ForEach(iter)
  521. {
  522. IMapping &cur = iter.query();
  523. StringBuffer* dirvalue = m_overrideDirs->mapToValue(&cur);
  524. const char * key = (const char*)cur.getKey();
  525. xpath.clear().appendf(XML_TAG_SOFTWARE"/Directories/Category[@name='%s']", key);
  526. if (!strcmp(key, "log"))
  527. ovrLog = false;
  528. else if (!strcmp(key, "run"))
  529. ovrRun = false;
  530. IPropertyTree* pDir = m_buildSetTree->queryPropTree(xpath.str());
  531. if (pDir)
  532. pDir->setProp("@dir", dirvalue->str());
  533. else
  534. {
  535. pDir = m_buildSetTree->queryPropTree(XML_TAG_SOFTWARE"/Directories/")->addPropTree("Category", createPTree());
  536. pDir->setProp(XML_ATTR_NAME, (const char*)cur.getKey());
  537. pDir->setProp("@dir", dirvalue->str());
  538. }
  539. }
  540. }
  541. pNewEnvTree->addPropTree(XML_TAG_SOFTWARE,createPTreeFromIPT(m_buildSetTree->queryPropTree("./" XML_TAG_SOFTWARE)));
  542. xpath.clear().appendf("%s/%s/%s[%s='%s']/LocalEnvConfFile", XML_TAG_SOFTWARE, XML_TAG_ESPPROCESS, XML_TAG_ESPSERVICE, XML_ATTR_NAME, m_service.str());
  543. const char* tmp = m_cfg->queryProp(xpath.str());
  544. if (tmp && *tmp)
  545. {
  546. Owned<IProperties> pParams = createProperties(tmp);
  547. updateDirsWithConfSettings(pNewEnvTree, pParams, ovrLog, ovrRun);
  548. }
  549. const char* firstComp = "esp";
  550. xpath.clear().appendf("./%s/%s/%s/[@name=\"%s\"]", XML_TAG_PROGRAMS, XML_TAG_BUILD, XML_TAG_BUILDSET, firstComp);
  551. IPropertyTree* pEspBuildSet = m_buildSetTree->queryPropTree(xpath.str());
  552. if (pEspBuildSet)
  553. addComponentToSoftware(pNewEnvTree, pEspBuildSet);
  554. xpath.clear().appendf("./%s/%s/%s", XML_TAG_PROGRAMS, XML_TAG_BUILD, XML_TAG_BUILDSET);
  555. Owned<IPropertyTreeIterator> buildSetInsts = m_buildSetTree->getElements(xpath.str());
  556. ForEach(*buildSetInsts)
  557. {
  558. IPropertyTree* pBuildSet = &buildSetInsts->query();
  559. const char* buildSetName = pBuildSet->queryProp(XML_ATTR_NAME);
  560. if (strcmp(firstComp, buildSetName))
  561. addComponentToSoftware(pNewEnvTree, &buildSetInsts->query());
  562. }
  563. getEspBindingInformation(pNewEnvTree);
  564. addTopology(pNewEnvTree);
  565. getDefaultsForWizard(pNewEnvTree);
  566. }
  567. }
  568. void CWizardInputs::addInstanceToTree(IPropertyTree* pNewEnvTree, StringBuffer attrName, const char* processName, const char* buildSetName, const char* instName)
  569. {
  570. StringBuffer sb, sbl, compName, xpath, nodeName;
  571. xpath.clear().appendf("./%s/%s[%s=\"%s\"]", XML_TAG_HARDWARE, XML_TAG_COMPUTER, XML_ATTR_NETADDRESS, attrName.str());
  572. IPropertyTree* pHardTemp = pNewEnvTree->queryPropTree(xpath.str());
  573. if(pHardTemp)
  574. nodeName.clear().append(pHardTemp->queryProp("./" XML_ATTR_NAME));//NodeName
  575. xpath.clear().appendf("./%s/%s[%s=\"%s\"]", XML_TAG_SOFTWARE, processName, XML_ATTR_BUILDSET, buildSetName);
  576. IPropertyTree* pComp = pNewEnvTree->queryPropTree(xpath.str());
  577. compName.clear().append(pComp->queryProp(XML_ATTR_NAME));//compName
  578. sb.clear().appendf("<Instance buildSet=\"%s\" compName=\"%s\" ><Instance name=\"%s\" /></Instance>", buildSetName, compName.str(), nodeName.str());
  579. Owned<IPropertyTree> pInstance = createPTreeFromXMLString(sb.str());
  580. if(pInstance)
  581. addInstanceToCompTree(pNewEnvTree, pInstance, sbl.clear(), sb.clear(),NULL);
  582. xpath.clear().appendf("./%s/%s[%s=\"%s\"]/%s[%s=\"%s\"]", XML_TAG_SOFTWARE, processName, XML_ATTR_NAME, compName.str(), XML_TAG_INSTANCE, XML_ATTR_COMPUTER, nodeName.str());
  583. IPropertyTree* pInst = pNewEnvTree->queryPropTree(xpath.str());
  584. if(pInst)
  585. {
  586. pInst->addProp(XML_ATTR_NAME, instName);
  587. }
  588. }
  589. void CWizardInputs::getDefaultsForWizard(IPropertyTree* pNewEnvTree)
  590. {
  591. StringBuffer xpath, tempName, value;
  592. Owned<IPropertyTree> pBuildTree = createPTreeFromIPT(pNewEnvTree->queryPropTree("./" XML_TAG_PROGRAMS));
  593. xpath.clear().appendf("./%s/%s/", XML_TAG_BUILD, XML_TAG_BUILDSET);
  594. Owned<IPropertyTreeIterator> buildSetInsts = pBuildTree->getElements(xpath.str());
  595. ForEach(*buildSetInsts)
  596. {
  597. IPropertyTree* pBuildSet = &buildSetInsts->query();
  598. StringBuffer buildSetPath, compName;
  599. const char* buildSetName = pBuildSet->queryProp(XML_ATTR_NAME);
  600. const char* xsdFileName = pBuildSet->queryProp(XML_ATTR_SCHEMA);
  601. const char* processName = pBuildSet->queryProp(XML_ATTR_PROCESS_NAME);
  602. if(processName && *processName && buildSetName && * buildSetName && xsdFileName && *xsdFileName)
  603. {
  604. Owned<IPropertyTree> pSchema = loadSchema(pBuildTree->queryPropTree("./" XML_TAG_BUILD "[1]"), pBuildSet, buildSetPath, NULL);
  605. Owned<IPropertyTree> pCompTree = generateTreeFromXsd(pNewEnvTree, pSchema, processName, buildSetName, m_cfg, m_service.str(), true, true, this);
  606. xpath.clear().appendf("./%s/%s/[%s=\"%s\"]", XML_TAG_SOFTWARE, processName, XML_ATTR_BUILDSET, buildSetName);
  607. IPropertyTree* pSWCompTree = pNewEnvTree->queryPropTree(xpath.str());
  608. if(pSWCompTree && pCompTree)
  609. {
  610. Owned<IAttributeIterator> iAttr = pCompTree->getAttributes();
  611. ForEach(*iAttr)
  612. {
  613. if( pSWCompTree->hasProp(iAttr->queryName()) && strcmp(iAttr->queryName(), "@buildSet") != 0)
  614. {
  615. if (!strcmp(iAttr->queryName(), XML_ATTR_NAME))
  616. {
  617. StringBuffer sbxpath, sbnew, sbMsg;
  618. sbnew.clear().append(iAttr->queryValue());
  619. sbxpath.clear().append(processName);
  620. getUniqueName(pNewEnvTree, sbnew, sbxpath.str(), XML_TAG_SOFTWARE);
  621. bool ret = checkComponentReferences(pNewEnvTree, pSWCompTree, pSWCompTree->queryProp(iAttr->queryName()), sbMsg, sbnew.str());
  622. if (ret)
  623. pSWCompTree->setProp(iAttr->queryName(), iAttr->queryValue());
  624. }
  625. else
  626. pSWCompTree->setProp(iAttr->queryName(), iAttr->queryValue());
  627. }
  628. }
  629. //Now adding elements
  630. Owned<IPropertyTreeIterator> iterElems = pCompTree->getElements("*");
  631. ForEach (*iterElems)
  632. {
  633. IPropertyTree* pElem = &iterElems->query();
  634. Owned<IAttributeIterator> iAttr = pElem->getAttributes();
  635. ForEach(*iAttr)
  636. {
  637. IPropertyTree* pNewSubElem = pSWCompTree->queryPropTree(pElem->queryName());
  638. if (!pNewSubElem)
  639. {
  640. pNewSubElem = pSWCompTree->addPropTree(pElem->queryName(), createPTreeFromIPT(pElem));
  641. break;
  642. }
  643. else
  644. {
  645. Owned<IPropertyTreeIterator> srcElems = pSWCompTree->getElements(pElem->queryName());
  646. IPropertyTree* pSrcElem = NULL;
  647. ForEach(*srcElems)
  648. {
  649. pSrcElem = &srcElems->query();
  650. Owned<IAttributeIterator> iAttrElem = pElem->getAttributes();
  651. ForEach(*iAttrElem)
  652. {
  653. const char* attrName = iAttrElem->queryName();
  654. if (pSrcElem->hasProp(attrName))
  655. pSrcElem->setProp(attrName, iAttrElem->queryValue());
  656. Owned<IPropertyTreeIterator> iterSubElems = pElem->getElements("*");
  657. ForEach (*iterSubElems)
  658. {
  659. IPropertyTree* pSubElem = &iterSubElems->query();
  660. Owned<IPropertyTreeIterator> srcSubElems = pSWCompTree->getElements(pSubElem->queryName());
  661. IPropertyTree* pSrcSubElem = NULL;
  662. ForEach(*srcSubElems)
  663. {
  664. pSrcSubElem = &srcSubElems->query();
  665. Owned<IAttributeIterator> iAttrElem = pSubElem->getAttributes();
  666. ForEach(*iAttrElem)
  667. {
  668. const char* attrName = iAttrElem->queryName();
  669. if (pSrcSubElem->hasProp(attrName))
  670. pSrcSubElem->setProp(attrName, iAttrElem->queryValue());
  671. }
  672. }
  673. }
  674. }
  675. }
  676. }
  677. }
  678. }
  679. }
  680. }
  681. }
  682. }
  683. void CWizardInputs::addToCompIPMap(const char* buildSetName, const char* value, const char* compName)
  684. {
  685. CInstDetails* pInst = NULL;
  686. if(m_compIpMap.find(buildSetName) != NULL)
  687. {
  688. pInst = m_compIpMap.getValue(buildSetName);
  689. (pInst->getIpAssigned()).append(value);
  690. }
  691. else
  692. {
  693. pInst = new CInstDetails();
  694. pInst->setParams(compName, value);
  695. m_compIpMap.setValue(buildSetName, pInst);
  696. }
  697. }
  698. unsigned CWizardInputs::getCntForAlreadyAssignedIPS(const char* buildSetName)
  699. {
  700. unsigned cnt = 0;
  701. CInstDetails* pInstRoxie = NULL, *pInstThor = NULL;
  702. if (!strcmp(buildSetName, "roxie") || !strcmp(buildSetName, "thor" ))
  703. {
  704. if (m_compIpMap.find("roxie") != NULL)
  705. {
  706. CInstDetails* pInst = m_compIpMap.getValue("roxie");
  707. cnt += pInst->getIpAssigned().length();
  708. }
  709. if (m_compIpMap.find("thor") != NULL)
  710. {
  711. CInstDetails* pInst = m_compIpMap.getValue("thor");
  712. cnt += pInst->getIpAssigned().length();
  713. }
  714. return cnt;
  715. }
  716. else
  717. {
  718. if (m_compIpMap.find("roxie") != NULL)
  719. pInstRoxie = m_compIpMap.getValue("roxie");
  720. if (m_compIpMap.find("thor") != NULL)
  721. pInstThor = m_compIpMap.getValue("thor");
  722. }
  723. HashIterator ips(m_compIpMap);
  724. ForEach(ips)
  725. {
  726. CInstDetails* comp = m_compIpMap.mapToValue(&ips.query());
  727. if (pInstRoxie == comp || pInstThor == comp)
  728. continue;
  729. StringArray& ipArray = comp->getIpAssigned();
  730. cnt += ipArray.length();
  731. }
  732. return cnt;
  733. }
  734. void CWizardInputs::addRoxieThorClusterToEnv(IPropertyTree* pNewEnvTree, CInstDetails* pInstDetails, const char* buildSetName, bool genRoxieOnDemand)
  735. {
  736. StringBuffer xmlForRoxiePorts, xmlForRoxieServers, xpath, compName, computerName, msg;
  737. if(!strcmp(buildSetName, "roxie"))
  738. {
  739. //Before proceeding remove the roxieserver already added to env via xsd.
  740. xpath.clear().appendf("./%s/%s/%s", XML_TAG_SOFTWARE, XML_TAG_ROXIECLUSTER, XML_ATTR_NAME);
  741. compName.clear().append(pNewEnvTree->queryProp(xpath.str()));
  742. xmlForRoxiePorts.clear().appendf("<RoxieData type=\"RoxieFarm\" parentName=\"\" roxieName=\"%s\" ", compName.str());
  743. if (genRoxieOnDemand)
  744. xmlForRoxiePorts.append("port=\"0\" >");
  745. else
  746. xmlForRoxiePorts.append(">");
  747. if (m_roxieNodes >= 1)
  748. xmlForRoxieServers.clear().appendf("<RoxieData type=\"None\" roxieName=\"%s\" >", compName.str());
  749. if(pInstDetails)
  750. {
  751. StringArray& ipAssignedToComp = pInstDetails->getIpAssigned();
  752. xmlForRoxieServers.append("<Instances>");
  753. ForEachItemIn(i, ipAssignedToComp)
  754. {
  755. xpath.clear().appendf("./%s/%s/[%s=\"%s\"]", XML_TAG_HARDWARE, XML_TAG_COMPUTER, XML_ATTR_NETADDRESS, ipAssignedToComp.item(i));
  756. IPropertyTree* pHardTemp = pNewEnvTree->queryPropTree(xpath.str());
  757. if(pHardTemp){
  758. xmlForRoxiePorts.appendf("<Component name=\"%s\" />", pHardTemp->queryProp("./@name"));
  759. xmlForRoxieServers.appendf("<Instance name=\"%s\"/>", pHardTemp->queryProp("./@name"));
  760. }
  761. }
  762. xmlForRoxieServers.append("</Instances>");
  763. xmlForRoxiePorts.append("</RoxieData>");
  764. xmlForRoxieServers.append("</RoxieData>");
  765. handleRoxieOperation(pNewEnvTree, "AddRoxieFarm", xmlForRoxiePorts.str());
  766. if (!genRoxieOnDemand)
  767. handleRoxieOperation(pNewEnvTree, "RoxieSlaveConfig" ,xmlForRoxieServers.str());
  768. }
  769. 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);
  770. pNewEnvTree->removeProp(xpath.str());
  771. }
  772. else if(!strcmp(buildSetName, "thor"))
  773. {
  774. //We need only one master
  775. StringBuffer masterIP, xml;
  776. xpath.clear().appendf("./%s/%s/%s", XML_TAG_SOFTWARE, XML_TAG_THORCLUSTER, XML_ATTR_NAME);
  777. compName.clear().append(pNewEnvTree->queryProp(xpath.str()));
  778. if(pInstDetails)
  779. {
  780. StringArray& ipAssignedToComp = pInstDetails->getIpAssigned();
  781. if(!ipAssignedToComp.empty())
  782. masterIP.clear().append(ipAssignedToComp.item(0));
  783. xpath.clear().appendf("./%s/%s[%s=\"%s\"]", XML_TAG_HARDWARE, XML_TAG_COMPUTER, XML_ATTR_NETADDRESS, masterIP.str());
  784. IPropertyTree* pHardTemp = pNewEnvTree->queryPropTree(xpath.str());
  785. if(pHardTemp)
  786. xml.clear().appendf("<ThorData type=\"Master\" name=\"%s\" validateComputers=\"false\" skipExisting=\"false\" > <Computer name=\"%s\" /></ThorData>", compName.str(), pHardTemp->queryProp("./@name"));
  787. handleThorTopologyOp(pNewEnvTree, "Add", xml.str(), msg);
  788. //Now add Slave
  789. xml.clear().appendf("<ThorData type=\"Slave\" name=\"%s\" validateComputers=\"false\" slavesPerNode=\"%d\" skipExisting=\"false\" >", compName.str(), m_thorSlavesPerNode);
  790. unsigned numOfNodes = ipAssignedToComp.ordinality() == 1 ? 0 : 1;
  791. for( ; numOfNodes < ipAssignedToComp.ordinality() ; numOfNodes++)
  792. {
  793. xpath.clear().appendf("./%s/%s[%s=\"%s\"]", XML_TAG_HARDWARE, XML_TAG_COMPUTER, XML_ATTR_NETADDRESS, ipAssignedToComp.item(numOfNodes));
  794. IPropertyTree* pHardTemp = pNewEnvTree->queryPropTree(xpath.str());
  795. if(pHardTemp)
  796. xml.appendf("<Computer name=\"%s\" />", pHardTemp->queryProp("./@name"));
  797. }
  798. xml.append("</ThorData>");
  799. handleThorTopologyOp(pNewEnvTree, "Add" , xml.str(), msg);
  800. }
  801. }
  802. }
  803. void CWizardInputs::getEspBindingInformation(IPropertyTree* pNewEnvTree)
  804. {
  805. StringBuffer xpath, sbDefn, xmlArg, compName, sbNewName;
  806. Owned<IPropertyTreeIterator> espProcessIter = pNewEnvTree->getElements("./" XML_TAG_SOFTWARE "/" XML_TAG_ESPPROCESS);
  807. ForEach(*espProcessIter)
  808. {
  809. IPropertyTree* pEspProcess = &espProcessIter->query();
  810. compName.clear().append(pEspProcess->queryProp(XML_ATTR_NAME));
  811. xpath.clear().appendf("./%s/%s/%s[@processName=\"%s\"]", XML_TAG_PROGRAMS, XML_TAG_BUILD, XML_TAG_BUILDSET, XML_TAG_ESPSERVICE);
  812. Owned<IPropertyTreeIterator> espServiceIter = pNewEnvTree->getElements(xpath.str());
  813. ForEach (*espServiceIter)
  814. {
  815. IPropertyTree* pEspService = &espServiceIter->query();
  816. if(pEspService)
  817. {
  818. StringBuffer espServiceName;
  819. espServiceName.appendf("my%s", pEspService->queryProp("@name"));
  820. xpath.clear().appendf("./%s/%s[%s=\"%s\"]", XML_TAG_SOFTWARE, XML_TAG_ESPSERVICE, XML_ATTR_NAME, espServiceName.str());
  821. IPropertyTree* pEspServiceInSWTree = pNewEnvTree->queryPropTree(xpath.str());
  822. if(pEspServiceInSWTree)
  823. {
  824. xpath.clear().append("./Properties/@defaultPort");
  825. const char* port = pEspService->queryProp(xpath.str());
  826. xpath.clear().append("./Properties/@defaultResourcesBasedn");
  827. const char* resourceBasedn = pEspService->queryProp(xpath.str());
  828. const char* buildSetName = pEspService->queryProp(XML_ATTR_NAME);
  829. const char* processName = pEspService->queryProp(XML_ATTR_PROCESS_NAME);
  830. StringBuffer buildSetPath;
  831. Owned<IPropertyTree> pSchema = loadSchema(pNewEnvTree->queryPropTree("./Programs/Build[1]"), pEspService, buildSetPath, NULL);
  832. xmlArg.clear().appendf("<EspServiceBindings type=\"EspBinding\" compName=\"%s\" > <Item name=\"%s\" params=\"pcType=EspProcess::pcName=%s::subType=EspBinding::subTypeKey=%s \"/></EspServiceBindings>", compName.str(), espServiceName.str(), compName.str(), espServiceName.str());
  833. addEspBindingInformation(xmlArg, pNewEnvTree, sbNewName, NULL, m_cfg, m_service.str());
  834. xpath.clear().appendf("./%s/%s/%s/[%s=\"\"]", XML_TAG_SOFTWARE, XML_TAG_ESPPROCESS, XML_TAG_ESPBINDING, XML_ATTR_SERVICE);
  835. IPropertyTree* pEspBindingInfo = pNewEnvTree->queryPropTree(xpath.str());
  836. pEspBindingInfo->setProp(XML_ATTR_NAME,(espServiceName.toLowerCase()).str());
  837. pEspBindingInfo->setProp(XML_ATTR_SERVICE,(espServiceName.toLowerCase()).str());
  838. pEspBindingInfo->setProp(XML_ATTR_PORT, port );
  839. pEspBindingInfo->setProp("@resourcesBasedn",resourceBasedn);
  840. xpath.clear().appendf("%s/%s[%s=\"%s\"]/Properties", XML_TAG_SOFTWARE, XML_TAG_ESPSERVICE, XML_ATTR_NAME, (espServiceName.toLowerCase()).str());
  841. IPropertyTree* pSvcProps = pNewEnvTree->queryPropTree(xpath.str());
  842. Owned<IPropertyTree> pCompTree = generateTreeFromXsd(pNewEnvTree, pSchema, processName, buildSetName, m_cfg, m_service.str(), true, false, 0);
  843. Owned<IPropertyTreeIterator> i = pSvcProps->getElements("Authenticate");
  844. ForEach(*i)
  845. {
  846. IPropertyTree* pAuthCopy = createPTreeFromIPT(&i->query());
  847. mergeAttributes(pAuthCopy, pCompTree->queryPropTree("Authenticate"));
  848. IPropertyTree* pNewNode = pEspBindingInfo->addPropTree("Authenticate", pAuthCopy);
  849. }
  850. i.setown( pSvcProps->getElements("AuthenticateFeature") );
  851. ForEach(*i)
  852. {
  853. IPropertyTree* pAuthCopy = createPTreeFromIPT(&i->query());
  854. //Adding authentication to true for espbinding.
  855. pAuthCopy->addProp("@authenticate","Yes");
  856. mergeAttributes(pAuthCopy, pCompTree->queryPropTree("AuthenticateFeature"));
  857. IPropertyTree* pNewNode = pEspBindingInfo->addPropTree("AuthenticateFeature", pAuthCopy);
  858. }
  859. i.setown( pSvcProps->getElements("AuthenticateSetting") );
  860. ForEach(*i)
  861. {
  862. IPropertyTree* pAuthCopy = createPTreeFromIPT(&i->query());
  863. mergeAttributes(pAuthCopy, pCompTree->queryPropTree("AuthenticateSetting"));
  864. IPropertyTree* pNewNode = pEspBindingInfo->addPropTree("AuthenticateSetting", pAuthCopy);
  865. }
  866. }
  867. }
  868. }
  869. }
  870. }
  871. void CWizardInputs::addTopology(IPropertyTree* pNewEnvTree)
  872. {
  873. StringBuffer xpath;
  874. if(!pNewEnvTree->hasProp("./" XML_TAG_SOFTWARE "/" XML_TAG_TOPOLOGY))
  875. pNewEnvTree->addPropTree("./" XML_TAG_SOFTWARE "/" XML_TAG_TOPOLOGY, createPTree());
  876. HashIterator sIter(m_compForTopology);
  877. for(sIter.first();sIter.isValid();sIter.next())
  878. {
  879. IMapping &cur = sIter.query();
  880. IPropertyTree* pCluster = createTopologyForComp(pNewEnvTree,(const char *) cur.getKey());
  881. if(pCluster)
  882. pNewEnvTree->addPropTree("./" XML_TAG_SOFTWARE "/" XML_TAG_TOPOLOGY "/Cluster", pCluster);
  883. }
  884. }
  885. IPropertyTree* CWizardInputs::createTopologyForComp(IPropertyTree* pNewEnvTree, const char* component)
  886. {
  887. StringBuffer xmlTag, xpath , compName, clusterStr;
  888. if(!strcmp(component, "roxie"))
  889. xmlTag.clear().append(XML_TAG_ROXIECLUSTER);
  890. else if(!strcmp(component, "thor"))
  891. xmlTag.clear().append(XML_TAG_THORCLUSTER);
  892. else if(!strcmp(component, "hthor"))
  893. xmlTag.clear().append("hthor");
  894. xpath.clear().appendf("./%s/%s[1]/%s", XML_TAG_SOFTWARE, xmlTag.str(), XML_ATTR_NAME);
  895. clusterStr.clear().appendf("<Cluster name=\"%s\" prefix=\"%s\" alias=\"\"></Cluster>", component, component);
  896. IPropertyTree* pCluster = createPTreeFromXMLString(clusterStr.str());
  897. if(pCluster)
  898. {
  899. if(pNewEnvTree->hasProp(xpath.str()))
  900. {
  901. IPropertyTree* pComponent = pCluster->addPropTree(xmlTag.str(), createPTree());
  902. pComponent->addProp(XML_ATTR_PROCESS, pNewEnvTree->queryProp(xpath.str()));
  903. }
  904. if(m_compForTopology.find(component) != NULL)
  905. {
  906. StringArray* clusterCompEle = 0;
  907. StringArrayPtr* clusterPair = m_compForTopology.getValue(component);
  908. if(clusterPair)
  909. {
  910. clusterCompEle = (*clusterPair);
  911. for(unsigned i = 0 ; i < clusterCompEle->ordinality() ; i++)
  912. {
  913. const char* eachClusterElem = clusterCompEle->item(i);
  914. xpath.clear().appendf("./%s/%s/%s[%s=\"%s\"]", XML_TAG_PROGRAMS, XML_TAG_BUILD, XML_TAG_BUILDSET, XML_ATTR_NAME, eachClusterElem);
  915. IPropertyTree* pBuildset = pNewEnvTree->queryPropTree(xpath.str());
  916. if(pBuildset)
  917. {
  918. const char* processName = pBuildset->queryProp(XML_ATTR_PROCESS_NAME);
  919. if(processName && *processName)
  920. {
  921. IPropertyTree* pElement = pCluster->addPropTree(processName,createPTree());
  922. xpath.clear().appendf("./%s/%s[1]/%s", XML_TAG_SOFTWARE, processName, XML_ATTR_NAME);
  923. if(pElement && pNewEnvTree->hasProp(xpath.str()))
  924. pElement->addProp(XML_ATTR_PROCESS, pNewEnvTree->queryProp(xpath.str()));
  925. }
  926. }
  927. }
  928. }
  929. clusterCompEle->kill();
  930. }
  931. return pCluster;
  932. }
  933. else
  934. return NULL;
  935. }
  936. void CWizardInputs::checkForDependencies()
  937. {
  938. StringBuffer xpath;
  939. if(m_buildSetTree)
  940. {
  941. xpath.clear().appendf("./%s/%s/%s", XML_TAG_PROGRAMS, XML_TAG_BUILD, XML_TAG_BUILDSET);
  942. Owned<IPropertyTreeIterator> buildSetInsts = m_buildSetTree->getElements(xpath.str());
  943. ForEach(*buildSetInsts)
  944. {
  945. IPropertyTree* pBuildSet = &buildSetInsts->query();
  946. const char* buildSetName = pBuildSet->queryProp(XML_ATTR_NAME);
  947. unsigned numOfNodesNeeded = 1;
  948. if((!strcmp(buildSetName,"roxie") && m_roxieNodes == 0 )|| (!strcmp(buildSetName,"thor")&& m_thorNodes == 0)){
  949. numOfNodesNeeded = 0;
  950. m_doNotGenComp.append(buildSetName);
  951. m_compForTopology.remove("thor_roxie");
  952. if (!strcmp(buildSetName,"thor"))
  953. m_compForTopology.remove("thor");
  954. }
  955. if(numOfNodesNeeded == 0 || (m_doNotGenComp.find(buildSetName) != NotFound))
  956. {
  957. if(m_compForTopology.find(buildSetName) != NULL )
  958. m_compForTopology.remove(buildSetName);
  959. checkAndAddDependComponent(buildSetName);
  960. }
  961. }
  962. }
  963. }
  964. void CWizardInputs::checkAndAddDependComponent(const char* key)
  965. {
  966. StringBuffer paramEntry(key);
  967. paramEntry.append("_dependencies");
  968. if(m_algProp)
  969. {
  970. if(m_algProp->hasProp(paramEntry.str()))
  971. {
  972. StringArray sArray;
  973. sArray.appendList(m_algProp->queryProp(paramEntry.str()), ";");
  974. ForEachItemIn(x, sArray)
  975. {
  976. if(m_doNotGenComp.find(sArray.item(x)) == NotFound)
  977. {
  978. m_doNotGenComp.append(sArray.item(x));
  979. checkAndAddDependComponent(sArray.item(x));
  980. }
  981. }
  982. }
  983. }
  984. }
  985. unsigned CWizardInputs::getNumOfNodes(const char* compName)
  986. {
  987. if(m_compIpMap.find(compName) != NULL)
  988. {
  989. CInstDetails* pInst = NULL;
  990. pInst = m_compIpMap.getValue(compName);
  991. StringArray& ipArr = pInst->getIpAssigned();
  992. return ipArr.ordinality();
  993. }
  994. return 0;
  995. }
  996. void CWizardInputs::setTopologyParam()
  997. {
  998. if(m_clusterForTopology.ordinality() > 0)
  999. {
  1000. StringBuffer topologySec;
  1001. ForEachItemIn(x, m_clusterForTopology)
  1002. {
  1003. topologySec.clear().appendf("%s_topology",m_clusterForTopology.item(x));
  1004. const char * elemForCluster = m_algProp->queryProp(topologySec.str());
  1005. if(elemForCluster && *elemForCluster)
  1006. {
  1007. StringArray* compClusterArr = new StringArray();
  1008. StringArray clusterElemArr;
  1009. clusterElemArr.appendList(elemForCluster, ",");
  1010. ForEachItemIn(y, clusterElemArr)
  1011. compClusterArr->append(clusterElemArr.item(y));
  1012. m_compForTopology.setValue(m_clusterForTopology.item(x),compClusterArr);
  1013. }
  1014. }
  1015. }
  1016. }
  1017. void CWizardInputs::addComponentToSoftware(IPropertyTree* pNewEnvTree, IPropertyTree* pBuildSet)
  1018. {
  1019. if (!pBuildSet)
  1020. return;
  1021. StringBuffer xpath, sbNewName;
  1022. StringBuffer buildSetPath, compName, assignedIP, sbl;
  1023. const char* buildSetName = pBuildSet->queryProp(XML_ATTR_NAME);
  1024. const char* xsdFileName = pBuildSet->queryProp(XML_ATTR_SCHEMA);
  1025. const char* processName = pBuildSet->queryProp(XML_ATTR_PROCESS_NAME);
  1026. StringBuffer deployable = pBuildSet->queryProp("@" TAG_DEPLOYABLE);
  1027. unsigned numOfIpNeeded = 1;
  1028. if (m_doNotGenComp.find(buildSetName) != NotFound )
  1029. return;
  1030. if (processName && *processName && buildSetName && * buildSetName && xsdFileName && *xsdFileName)
  1031. {
  1032. Owned<IPropertyTree> pSchema = loadSchema(m_buildSetTree->queryPropTree("./" XML_TAG_PROGRAMS "/" XML_TAG_BUILD "[1]"), pBuildSet, buildSetPath, NULL);
  1033. IPropertyTree* pCompTree = generateTreeFromXsd(pNewEnvTree, pSchema, processName, buildSetName, m_cfg, m_service.str(), false);
  1034. sbNewName.clear();
  1035. if (strstr(buildSetName ,"my") == NULL && (strcmp(buildSetName, "topology") != 0))
  1036. sbNewName.append("my");
  1037. addComponentToEnv(pNewEnvTree, buildSetName, sbNewName, pCompTree);
  1038. if (!strcmp(processName, XML_TAG_ESPSERVICE) || !strcmp(processName, XML_TAG_PLUGINPROCESS))
  1039. processName = buildSetName;
  1040. if (strcmp(deployable,"no") != 0)
  1041. {
  1042. if (m_compOnAllNodes.find(buildSetName) != NotFound)
  1043. {
  1044. for (unsigned i = 0; i < m_ipaddressSupport.ordinality(); i++)
  1045. {
  1046. sbl.clear().appendf("s").append(i+1);
  1047. assignedIP.clear().append(m_ipaddressSupport.item(i));
  1048. addInstanceToTree(pNewEnvTree, assignedIP, processName, buildSetName,sbl.str());
  1049. }
  1050. for (unsigned i = 0; i < m_ipaddress.ordinality(); i++)
  1051. {
  1052. sbl.clear().appendf("s").append(m_ipaddressSupport.ordinality() + i+1);
  1053. assignedIP.clear().append(m_ipaddress.item(i));
  1054. addInstanceToTree(pNewEnvTree, assignedIP, processName, buildSetName,sbl.str());
  1055. }
  1056. int nCount = 1;
  1057. for (unsigned i = 0; i < m_arrBuildSetsWithAssignedIPs.ordinality(); i++)
  1058. {
  1059. const StringArray &strIPList = getIpAddrMap(m_arrBuildSetsWithAssignedIPs.item(i));
  1060. for (unsigned i2 = 0; i2 < strIPList.ordinality(); i2++)
  1061. {
  1062. sbl.set("s").append(m_ipaddress.ordinality() + m_ipaddressSupport.ordinality() + nCount++);
  1063. assignedIP.set(strIPList.item(i2));
  1064. addInstanceToTree(pNewEnvTree, assignedIP, processName, buildSetName,sbl.str());
  1065. }
  1066. }
  1067. }
  1068. else if (numOfIpNeeded > 0)
  1069. {
  1070. if (!strcmp(buildSetName, "roxie"))
  1071. numOfIpNeeded = m_roxieNodes;
  1072. else if (!strcmp(buildSetName, "thor"))
  1073. numOfIpNeeded = m_thorNodes + 1;
  1074. else if (!strcmp(buildSetName, "esp"))
  1075. numOfIpNeeded = m_espNodes;
  1076. CInstDetails* pInstDetail = getServerIPMap(sbNewName.str(), buildSetName, pNewEnvTree, numOfIpNeeded);
  1077. if (pInstDetail)
  1078. {
  1079. if (!strcmp(buildSetName, "roxie") || !strcmp(buildSetName, "thor" ))
  1080. {
  1081. addRoxieThorClusterToEnv(pNewEnvTree, pInstDetail, buildSetName);
  1082. if (!strcmp(buildSetName, "roxie") && m_roxieOnDemand)
  1083. addRoxieThorClusterToEnv(pNewEnvTree, pInstDetail, buildSetName, true);
  1084. }
  1085. else
  1086. {
  1087. StringArray& ipArr = pInstDetail->getIpAssigned();
  1088. ForEachItemIn(x, ipArr)
  1089. {
  1090. assignedIP.clear().append(ipArr.item(x));
  1091. if (!strcmp(buildSetName, "esp"))
  1092. {
  1093. StringBuffer s1("s_1");
  1094. const char *pName = getUniqueName2(pNewEnvTree, s1, XML_TAG_ESPPROCESS, "");
  1095. addInstanceToTree(pNewEnvTree, assignedIP, processName, buildSetName, pName);
  1096. }
  1097. else
  1098. addInstanceToTree(pNewEnvTree, assignedIP, processName, buildSetName, "s1");
  1099. }
  1100. }
  1101. }
  1102. }
  1103. }
  1104. }
  1105. }
  1106. StringArray& CWizardInputs::getIpAddrMap(const char* buildSetName)
  1107. {
  1108. if (buildSetName && *buildSetName)
  1109. {
  1110. for (int i = 0; i < m_arrBuildSetsWithAssignedIPs.ordinality(); i++)
  1111. {
  1112. if (stricmp(buildSetName, m_arrBuildSetsWithAssignedIPs.item(i)) == 0)
  1113. {
  1114. m_sipaddress.clear();
  1115. formIPList(m_arrAssignedIPs.item(i), m_sipaddress);
  1116. return m_sipaddress;
  1117. }
  1118. }
  1119. }
  1120. if (m_supportNodes == 0)
  1121. return m_ipaddress;
  1122. else
  1123. {
  1124. if (!strcmp(buildSetName, "roxie") || !strcmp(buildSetName, "thor" ))
  1125. return m_ipaddress;
  1126. }
  1127. return m_ipaddressSupport;
  1128. }