4 import java.io.Serializable;
5 import java.util.ArrayList;
9 * Class representing a computing nodes cluster
10 * @author Sébastien Miquée
13 public class Cluster implements Serializable
15 private static final long serialVersionUID = 1L;
18 private ArrayList<GNode> nodes ;
19 private ArrayList<GNode> freenodes ;
21 private int moreNode ;
25 * Default constructor.
30 nodes = new ArrayList<GNode>() ;
31 freenodes = new ArrayList<GNode>() ;
38 * Set the name of the cluster.
39 * @param _name Cluster's name
41 public void setName( String _name )
48 * Adding a computing node to the cluster.
49 * @param _n Node to be add
51 public void addGNode( GNode _n )
53 if( _n != null && _n.getClusterName().equalsIgnoreCase( name ) )
55 _n.setInCluster( true ) ;
58 if( ! _n.getMapped() )
67 * Return the list of computing nodes which are in the cluster.
68 * @return The list of nodes
70 public ArrayList<GNode> getGNodes()
77 * Return the list of free computing nodes which are in the cluster.
78 * @return The list of free nodes
80 public ArrayList<GNode> getFreeGNodes()
87 * Return cluster's name.
88 * @return Cluster's name
90 public String getName()
97 * Return the amount of computing nodes in the cluster.
98 * @return The amount of nodes
100 public int getNbGNode()
102 return nodes.size() ;
107 * Set the site in which the cluster is.
108 * @param _site Site's name
110 public void setSite( String _site )
117 * Return the site's name in which the cluster is.
118 * @return The site's name
120 public String getSite()
127 * Test if a computing node is in the cluster, and return its position (if
129 * @param _g The node to be tested
130 * @return The position of the node
132 public int isIn( GNode _g )
138 for( int i = 0 ; i < nodes.size() ; i ++ )
140 if( nodes.get( i ).getId() == _g.getId() )
153 * Test if a computing node is in the cluster, and return it (if
155 * @param _g The node to be tested
156 * @return The position of the node
158 public GNode exists( GNode _g )
162 for( int i = 0 ; i < nodes.size() ; i ++ )
164 if( nodes.get( i ).getId() == _g.getId() )
166 return nodes.get( i ) ;
175 * Return the next available computing node in the cluster.
176 * @return The next node in the cluster
178 public GNode nextGNode()
182 if( freenodes.size() > 0 )
184 ret = freenodes.get( 0 ) ;
192 * Return the next available computing node in the cluster,
193 * according to the moreNode iterator.
194 * @return The next node in the cluster
196 public GNode moreGNode()
200 if( freenodes.size() > 0 )
202 if( moreNode >= freenodes.size() )
204 System.err.println( "No more free node available" );
206 ret = freenodes.get( moreNode ) ;
216 * (Re-)Initialize the moreNode counter.
218 public void initMoreGNode()
225 * Remove a failed node from the cluster.
226 * @param _dead The failed node
228 public void removeGNode( GNode _dead )
232 if( _dead.getClusterName().equalsIgnoreCase( name )
233 && _dead.getSiteName().equalsIgnoreCase( site ) )
236 for( i = 0 ; i < nodes.size() ; i++ )
238 if( _dead.getId() == nodes.get( i ).getId() )
243 for( j = 0 ; j < freenodes.size() ; j++ )
245 if( freenodes.get(j).getId() == _dead.getId() )
247 freenodes.remove( j ) ;
256 if( i > nodes.size() )
258 System.err.println( "(Cluster) The GNode was not found in the list!" );
261 System.err.println( "(Cluster) The GNode to be deleted is not mine!" ) ;
264 System.err.println( "(Cluster) The GNode to be deleted is null!" ) ;
270 * Set the mapped status of a node of the cluster.
271 * @param _g The mapped node
272 * @param _status The status of the node
274 public void setGNodeStatus( GNode _g, boolean _status )
278 for( int i = 0 ; i < nodes.size() ; i++ )
280 if( nodes.get( i ).getId() == _g.getId() )
282 nodes.get( i ).setMapped( _status ) ;
286 for( int j = 0 ; j < freenodes.size() ; j++ )
288 if( freenodes.get(j).getId() == nodes.get(i).getId() )
290 freenodes.remove( j ) ;
296 if( ! freenodes.contains( nodes.get( i ) ) )
297 freenodes.add( nodes.get( i ) ) ;
306 * Return the amount of available free nodes in the cluster.
307 * @return The amount of free nodes
309 public int getNbFreeNodes()
311 return freenodes.size() ;
316 * Compute and return the available computing power of the cluster.
317 * @return The available computing power
319 public double getAvailablePower()
323 /** If there is some available nodes **/
324 if( freenodes.size() > 0 )
326 for( int i = 0 ; i < freenodes.size() ; i++ )
328 ret += freenodes.get( i ).getPower() ;
337 * Compute and return the average available computing power of the cluster.
338 * @return The available available computing power
340 public double getAvgAvailablePower()
344 /** If there is some available nodes **/
345 if( freenodes.size() > 0 )
347 for( int i = 0 ; i < freenodes.size() ; i++ )
349 ret += freenodes.get( i ).getPower() ;
352 ret = ret / freenodes.size() ;
359 public double getAvgPower()
363 /** If there is some available nodes **/
364 if( nodes.size() > 0 )
366 for( int i = 0 ; i < nodes.size() ; i++ )
368 ret += nodes.get( i ).getPower() ;
371 ret = ret / nodes.size() ;
378 public double getPower()
382 /** If there is some available nodes **/
383 if( nodes.size() > 0 )
385 for( int i = 0 ; i < nodes.size() ; i++ )
387 ret += nodes.get( i ).getPower() ;
395 * Initialization of computing nodes in this cluster. Set all
396 * of these nodes to be not mapped on.
398 public void initGNodes()
400 /** Initialization of local nodes **/
401 /** and reconstruction of the freenodes list **/
403 freenodes = new ArrayList<GNode>() ;
405 for( int i = 0 ; i < nodes.size() ; i++ )
407 nodes.get( i ).setMapped( false ) ;
409 freenodes.add( nodes.get( i ) ) ;
415 * Replace a node in the cluster (in case of a reconnection for example).
416 * @param _g The node to be replaced
418 public void replaceGNode( GNode _g )
429 * Search and return the better (most powerful) available node
431 * @return The best available node
433 public GNode getBetterFreeGNode()
437 if( freenodes.size() > 0 )
439 ret = freenodes.get( 0 ) ;
442 for( int i = 1 ; i < freenodes.size() ; i++ )
444 if( freenodes.get( i ).getPower() > ret.getPower() )
446 ret = freenodes.get( i ) ;
455 * Construct and return a copy of the current Cluster.
456 * @return A copy of the cluster
458 public Cluster clone()
460 Cluster copy = new Cluster() ;
462 copy.setName( name ) ;
463 copy.setSite( site ) ;
465 for( int i = 0 ; i < nodes.size() ; i++ )
467 GNode newgn = (GNode) nodes.get( i ).clone() ;
468 newgn.setCluster( copy ) ;
469 copy.addGNode( newgn ) ;
477 /** La programmation est un art, respectons ceux qui la pratiquent !! **/