<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>MilamberSpace - JMeter &#187; Contrôleur Pour chaque</title>
	<atom:link href="http://blog.milamberspace.net/index.php/tag/controleur-pour-chaque/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.milamberspace.net</link>
	<description>Apache JMeter (surtout) mais aussi GNU/Linux, OpenSource, l&#039;Informatique, etc.</description>
	<lastBuildDate>Sun, 05 Feb 2012 09:51:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Charger un serveur LDAP depuis une base de données avec JMeter</title>
		<link>http://blog.milamberspace.net/index.php/2009/07/30/charger-un-serveur-ldap-depuis-une-base-de-donnees-avec-jmeter-468.html</link>
		<comments>http://blog.milamberspace.net/index.php/2009/07/30/charger-un-serveur-ldap-depuis-une-base-de-donnees-avec-jmeter-468.html#comments</comments>
		<pubDate>Thu, 30 Jul 2009 07:58:41 +0000</pubDate>
		<dc:creator>Milamber</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[JMeter]]></category>
		<category><![CDATA[Test fonctionnel]]></category>
		<category><![CDATA[Contrôleur Pour chaque]]></category>
		<category><![CDATA[JDBC]]></category>
		<category><![CDATA[LDAP]]></category>

		<guid isPermaLink="false">http://blog.milamberspace.net/?p=468</guid>
		<description><![CDATA[Voici un tutoriel pour réaliser un script JMeter qui va lire dans une base de données (ici MySQL) via JDBC, une table d&#8217;utilisateurs (nom et prénom), puis se connecter sur un serveur LDAP (ici openLDAP) afin d&#8217;ajouter chaque utilisateur dans le LDAP. Ce tutoriel a pour objectifs : Rappeler l&#8217;utilisation de Requête JDBC pour accéder [...]]]></description>
			<content:encoded><![CDATA[<p>Voici un tutoriel pour réaliser un script JMeter qui va lire dans une base de données (ici MySQL) via JDBC, une table d&#8217;utilisateurs (nom et prénom), puis se connecter sur un serveur LDAP (ici openLDAP) afin d&#8217;ajouter chaque utilisateur dans le LDAP.</p>
<p><span style="text-decoration: underline;">Ce tutoriel a pour objectifs :</span></p>
<ol>
<li> Rappeler l&#8217;utilisation de <strong>Requête JDBC</strong> pour accéder à une base de données, et récupérer dans un ensemble de variables les résultats de requête JDBC</li>
<li> Montrer comment effectuer l&#8217;ajout d&#8217;une fiche Utilisateur dans un serveur LDAP via une <strong>Requête LDAP étendue</strong> de JMeter</li>
<li> Montrer le fonctionnement du <strong>Contrôleur Pour chaque </strong>dans JMeter</li>
<li> Montrer un petit exemple de <strong>Pré-Processeur BeanShell</strong></li>
</ol>
<p>Voici le plan de de test final.</p>
<p style="text-align: center;"><img class="aligncenter" style="border: 1px solid black;" title="Plan de test LDAP / Base avec JMeter" src="/wp-content/images/jmeter21-img-ldap/jmeter-ldap01.png" alt="" width="347" height="377" /></p>
<p><span id="more-468"></span><span style="text-decoration: underline;">On observe deux sections :</span></p>
<ol>
<li><strong>Base de données : </strong>qui est un <strong>Contrôleur Simple</strong> regroupant les éléments nécessaires à la partie JDBC afin d&#8217;accéder à la base et faire la requête SQL qui va permettre de récupérer les utilisateurs à créer.</li>
<li><strong>LDAP : </strong>qui est aussi un<strong> Contrôleur Simple</strong> regroupant les éléments permettant la connexion au serveur LDAP et effectuer la requête d&#8217;ajout dans le LDAP des utilisateurs.</li>
</ol>
<p>Concernant la partie Base de données, je vous revois vers <a href="http://blog.milamberspace.net/index.php/2009/06/12/jmeter-utilisation-de-lelement-jdbc-comme-source-de-donnees-pour-un-test-de-charge-partie-1-311.html">ce billet</a> pour avoir plus de détails sur sa mise en place. Ci-dessous, je vais seulement commenter certains éléments de cette partie.</p>
<p>L&#8217;élément <strong>Requête JDBC</strong> correspond à la requête SQL que JMeter va effectuer pour obtenir une liste de noms et de prénoms qui seront utilisés dans la section LDAP.</p>
<ul>
<li> Le champ <em>Nom de liaison</em> fait référence au &#8216;pool&#8217; JDBC configuré dans l&#8217;élément <strong>Configuration de connexion JDBC</strong></li>
<li> Le type de requête est <em>Select Statement, </em>on fait donc une requête SQL commençant par SELECT :
<ul>
<li> <em>SELECT ID, NOM, PRENOM from BOXERS</em></li>
</ul>
</li>
<li> Dans le champ N<em>oms des variables</em>, on donne les variables (JMeter) qui vont recevoir les données. Pour nous, cela sera <em>VAR_ID, VAR_NOM, VAR_PRENOM</em>.</li>
</ul>
<p style="text-align: center;"><img class="aligncenter" style="border: 1px solid black;" title="Requête JDBC" src="/wp-content/images/jmeter21-img-ldap/jmeter-ldap03.png" alt="" width="473" height="342" /></p>
<p style="text-align: left;">A l&#8217;exécution, la requête SQL retournera une liste de noms et les placera dans les variables correspondantes, avec un suffixe <strong>_X</strong> où <em>X</em> est le numéro de la ligne retournée.</p>
<p style="text-align: center;"><img class="aligncenter" style="border: 1px solid black;" title="Requête JDBC" src="/wp-content/images/jmeter21-img-ldap/jmeter-ldap02.png" alt="" width="627" height="457" /></p>
<p>Pour la section suivante, LDAP, on utilisera donc ces variables pour faire l&#8217;ajout dans le LDAP.</p>
<p>Ainsi voici la partie LDAP : le premier élément est une <strong>Requête LDAP étendue</strong> qui va permettre de faire la connexion avec le serveur LDAP.</p>
<p style="text-align: center;"><img class="aligncenter" style="border: 1px solid black;" title="Conexion LDAP avec JMeter" src="/wp-content/images/jmeter21-img-ldap/jmeter-ldap10.png" alt="" width="640" height="357" /></p>
<p>Pour cela, on choisi le type de test « <em>Unité liée </em>», et on complète les différents champs nécessaires :</p>
<ul>
<li> <strong>Nom du serveur</strong> (ou adresse IP)</li>
<li> <strong>Port</strong> <strong>:</strong> 389 (correspondant au port par défaut pour le protocole ldap)</li>
<li> <strong>DN :</strong> nom du suffixe de l&#8217;annuaire</li>
<li> <strong>Identifiant</strong> <strong>:</strong> un compte disposant des droits pour modifier l&#8217;annuaire (ici c&#8217;est l&#8217;administrateur LDAP)</li>
<li> <strong>Mot de passe</strong> associé au compte ci-dessus</li>
<li> <strong>Délai d&#8217;attente de connexion :</strong> paramètre optionnel qui permet de faire échouer l&#8217;échantillon (de connexion) si jamais la connexion n&#8217;est pas ouverte</li>
<li> La case à cocher permet de faire une connexion via le protocole LDAPS (via SSL donc) <em>(accompagné par le port 636 en général)</em></li>
</ul>
<p>Ensuite, on en profite pour faire l&#8217;opération inverse de la connexion : la Déconnexion. Pour cela, on choisit tout simplement le type de test « <em>Délier les unités</em> ». Cette requête sera placée en fin du scénario.</p>
<p style="text-align: center;"><img class="aligncenter" style="border: 1px solid black;" title="Déconnexion LDAP avec JMeter" src="/wp-content/images/jmeter21-img-ldap/jmeter-ldap11.png" alt="" width="641" height="180" /></p>
<p>Passons aux éléments qui vont nous permettre d&#8217;ajouter les fiches annuaires dans le LDAP.</p>
<p style="text-align: center;"><img class="aligncenter" style="border: 1px solid black;" title="Contrôleur Pour chaque (foreach) JMeter" src="/wp-content/images/jmeter21-img-ldap/jmeter-ldap12.png" alt="" width="342" height="162" /></p>
<p>Le contrôleur ci-dessus, <strong>Pour chaque </strong>va tout simplement <em>(efficacement je dirais)</em>, parcourir une à une les variables <em>VAR_NOM_x </em>où <em>x</em> est le numéro de ligne des résultats de la requête SQL précédente. À chaque itération, il va affecter à la variable <em>NOM</em> la valeur de <em>VAR_NOM_x</em>. <em>(on notera la correspondance entre VAR_NOM de la requête JDBC Select et le VAR_NOM_x du contrôleur)</em></p>
<p style="text-align: center;"><img class="aligncenter" style="border: 1px solid black;" title="Compteur JMeter" src="/wp-content/images/jmeter21-img-ldap/jmeter-ldap13.png" alt="" width="274" height="227" /></p>
<p>Ici, on ajoute un <strong>Compteur </strong>JMeter qui nous permet de connaître (suivre) le numéro de ligne, afin que nous puissions l&#8217;utiliser dans la prochaine requête pour générer des variables.</p>
<p style="text-align: center;"><img class="aligncenter" style="border: 1px solid black;" title="Ajout LDAP avec JMeter" src="/wp-content/images/jmeter21-img-ldap/jmeter-ldap14.png" alt="" width="639" height="432" /></p>
<p>Nous voilà dans la requête « costaude », il s&#8217;agit d&#8217;une <strong>Requête LDAP étendue</strong> qui va traiter l&#8217;ajout. Ainsi, on choisit le type de test « <em>Add test </em>».</p>
<p>Puis le champ <em>Entry DN</em> nous permet d&#8217;indiquer l&#8217;identifiant unique de la fiche dans l&#8217;annuaire.</p>
<p>Le tableau suivant, permet d&#8217;ajouter les couples « clé: valeur » suivant le principe du fichier LDIF (importation de comptes LDAP).</p>
<p>On notera les points suivants :</p>
<ul>
<li><em>${__V(VAR_PRENOM_${CPT})}</em> permet de générer la variable « <em>${VAR_PRENOM_x} </em>pour chaque itération du <strong>Contrôleur Pour chaque</strong></li>
<li><em>${NEW_NOM}</em> et <em>${NEW_PRENOM}</em> sont des variables définies dans un <strong>Pré-processeur BeanShell</strong> (ci-dessous)</li>
</ul>
<p>Dans la requête d&#8217;ajout, il est important de ne pas oublier les éléments « <em>objectclass</em> » qui vont définir la structure de la fiche annuaire.</p>
<p style="text-align: center;"><img class="aligncenter" style="border: 1px solid black;" title="Pré-processeur BeanShell JMeter" src="/wp-content/images/jmeter21-img-ldap/jmeter-ldap16.png" alt="" width="510" height="519" /></p>
<p>En fils de la requête d&#8217;ajout, on place donc un <strong>Pré-processeur BeanShell</strong>, qui va permettre d&#8217;effectuer quelques actions (ou préparations) sur les données avant leur utilisation.</p>
<p>Tout d&#8217;abord, on récupère la variable <em>CPT</em> (via <em>vars.get(&nbsp;&raquo;GET&nbsp;&raquo;)</em>), puis avec une concaténation, on récupére la valeur de la variable <em>VAR_PRENOM_x</em>. On supprime les points et enlève les guillemets <em>(car certains noms dans la base des boxers ont des pseudonymes entre guillemets)</em>. Puis on refait la même chose avec le NOM.</p>
<p>Pour finir, on génère l&#8217;adresse email via un petit passage en minuscule et une concaténation du domaine de messagerie.</p>
<p>A chaque fois, on utilise le <em>vars.put</em> pour déposer des nouvelles variables dans JMeter.</p>
<p style="text-align: center;"><img class="aligncenter" style="border: 1px solid black;" title="Assertion Réponse JMeter" src="/wp-content/images/jmeter21-img-ldap/jmeter-ldap15.png" alt="" width="433" height="321" /></p>
<p>Ensuite, avec l&#8217;élément suivant, une <strong>Assertion Réponse</strong>, j&#8217;anticipe sur l&#8217;exécution et la vérification que tout s&#8217;est bien passé. En effet, si l&#8217;exécution de la requête d&#8217;ajout LDAP fonctionne correctement, le résultat contient «<em> &lt;responsemessage&gt;Success&lt;/responsemessage&gt; </em>». L&#8217;assertion sur ce texte va nous permettre de détecter rapidement les cas en erreur <em>(si il y en a)</em>.</p>
<p style="text-align: center;"><img class="aligncenter" style="border: 1px solid black;" title="Requête LDAP de recherche avec JMeter" src="/wp-content/images/jmeter21-img-ldap/jmeter-ldap17.png" alt="" width="645" height="432" /></p>
<p>Après la requête d&#8217;ajout, on place une requête de recherche dans le LDAP (type de test : <em>Search test</em>). C&#8217;est optionnel, c&#8217;est juste pour faire une seconde vérification du bon ajout.</p>
<p>On notera :</p>
<ul>
<li>Le champ <strong>Search Filter </strong>qui est ici le « <em>uid</em> » inséré</li>
<li>Le champ <strong>Scope</strong> est positionné à <em>Effectuer une recherche &#8216;onelevel&#8217;</em> (on ne recherche pas dans les sous-éléments de l&#8217;arbre LDAP)</li>
<li>Le champ <strong>Size limit</strong> pour limiter à 1 le résultat retourné (on fait une recherche unitaire)</li>
<li>Le champ <strong>Limite de temps</strong> à 10000 (ms) pour faire échouer l&#8217;échantillon si le serveur LDAP est trop long à répondre</li>
<li>Le champ <strong>Attributes</strong> (optionnel) qui permet de choisir les champs à récupérer, ici le CN, SN et Mail</li>
<li>Et pour finir, la case à cocher <strong>Examiner les résultats de recherche ?</strong> va permettre d&#8217;avoir dans les résultats du test, les valeurs des champs récupérés afin notamment de faire (par exemple) une assertion.</li>
</ul>
<p>Ensuite <em>(enfin)</em> on peut passer à l&#8217;exécution du scénario JMeter.</p>
<p>Pour cela, on grade la configuration par défaut du <strong>Groupes d&#8217;unités</strong>, à savoir : 1 unité qui monte en charge en 1 seconde et qui faire 1 itération (1-1-1).</p>
<p><em>(c&#8217;est le <strong>Contrôleur Pour chaque</strong> qui se charge des itérations sur les utilisateurs)</em></p>
<p><span style="text-decoration: underline;">Voici l&#8217;arbre de résultats :</span></p>
<p style="text-align: center;"><img class="aligncenter" style="border: 1px solid black;" title="Résultats de lexécution LDAP dans JMeter" src="/wp-content/images/jmeter21-img-ldap/jmeter-ldap18.png" alt="" width="679" height="298" /></p>
<p>Si tout s&#8217;est bien passé, tout est <em>vert</em>. Dans les données de réponses, on voit les résultats des requêtes LDAP, avec la valeur <em>Success</em>.</p>
<p>On peut également vérifier dans les données de réponses que <em>par exemple</em> la génération des adresses email s&#8217;est bien déroulée.</p>
<p style="text-align: center;"><img class="aligncenter" style="border: 1px solid black;" title="Vérification du pré-processeur dans la requête LDAP avec JMeter" src="/wp-content/images/jmeter21-img-ldap/jmeter-ldap19.png" alt="" width="667" height="444" /></p>
<p>Un récepteur <strong>Résultats d&#8217;assertion</strong>, configuré pour afficher <em>uniquement</em> les erreurs, permet de voir les utilisateurs qui ont eu un problème lors de l&#8217;exécution. Ici, il y a eu des soucis visiblement sur les noms de boxers qui ont un caractère accentué&#8230;</p>
<p style="text-align: center;"><img class="aligncenter" style="border: 1px solid black;" title="Rapport dassertion JMeter" src="/wp-content/images/jmeter21-img-ldap/jmeter-ldap20.png" alt="" width="749" height="271" /></p>
<p>Et voilà, avec ce tutoriel, on découvre que JMeter sait faire d&#8217;autre chose qu&#8217;un test de charge Web.</p>
<p>Vous noterez que ce type de scénario, fait de JMeter une sorte d&#8217;<a href="http://fr.wikipedia.org/wiki/ETL">ETL (Extract-Transform-Load)</a>. Ainsi, on peut même imaginer d&#8217;adapter ce scénario pour maintenir une synchronisation entre une base de données et un LDAP, le tout en exécutant JMeter en <a href="http://blog.milamberspace.net/index.php/2009/02/01/jmeter-pourquoi-executer-son-test-de-charges-en-mode-non-gui-sans-interface-graphique-192.html">mode non-gui</a> dans une tâche programmée ou un cron.</p>
<p>Je prépare une suite à ce tutoriel concernant la conversion automatisée des mots de passe stockés ici en clair dans le LDAP, vers des mots de passe stockés en SHA-1.</p>
<p><em>Bons scénarios.</em></p>
<p><em><br />
</em></p>
<p><strong>En annexes :</strong><br />
<strong> A/ </strong>Un petit SELECT de ma base de données (histoire de montrer sa structure)</p>
<pre>mysql&gt; select * from BOXERS limit 10;
 +----+----------+------------+
 | ID | PRENOM   | NOM        |
 +----+----------+------------+
 |  1 | Muhammad | Ali        |
 |  2 | Lou      | Ambers     |
 |  3 | Vito     | Antuofermo |
 |  4 | Jorge    | Arce       |
 |  5 | Alexis   | Arguello   |
 |  6 | Henry    | Armstrong  |
 |  7 | Abe      | Attell     |
 |  8 | Monte    | Attell     |
 |  9 | Yuri     | Arbachakov |
 | 10 | Satoshi  | Aragaki    |
 +----+----------+------------+
 10 rows in set (0.03 sec)</pre>
<p><strong>B/ </strong>Le format LDIF d&#8217;exemple <em>(qui permet de connaître les champs à ajouter dans la requête LDAP d&#8217;ajout, mais entendu, il faut l&#8217;adapter pour que cela colle avec le vôtre (serveur LDAP))</em></p>
<pre>dn: uid=milamber,ou=Users,dc=milamberspace,dc=net
objectclass: organizationalPerson
objectclass: person
objectclass: top
objectclass: inetOrgPerson
uid: milamber
userPassword: jmeter2009
cn: milamber
mail: milamber@milamberspace.net
displayname: Milamber
givenname: Milamber
sn: Milamber</pre>
<p>./</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.milamberspace.net/index.php/2009/07/30/charger-un-serveur-ldap-depuis-une-base-de-donnees-avec-jmeter-468.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

