/*! ****************************************************************************** * * Pentaho Data Integration * * Copyright (C) 2002-2013 by Pentaho : http://www.pentaho.com * ******************************************************************************* * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ******************************************************************************/ package org.pentaho.di.cluster; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.pentaho.di.core.Const; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.www.Carte; import org.pentaho.di.www.WebServer; public class ClusterGenerator { public static final String TEST_CLUSTER_NAME = "test-cluster"; /** * We use one master and 3 slaves */ public static final SlaveServer[] LOCAL_TEST_SLAVES = new SlaveServer[] { new SlaveServer( "test-localhost-8585-master", "127.0.0.1", "8585", "cluster", "cluster", null, null, null, true ), new SlaveServer( "test-localhost-8586-slave", "127.0.0.1", "8586", "cluster", "cluster", null, null, null, false ), new SlaveServer( "test-localhost-8587-slave", "127.0.0.1", "8587", "cluster", "cluster", null, null, null, false ), new SlaveServer( "test-localhost-8588-slave", "127.0.0.1", "8588", "cluster", "cluster", null, null, null, false ), }; private ClusterSchema clusterSchema; private List<Carte> carteList; public ClusterGenerator() throws KettleException { this.clusterSchema = new ClusterSchema(); this.clusterSchema.setName( TEST_CLUSTER_NAME ); this.clusterSchema.getSlaveServers().addAll( Arrays.asList( LOCAL_TEST_SLAVES ) ); this.clusterSchema.setSocketsCompressed( false ); this.clusterSchema.setBasePort( "40000" ); this.clusterSchema.setSocketsBufferSize( "2000" ); this.clusterSchema.setSocketsFlushInterval( "5000" ); this.carteList = new ArrayList<Carte>(); } public void launchSlaveServers() throws Exception { // Launch the defined slave servers in a separate thread... // for ( SlaveServer slaveServer : LOCAL_TEST_SLAVES ) { final String hostname = slaveServer.getHostname(); final int port = Const.toInt( slaveServer.getPort(), WebServer.PORT ); CarteLauncher launcher = new CarteLauncher( hostname, port ); Thread thread = new Thread( launcher ); thread.setName( "Carte Launcher" + thread.getName() ); thread.start(); // Wait until the carte object is available... while ( launcher.getCarte() == null && !launcher.isFailure() ) { Thread.sleep( 100 ); } // Keep a list of launched servers if ( launcher.getCarte() != null ) { carteList.add( launcher.getCarte() ); } // If there is a failure, stop the servers already launched and throw the exception if ( launcher.isFailure() ) { stopSlaveServers(); throw launcher.getException(); // throw the exception for good measure. } } } public void stopSlaveServers() throws Exception { for ( Carte carte : carteList ) { carte.getWebServer().stopServer(); } } /** * @return the clusterSchema */ public ClusterSchema getClusterSchema() { return clusterSchema; } /** * @param clusterSchema * the clusterSchema to set */ public void setClusterSchema( ClusterSchema clusterSchema ) { this.clusterSchema = clusterSchema; } }