def __init__(self, serviceName=None, opalURL="http://webservices.rbvi.ucsf.edu/opal/services/", sessionData=None): from AppService_client import AppServiceLocator from AppService_client import getAppMetadataRequest self.busy = False self.appLocator = AppServiceLocator() if sessionData: self.serviceURL, self.jobID, self.status = sessionData try: from cPickle import loads except ImportError: from pickle import loads else: self.serviceURL = opalURL + serviceName self.jobID = None self.status = None self.appServicePort = self.appLocator.getAppServicePort( self.serviceURL) if not sessionData: req = getAppMetadataRequest() resp = self.appServicePort.getAppMetadata(req)
else: if proto == "https": # example of ssl invocation appServicePort = appLocator.getAppServicePort( baseURL + "opal2/services/cat", ssl=1, transdict={'cert_file': cert, 'key_file': key}, transport=httplib.HTTPSConnection) print "setting cert to: " + cert else: print "Unknown protocol: ", proto sys.exit(1) # Make remote invocation to get application metadata print "Getting Application Metadata" req = getAppMetadataRequest() resp = appServicePort.getAppMetadata(req) print "Usage:", resp._usage # Set up remote job launch req = launchJobRequest() req._argList = "-ipdb benzene.pdb -h -opdb output.pdb" inputFiles = [] inputFile = ns0.InputFileType_Def('inputFile') inputFile._name ='benzene.pdb' sampleFile = open("./etc/benzene.pdb", "r") sampleFileString = sampleFile.read() sampleFile.close() inputFile._contents = sampleFileString inputFiles.append(inputFile) req._inputFile = inputFiles
def getServiceMetadata(self): """ """ req = getAppMetadataRequest() resp = self.appServicePort.getAppMetadata(req) return resp
def initialize(): global _modules if configuration.check('urlList'): urlList = configuration.urlList.split(";") else: return module_descs = [] opal_url = urlList[0] if not opal_url: print "ERROR: No Opal URL provided" return services = [] for opal_url in urlList: if opal_url.find("/opal2") != -1: service_list_url = opal_url + "/opalServices.xml" opener = urllib.FancyURLopener({}) socket = opener.open(service_list_url) text = socket.read() feed = xml.dom.minidom.parseString(text) for entry in feed.getElementsByTagName('entry'): link = entry.getElementsByTagName('link')[0] service = link.getAttribute('href') services.append(str(service)) else: print "ERROR: No opal2 contained in URL" return for url in services: namespace = os.path.dirname(os.path.dirname(url)) servername = urlparse.urlparse(url)[1] servername = servername.replace('.','_') servername = servername.split(':')[0] node_name = os.path.basename(url) + '_' + servername appLocator = AppServiceLocator() appServicePort = appLocator.getAppServicePort(url) req = getAppMetadataRequest() metadata = appServicePort.getAppMetadata(req) if url == 'http://ws.nbcr.net/opal2/services/Pdb2pqrOpalService': print "------------------------\n" print metadata print "------------------------\n" ip_list = [] pdesc_dic = {} try: separator = metadata._types._taggedParams._separator if separator == None: separator = " " except AttributeError: separator = " " try: rawlist = metadata._types._flags._flag for i in rawlist: pdesc_dic[str(i._id)] = str(i._textDesc) meta = {'url': url, 'type': 'FLAG', 'file': False, 'arg': str(i._tag), 'default': None, 'adv': True} if i._default and str(i._default) == 'True': meta['default'] = 'True' ip_list.append((str(i._id), "basic:Boolean", {"defaults": str([str('True')]), "labels": str([str(i._textDesc)]), "optional": True}, meta)) else: ip_list.append((str(i._id), "basic:Boolean", {"labels": str([str(i._textDesc)]), "optional": True}, meta)) except AttributeError: flaglist = [] try: rawlist = metadata._types._taggedParams._param for i in rawlist: #print "TAGID is " + str(i._tag) meta = {'url': url, 'type': 'TAGGED', 'file': False, 'default': None, 'adv': True} meta['arg'] = str(i._tag) + str(separator) pdesc_dic[str(i._id)] = str(i._textDesc) tagged_object = getTaggedParam(metadata, str(i._id)) if (tagged_object._paramType == 'FILE') and (tagged_object._ioType == 'INPUT'): meta['file'] = True if i._default: meta['default'] = str(i._default) ip_list.append((str(i._id), "basic:File", {"defaults": str([str(i._default)]), "labels": str([str(i._textDesc)]), "optional": True}, meta)) else: ip_list.append((str(i._id), "basic:File", {"labels": str([str(i._textDesc)]), "optional": True}, meta)) else: meta['file'] = False if i._default: meta['default'] = str(i._default) ip_list.append((str(i._id), "basic:String", {"defaults": str([str(i._default)]), "labels": str([str(i._textDesc)]), "optional": True}, meta)) else: ip_list.append((str(i._id), "basic:String", {"labels": str([str(i._textDesc)]), "optional": True}, meta)) except AttributeError: taglist = [] try: rawlist = metadata._types._untaggedParams._param #untaglist = [str(i._id) for i in rawlist] for i in rawlist: meta = {'url': url, 'type': 'UNTAGGED', 'file': False, 'default': None, 'adv': True} meta['arg'] = str(i._id) pdesc_dic[str(i._id)] = str(i._textDesc) untagged_object = getUntaggedParam(metadata, meta['arg']) if (untagged_object._paramType=='FILE') and (untagged_object._ioType=='INPUT'): meta['file'] = True ip_list.append((str(i._id), "basic:File", {"labels": str([str(i._textDesc)]), "optional": True}, meta)) else: if i._default: meta['default'] = str(i._default) ip_list.append((str(i._id), "basic:String", {"defaults": str([str(i._default)]), "labels": str([str(i._textDesc)]), "optional": True}, meta)) else: ip_list.append((str(i._id), "basic:String", {"labels": str([str(i._textDesc)]), "optional": True}, meta)) except AttributeError: untaglist = [] pdesc_keys = pdesc_dic.keys() pdesc_keys.sort() mod_doc = metadata._usage + "\n" mod_doc += "\n***************** Input Parameters ****************\n\n" for pk in pdesc_keys: mod_doc += pk + ": " + pdesc_dic[pk] + "\n" if ip_list == []: meta = {'url': url, 'type': 'simple', 'default': None, 'adv': False} ip_list.append(("commandLine", "basic:String", {"labels": str(["Command line arguments"]), "optional": True}, meta)) ip_list.append(("inFiles", "basic:List", {"labels": str(["Input file list"]), "optional": True}, meta)) ip_list.append(("numProcs", "basic:Integer", {"labels": str(["Number of processors"]), "optional": True}, meta)) def ws_compute(self): if self._port_list[0][3]['url'] != None: url = self._port_list[0][3]['url'] adv = self._port_list[0][3]['adv'] else: url = "" print "ERROR: There are no input arguments provided for this web service" cmdline = "" numProcs = None tagged = [] untagged = [] flags = [] files = [] for i in self._port_list: pn = i[0] meta = i[3] if ((self.hasInputFromPort(pn) and self.getInputFromPort(pn) != "") or meta['default'] != None) and adv == True: # print "META" # print meta if meta['type'] == 'FLAG': if self.hasInputFromPort(pn): if self.getInputFromPort(pn) == True: flags.append(meta['arg']) elif meta['default'] == 'True': flags.append(meta['arg']) elif meta['type'] == 'TAGGED': if self.hasInputFromPort(pn): val = self.getInputFromPort(pn) elif meta['default'] != None: val = meta['default'] if meta['file'] == True: file_an = core.modules.basic_modules.File.translate_to_string(val) file_bn = os.path.basename(file_an) tagged.append(meta['arg'] + file_bn) files.append(file_an) else: tagged.append(meta['arg'] + val) elif meta['type'] == 'UNTAGGED': if self.hasInputFromPort(pn): val = self.getInputFromPort(pn) elif meta['default'] != None: val = meta['default'] if meta['file'] == True: file_an = core.modules.basic_modules.File.translate_to_string(val) file_bn = os.path.basename(file_an) untagged.append(file_bn) files.append(file_an) else: untagged.append(val) cmdline = "" for i in flags: cmdline += i + " " for i in tagged: cmdline += i + " " for i in untagged: cmdline += i + " " inputFiles = [] for i in files: inputFile = ns0.InputFileType_Def('inputFile') inputFile._name = os.path.basename(i) inputFile._attachment = open(i, "r") inputFiles.append(inputFile) if cmdline == "": if self.hasInputFromPort('commandLine'): cmdline = self.getInputFromPort('commandLine') if self.hasInputFromPort('numProcs'): numProcs = self.getInputFromPort('numProcs') if self.hasInputFromPort("inFiles"): inFilesPath = self.getInputFromPort("inFiles") if inFilesPath != None: for i in inFilesPath: inputFile = ns0.InputFileType_Def('inputFile') inputFile._name = os.path.basename(i) inputFile._attachment = open(i, "r") inputFiles.append(inputFile) print os.path.basename(url) + " from " + os.path.dirname(url) + " is going to run with arguments:\n " + cmdline appLocator = AppServiceLocator() appServicePort = appLocator.getAppServicePort(url) req = launchJobRequest() req._argList = cmdline req._inputFile = inputFiles if numProcs != None: req._numProcs = numProcs resp = appServicePort.launchJob(req) self.jobID = resp._jobID print "Job outputs URL: " + resp._status._baseURL # urlparse.urljoin(url, '/' + self.jobID) status = resp._status._code while (status != 4 and status != 8): status = appServicePort.queryStatus(queryStatusRequest(self.jobID))._code time.sleep(5) if (status == 8): resp = appServicePort.getOutputs(getOutputsRequest(self.jobID)) outurls = [str(resp._stdOut), str(resp._stdErr)] if (resp._outputFile != None): for i in resp._outputFile: outurls.append(str(i._url)) print "Opal job completed successfully" else: print "ERROR: Opal job failed" resp = appServicePort.getOutputs(getOutputsRequest(self.jobID)) outurls = [str(resp._stdOut), str(resp._stdErr)] self.setResult("outurls", tuple(outurls)) module_descs.append((node_name, {"_inputs": get_ports(ip_list), "_outputs": [("outurls", "basic:List")], "_doc": mod_doc, "namespace": namespace}, {"compute": ws_compute, "_port_list": ip_list, })) # if configuration.use_b: _modules = build_modules(module_descs)
def execApbs(vars=None, argv=None): """ Executes APBS and regulates checking of job status and retrieval of data if job is successfully completed. """ if argv is None: # i.e. if it is a local run argv = sys.argv webRun = False else: webRun = True custom_service_url = None if vars != None: if vars.has_key('service_url'): custom_service_url = vars['service_url'] vars = initRemoteVars(argv) if custom_service_url != None: vars['service_url'] = custom_service_url global service_url #*argument parser # command-line arguments vars['inFile'] = argv[-1] # parses input file if(vars['inFile'].find("/")==-1): directory="" else: directory = os.path.dirname(vars['inFile'])+'/' vars['inFile'] = os.path.basename(vars['inFile']) nprocs = 1 if not vars.has_key('service_url'): # find out if it's sequential or parallel tempFile = open(directory+vars['inFile'], 'r') version_check_flag = True for line in tempFile: # remove whitespace line=line.strip() if(line[:5]=='pdime'): dimension_array = line.split() nprocs = int(dimension_array[1])*int(dimension_array[2])*int(dimension_array[3]) global parallel_service_url vars['service_url'] = parallel_service_url version_check_flag = False if(line[:5]=='async'): vars['service_url'] = service_url version_check_flag = True break if version_check_flag: vars['service_url'] = service_url tempFile.close() else: version_check_flag = True # Enable version checking for custom defined Opal service as well service_url = vars['service_url'] # Retrieve a reference to the AppServicePort #*this is also from the path to the service appServicePort = AppServiceLocator().getAppServicePort(vars['service_url']) # Set up remote job launch req = launchJobRequest() # Checks version compatibility (but currently only works for sequential calculations) if version_check_flag: opal_version = AppServicePortTypeSoapBindingSOAP(vars['service_url']).getAppMetadata(getAppMetadataRequest())._usage.split()[-1] if opal_version != local_version: stderr.write("WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! WARNING!\n") stderr.write("It appears that the remote server version of APBS (%s) does not match\nthe local version (%s)!\n" % (opal_version,local_version)) stderr.write("Proceed at your own risk!!\n") stderr.write("WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! WARNING!\n") if webRun: return False if(vars.has_key('argList')): vars['argList'] = vars['argList'] + " " + vars['inFile'] else: vars['argList']=vars['inFile'] req._argList = vars['argList'] req._numProcs = nprocs # append all input files in this manner - in this case we have two of them inputFiles = [] #*this is where apbs.in is read in inputFiles.append(ns0.InputFileType_Def('inputFile')) #*this must be the same as req._argList is defined to be inputFiles[-1]._name = vars['inFile'] tempFile = open(directory+vars['inFile'], 'r') inputFiles[-1]._contents = tempFile.read() tempFile.close() # this is where the rest of the files to read in are determined start = False tempFile = open(directory+vars['inFile'], 'r') for line in tempFile: # remove whitespace line=line.strip() if(line=="end"): break if(start and line.find("#")!=0): # eliminates lines with just comments # remove comment if(line.find("#")!=-1): line = line[:line.find("#")] # re-remove whitespace (left after comment removal) line=line.strip() # remove everything except file name count = -1 while line[count]!=' ': count = count-1 fileName=line[count+1:] inputFiles.append(ns0.InputFileType_Def('inputFile')) inputFiles[-1]._name=fileName tempFile2 = open(directory+fileName, "r") inputFiles[-1]._contents = tempFile2.read() tempFile2.close() if(line=="read"): start = True tempFile.close() # req's inputFile variable is the array of input files created in the lines directly above req._inputFile = inputFiles if vars['typeOfRun']=='remote': appServicePort.launchJob(req) return [appServicePort, appServicePort.launchJob(req)] # Launch job, and retrieve job ID print "Launching remote APBS job" try: resp = appServicePort.launchJob(req) except ZSI.FaultException, errstr: stderr.write("Error! Failed to execute Opal job. Please send the entire output to the APBS development team.\n") stderr.write("%s\n" % errstr.fault.AsSoap()) sys.exit(13)
def getServiceMetadata(self): """ return the XML appConfig used by this application """ req = getAppMetadataRequest() resp = self.appServicePort.getAppMetadata(req) return resp
def execApbs(vars=None, argv=None): """ Executes APBS and regulates checking of job status and retrieval of data if job is successfully completed. """ if argv is None: # i.e. if it is a local run argv = sys.argv webRun = False else: webRun = True custom_service_url = None if vars != None: if vars.has_key('service_url'): custom_service_url = vars['service_url'] vars = initRemoteVars(argv) if custom_service_url != None: vars['service_url'] = custom_service_url global service_url #*argument parser # command-line arguments vars['inFile'] = argv[-1] # parses input file if (vars['inFile'].find("/") == -1): directory = "" else: directory = os.path.dirname(vars['inFile']) + '/' vars['inFile'] = os.path.basename(vars['inFile']) nprocs = 1 if not vars.has_key('service_url'): # find out if it's sequential or parallel tempFile = open(directory + vars['inFile'], 'r') version_check_flag = True for line in tempFile: # remove whitespace line = line.strip() if (line[:5] == 'pdime'): dimension_array = line.split() nprocs = int(dimension_array[1]) * int( dimension_array[2]) * int(dimension_array[3]) global parallel_service_url vars['service_url'] = parallel_service_url version_check_flag = False if (line[:5] == 'async'): vars['service_url'] = service_url version_check_flag = True break if version_check_flag: vars['service_url'] = service_url tempFile.close() else: version_check_flag = True # Enable version checking for custom defined Opal service as well service_url = vars['service_url'] # Retrieve a reference to the AppServicePort #*this is also from the path to the service appServicePort = AppServiceLocator().getAppServicePort(vars['service_url']) # Set up remote job launch req = launchJobRequest() # Checks version compatibility (but currently only works for sequential calculations) if version_check_flag: opal_version = AppServicePortTypeSoapBindingSOAP( vars['service_url']).getAppMetadata( getAppMetadataRequest())._usage.split()[-1] if opal_version != local_version: stderr.write( "WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! WARNING!\n" ) stderr.write( "It appears that the remote server version of APBS (%s) does not match\nthe local version (%s)!\n" % (opal_version, local_version)) stderr.write("Proceed at your own risk!!\n") stderr.write( "WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! WARNING!\n" ) if webRun: return False if (vars.has_key('argList')): vars['argList'] = vars['argList'] + " " + vars['inFile'] else: vars['argList'] = vars['inFile'] req._argList = vars['argList'] req._numProcs = nprocs # append all input files in this manner - in this case we have two of them inputFiles = [] #*this is where apbs.in is read in inputFiles.append(ns0.InputFileType_Def('inputFile')) #*this must be the same as req._argList is defined to be inputFiles[-1]._name = vars['inFile'] tempFile = open(directory + vars['inFile'], 'r') inputFiles[-1]._contents = tempFile.read() tempFile.close() # this is where the rest of the files to read in are determined start = False tempFile = open(directory + vars['inFile'], 'r') for line in tempFile: # remove whitespace line = line.strip() if (line == "end"): break if (start and line.find("#") != 0): # eliminates lines with just comments # remove comment if (line.find("#") != -1): line = line[:line.find("#")] # re-remove whitespace (left after comment removal) line = line.strip() # remove everything except file name count = -1 while line[count] != ' ': count = count - 1 fileName = line[count + 1:] inputFiles.append(ns0.InputFileType_Def('inputFile')) inputFiles[-1]._name = fileName tempFile2 = open(directory + fileName, "r") inputFiles[-1]._contents = tempFile2.read() tempFile2.close() if (line == "read"): start = True tempFile.close() # req's inputFile variable is the array of input files created in the lines directly above req._inputFile = inputFiles if vars['typeOfRun'] == 'remote': appServicePort.launchJob(req) return [appServicePort, appServicePort.launchJob(req)] # Launch job, and retrieve job ID print "Launching remote APBS job" try: resp = appServicePort.launchJob(req) except ZSI.FaultException, errstr: stderr.write( "Error! Failed to execute Opal job. Please send the entire output to the APBS development team.\n" ) stderr.write("%s\n" % errstr.fault.AsSoap()) sys.exit(13)