/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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.apache.hadoop.mapred; import java.io.File; import java.io.FileOutputStream; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.mapreduce.test.system.MRCluster; import org.apache.hadoop.test.system.AbstractDaemonClient; import org.apache.hadoop.test.system.process.HadoopDaemonRemoteCluster; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class TestPushConfig { private static MRCluster cluster; private String localConfDir = "localconf"; private static final Log LOG = LogFactory.getLog( TestPushConfig.class.getName()); @BeforeClass public static void before() throws Exception { String [] expExcludeList = new String[2]; expExcludeList[0] = "java.net.ConnectException"; expExcludeList[1] = "java.io.IOException"; cluster = MRCluster.createCluster(new Configuration()); cluster.setExcludeExpList(expExcludeList); cluster.setUp(); } @AfterClass public static void after() throws Exception { cluster.tearDown(); } /** * This test about testing the pushConfig feature. The pushConfig functionality * available as part of the cluster process manager. The functionality takes * in local input directory and pushes all the files from the local to the * remote conf directory. This functionality is required is change the config * on the fly and restart the cluster which will be used by other test cases * @throws Exception is thrown if pushConfig fails. */ @Test public void testPushConfig() throws Exception { final String DUMMY_CONFIG_STRING = "mapreduce.newdummy.conf"; final String DUMMY_CONFIG_STRING_VALUE = "HerriotTestRules"; Configuration origconf = new Configuration(cluster.getConf()); origconf.set(DUMMY_CONFIG_STRING, DUMMY_CONFIG_STRING_VALUE); String localDir = HadoopDaemonRemoteCluster.getDeployedHadoopConfDir() + File.separator + localConfDir; File lFile = new File(localDir); if(!lFile.exists()){ lFile.mkdir(); } String mapredConf = localDir + File.separator + "mapred-site.xml"; File file = new File(mapredConf); origconf.writeXml(new FileOutputStream(file)); Configuration daemonConf = cluster.getJTClient().getProxy().getDaemonConf(); Assert.assertTrue("Dummy varialble is expected to be null before restart.", daemonConf.get(DUMMY_CONFIG_STRING) == null); String newDir = cluster.getClusterManager().pushConfig(localDir); cluster.stop(); AbstractDaemonClient cli = cluster.getJTClient(); waitForClusterStop(cli); // make sure the cluster has actually stopped cluster.getClusterManager().start(newDir); cli = cluster.getJTClient(); waitForClusterStart(cli); // make sure the cluster has actually started Configuration newconf = cluster.getJTClient().getProxy().getDaemonConf(); Assert.assertTrue("Extra varialble is expected to be set", newconf.get(DUMMY_CONFIG_STRING).equals(DUMMY_CONFIG_STRING_VALUE)); cluster.getClusterManager().stop(newDir); cli = cluster.getJTClient(); // make sure the cluster has actually stopped waitForClusterStop(cli); // start the daemons with original conf dir cluster.getClusterManager().start(); cli = cluster.getJTClient(); waitForClusterStart(cli); daemonConf = cluster.getJTClient().getProxy().getDaemonConf(); Assert.assertTrue("Dummy variable is expected to be null after restart.", daemonConf.get(DUMMY_CONFIG_STRING) == null); lFile.delete(); } private void waitForClusterStop(AbstractDaemonClient cli) throws Exception { int i=1; while (i < 40) { try { cli.ping(); Thread.sleep(1000); i++; } catch (Exception e) { break; } } for (AbstractDaemonClient tcli : cluster.getTTClients()) { i = 1; while (i < 40) { try { tcli.ping(); Thread.sleep(1000); i++; } catch (Exception e) { break; } } if (i >= 40) { Assert.fail("TT on " + tcli.getHostName() + " Should have been down."); } } } private void waitForClusterStart(AbstractDaemonClient cli) throws Exception { int i=1; while (i < 40) { try { cli.ping(); break; } catch (Exception e) { i++; Thread.sleep(1000); LOG.info("Waiting for Jobtracker on host : " + cli.getHostName() + " to come up."); } } for (AbstractDaemonClient tcli : cluster.getTTClients()) { i = 1; while (i < 40) { try { tcli.ping(); break; } catch (Exception e) { i++; Thread.sleep(1000); LOG.info("Waiting for Tasktracker on host : " + tcli.getHostName() + " to come up."); } } } } }