blob: 03205e7f8789c76a1070781b7b96911b7c90bf20 [file] [log] [blame]
/**
* 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.yarn.server.applicationhistoryservice;
import org.apache.commons.io.FileUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.security.UserGroupInformation;
import org.apache.hadoop.service.Service.STATE;
import org.apache.hadoop.util.ExitUtil;
import org.apache.hadoop.yarn.conf.YarnConfiguration;
import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.HBaseTimelineMetricsService;
import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.PhoenixHBaseAccessor;
import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.TimelineMetricConfiguration;
import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.availability.MetricCollectorHAController;
import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.query.DefaultPhoenixDataSource;
import org.apache.zookeeper.ClientCnxn;
import org.easymock.EasyMock;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLClassLoader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import static org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.TimelineMetricConfiguration.METRICS_SITE_CONFIGURATION_FILE;
import static org.easymock.EasyMock.anyObject;
import static org.easymock.EasyMock.anyString;
import static org.easymock.EasyMock.createNiceMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.expectLastCall;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
import static org.powermock.api.easymock.PowerMock.expectNew;
import static org.powermock.api.easymock.PowerMock.mockStatic;
import static org.powermock.api.easymock.PowerMock.replayAll;
import static org.powermock.api.easymock.PowerMock.verifyAll;
import static org.powermock.api.support.membermodification.MemberMatcher.method;
import static org.powermock.api.support.membermodification.MemberModifier.suppress;
@RunWith(PowerMockRunner.class)
@PrepareForTest({ PhoenixHBaseAccessor.class, HBaseTimelineMetricsService.class, UserGroupInformation.class,
ClientCnxn.class, DefaultPhoenixDataSource.class, ConnectionFactory.class,
TimelineMetricConfiguration.class, ApplicationHistoryServer.class })
@PowerMockIgnore( {"javax.management.*"})
public class TestApplicationHistoryServer {
ApplicationHistoryServer historyServer = null;
Configuration metricsConf = null;
@Rule
public TemporaryFolder folder = new TemporaryFolder();
@Before
@SuppressWarnings("all")
public void setup() throws URISyntaxException, IOException {
folder.create();
File hbaseSite = folder.newFile("hbase-site.xml");
File amsSite = folder.newFile("ams-site.xml");
FileUtils.writeStringToFile(hbaseSite, "<configuration>\n" +
" <property>\n" +
" <name>hbase.defaults.for.version.skip</name>\n" +
" <value>true</value>\n" +
" </property>" +
" <property> " +
" <name>hbase.zookeeper.quorum</name>\n" +
" <value>localhost</value>\n" +
" </property>" +
"</configuration>");
FileUtils.writeStringToFile(amsSite, "<configuration>\n" +
" <property>\n" +
" <name>test</name>\n" +
" <value>testReady</value>\n" +
" </property>\n" +
" <property>\n" +
" <name>timeline.metrics.host.aggregator.hourly.disabled</name>\n" +
" <value>true</value>\n" +
" <description>\n" +
" Disable host based hourly aggregations.\n" +
" </description>\n" +
" </property>\n" +
" <property>\n" +
" <name>timeline.metrics.host.aggregator.minute.disabled</name>\n" +
" <value>true</value>\n" +
" <description>\n" +
" Disable host based minute aggregations.\n" +
" </description>\n" +
" </property>\n" +
" <property>\n" +
" <name>timeline.metrics.cluster.aggregator.hourly.disabled</name>\n" +
" <value>true</value>\n" +
" <description>\n" +
" Disable cluster based hourly aggregations.\n" +
" </description>\n" +
" </property>\n" +
" <property>\n" +
" <name>timeline.metrics.cluster.aggregator.minute.disabled</name>\n" +
" <value>true</value>\n" +
" <description>\n" +
" Disable cluster based minute aggregations.\n" +
" </description>\n" +
" </property>" +
"</configuration>");
ClassLoader currentClassLoader = Thread.currentThread().getContextClassLoader();
// Add the conf dir to the classpath
// Chain the current thread classloader
URLClassLoader urlClassLoader = null;
try {
urlClassLoader = new URLClassLoader(new URL[] {
folder.getRoot().toURI().toURL() }, currentClassLoader);
} catch (MalformedURLException e) {
e.printStackTrace();
}
Thread.currentThread().setContextClassLoader(urlClassLoader);
metricsConf = new Configuration(false);
metricsConf.addResource(Thread.currentThread().getContextClassLoader()
.getResource(METRICS_SITE_CONFIGURATION_FILE).toURI().toURL());
assertNotNull(metricsConf.get("test"));
}
// simple test init/start/stop ApplicationHistoryServer. Status should change.
@Ignore
@Test(timeout = 50000)
public void testStartStopServer() throws Exception {
Configuration config = new YarnConfiguration();
UserGroupInformation ugi =
UserGroupInformation.createUserForTesting("ambari", new String[] {"ambari"});
mockStatic(UserGroupInformation.class);
expect(UserGroupInformation.getCurrentUser()).andReturn(ugi).anyTimes();
expect(UserGroupInformation.isSecurityEnabled()).andReturn(false).anyTimes();
config.set(YarnConfiguration.APPLICATION_HISTORY_STORE,
"org.apache.hadoop.yarn.server.applicationhistoryservice.NullApplicationHistoryStore");
Configuration hbaseConf = new Configuration();
hbaseConf.set("hbase.zookeeper.quorum", "localhost");
TimelineMetricConfiguration metricConfiguration = PowerMock.createNiceMock(TimelineMetricConfiguration.class);
expectNew(TimelineMetricConfiguration.class).andReturn(metricConfiguration);
expect(metricConfiguration.getHbaseConf()).andReturn(hbaseConf);
Configuration metricsConf = new Configuration();
expect(metricConfiguration.getMetricsConf()).andReturn(metricsConf).anyTimes();
expect(metricConfiguration.isTimelineMetricsServiceWatcherDisabled()).andReturn(true);
expect(metricConfiguration.getTimelineMetricsServiceHandlerThreadCount()).andReturn(20).anyTimes();
expect(metricConfiguration.getWebappAddress()).andReturn("localhost:9990").anyTimes();
expect(metricConfiguration.getTimelineServiceRpcAddress()).andReturn("localhost:10299").anyTimes();
expect(metricConfiguration.getClusterZKQuorum()).andReturn("localhost").anyTimes();
expect(metricConfiguration.getClusterZKClientPort()).andReturn("2181").anyTimes();
Connection connection = createNiceMock(Connection.class);
Statement stmt = createNiceMock(Statement.class);
PreparedStatement preparedStatement = createNiceMock(PreparedStatement.class);
ResultSet rs = createNiceMock(ResultSet.class);
mockStatic(DriverManager.class);
expect(DriverManager.getConnection("jdbc:phoenix:localhost:2181:/ams-hbase-unsecure"))
.andReturn(connection).anyTimes();
expect(connection.createStatement()).andReturn(stmt).anyTimes();
expect(connection.prepareStatement(anyString())).andReturn(preparedStatement).anyTimes();
suppress(method(Statement.class, "executeUpdate", String.class));
expect(preparedStatement.executeQuery()).andReturn(rs).anyTimes();
expect(rs.next()).andReturn(false).anyTimes();
preparedStatement.close();
expectLastCall().anyTimes();
connection.close();
expectLastCall();
MetricCollectorHAController haControllerMock = PowerMock.createMock(MetricCollectorHAController.class);
expectNew(MetricCollectorHAController.class, metricConfiguration)
.andReturn(haControllerMock);
haControllerMock.initializeHAController();
expectLastCall().once();
expect(haControllerMock.isInitialized()).andReturn(false).anyTimes();
org.apache.hadoop.hbase.client.Connection conn = createNiceMock(org.apache.hadoop.hbase.client.Connection.class);
mockStatic(ConnectionFactory.class);
expect(ConnectionFactory.createConnection((Configuration) anyObject())).andReturn(conn);
expect(conn.getAdmin()).andReturn(null);
EasyMock.replay(connection, stmt, preparedStatement, rs);
replayAll();
historyServer = new ApplicationHistoryServer();
historyServer.init(config);
verifyAll();
assertEquals(STATE.INITED, historyServer.getServiceState());
assertEquals(4, historyServer.getServices().size());
ApplicationHistoryClientService historyService =
historyServer.getClientService();
assertNotNull(historyServer.getClientService());
assertEquals(STATE.INITED, historyService.getServiceState());
historyServer.start();
assertEquals(STATE.STARTED, historyServer.getServiceState());
assertEquals(STATE.STARTED, historyService.getServiceState());
historyServer.stop();
assertEquals(STATE.STOPPED, historyServer.getServiceState());
}
// test launch method
@Ignore
@Test(timeout = 60000)
public void testLaunch() throws Exception {
UserGroupInformation ugi =
UserGroupInformation.createUserForTesting("ambari", new String[]{"ambari"});
mockStatic(UserGroupInformation.class);
expect(UserGroupInformation.getCurrentUser()).andReturn(ugi).anyTimes();
expect(UserGroupInformation.isSecurityEnabled()).andReturn(false).anyTimes();
ExitUtil.disableSystemExit();
try {
historyServer = ApplicationHistoryServer.launchAppHistoryServer(new String[0]);
} catch (ExitUtil.ExitException e) {
assertEquals(0, e.status);
ExitUtil.resetFirstExitException();
fail();
}
}
@After
public void stop() {
if (historyServer != null) {
historyServer.stop();
}
}
}