• Aucun résultat trouvé

Exemple : fabrication d’un nouveau type d’itinéraire parallèle

Programmation d’agents mobiles pour l’administration système et

6.4 Extensibilité du modèle de développement .1Modalités de l’extension

6.4.3 Exemple : fabrication d’un nouveau type d’itinéraire parallèle

On va illustrer ici le fait qu’on est capable d’initier la création d’agents mo-biles ayant leur propre itinéraire lors de l’exécution de méthode associée à une Destination indiquée dans l’itinéraire d’un autre agent mobile. Ceci servira donc d’exemple à l’utilisation de deux types possibles de Destination que l’on peut dé-cider de rajouter par extension : CloneDestination et RendezVousDestination. L’exemple consistera à administrer tous les systèmes et les éléments du réseau,

de tous les sous-réseaux, en parallèle. L’agent principal aura aussi en charge d’administrer les éléments de son propre sous-réseau.

L’AgentClone (AC, cf. code 6.20) qui joue le rôle de l’agent principal démarre avec un ItineraryManagerParalleleWholeNetwork (IMPWN, cf. code 6.16). La préparation de l’itinéraire consiste à :

public class ItineraryManagerParallelWholeNetwork extends ItineraryManager implements java.io.Serializable{

/** Constructor */

public ItineraryManagerParallelWholeNetwork() { super(); } public void prepareItinerary() {

prepareItinerary((ItineraryServer)null); }

public void prepareItinerary(ItineraryServer iServer) { RendezVousDestination rdvDestination;

try {

if (iServer == null) {

iServer=getLocalItineraryServer(); }

// obj contains a reference onto the local Itinerary Server ArrayList proActiveNodes = iServer.getProActiveNode();

ArrayList snmpList = new ArrayList(iServer.getSNMPElements());

if (proActiveNodes.isEmpty()) return; // nothing to do, may be an error createMigrationStrategyManager();

// prepare rendez-vous

int lastIndex =proActiveNodes.size() -1;

rdvDestination = new RendezVousDestination((Destination)proActiveNodes.get(lastIndex)); rdvDestination.setMasterAgent((Agent)ProActive.getStubOnThis());

// to synchronize secondary agents NodeDestination nd =

new NodeDestination(NodeFactory.getDefaultNode().getNodeInformation().getURL(),""); // A clone destination on current Node, and give it

// the list of others ItineraryServers CloneDestination cDestination =

new CloneDestination(nd,othersItineraryServer,rdvDestination); myItinerary.add(cDestination);

for (int i=0;i<proActiveNodes.size() ;i++) {

NodeDestination nd =(NodeDestination)proActiveNodes.get(i) myItinerary.add(nd);

int currentPos = snmpList.indexOf(nd.getDestination().getHostName()); if (currentPos >=0) // add SNMPDestination for same Host

myItinerary.add(snmpList.remove(currentPos)); }

// add others SNMPDestination, host without a Node for (int i=0;i<snmpList.size();i++)

myItinerary.add(snmpList.get(i));

// add RendezVous at end of current Itinerary byt modified method named rdvDestination.setMethodName("rendezVousMaster"); // for master agent only myItinerary.add(rdvDestination);

} catch (Exception e) {e.printStackTrace(); }

} }

Fig. 6.16 – Classe de l’ItineraryManagerParalleleWholeNetwork

– contacter l’ItineraryServer (IS) local afin de récupérer la liste des nœuds ProActive.

– créer une CloneDestination (CD, cf. code 6.17) pour que l’AC, à son arrivée sur une telle destination, se mette à préparer le nombre d’agents mobiles secondaires nécessaire.

– faire en sorte que le premier élément de l’itinéraire de l’AC soit une Clone-Destination et les suivants les NodeClone-Destinations obtenus via l’Itinerary-Server local.

– fixer la dernière destination (RendezVousDestination, cf. code figure 6.18) comme celle qui permettra de se synchroniser avec tous les agents secon-daires. La méthode appelée pour l’AC sera rendezVousMaster qui permet de suspendre le suivi de l’itinéraire en vue de se synchroniser avec les agents secondaires.

