AMGA APIs usage
(Java, C++)
Antonio Calanducci
antonio.calanducci@ct.infn.it
INFN Catania
EGEE NA3 Training & Dissemination
II Corso di formazione INFN su aspetti pratici
dell’integrazione di applicazioni in Grid
ICTP, Trieste 01-12 Dicembre 2008
www.ccr.infn.it
II Corso integrazione applicazioni Grid @ ICTP, 1-12 Dec 2008
http://grid.infn.it/
Contents
• Java APIs usage, examples and
references
• C++ APIs usage, examples and references
www.ccr.infn.it
II Corso integrazione applicazioni Grid @ ICTP, 1-12 Dec 2008
http://grid.infn.it/
Java APIs requirements
• Java APIs are “pure” Java: can be used to any platform
(Linux, Windows, Mac OS X)
• Requirements:
– AMGA APIs jar: glite-amga-api-java-v1.30.jar
Download @ http://amga.web.cern.ch/amga/downloads/glite-amgaapi-java-v1.30.jar
– A Bouncy Castle Provider jar compatible with your Java SDK
release (bcprov-jdk1x-yyy.jar)
Download @ http://www.bouncycastle.org/latest_releases.html
– Java SDK >= 1.5
Download @: http://java.sun.com/javase/downloads/
– Javadoc API documentation @:
http://amga.web.cern.ch/amga/java/index.html
www.ccr.infn.it
II Corso integrazione applicazioni Grid @ ICTP, 1-12 Dec 2008
http://grid.infn.it/
Java API usage
• Java APIs can be used in two ways:
– Sending the commands directly to the server using the low-level
API:
arda.md.javaclient.MDServerConnection
It does not understand the semantics of the commands and does not
parse server response into suitable structures
But better control on the connection to the server (you can easily abort
a query for example)
– High-level interface (that in turn uses the low level one) exposed by
arda.md.javaclient.MDClient class
Provide suitable structures to handle server response
Not all the commands are implemented (use direct connection instead)
• A higher level OO framework has been developed that
implement several OO Design Patterns (not covered here).
More info@: http://amga.web.cern.ch/amga/api_java13.html
www.ccr.infn.it
II Corso integrazione applicazioni Grid @ ICTP, 1-12 Dec 2008
http://grid.infn.it/
Low level API:
MDServerConnection
import java.io.IOException;
import arda.md.javaclient.*;
public class DirectAMGA {
public static void main(String[] args) throws IOException
{
// Loads default configuration from mdclientjava.config and connects to server
MDServerConnection serverConn = new MDServerConnection(
MDServerConnectionContext.loadDefaultConfiguration());
try {
serverConn.execute("pwd");
while (!serverConn.eot()) {
String row = serverConn.fetchRow();
System.out.println(">" + row);
}
} catch (CommandException e) {
System.out.println("Error executing command: " + e.getMessage());
}
}
}
www.ccr.infn.it
II Corso integrazione applicazioni Grid @ ICTP, 1-12 Dec 2008
http://grid.infn.it/
High level API:
arda.md.javaclient.MDClient #1
import arda.md.javaclient.*;
import java.util.Iterator;
public class MDJavaAPI {
public static String TEST_DIR = "/gilda/tony/dir1";
public static void main(String[] args) throws Exception {
/*Alternative configuration, using mdjavaclient.config file:
MDServerConnectionContext mdConContext =
MDServerConnectionContext.loadDefaultConfiguration());
*/
//setting MDServerConnectionContext
MDServerConnectionContext mdConContext = new MDServerConnectionContext();
mdConContext.setHost("amga.grid.box");
mdConContext.setPort(8833);
mdConContext.setCurrentDir("/");
mdConContext.setGroupMask("rwx");
mdConContext.setPermissionMask("rwx");
mdConContext.setLogin("NULL");
mdConContext.setUseSSL(true);
mdConContext.setAuthMode(MDServerConnectionContext.AUTH_GRIDPROXY);
mdConContext.setGridProxyFile("/tmp/x509up_u503");
www.ccr.infn.it
II Corso integrazione applicazioni Grid @ ICTP, 1-12 Dec 2008
http://grid.infn.it/
High level API:
arda.md.javaclient.MDClient #2
MDServerConnection serverConn = new MDServerConnection(mdConContext);
MDClient mdClient = new MDClient(serverConn);
System.out.println("Listing attribues of " + TEST_DIR);
try {
AttributeDefList attrs = mdClient.listAttr(TEST_DIR);
Iterator<AttributeDef> it = attrs.iterator();
System.out.println("Result: ");
while(it.hasNext())
{
AttributeDef att = it.next();
System.out.println(" >" + att.getName() + ":" + att.getType());
}
} catch(CommandException e) {
System.out.println("Error: " + e.getMessage());
}
www.ccr.infn.it
II Corso integrazione applicazioni Grid @ ICTP, 1-12 Dec 2008
http://grid.infn.it/
High level API:
arda.md.javaclient.MDClient #3
System.out.println("Getting comment and id attributes of " + TEST_DIR);
try {
String[] keys = {"remark", "id"};
AttributeSetList col = mdClient.getAttr(TEST_DIR, keys);
Iterator<AttributeSet> attrs = col.iterator();
while(attrs.hasNext()) {
AttributeSet set = attrs.next();
System.out.println("File: " + set.getEntry());
String[] keys1 = set.getKeys();
for(int i = 0; i < keys1.length; i++) {
System.out.println(" >" + keys1[i] + "=" +
set.getValue(keys1[i]));
}
}
} catch(CommandException e) {
System.out.println("Error: " + e.getMessage());
}
}
}
www.ccr.infn.it
II Corso integrazione applicazioni Grid @ ICTP, 1-12 Dec 2008
http://grid.infn.it/
Compile and run the examples
• Set up the CLASSPATH properly:
– export CLASSPATH=$HOME/glite-amga-api-java-v1.30.jar:/opt/
d-cache/srm/lib/security/bcprov-jdk15-133.jar:.
• Set up properly mdjavaclient.config (if you use
loadDefaultConfiguration()):
–
–
–
–
–
–
Host = amga.grid.box
Port = 8833
Login = NULL
AuthMode = GridProxy
GridProxyFile=/tmp/x509up_u501
UseSSL = 1
• Compile and run the code:
– javac MDJavaAPI.java
– java MDJavaAPI
www.ccr.infn.it
II Corso integrazione applicazioni Grid @ ICTP, 1-12 Dec 2008
http://grid.infn.it/
mdjavacli and mdjavaclient
• Java versions of the mdcli/mdclient CLI tools are
available and distributed with the previous Java AMGA
release.
– Download them at:
http://amga.web.cern.ch/amga/downloads/ardamd-apijava-1.2.6RC1.tar.gz
– Set up properly the mdjavaclient.config (as in the previous slide)
– Use the wrapper bash script (mdjavacli.sh and mdjavaclient.sh)
to set up automatically the CLASSPATH and launch the main
classes
– AMGA Java API homepage:
http://amga.web.cern.ch/amga/api_java13.html
www.ccr.infn.it
II Corso integrazione applicazioni Grid @ ICTP, 1-12 Dec 2008
http://grid.infn.it/
C++ APIs requirements
• C++ API are available on the same platformd AMGA CLI
RPMs are available (currently SLC 3/4)
• To build and run you have to be sure the following are
installed in you system:
[desktop18] /opt/glite/lib > ls
-rw-r--r-- 1 root root 776204
-rwxr-xr-x 1 root root
864
lrwxrwxrwx 1 root root
20
libMDClient.so.0.0.0
lrwxrwxrwx 1 root root
20
-> libMDClient.so.0.0.0
-rwxr-xr-x 1 root root 1867114
0.0.0
-la /opt/glite/lib/libMDClient.*
19 nov 20:49 /opt/glite/lib/libMDClient.a
19 nov 20:49 /opt/glite/lib/libMDClient.la
19 nov 21:45 /opt/glite/lib/libMDClient.so ->
19 nov 21:45 /opt/glite/lib/libMDClient.so.0
19 nov 20:49 /opt/glite/lib/libMDClient.so.
• Header files are here:
/opt/glite/include/AMGAService.h
/opt/glite/include/MDClient.h
/opt/glite/include/md_api.h
www.ccr.infn.it
II Corso integrazione applicazioni Grid @ ICTP, 1-12 Dec 2008
http://grid.infn.it/
C++ available APIs
• As Java APIs, they can be used in two ways:
– a low level API that sends direct commands to the server
using MDClient.h
Documentation available at:
• http://project-arda-dev.web.cern.ch/project-arda-dev/metadata/
md__api_8cc.html
– a high level API that parse and provides suitable structures to
contain results
using md_api.h
Documentation available at:
• http://project-arda-dev.web.cern.ch/project-arda-dev/metadata/
classMDClient.html
• C++ API homepage:
– http://amga.web.cern.ch/amga/api_cpp.html
www.ccr.infn.it
II Corso integrazione applicazioni Grid @ ICTP, 1-12 Dec 2008
http://grid.infn.it/
MDClient.h usage
#include <MDClient.h>
#include <iostream>
int main (int argc, char *argv[])
{
int res;
MDClient client;
// client.setDebug(true);
if(client.connectToServer()){
std::cout << client.getError() << std::endl;
return 5;
}
std::string command="pwd";
if( ( res=client.execute(command)) ){
std::cout << " ERROR: execute failed"
<< "
(" << res << "): "
<< client.getError() << std::endl;
return res;
}
www.ccr.infn.it
II Corso integrazione applicazioni Grid @ ICTP, 1-12 Dec 2008
http://grid.infn.it/
MDClient.h usage
while(!client.eot()) {
std::string row;
if(res=client.fetchRow(row)){
std::cout << "Error fetching: " << res << std::endl;
return res;
}
std::cout << row << std::endl;
}
return 0;
}
www.ccr.infn.it
II Corso integrazione applicazioni Grid @ ICTP, 1-12 Dec 2008
http://grid.infn.it/
md_api.h usage
#include "md_api.h"
#include <iostream>
int main (int argc, char *argv[])
{
int res;
std::cout << "Listing attributes of /gilda/tony/dir1\n";
std::list< std::string > attrList;
std::list< std::string > types;
if( (res=listAttr("/gilda/tony/dir1", attrList, types)) == 0){
std::cout << " Result:" << std::endl;
std::list< std::string >::iterator I=attrList.begin();
while(I != attrList.end())
std::cout << " >" << (*I++) << "<" << std::endl;
} else {
std::cout << " Error: " << res << std::endl;
}
www.ccr.infn.it
II Corso integrazione applicazioni Grid @ ICTP, 1-12 Dec 2008
http://grid.infn.it/
md_api.h usage #2
std::cout << "Getting id and comment attributes of /gilda/tony/dir1\n";
AttributeList attributeList(2);
std::list< std::string > attributes;
attributes.push_back("id");
attributes.push_back("comment");
if( (res=getAttr("/gilda/tony/dir1/", attributes, attributeList)) == 0){
std::cout << " Result:" << std::endl;
while(!attributeList.lastRow()){
std::vector< std::string > attrs;
std::string filename;
attributeList.getRow(filename, attrs);
std::cout << "File: >" << filename << "<" << std::endl;
for(size_t i=0; i< attrs.size(); i++)
std::cout << " >" << attrs[i] << "<" << std::endl;
std::cout << std::endl;
}
} else {
std::cout << " Error: " << res << std::endl;
}
www.ccr.infn.it
II Corso integrazione applicazioni Grid @ ICTP, 1-12 Dec 2008
http://grid.infn.it/
Compile and run the example
• Include header file and library directories at compile
time:
– g++ -m32 -I/opt/glite/include/ -L/opt/glite/lib -lMDClient
direct.cpp -o direct
• Set up properly LD_LIBRARY_PATH to find
libMDClient.*
– export LD_LIBRARY_PATH=/opt/glite/lib:
$LD_LIBRARY_PATH
• You don’t need to set any special AMGA configuration
file. It tries the ones of mdcli/mdclient in the following
order:
– $PWD/mdclient.config
– $HOME/.mdclient.config
– /etc/mdclient.config
www.ccr.infn.it
II Corso integrazione applicazioni Grid @ ICTP, 1-12 Dec 2008
http://grid.infn.it/
Questions…
www.ccr.infn.it
II Corso integrazione applicazioni Grid @ ICTP, 1-12 Dec 2008
http://grid.infn.it/