31
Jul/09
0

Mise en oeuvre CouchDB (Rake, tests)

CouchDB sera notre base de données documentaire afin de stocker les éléments de façon permanente.

Nous allons donc installer un serveur CouchDB, et mettre en place les éléments permettant ensuite de l’exploiter dans notre application.

Installation du serveur

Pour le coup, ce paragraphe sera très simple. En effet, avec Arch, nous avons la chance d’avoir un package AUR déjà disponible et qui fonctionne bien. On installe donc CouchDB par la commande :

yaourt -Sy couchdb

La base sera installé en tant que démon, et un utilisateur Couchdb sera créé. La base sera lancée avec cet utilisateur.

Note : encore une fois, il s’agit là d’une installation rapide, à peu de frais et donc dédiée au développement.

On peut connaître l’état du démon (et le démarrer éventuellement) par les commandes suivantes :

$ /etc/rc.d/couchdb status
Apache CouchDB is not running.
$ sudo /etc/rc.d/couchdb start
Starting database server couchdb
:: Starting the CouchDB daemon                  [DONE]

Futon : l’interface web

CouchDB contient de base une interface d’administration par navigateur. Il suffit de pointer le navigateur à l’adresse http://localhost:5984/_utils/ (il vaut mieux la mettre dans les marques pages).

Futon - démarrage

Modification du processus de build

Les bases et documents peuvent être créés facilement par l’interface d’administration. Cependant, on va créer une extension au fichier de build afin d’avoir les mécanismes pour automatiser les actions de base.

Pour cela, on va utiliser une gem permettant de se simplifier le boulot : RestClient :

sudo gem install rest-client

On modifie le fichier Rakefile.rb de la manière suivante :

require "rest_client"
 
namespace 'db' do
 
  SERVER = "http://127.0.0.1:5984/"
  DB = "ercm"
 
  desc "Initialise a database"
  task :create do
    RestClient.put "#{SERVER}/#{DB}/", nil
  end
 
end

Cette commande rake db:create crée une nouvelle base de données. Si on joue la commande plusieurs fois, un code retour 412 est renvoyé.

Les tâches pourront être augmentées afin de fournir des services supplémentaires.

Accès via Erlang

Concernant la liaison entre le serveur applicatif et la base de données, les choses sont un peu moins simples, due à la présence d’un nombre important de possibilités.

Dans mon processus de sélection très scientifique (!), les deux candidats les plus prometteurs semblent être couchbeam et eCouch.

Le choix se porte sur eCouch car semblant plus « mature », et supporté par l’équipe derrière Tarpipe.

Installation

Il s’agit d’une application OTP, et donc l’installation se fait, comme pour Mochiweb, par la récupération des sources :

$ cd /d/apps
$ svn checkout http://ecouch.googlecode.com/svn/trunk/ ecouch
$ cd ecouch
make

L’application OTP ecouch est compilée. On la rajoute maintenant comme dépendance au projet ercm.

$ cd /d/apps/ercm/deps
$ ln -s ../../ecouch/ ecouch-src
$ ls -l
total 0
lrwxrwxrwx 1 h h 13 juil. 31 09:03 ecouch-src -> ../../ecouch/
lrwxrwxrwx 1 h h 35 juil. 30 20:11 mochiweb-src -> /d/apps/mochiweb/scripts/../ebin/..

Nos deux applications OTP sont bien présentes en tant que lien symbolique. Pour info, ces liens sont chargé par le module src/ercm_deps.erl.

Pour que l’application ecouch puisse être utilisée, il faut qu’elle soit référencée par le shell lors du lancement de l’application. Cette application, de plus, dépend du module inets qui devra lui aussi être démarré.

Note : je ne maitrise pas encore toutes les subtilités d’OTP concernant les dépendances, ni quelles sont les meilleures pratiques pour les démarrer. Je ne présente ici qu’une des façons que j’ai pu trouver pour démarrer simplement, pas forcément ce qui doit être fait.

Le module inets sera démarré en ligne de commande, en modifiant la tâche start du Rakefile.rb :

task :start => :build do
  system "erl -pa #{EBIN_DIR} #{ROOT}/deps/*/ebin -boot start_sasl -s reloader -s inets -s ercm"
end

Notez la commande « -s inets » dans la chaîne.

Puis on démarre l’application ecouch lors du démarrage de notre application, en modifiant le fichier src/ercm_app.erl :

start(_Type, _StartArgs) ->
  application:start(ecouch),
  ercm_deps:ensure(),
  ercm_sup:start_link().
 
stop(_State) ->
  application:stop(ecouch),
  ok.

Lorsqu’on démarre l’applicatif, le shell doit afficher le fait que ecouch est démarré :

=PROGRESS REPORT==== 31-Jul-2009::10:06:10 ===
          supervisor: {local,ecouch}
             started: [{pid,<0.69.0>},
                       {name,ec_listener_sup},
                       {mfa,
                           {ec_listener,start_link,
                               ["127.0.0.1","5984",[],[]]}},
                       {restart_type,permanent},
                       {shutdown,2000},
                       {child_type,worker}]
 
=PROGRESS REPORT==== 31-Jul-2009::10:06:10 ===
          supervisor: {local,ecouch}
             started: [{pid,<0.70.0>},
                       {name,ec_client_sup},
                       {mfa,
                           {supervisor,start_link,
                               [{local,ec_client_sup},ecouch,[ec_client]]}},
                       {restart_type,permanent},
                       {shutdown,infinity},
                       {child_type,supervisor}]
 
=PROGRESS REPORT==== 31-Jul-2009::10:06:10 ===
         application: ecouch
          started_at: nonode@nohost
** Found 0 name clashes in code paths

À partir de là, on peut tester notre connexion directement dans le shell (la complétion des espaces de noms et des fonctions marche bien, en tapant la touche tab) :

1> ecouch:db_list().
 
=PROGRESS REPORT==== 31-Jul-2009::10:07:34 ===
          supervisor: {local,inet_gethost_native_sup}
             started: [{pid,<0.77.0>},{mfa,{inet_gethost_native,init,[[]]}}]
 
=PROGRESS REPORT==== 31-Jul-2009::10:07:34 ===
          supervisor: {local,kernel_safe_sup}
             started: [{pid,<0.76.0>},
                       {name,inet_gethost_native_sup},
                       {mfa,{inet_gethost_native,start_link,[]}},
                       {restart_type,temporary},
                       {shutdown,1000},
                       {child_type,worker}]
{ok,[<<"ercm">>]}
2> ecouch:db_list().
{ok,[<<"ercm">>]}
3>

L’environnement de travail doit être maintenant utilisable pour exploiter la base directement dans le serveur applicatif.

Bien sur, on n’a pas configuré les adresses et ports d’accès, ce qui ne serait pas à faire en production.

Pour information, la base est visible avec futon :

base sous futon

Sources : http://github.com/rv/ercm/tree/blog05

Filed under: CouchDB, Erlang
Comments (0) Trackbacks (0)

No comments yet.

Leave a comment

No trackbacks yet.