public class CloneDestination implements java.io.Serializable, org.objectweb.proactive.ext.migration.Destination{

private String host, methodName = "cloneOnArrival"; private Destination dest=null;

private int numberOfAgents=0; // Number of agents to duplicate private DestinationList lastItinerary;

RendezVousDestination rdvDestination;

public CloneDestination(Destination dest, DestinationList lastItinerary) { this.dest=dest;

this.numberOfAgents=lastItinerary.size(); this.lastItinerary=lastItinerary;

}

public CloneDestination(Destination dest, DestinationList lastItinerary, RendezVousDestination rdvDestination) {

this.dest=dest;

if (lastItinerary!= null) this.numberOfAgents=lastItinerary.size(); else this.numberOfAgents=-1;;

this.lastItinerary=lastItinerary; this.rdvDestination = rdvDestination;

}

// return the next part of current itinerary, to be use by clone agents public DestinationList getLastItinerary() {

return lastItinerary; }

// return RendezVous Destination

public RendezVousDestination getRendezVousDestination() { return rdvDestination;

}

// number of agents to wait if necessary

public int getNumberOfAgent() { return numberOfAgents; }

/** Return method name to execute */ public String getMethodName() { return methodName;

}

public Destination getCloneDestination() { return dest;

} }

Fig. 6.17 – Classe de la CloneDestination

Clone-Destination les actions suivantes sont exécutées :

– On récupère la RendezVousDestination (qui est en fait aussi stockée dans la CloneDestination)

– On récupère le nombre d’ItineraryServers, ce qui donne le nombre d’ins-tances d’AgentGeneric (AG, cf.code 6.19) qui doivent être créés.

– Pour chaque élément de la liste (liste des ItineraryServers)

– le master agent (AC) créé un AG avec un ItineraryManagerLocal-Network (pour administrer tous ses éléments, nœuds ProActive et agents SNMP).

– On fixe la dernière Destination comme étant de type RendezVous-Destination et on demande la préparation de l’itinéraire via l’Itine-raryServer correspondant. On a fait en sorte que dans cette Rendez-VousDestination on ait une référence vers l’agent principal (ici l’AC) afin que les agents secondaires puissent le contacter. Cette RendezVous-Destination permettra l’appel de la méthode rendezVousPoint pour les agents secondaires.

– L’AG démarre son itinéraire. Sa dernière Destination sera donc la -RendezVousDestination.

– Fin de Pour....

Dès que les AGs arrivent sur leur RendezVousDestination, ils se synchro-nisent avec l’AC par l’appel de la méthode rendezVousPoint() associée à cette destination, méthode qui est définie dans le corps de l’AC. Cette méthode dé-compte le nombre d’AG fils qui l’ont appelée au moment de ce rendez-vous. Chaque AgentGeneric appelle la méthode collectData de l’AC pour trans-mettre les données collectées.

6.5 Bilan

Dans ce chapitre nous avons présenté la mise en œuvre de notre système de gestion d’itinéraire, basé sur la classe ItineraryManager. Ce gestionnaire d’itinéraire se charge de récupérer les informations mises à disposition par un ou plusieurs ItineraryServers, qui sont quant à eux localisés sur différents sous-réseaux du réseau à administrer. Avec ces informations, nous avons pu construire différents types d’itinéraires adaptés à des opérations d’administration :

– pour le sous-réseau, comprenant les équipements actifs et les nœuds ProAc-tive

– pour l’ensemble du réseau, c’est-à-dire l’union des itinéraires possibles par sous-réseau

– par type de service fourni par les éléments du réseau, comme par exemple un itinéraire pour toutes les imprimantes

Nous avons aussi défini le cadre de programmation des agents mobiles dans le contexte de l’administration système et réseau en définissant une classe générique

public class RendezVousDestination implements java.io.Serializable, org.objectweb.proactive.ext.migration.Destination {

private String host;

private String methodName = "rendezVousPoint"; private Destination lastDestination;

private Agent masterAgent;

public RendezVousDestination(Destination lastDestination) { this.lastDestination=lastDestination;

methodName=lastDestination.getMethodName(); }

public String toString() {

return " rendezvous point "+lastDestination.getDestination()); }

public void setMasterAgent(Agent masterAgent) { this.masterAgent=masterAgent;

}

public Agent getMasterAgent() { return masterAgent;

}

/**Return the snmp method to execute */ public String getMethodName() {

return lastDestination.getMethodName(); }

/** Return current destination as a string */ public String getDestination() {

return lastDestination.getDestination(); }

// get rendezvous Destination

public Destination getRendezVous() { return lastDestination;} // set a rendezvous

public void setRendezVous(Destination lastDestination) { this.lastDestination=lastDestination;

} }

Fig. 6.18 – Classe de la RendezVousDestination

