Practical using C++ WMProxy API advanced job submission Emidio Giorgio – [email protected] Primo Corso INFN per il Porting delle Applicazioni su Grid Martina Franca 14 November 2007 www.ccr.infn.it Martina Franca 14 Novembre 2007 http://grid.infn.it/ Scope • The practical exercises are to illustrate “how” – Not using typical jobs for running on a grid!! – But to show how EGEE grid services are used, jobs are submitted, output retrieved…and how they can be accessed from your own programs • We will use the Application Programming Interfaces on a “User Interface” (UI) machine – “UI” is your interface to the [GILDA] Grid Where your digital credentials are held Client tools and libraries are already installed www.ccr.infn.it Martina Franca214 Novembre 2007 http://grid.infn.it/ WMProxy • WMProxy (Workload Manager Proxy) – is a new service providing access to the gLite Workload Management System (WMS) functionality through a simple Web Services based interface. – has been designed to efficiently handle a large number of requests for job submission and control to the WMS – the service interface addresses the Web Services and SOA (Service Oriented Architecture) architecture standards – Beside the “classical” Command Line Interface has a complete set of API through which it can be accessed – APIs are available for Java, Python, C++ www.ccr.infn.it Martina Franca314 Novembre 2007 http://grid.infn.it/ API WMProxy usage overview • A small set of “external” (to gLite) libraries are needed in order to succesfully compile • Everything needed for compilation and execution can is provided in the attached tarball • Examples are just examples……you may need to do some of operations and checks that are normally done automatically from CLI • Not all the functions are implemented by the “official” API….has been necessary to add something…. • Wiki page – http://repository.gs.ba.infn.it/twiki/bin/view/GILDA/ WMProxyCPPAPI www.ccr.infn.it Martina Franca414 Novembre 2007 http://grid.infn.it/ New request types • • • • • Direct Acyclic Graphs of jobs (DAG): set of jobs where the input, output, or execution of one or more jobs depends on one or more other jobs Parametric Jobs: they have one or more parametric attributes in the JDL, whose values vary according to a parameter Job Collection : a set of independent jobs that for some reason (known to the user) have to be submitted, monitored and controlled as a single request JDL has been extended to allow specification of the input sandbox at the level of the compound request (i.e. DAGs, Collections and Parametric jobs) Input Sandbox can – Be shared among nodes of collection/DAG saving bandwidth use – Contain URI pointing to files on a remote gridFTP server www.ccr.infn.it Martina Franca514 Novembre 2007 http://grid.infn.it/ Introduction to the API WMP practical • You will: – Compile a C++ source code which queries WMS on available resources – Compile a C++ source code which submit a simple job (not compound) to the WMS • Download the tar ball exercise – http://repository.gs.ba.infn.it/twiki/pub/GILDA/WMProxyCPPAPI/ wmproxy-api-examples.tar.gz – uncompress it, enter the directory and just type make – check out executables with --help to see parameters GLITE_WMPROXY_ENDPOINT= https://wms1.gs.ba.infn.it:7443/glite_wms_wmproxy_server 6 www.ccr.infn.it Martina Franca 14 Novembre 2007 http://grid.infn.it/ WMS : References • WMS User's Guide – https://edms.cern.ch/file/572489/1/EGEE-JRA1-TEC-572489-WMSguide-v0-2.pdf • WM Proxy quick start – http://trinity.datamat.it/projects/EGEE/wiki/wiki.php? n=WMProxyClient.QuickStart • WM Proxy API documentation – http://trinity.datamat.it/projects/EGEE/wiki/wiki.php? n=WMProxyAPI.APIDocumentation • JDL Attributes Specification for WM Proxy – https://edms.cern.ch/file/590869/1/EGEE-JRA1-TEC-590869-JDLAttributes-v0-8.pdf 7 www.ccr.infn.it Martina Franca 14 Novembre 2007 http://grid.infn.it/ WMProxy Java API ver 3.1.0 thanks Giuseppe La ROCCA and Tony Calanducci for slides and examples Overview of the WMProxy Java API Software Requirements Class org.glite.wms.wmproxy.WMProxyAPI An use case www.ccr.infn.it Evento, Luogo, 8 Data odierna - http://grid.infn.it/ The WMProxy WMS front-end • The Workload Manager Proxy (WMProxy in short) is the service responsible to provide access to the WMS functionality through a Web Service Interface • The gLite WMProxy services can be either accessed directly through the published WSDL, the C++ command line interface, or the API • You can submit and control the following type of Jobs: – Job: a simple application – DAG: a direct acyclic graph of dependent jobs – Collection: a set of independent jobs www.ccr.infn.it Evento, Luogo, 9 Data odierna - http://grid.infn.it/ Installation guide API JAVA /2 • Axis (http://ws.apache.org/axis/) where the needed jars are: axis-ant.jar axis.jar jaxrpc.jar commons-discovery-0.2.jar commons-logging-1.0.4.jar log4j-1.2.8.jar log4j.properties saaj.jar wsdl4j-1.5.1.jar www.ccr.infn.it dcache-client-1.7.0-31.i586.rpm Evento, Luogo, 10 Data odierna - http://grid.infn.it/ Installation guide API JAVA /3 • BouncyCastle (http://www.bouncycastle.org/) where the needed jar is: bcprov-jdk14-122.jar glite-essentials-java-1.2.0-2_EGEE W A R N I N G Make sure all the listed jar(s) are included in your CLASSPATH environment variable !! 11 www.ccr.infn.it Evento, Luogo, Data odierna - http://grid.infn.it/ Installation guide API JAVA /4 • 2.) Install the following component(s) from the latest gLite release (http://glite.web.cern.ch/glite/ packages): glite-security-test-utils glite-security-util-java glite-security-delegation-java glite-security-trustmanager glite-wms-wmproxy-api-java www.ccr.infn.it Evento, Luogo, 12 Data odierna - http://grid.infn.it/ Software Requirements /1 • Verify that your User Interface (UI) or workstation contains the following rpm package(s): glite-wms-wmproxy-api-java-3.1.1-1_N20061202.noarch.rpm glite-wms-ui-api-java-3.1.1-1_N20061202.i386.rpm glite-security-util-java-1.3.8-1_N20061202.noarch.rpm glite-security-trustmanager-1.8.8-1_N20061202.noarch.rpm glite-security-delegation-java-1.4.1-1_N20061202.noarch.rpm glite-jdl-api-java-3.1.3-1_N20061202.i386.rpm • If these rpm package(s) are not installed you can downloaded them from this web page http://lxb2071.cern.ch:8080/etics/index.jsp www.ccr.infn.it Evento, Luogo, 13 Data odierna - http://grid.infn.it/ WMProxy Java APIs tarball • WMProxy Java APIs are pure Java APIs – They can be used from any platform where a Java Virtual Machine is available and the needer JARs files are found – You need a proxy anyway – You can download a tarball with all the req jars at: • https://grid.ct.infn.it/twiki/bin/viewfile/GILDA/ApiJavaWMProxy? rev=1;filename=WMProxy-api-JARS.tar.gz export CLASSPATH=glite-wms-ui-api-java.jar:cryptix32.jar:cryptixasn1.jar:puretls.jar:classad.jar:bcprovjdk14-122.jar:saaj.jar:commons-logging-1.1.jar:glite-wmswmproxy-api-java.jar:axis.jar:axis-ant.jar:commonsdiscovery-0.2.jar:glite-security-delegation-java.jar:glite-securitytrustmanager.jar:glite-security-utiljava.jar:jaxrpc.jar:log4j-1.2.8.jar:wsdl4j-1.5.1.jar:glite-jdl-apijava.jar:cog-jglobus.jar:glite-wms-wmproxy-api-java.jar:. www.ccr.infn.it Evento, Luogo, Data odierna - http://grid.infn.it/ org.glite.wms.wmproxy.WMProxyAPI • The main Java class of this Java API is: org.glite.wms.wmproxy.WMProxyAPI; • The class WMProxyAPI provides a set of methods that allow : – – – – – – – – delegating the credential ; registering and submitting jobs ; cancelling the job during its life-cycle ; retrieving information on the location where the job input sandbox files can be stored ; retrieving the output sandbox files list ; retrieving a list of possible matching Computer Elements ; getting JDL templates ; getting information on the user disk quota on the server . www.ccr.infn.it Evento, Luogo, Data odierna - http://grid.infn.it/ WMProxyAPI constructors • A client object can be created using one of these following constructor(s): public WMProxyAPI(String url, String proxyFile) public WMProxyAPI(String url, String proxyFile, String certsPath) where: – url: the WMProxy server URL to be contacted (e.g. https://<host>:<port>glite_wms_wmproxy_server); – proxyFile: the pathname to a valid user proxy; for the default value (/tmp/x509up_u<UID>) – certPath: the path of a local CA directory www.ccr.infn.it Evento, Luogo, Data odierna - http://grid.infn.it/ org.glite.wms.wmproxy.WMProxyAPI Therefore, using one of the constructors WMProxyAPI Client = new WMProxyAPI( … ); allow the creation of a new instance. This instance will be used to invoke any other WMProxy methods. For example: WMProxyAPI Client = new WMProxyAPI( https:// trinity.datamat.it:7443/glite_wms_wmproxy_server, “/x509up_u504”); // replace with your WMProxy endpoint jobIDs = Client.jobSubmit(jdlString, delegationID); www.ccr.infn.it Evento, Luogo, 17 Data odierna - http://grid.infn.it/ org.glite.wms.wmproxy.WMProxyAPI • In case of failure, one of the following exceptions is thrown: org.glite.wms.wmproxy.AuthenticationFaultType org.glite.wms.wmproxy.JobUnknownFaultType org.glite.wms.wmproxy.InvalidArgumentFaultType org.glite.wms.wmproxy.NoSuitableResourcesFaultType org.glite.wms.wmproxy.GetQuotaManagementFaultType org.glite.wms.wmproxy.ProxyFileException org.glite.wms.wmproxy.GrstDelegationException org.glite.wms.wmproxy.GenericFaultType org.gridsite.www.namespaces.delegation_1.DelegationExceptionType www.ccr.infn.it Evento, Luogo, 18 Data odierna - http://grid.infn.it/ JDL Basic Requirement • The JDL to be matched must contains some mandatory Requirements and Rank attributes; – when using command line interface these are added by default by the UI, but in our case user has to take care to check if his/her JDL file contains them: Requirements = (other.GlueCEStateStatus == "Production"); Rank = (-other.GlueCEStateEstimatedResponseTime); www.ccr.infn.it Evento, Luogo, 19 Data odierna - http://grid.infn.it/ Delegation of user credential • Before calling submission or list match services, client proxy credentials are requested to be transferred from the client to the server through a delegation process. • The following Java code performs this delegation process : String delegationId = “larocca”; WMProxyAPI client = new WMProxyAPI wmproxy_url,user_proxy,CAcertsPath); /*Get a proxy identified by the delegationID String*/ proxy = client.grstGetProxyReq (delegationId); /* Allows delegating user’s credential to the WMProxy */ client.grstPutProxy(delegationId, proxy); The obtained delegation identifier can be reused for several calls to the WMProxy server; www.ccr.infn.it Evento, Luogo, 20 Data odierna - http://grid.infn.it/ Difference between submission and registration /1 • Submission of simple jobs, DAGs, collections and parametric jobs to the WMProxy service requires as input a job description file in which job characteristics and requirements are expressed by means of Condor class-ad-like expressions. • In this description the users can specify some files that are needed by the submitted jobs during the execution on the remote Worker Node. These files are listed in the JDL InputSandbox attribute specifying for each of them the complete URI of its location. • If the job does NOT have any file in the InputSandbox to be transferred from the submitting machine to the WMProxy node, the submission can be performed a calling the jobSubmit method: jobIds = client.jobSubmit(jdlString, delegationId); www.ccr.infn.it Evento, Luogo, 21 Data odierna - http://grid.infn.it/ Difference between submission and registration /2 Otherwise, these following steps are needed: • a preliminary server registration: jobId = client.jobRegister(jdlString, delegationId); • transfer of files listed in the InputSandbox from the client machine to the WMS node; • call the jobStart method to trigger the submission: client.jobStart(jobId); www.ccr.infn.it Evento, Luogo, 22 Data odierna - http://grid.infn.it/ Difference between submission and registration /2 Otherwise, these following steps are needed: • a preliminary server registration: jobId = client.jobRegister(jdlString, delegationId); • transfer of files listed in the InputSandbox from the client machine to the WMS node; • call the jobStart method to trigger the submission: client.jobStart(jobId); www.ccr.infn.it Evento, Luogo, 22 Data odierna - http://grid.infn.it/ Software Requirements /3 • In order to allow grid user to invoke, within Java code, the UrlCopy class to copy files from the WMS Server to the UI and vice versa the following Java package is requested cog-jglobus-1.4-bin.tar.gz The above package, with all the needed documentation, can be downloaded from this web page http://dev.globus.org/wiki/CoG_JGlobus_1.4 www.ccr.infn.it Evento, Luogo, 23 Data odierna - http://grid.infn.it/ for (int index = 0; index < InputSandboxFiles.length; index++) { String toURL = front + “2811” + rear; toURL = toURL + "/" + InputSandboxFiles[index]; fromURL = "file:///" + InputSandboxFiles[index]; Specify the Destination and Source URL(s) try { GlobusURL from = new GlobusURL(fromURL); GlobusURL to = new GlobusURL(toURL); Copy file(s) from the UI to the Resource Broker UrlCopy uCopy = new UrlCopy(); uCopy.setDestinationUrl(to); uCopy.setSourceUrl(from); uCopy.setUseThirdPartyCopy(true); uCopy.copy(); } catch (Exception e) {System.err.println(e.getMessage());} } The script, thanks to the UrlCopy Class, performs the copy of the InputSandbox files to the reduced path of the WMS as you can see: [root@glite-rb2 root]# cd /var/glite/SandboxDir/XA/ [root@glite-rb2 root]# ll https_3a_2f_2fglite-rb2.ct.infn.it_3a9000_2fXAoY7FZgLJgC4U9grsBw/input/ www.ccr.infn.it Evento, Luogo, 24 Data odierna - http://grid.infn.it/ org.glite.wms.wmproxy.WMProxyAPI • In the following tarball: https://grid.ct.infn.it/twiki/bin/viewfile/GILDA/ApiJavaWMProxy? rev=1;filename=WMProxy-api-JARS.tar.gz • two examples are available (thanks again to Giuseppe La Rocca): – WMProxyGetProxyAndSubmit Create delegation, transfer InputSandBox files, submit the job – WMProxyGetOutputAndPurge Get OutputSandbox and Purge it • To set the CLASSPATH properly, use source setcp.sh www.ccr.infn.it Evento, Luogo, Data odierna - http://grid.infn.it/ Submit a new request to WMProxy /1 [larocca@glite-tutor:~/API]$ java WMProxyGetProxyAndSubmit WMProxyGetProxyAndSubmit.java "A simple client to interact with the WMProxy Server." Author: Giuseppe La Rocca ([email protected]) I.N.F.N. - Sez. of Catania - ITALY Via S.Sofia, 64 - 95123 Catania Phone: +39.095.378.53.74 Usage : java WMProxyGetProxyAndSubmit -h[elp] java WMProxyGetProxyAndSubmit <user_proxy> <delegation_id> <wmproxy_server> <InputSandboxFiles> <jdl_file> <CAcertsPath> [CAs paths (optional)] where: <user_proxy> ... the file containing the user's credentials <delegation_id> ... the string used to save the user's delegation <wmproxy_server> ... the entry point of the WMProxy Server to contact (e.g. : https://glite-rb3.ct.infn.it:7443/glite_wms_wmproxy_server <InputSandboxFiles> ... The list of file(s) to transfer to the WMProxy Server <jdl_file> ... the jdl file to submit to the grid <CAcertsPath> ... the path location of the directory containing all the Certificate Authorities files www.ccr.infn.it Evento, Luogo, 26 Data odierna - http://grid.infn.it/ Retrieve output file(s) When the job finishes you can retrieve the output file(s) as follow: [larocca@glite-tutor:~/API]$ java WMProxyGetOutputAndPurge Usage : java WMProxyGetOutputAndPurge -h[elp] java WMProxyGetOutputAndPurge <user_proxy> <wmproxy_server> <jobId> <dirPath> <CAcertsPath> [CAs paths (optional)] +------------------------------------------------------------------------+ WMProxy URL = [https://glite-rb2.ct.infn.it:7443/glite_wms_wmproxy_server] proxyFile = [/tmp/x509up_u512] JobID = [https://glite-rb2.ct.infn.it:9000/XAoY7FZgLJjgCp4U9grsBw] dirPath = [/home/larocca/API/] CA certs = [/etc/grid-security/certificates/] +------------------------------------------------------------------------+ Start downloading output file(s).. file n. 1 -------------------------------------------name = [gsiftp://glite-rb2.ct.infn.it:2811/var/glite/SandboxDir/XA/https_3a_2f_2fgliterb2.ct.infn.it_3a9000_2fXAoY7FZgLJjgCp4U9grsBw/output/hostname.err] size = [0] List of file(s) retrieved from to the Resource Broker to the user’s account file n. 2 -------------------------------------------name = [gsiftp://glite-rb2.ct.infn.it:2811/var/glite/SandboxDir/XA/https_3a_2f_2fgliterb2.ct.infn.it_3a9000_2fXAoY7FZgLJjgCp4U9grsBw/output/hostname.out] size = [28] www.ccr.infn.it Evento, Luogo, 27 Data odierna - http://grid.infn.it/ Monitoring jobs status • Job status information are not accessible via WMProxy services • They are registered into the Logging and Bookkeeping (LB) server. • Another set of APIs is available to interact with the LB (Java/C++/Python) – Python/Java ones are wrapper around the C++ native libraries, so those APIs are not portable (works on SLC UI) – but the WSDL is available, so users can generate their own code starting from those. www.ccr.infn.it Evento, Luogo, Data odierna - http://grid.infn.it/ LB Java APIs • The ones needed by WMProxy, plus: – glite-wms-ui-api-java.jar (org.glite.wmsui.apij.*) • Javadoc is available here: – http://egee-jra1-wm.mi.infn.it/egee-jra1-wm/api_doc/ wmsui_apijava/index.html www.ccr.infn.it Evento, Luogo, Data odierna - http://grid.infn.it/ JobStatus example import org.glite.wmsui.apij.*; public class JobStatus { public static void main(String[] args) throws Exception { try{ String jid = args[0] ; JobId jobid = new JobId(jid); Job job = new Job(jobid); Result res = job.getStatus(false) ; System.out.println(res.toString()); }catch(UnsupportedOperationException exc){ ........ }catch(java.io.FileNotFoundException exc){ }catch(org.globus.gsi.GlobusCredentialException exc) { }catch(Exception exc){ } } } www.ccr.infn.it Evento, Luogo, Data odierna - http://grid.infn.it/ References • API Documentation http://trinity.datamat.it/projects/EGEE/wiki/apidoc/3.1/ htmljava/index.html • Datamat – WMProxy quickstart http://trinity.datamat.it/projects/EGEE/wiki/wiki.php? n=WMProxyClient.QuickStart • JDL Attributes guide for WMProxy https://edms.cern.ch/document/590869/1 • WMProxy user guide https://edms.cern.ch/document/674643/1 www.ccr.infn.it Evento, Luogo, 31 Data odierna - http://grid.infn.it/