Propriétés du Document Source du Document SDK_accords.odt Titre du Document SDK Python et Java pour le développement de services ACCORD Module(s) PyaccordsSDK, JaccordsSDK Responsable Prologue Auteur(s) / contributeur(s) Elyès ZEKRI & Hamid MEDJAHED du Document Annexe de Livrable V2.0 Validé par Date de la validation Résumé Ce document présente la procédure d'ajout d'un composant (fournisseur de service) à la plateforme ACCORDS. Mots Clefs Fournisseur de service, composant, OCCI, ACCORDS, python, java COMPATIBLE ONE 12/06/2012 1(9)
Table des Matières 1. Introduction...3 2. Pré-requis...3 3. Procédure d'ajout d'un composant ACCORDS... 3 a) Principe... 3 b) Installation... 4 c) Gestion des catégories OCCI... 4 d) Création d'un composant ACCORDS... 6 4. Références...9 COMPATIBLE ONE 12/06/2012 2(9)
1.Introduction Ce document s'adresse aux développeurs souhaitant mettre en œuvre un composant (fournisseur de services) ACCORDS [1][2] en python ou en java. D'un point de vue technique, un composant ACCORDS est susceptible d'être implémenté dans n'importe quel langage de programmation du moment que les deux conditions suivantes sont vérifiées: 1)Le composant doit être en mesure de gérer les messages du standard OCCI/REST [4][5] [6] 2)Une connaissance à priori de l'architecture et des fonctionnalités ACCORDS est nécessaire (Resolver, Publisher...) Afin d'aider le développeur dans sa démarche de création d'un composant en python ou en java, nous proposons une procédure générique et paramétrable dont l'objectif est de générer un programme java ou un script python décrivant le comportement du module. 2.Pré-requis Afin d'ajouter un nouveau composant CompatibleOne, il est nécessaire de disposer du noyau de la plateforme ACCORDS organisé autour des interfaces OCCI et CORDS, des outils de manipulation de données (xml,...), ainsi que des composants de base de la plateforme ACCORDS (publisher, coss...). Ces éléments sont décrits dans les livrables [1] et [1]. Les sources de la plateforme ACCORDS et la procédure d'installation sont accessibles par l'intermédiaire du lien donné par [3]. 3.Procédure d'ajout d'un composant ACCORDS Dans ce qui suit, seront décrites les étapes qui mèneront à la génération d'un composant ACCORDS sur la base de la définition d'un ensemble de catégories OCCI qui lui seront associées. a)principe Le principe de cette procédure consiste à faire appel à des fonctions génériques compilées sous forme de bibliothèques partagées pour le paramétrage d'un module ainsi que pour sa création. Les bibliothèque «pycompmanager.so» et «libjcompmgr.so» contiennent les fonctions de gestion des composants ACCORDS respectivement en langage python et java. Les bibliothèque «pycompdev.so» et «libjcompdev.so» contiennent les fonctions et les types respectivement python et java permettant le développement d'un module : structures de données représentant les catégories, fonction de lancement d'un module. Ces bibliothèques résultent d'un interfaçage avec des fonctions de gestion des composants codées en C. Cet interfaçage est réalisé par l'intermédiaire de l'api Python/C pour python et JNI pour Java. COMPATIBLE ONE 12/06/2012 3(9)
b)installation Pour pyaccordssdk : Pour générer les bibliothèques «pycompmanager.so» et «pycompdev.so» il faut lancer le script «pyaccords_config.sh». $./pyaccords_config.sh Pour jaccordssdk : Il faut préparer l environnement java en renseignant la variable JAVA_HOME avec le chemin du JDK. Pour générer la bibliothèque «libjcompmgr.so» et «libjompdev.so»il faut taper les commandes suivantes. $ cd jaccordssdk/jcompmgr $ make $ cd jaccordssdk/jcompdev $ make c)gestion des catégories OCCI Une catégorie est une entité OCCI permettant d'organiser sémantiquement les ressources. Elle est caractérisée principalement par un ensemble d'attributs et par une liste d'actions [4]. Dans pyaccordssdk et jaccordssdk, nous proposons deux fonctions permettant de générer une nouvelle catégorie ou de supprimer une catégorie existante : generatecategory : Cette fonction permet de générer les fichiers sources liés à la catégorie et de les placer au niveau des sous-répertoires du projet ACCORDS. Ces fichiers sont : Les fichiers C placés dans les sous répertoires «occi/src» et «cords/src» contenant : les fonctions d'accès OCCI de base : POST, GET, PUT et les fonctions de gestion de la mémoire spécifiques à la catégorie créée. Les fichiers Python ou java permettant l'interfaçage avec les fichiers C précédents. Parmi ces fichiers, ceux qui nous intéressent le plus sont les fichiers «categoryinterface.py» et «categoryaction.py» se trouvant dans le sousrépertoire «pyaccords» pour pyaccordssdk et «categoryinterface.java» et «categoryaction.java» se trouvant dans le sous-répertoire «jaccords» pour jaccordssdk. Ces fichiers contiennent respectivement la définition des méthodes d'accès CRUD (Create, Retrieve, Update, Delete) et les définition des actions (méthodes) qui auront été associées à la catégorie lors de sa génération. Ce sont ces fichiers qui sont censés être modifiés par le développeur. generatecategory(catname, catatr, catact, occiflag) Takes five parameters : - catname: Category name - catatr: Attributes of the category (exp: "atr1 atr2 atr2") - catact: Actions of the category (exp: "act1 act2 act3") COMPATIBLE ONE 12/06/2012 4(9)
- occiflag : Takes one of the foolowing value - "" nothing to specify - "_OCCI_PRIORITY" the service is to be offered first - "_OCCI_PRIVATE" the service is not to be published - "_OCCI_SECRET" the will not appear in categories - "_OCCI_AUTO_PUBLISH" the service will be auto publish - "_OCCI_SECURE" each access must be secure - "_OCCI_NO_PRICING" inhibit category pricing - "_OCCI_NO_AUTHORIZE" inhibit category authorize failure - "_OCCI_CONSUMER" publish monitoring consumer - "_OCCI_PROVIDER" publish resources provider - "_OCCI_CONTRACT" publish resources under contract removecategory : cette fonction permet de supprimer une catégorie existante en supprimant ses fichiers sources générés au niveau du répertoire du projet ACCORDS. removecategory(catname) Takes one parameters - catname: Category name à l'issue des opérations de génération/suppression de catégorie et afin que : 1) les bibliothèques ACCORDS soient mises à jour et 2) la bibliothèque «pycompdev.so» soit compilée, Pour pyaccordssdk il faut faire appel à la fonction «commit()» qui va procéder à la recompilation. En ce qui concerne jaccordssdk il faut recompiler la manuellement plateforme Accords : $ cd accords-platform $ make clean $ make $ make install Exemple : Voici l'exemple d'un script Pyhton permettant de créer une catégorie «mycategory» contenant deux attributs «atr1» et «atr2» et les actions «act1» et «act2»: >>>import pycompmanager >>>pycompmanager.generatecategory ( mycategory, attrbute1 attribute2, act1 act2, "_OCCI_PROVIDER") >>>pycompmanager.commit() Voici l'exemple d'un programme java permettant de créer une catégorie «mycategory» contenant deux attributs «atr1» et «atr2» et les actions «act1» et «act2» COMPATIBLE ONE 12/06/2012 5(9)
public class Testjcompmgr{ static{ System.loadLibrary("JcompMgr"); catch( UnsatisfiedLinkError e){ System.out.println("Could not load library, add it to LD_LIBRARY_PATH?"); System.exit(1); public static void main(string[] argv){ JcompMgr gen = new JcompMgr(); gen.generatecategory("mycategory","atr1 atr2","act1 act2", "_OCCI_PROVIDER"); Pour compiler et lancer cet exemple on utilise les commandes suivantes : $ export LD_LIBRARY_PATH=/path/to/jaccordsSDK/jcompmgr/ $ export CLASSPATH=.:/path/to/jaccordsSDK/jcompmgr/ $ javac Testjcompmgr.java $ java Testjcompmgr d)création d'un composant ACCORDS Les composants, tels qu'il sont implémentés dans ACCORDS, ont tous le même comportement de base, à savoir: 1) Parser les paramètres passés en argument (fichier de configuration, nom de l'agent associé au composant,...) 2) Charger les données de configuration (adresse du composant, adresse du publisher,...) 3) Publier les catégories au niveau du publisher Afin de générer un composant Python ou Java mettant en œuvre ce comportement de base, il faut faire appel à la fonction «generatecomponent» : generatecomponent(mname, catname) Takes two parameters - mname: module name - catname: List of category (exp "cat1 cat2 cat3") Le résultat de l'appel de cette fonction est un fichier généré dans un sous-répertoire portant le même nom que le composant. Exemple: Voici l'exemple d'un script python permettant de générer un module qui gère les catégories «mycategory» et «mycategory1» COMPATIBLE ONE 12/06/2012 6(9)
>>>import pycompmanager >>>pycompmanager.generatecomponent( mymodule, mycategory mycategory1 ) À l'issu de cette manipulation un fichier Python mymodule.py généré dans le sousrépertoire mymodule L'équivalent java est : public class Testjcompmgr{ static{ try{ System.loadLibrary("JcompMgr"); catch( UnsatisfiedLinkError e){ System.out.println("Could not load library, add it to LD_LIBRARY_PATH?"); System.exit(1); public static void main(string[] argv){ JcompMgr gen = new JcompMgr(); gen.generatecomponent("mymodule","mycategory mycategory1"); Le résultat de ce programme est la génération d'un fichier java mymodule.java dans le sous-répertoire mymodule. Pour utiliser le nouveaux composant créé qu'il soit généré par pyaccordssdk ou pyaccordssdk Il faut ajouter les configurations appropriées au niveau des fichier accords.xml et cords_user.xml [1]. Si le mode sécurisé est activé il faut générer les certificats de sécurité pour ce nouveau module avec le script suivant (où $1 représente le nom de module) : module=$1 export bits=2048 export days=365 export sslconfig=./openssl.cnf echo "<tls key='security/"${module"privatekey.pem'" > security/${moduletls.xml echo " certificate='security/"${module"certificate.pem'" >> security/${moduletls.xml COMPATIBLE ONE 12/06/2012 7(9)
echo " passphrase='"accords"'" >> security/${moduletls.xml echo " authority='"certificates.crt"'" >> security/${moduletls.xml echo " authenticate='"1"'" >> security/${moduletls.xml echo " option='"13"' />" >> security/${moduletls.xml chmod 0640 security/${moduletls.xml echo "Creating certificate for module $1" if test! -e $sslconfig; then echo "Can not find openssl config file: $sslconfig" exit 1 fi if [ -z "$nethsm" ]; then openssl req -config $sslconfig \ -newkey $bits -x509 -days $days -sha1 \ -keyout security/${moduleprivatekey.pem -out security/$ {modulecertificate.pem 2> /dev/null else openssl req -engine pkcs11 -keyform e -config $sslconfig \ -newkey $bits -x509 -days $days -sha1 \ -keyout security/${moduleprivatekey.pem -out security/$ {modulecertificate.pem fi chmod 0400 security/${moduleprivatekey.pem chmod 0444 security/${modulecertificate.pem e)lancement d'un composant ACCORDS Pour pyaccordssdk : Pour lancer le module python généré par pyaccordssdk, taper la commande suivante : $ python mymodule.py --config accords.xml CO-MY-AGENT/1.0 Pour JaccordsSDK : Afin d'utiliser le nouveau module il faut compiler la librairie «libjcompdev.so» $ cd jaccordssdk/jcompdev $ make et enfin compiler le module généré avec les commandes suivantes : $ export LD_LIBRARY_PATH=/path/to/jaccordsSDK/jcompdev/ $ export CLASSPATH=.:/path/to/jaccordsSDK/jcompdev/ $ javac mymodule.java Pour lancer le module on utilise le script suivant : COMPATIBLE ONE 12/06/2012 8(9)
CURRDIR=`dirname $0` export LD_LIBRARY_PATH=$CURRDIR/../jaccordsSDK/jcompdev/;pwd :/usr/local/lib/ export CLASSPATH=$CURRDIR/../<moduleName>/:$CURRDIR/../jaccordsSDK/: $CURRDIR/../jaccordsSDK/jcompdev/:$CURRDIR/../jaccords/:$CURRDIR/../jaccords/jsrc/ java -Djava.library.path="$LD_LIBRARY_PATH" -cp $CLASSPATH JmyModule mymodule --config accords.xml CO-EXPMODULE/1.0 4.Références [1] L01.3 (ACCORDS) Spécifications finales Distribution des ressources (Architecture, API, protocoles) [2] L17.2 (CORDS) - Modèle de description des ressources (CORDS),Spécifications et Documentation XSD. [3] Accords Platform at OW2 : http://gitorious.ow2.org/ow2-compatibleone/accords-platform [4] Open Cloud Computing Interface - Core http://www.ogf.org/documents/gfd.183.pdf [5] Open Cloud Computing Interface - Infrastructure http://www.ogf.org/documents/gfd.183.pdf [6] Open Cloud Computing Interface Http Binding http://www.ogf.org/documents/gfd.183.pdf COMPATIBLE ONE 12/06/2012 9(9)