Agent comprenant toutes les fonctionnalités liées à la construction de l’itinéraire, à son suivi ainsi que les appels de méthodes permettant d’effectuer une opération d’administration selon le type d’élément (basé sur la hiérarchie des Destinations que nous avons construite).

En respectant la méthodologie prônée par notre cadre de développement, nous avons mis en évidence la simplicité de son extension, qui passe par la création de nouveaux types de destinations, de nouveaux types d’itinéraires.

Le chapitre suivant présente les évaluations que nous avons réalisées sur notre plate-forme en utilisant notre modèle de programmation.

public class AgentGeneric extends Agent implements java.io.Serializable { ArrayList nodeRessource = new ArrayList();

ArrayList AllArplTable = new ArrayList(); public AgentGeneric() {

super(); }

public void setItineraryManager(ItineraryManager itineraryManager) { this.itineraryManager=itineraryManager;

}

public void onArrival() { super.onArrival();

SystemResources sr = new SystemResources(); nodeRessource.add(nodeDest);

nodeRessource.add(sr.getSystemOS());

// Gets TOTAL MEM, USED MEM, FREE MEM into a String nodeRessource.add(sr.toString());

}

public void snmpOnArrival() { // overrides Agent.snmpOnArrival super.snmpOnArrival();

// gets the SNMP MIB Table ip.ipNetToMediaTable

AllArplTable.addAll(new IpMacTable(snmpDest).getArpTable()); }

public void rendezVousPoint() {

RendezVousDestination rvDestination = (RendezVousDestination)itiManager.getCurrentDestination(); ((AgentClone)rvDestination.getMasterAgent()).rendezVousPoint(); ((AgentClone)rvDestination.getMasterAgent()).collectData(nodeRessource); ((AgentClone)rvDestination.getMasterAgent()).collectData(AllArplTable); }

public void displayData() {

System.out.println("Data collected : "+nodeRessource); }

}

public class AgentClone extends Agent implements java.io.Serializable { ArrayList nodeRessource = new ArrayList();

ArrayList AllArplTable = new ArrayList(); ArrayList listAgentsData = new ArrayList(); private int nbAgentToWait=0;

public AgentClone() { super();

}

// master agent suspend it’s own itinerary public void rendezVousMaster() {

try { getItineraryManager().suspendItinerary(); } catch (Exception e) {}

}

// method for RendezVousDestination public void rendezVousPoint() {

System.out.println("MASTER AGENT: A child agent is calling me"); if (nbAgentToWait >0) {

nbAgentToWait--; }

try {

if (nbAgentToWait == 0) {

System.out.println("Master agent can go to the next Destination"); getItineraryManager().resumeItinerary();

}

} catch (Exception e) {e.printStackTrace();} }

// method called by sub Agents

public void collectData(ArrayList listOfData) { listAgentsData.addAll(listOfData);

}

public void cloneOnArrival() { CloneDestination cloneDest =

((CloneDestination)itiManager.getCurrentDestination());

RendezVousDestination rdvDestination=cloneDest.getRendezVousDestination(); DestinationList allItineraryServer = cloneDest.getRestOfTheItinerary(); int nbItineraryServer = allItineraryServer.size();

nbAgentToWait=nbItineraryServer; try {

if (nbItineraryServer > 0) { // create one agent per nodes

for (int i=0;i<nbItineraryServer;i++) { AgentGeneric mobileAgent =

(AgentGeneric)ProActive.newActive("AgentGeneric", null);

ItineraryServer iServer = (ItineraryServer) allItineraryServer.next(); mobileAgent.setItineraryManager(new ItineraryManagerLocalNetwork()); // nodes and SNMP mobileAgent.setLastDestination(rdvDestination); mobileAgent.getItineraryManager().prepareItinerary(iServer); mobileAgent.startItinerary(); } }

} catch (Exception e) {e.printStackTrace(); } }

public void onArrival() { super.onArrival();

SystemResources sr = new SystemResources(); nodeRessource.add(nodeDest);

nodeRessource.add(sr.getSystemOS());

// Gets TOTAL MEM, USED MEM, FREE MEM into a String nodeRessource.add(sr.toString());

}

public void snmpOnArrival() { super.snmpOnArrival();

// gets the SNMP MIB Table ip.ipNetToMediaTable

AllArplTable.addAll(new IpMacTable(snmpDest).getArpTable()); }

public void displayData() {

System.out.println("Data collected : "+listAgentsData); }

}

Fig. 6.20 – Classe de l’AgentClone - agent principal

Performances et évaluation des