blob: 219a28fe193a6ba7da243dad60177c18a021d464 [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.resourcemanager.applicationsmanager;
import java.util.concurrent.atomic.AtomicInteger;
import junit.framework.Assert;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.yarn.api.records.ApplicationId;
import org.apache.hadoop.yarn.api.records.YarnApplicationState;
import org.apache.hadoop.yarn.api.records.ApplicationStatus;
import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext;
import org.apache.hadoop.yarn.event.EventHandler;
import org.apache.hadoop.yarn.factories.RecordFactory;
import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider;
import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
import org.apache.hadoop.yarn.server.resourcemanager.RMContextImpl;
import org.apache.hadoop.yarn.server.resourcemanager.amlauncher.AMLauncherEventType;
import org.apache.hadoop.yarn.server.resourcemanager.recovery.MemStore;
import org.apache.hadoop.yarn.server.resourcemanager.recovery.StoreFactory;
import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.AMLivelinessMonitor;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class TestASMStateMachine {
// private static final Log LOG = LogFactory.getLog(TestASMStateMachine.class);
// private static RecordFactory recordFactory = RecordFactoryProvider.getRecordFactory(null);
// RMContext context = new RMContextImpl(new MemStore());
// EventHandler handler;
// private boolean snreceivedCleanUp = false;
// private boolean snAllocateReceived = false;
// private boolean launchCalled = false;
// private boolean addedApplication = false;
// private boolean removedApplication = false;
// private boolean launchCleanupCalled = false;
// private AtomicInteger waitForState = new AtomicInteger();
// private Configuration conf = new Configuration();
// @Before
// public void setUp() {
// context.getDispatcher().init(conf);
// context.getDispatcher().start();
// handler = context.getDispatcher().getEventHandler();
// new DummyAMLaunchEventHandler();
// new DummySNEventHandler();
// new ApplicationTracker();
// new MockAppplicationMasterInfo();
// }
//
// @After
// public void tearDown() {
//
// }
//
// private class DummyAMLaunchEventHandler implements EventHandler<ASMEvent<AMLauncherEventType>> {
// AppAttempt application;
// AtomicInteger amsync = new AtomicInteger(0);
//
// public DummyAMLaunchEventHandler() {
// context.getDispatcher().register(AMLauncherEventType.class, this);
// }
//
// @Override
// public void handle(ASMEvent<AMLauncherEventType> event) {
// switch(event.getType()) {
// case LAUNCH:
// launchCalled = true;
// application = event.getApplication();
// context.getDispatcher().getEventHandler().handle(
// new ApplicationEvent(ApplicationEventType.LAUNCHED,
// application.getApplicationID()));
// break;
// case CLEANUP:
// launchCleanupCalled = true;
// break;
// }
// }
// }
//
// private class DummySNEventHandler implements EventHandler<ASMEvent<SNEventType>> {
// AppAttempt application;
// AtomicInteger snsync = new AtomicInteger(0);
//
// public DummySNEventHandler() {
// context.getDispatcher().register(SNEventType.class, this);
// }
//
// @Override
// public void handle(ASMEvent<SNEventType> event) {
// switch(event.getType()) {
// case RELEASE:
// snreceivedCleanUp = true;
// break;
// case SCHEDULE:
// snAllocateReceived = true;
// application = event.getAppAttempt();
// context.getDispatcher().getEventHandler().handle(
// new AMAllocatedEvent(application.getApplicationID(),
// application.getMasterContainer()));
// break;
// }
// }
//
// }
//
// private class ApplicationTracker implements EventHandler<ASMEvent<ApplicationTrackerEventType>> {
// public ApplicationTracker() {
// context.getDispatcher().register(ApplicationTrackerEventType.class, this);
// }
//
// @Override
// public void handle(ASMEvent<ApplicationTrackerEventType> event) {
// switch (event.getType()) {
// case ADD:
// addedApplication = true;
// break;
// case REMOVE:
// removedApplication = true;
// break;
// }
// }
// }
//
// private class MockAppplicationMasterInfo implements
// EventHandler<ApplicationEvent> {
//
// MockAppplicationMasterInfo() {
// context.getDispatcher().register(ApplicationEventType.class, this);
// }
// @Override
// public void handle(ApplicationEvent event) {
// LOG.info("The event type is " + event.getType());
// }
// }
//
// private void waitForState( ApplicationState
// finalState, AppAttemptImpl masterInfo) throws Exception {
// int count = 0;
// while(masterInfo.getState() != finalState && count < 10) {
// Thread.sleep(500);
// count++;
// }
// Assert.assertEquals(finalState, masterInfo.getState());
// }
//
// /* Test the state machine.
// *
// */
// @Test
// public void testStateMachine() throws Exception {
// ApplicationSubmissionContext submissioncontext = recordFactory.newRecordInstance(ApplicationSubmissionContext.class);
// submissioncontext.setApplicationId(recordFactory.newRecordInstance(ApplicationId.class));
// submissioncontext.getApplicationId().setId(1);
// submissioncontext.getApplicationId().setClusterTimestamp(System.currentTimeMillis());
//
// AppAttemptImpl masterInfo = new AppAttemptImpl(context,
// conf, "dummyuser", submissioncontext, "dummyToken", StoreFactory
// .createVoidAppStore(), new AMLivelinessMonitor(context
// .getDispatcher().getEventHandler()));
//
// context.getDispatcher().register(ApplicationEventType.class, masterInfo);
// handler.handle(new ApplicationEvent(
// ApplicationEventType.ALLOCATE, submissioncontext.getApplicationId()));
//
// waitForState(ApplicationState.LAUNCHED, masterInfo);
// Assert.assertTrue(snAllocateReceived);
// Assert.assertTrue(launchCalled);
// Assert.assertTrue(addedApplication);
// handler
// .handle(new AMRegistrationEvent(masterInfo.getMaster()));
// waitForState(ApplicationState.RUNNING, masterInfo);
// Assert.assertEquals(ApplicationState.RUNNING, masterInfo.getState());
//
// ApplicationStatus status = recordFactory
// .newRecordInstance(ApplicationStatus.class);
// status.setApplicationId(masterInfo.getApplicationID());
// handler.handle(new AMStatusUpdateEvent(status));
//
// /* check if the state is still RUNNING */
//
// Assert.assertEquals(ApplicationState.RUNNING, masterInfo.getState());
//
// handler.handle(new AMFinishEvent(masterInfo.getApplicationID(),
// ApplicationState.COMPLETED, "", ""));
// waitForState(ApplicationState.COMPLETED, masterInfo);
// Assert.assertEquals(ApplicationState.COMPLETED, masterInfo.getState());
// /* check if clean up is called for everyone */
// Assert.assertTrue(launchCleanupCalled);
// Assert.assertTrue(snreceivedCleanUp);
// Assert.assertTrue(removedApplication);
//
// /* check if expiry doesnt make it failed */
// handler.handle(new ApplicationEvent(ApplicationEventType.EXPIRE,
// masterInfo.getApplicationID()));
// Assert.assertEquals(ApplicationState.COMPLETED, masterInfo.getState());
// }
}