/** Special case to launch a viz on Argonne's cluster * this will always render to multicast */ void Gridifier::launchArgonneViz(const LauncherConfig &config){ QProcess *launchArgonneVizProcess = new QProcess(QString("./argonneVis.sh")); launchArgonneVizProcess->setWorkingDirectory(mScriptsDir); launchArgonneVizProcess->addArgument(config.visualizationGSH.mEPR); launchArgonneVizProcess->addArgument(QString::number(config.mTimeToRun)); launchArgonneVizProcess->addArgument(config.multicastAddress); QString vizTypeStr = ""; if (config.vizType == isosurface){ vizTypeStr = "iso"; } else if (config.vizType == volumeRender){ vizTypeStr = "vol"; } if (config.vizType == hedgehog){ vizTypeStr = "hog"; } else if (config.vizType == cutPlane){ vizTypeStr = "cut"; } launchArgonneVizProcess->addArgument(vizTypeStr); cout << launchArgonneVizProcess->arguments().join(" ") << endl; launchArgonneVizProcess->start(); while (launchArgonneVizProcess->isRunning()){ usleep(10000); mApplication->processEvents(); } cout << "Stdout:" << endl << launchArgonneVizProcess->readStdout() << endl; if (launchArgonneVizProcess->canReadLineStderr()) cout << "Stderr:" << endl << launchArgonneVizProcess->readStderr() << endl; }
/** Method calls appropriate xxx_launch.sh script to * actually launch the visualization job on the target machine */ int Gridifier::launchVizScript(const QString &scriptConfigFileName, const LauncherConfig &config){ // Construct name of script from name of application QProcess *launchVizScriptProcess = new QProcess(QString("./"+config.mAppToLaunch->mAppName+"_launch.sh")); launchVizScriptProcess->setWorkingDirectory(mScriptsDir); launchVizScriptProcess->addArgument(scriptConfigFileName); launchVizScriptProcess->addArgument(QString::number(config.mTimeToRun)); launchVizScriptProcess->start(); while (launchVizScriptProcess->isRunning()){ usleep(10000); mApplication->processEvents(); } if (launchVizScriptProcess->canReadLineStdout()){ QString out(launchVizScriptProcess->readStdout()); cout << "Stdout:" << endl << out << endl; if(out.contains("ERROR")){ return REG_FAILURE; } } if (launchVizScriptProcess->canReadLineStderr()){ QString out(launchVizScriptProcess->readStderr()); cout << "Stderr:" << endl << out << endl; if(out.contains("ERROR")){ return REG_FAILURE; } } return REG_SUCCESS; }
/** Calls setServiceData on the specified service using the second argument as the basis for the argument to setServiceData. (The <ogsi:setByServiceDataNames> tags are added in this routine.) */ void Gridifier::setServiceData(const QString &nameSpace, const QString &gsh, const QString &sdeText){ QString arg("<ogsi:setByServiceDataNames>"); arg.append(sdeText); arg.append("</ogsi:setByServiceDataNames>"); QProcess *setServiceDataProcess = new QProcess(QString("./setServiceData.pl")); setServiceDataProcess->setWorkingDirectory(mScriptsDir); setServiceDataProcess->addArgument(nameSpace); setServiceDataProcess->addArgument(gsh); setServiceDataProcess->addArgument(arg); setServiceDataProcess->start(); while (setServiceDataProcess->isRunning()){ usleep(10000); mApplication->processEvents(); } if(setServiceDataProcess->canReadLineStdout()){ cout << "Stdout:" << endl << setServiceDataProcess->readStdout() << endl; } if (setServiceDataProcess->canReadLineStderr()){ cout << "Stderr:" << endl << setServiceDataProcess->readStderr() << endl; } }
/** * Method calls lb3d_client.pl script to call web service * to actually launch the job on the target machine */ void Gridifier::webServiceJobSubmit(const QString & scriptConfigFileName){ // Construct name of script from name of application QProcess *launchSimScriptProcess = new QProcess(QString("./lb3d_client.pl")); launchSimScriptProcess->setWorkingDirectory(mScriptsDir); launchSimScriptProcess->addArgument(scriptConfigFileName); launchSimScriptProcess->start(); while (launchSimScriptProcess->isRunning()){ usleep(10000); mApplication->processEvents(); } cout << "Stdout:" << endl << launchSimScriptProcess->readStdout() << endl; if (launchSimScriptProcess->canReadLineStderr()) cout << "Stderr:" << endl << launchSimScriptProcess->readStderr() << endl; }
/** Create a MetaSGS */ QString Gridifier::makeMetaSGS(const QString &factory, const LauncherConfig &config, const QString &parentGSH){ QString result; QProcess *makeSimSGSProcess = new QProcess(QString("./make_msgs.pl")); makeSimSGSProcess->setWorkingDirectory(mScriptsDir); makeSimSGSProcess->addArgument(factory); // the tag is handled correctly if it contains spaces - thanks QT! makeSimSGSProcess->addArgument(config.mJobData->toXML(QString("MetaSGS"))); makeSimSGSProcess->addArgument(config.topLevelRegistryGSH); makeSimSGSProcess->addArgument(config.currentCheckpointGSH); makeSimSGSProcess->addArgument(config.mInputFileName); makeSimSGSProcess->addArgument(QString::number(config.mTimeToRun)); makeSimSGSProcess->addArgument(parentGSH); if (config.treeTag.length() > 0){ makeSimSGSProcess->addArgument(config.treeTag); makeSimSGSProcess->addArgument(config.checkPointTreeFactoryGSH); } makeSimSGSProcess->start(); while(makeSimSGSProcess->isRunning()){ usleep(10000); mApplication->processEvents(); } // Grab the sgs and return it // Do some error checking here - or in the calling class? result = QString(makeSimSGSProcess->readStdout()).stripWhiteSpace(); cout << "Stdout:" << endl << result << endl; if (makeSimSGSProcess->canReadLineStderr()) cout << "Stderr:" << endl << makeSimSGSProcess->readStderr() << endl; return result; }
//--------------------------------------------------------------- QString Gridifier::makeVizSGS(const QString &factory, const LauncherConfig &config){ QString result; #ifndef REG_WSRF QProcess *makeVizSGSProcess = new QProcess(QString("./make_vis_sgs.pl")); makeVizSGSProcess->setWorkingDirectory(mScriptsDir); makeVizSGSProcess->addArgument(factory); makeVizSGSProcess->addArgument(config.mJobData->toXML(QString("SGS"))); makeVizSGSProcess->addArgument(config.topLevelRegistryGSH); makeVizSGSProcess->addArgument(config.simulationGSH.mEPR); makeVizSGSProcess->addArgument(QString::number(config.mTimeToRun)); makeVizSGSProcess->start(); while (makeVizSGSProcess->isRunning()){ usleep(10000); mApplication->processEvents(); } if(makeVizSGSProcess->canReadLineStdout()){ result = QString(makeVizSGSProcess->readStdout()); cout << "stdout: " << result << endl; } else{ cout << "Full line of stdout unavailable" << endl; } if(makeVizSGSProcess->canReadLineStderr()){ cout << "stderr: " << QString(makeVizSGSProcess->readStderr()) << endl; } else{ cout << "Full line of stderr unavailable" << endl; } result = QString(makeVizSGSProcess->readStdout()).stripWhiteSpace(); #else // REG_WSRF is defined char purpose[1024]; char proxyAddress[1024]; int proxyPort; char iodef_label[256]; char *ioTypes; struct soap mySoap; char *EPR; struct msg_struct *msg; xmlDocPtr doc; xmlNsPtr ns; xmlNodePtr cur; struct io_struct *ioPtr; int i, count; struct reg_job_details job; /* Obtain the IOTypes from the data source */ soap_init(&mySoap); if( Get_resource_property (&mySoap, config.simulationGSH.mEPR.ascii(), config.simulationGSH.mSecurity.userDN, config.simulationGSH.mSecurity.passphrase, "ioTypeDefinitions", &ioTypes) != REG_SUCCESS ){ cout << "Call to get ioTypeDefinitions ResourceProperty on "<< config.simulationGSH.mEPR << " failed" << endl; return result; } cout << "Got ioTypeDefinitions >>" << ioTypes << "<<" << endl; if( !(doc = xmlParseMemory(ioTypes, strlen(ioTypes))) || !(cur = xmlDocGetRootElement(doc)) ){ fprintf(stderr, "Hit error parsing buffer\n"); xmlFreeDoc(doc); xmlCleanupParser(); return result; } ns = xmlSearchNsByHref(doc, cur, (const xmlChar *) "http://www.realitygrid.org/xml/steering"); if ( xmlStrcmp(cur->name, (const xmlChar *) "ioTypeDefinitions") ){ cout << "ioTypeDefinitions not the root element" << endl; return result; } /* Step down to ReG_steer_message and then to IOType_defs */ cur = cur->xmlChildrenNode->xmlChildrenNode; msg = New_msg_struct(); msg->msg_type = IO_DEFS; msg->io_def = New_io_def_struct(); parseIOTypeDef(doc, ns, cur, msg->io_def); Print_msg(msg); if(!(ioPtr = msg->io_def->first_io) ){ fprintf(stderr, "Got no IOType definitions from data source\n"); return result; } i = 0; printf("Available IOTypes:\n"); while(ioPtr){ if( !xmlStrcmp(ioPtr->direction, (const xmlChar *)"OUT") ){ printf(" %d: %s\n", i++, (char *)ioPtr->label); } ioPtr = ioPtr->next; } count = i-1; /* printf("Enter IOType to use as data source (0-%d): ", count); while(1){ if(scanf("%d", &i) == 1)break; } printf("\n"); */ // ARPDBG - temporary hardwire to select first output IOType //i = 0; count = 0; ioPtr = msg->io_def->first_io; while(ioPtr){ if( !xmlStrcmp(ioPtr->direction, (const xmlChar *)"OUT") ){ //if(count == i){ ARPDBG - temporary hardwire to select first output IOType strncpy(iodef_label, (char *)(ioPtr->label), 256); break; //}ARPDBG count++; } ioPtr = ioPtr->next; } Delete_msg_struct(&msg); // Initialize job_details struct snprintf(job.userName, REG_MAX_STRING_LENGTH, config.mJobData->mPersonLaunching.ascii()); snprintf(job.group, REG_MAX_STRING_LENGTH, "RSS"); snprintf(job.software, REG_MAX_STRING_LENGTH, config.mJobData->mSoftwareDescription.ascii()); snprintf(job.purpose, REG_MAX_STRING_LENGTH, config.mJobData->mPurposeOfJob.ascii()); snprintf(job.inputFilename, REG_MAX_STRING_LENGTH, config.mInputFileName.ascii()); job.lifetimeMinutes = config.mTimeToRun; snprintf(job.passphrase, REG_MAX_STRING_LENGTH, config.simulationGSH.mSecurity.passphrase); snprintf(job.checkpointAddress, REG_MAX_STRING_LENGTH, config.currentCheckpointGSH.ascii()); // Now create SWS for the vis if( !(EPR = Create_steering_service(&job, factory.ascii(), config.topLevelRegistryGSH.ascii(), &(config.registrySecurity)) ) ){ cout << "FAILED to create SWS for " << config.mJobData->mSoftwareDescription << " :-(" << endl; soap_end(&mySoap); soap_done(&mySoap); return result; } // Finally, set it up with information on the data source // Check to see whether or not an ioProxy is being used if( Get_resource_property (&mySoap, config.simulationGSH.mEPR.ascii(), config.simulationGSH.mSecurity.userDN, config.simulationGSH.mSecurity.passphrase, "dataSink", &ioTypes) != REG_SUCCESS ){ cout << "Call to get dataSink ResourceProperty on "<< config.simulationGSH.mEPR << " failed" << endl; return result; } // <sws:dataSink xmlns:sws="http://www.sve.man.ac.uk/SWS"> // <Proxy> // <address>methuselah.mvc.mcc.ac.uk</address> // <port>50010</port> // </Proxy> // </sws:dataSink> cout << "ARPDBG: Got dataSink >>" << ioTypes << "<<" << endl; char *ptr, *ptr0, *ptr1; proxyPort = 0; proxyAddress[0] = '\0'; if( ptr0 = strstr(ioTypes, "<Proxy>") ){ // An ioProxy IS being used by the simulation ptr1 = NULL; ptr = strstr(ptr0, "<address"); if(ptr)ptr = strstr(ptr, ">"); if(ptr)ptr++; if(ptr)ptr1 = strstr(ptr, "</address>"); if(ptr1)*ptr1 = '\0'; if(ptr1)strncpy(proxyAddress, ptr, 1024); if(ptr1)*ptr1 = '<'; ptr = strstr(ptr0, "<port"); if(ptr)ptr = strstr(ptr, ">"); if(ptr)ptr++; if(ptr)ptr1 = strstr(ptr, "</port>"); if(ptr1)*ptr1 = '\0'; if(ptr1)proxyPort = atoi(ptr); int idx = snprintf(purpose, 1024, "<dataSink><Proxy><address>%s</address>" "<port>%d</port></Proxy></dataSink>", proxyAddress, proxyPort); snprintf(&(purpose[idx]), 1024, "<dataSource><Proxy><address>%s" "</address><port>%d</port></Proxy><sourceLabel>%s" "</sourceLabel></dataSource>", proxyAddress, proxyPort, iodef_label); } else{ snprintf(purpose, 1024, "<dataSource><sourceEPR>%s</sourceEPR>" "<sourceLabel>%s</sourceLabel></dataSource>", config.simulationGSH.mEPR.ascii(), iodef_label); } printf("Calling Set_resource_property with >>%s<<\n", purpose); if(Set_resource_property(&mySoap, EPR, config.simulationGSH.mSecurity.userDN, config.simulationGSH.mSecurity.passphrase, purpose) != REG_SUCCESS){ cout << "Set_resource_property failed:" << endl; soap_end(&mySoap); soap_done(&mySoap); return result; } result = QString(EPR); soap_end(&mySoap); soap_done(&mySoap); #endif // ndef REG_WSRF return result; }