예제 #1
0
	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)
예제 #2
0
    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)
예제 #3
0
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
예제 #4
0
 def getServiceMetadata(self):
     """ """
     req = getAppMetadataRequest()
     resp = self.appServicePort.getAppMetadata(req)
     return resp
예제 #5
0
파일: init.py 프로젝트: SinSiXX/opaltoolkit
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)
예제 #6
0
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)
예제 #7
0
 def getServiceMetadata(self):
     """ return the XML appConfig used by this application """
     req = getAppMetadataRequest()
     resp = self.appServicePort.getAppMetadata(req)
     return resp
예제 #8
0
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)