Package org.springframework.yarn.boot.app

Source Code of org.springframework.yarn.boot.app.AbstractApplicationTests

/*
* Copyright 2014 the original author or authors.
*
* 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.springframework.yarn.boot.app;

import java.io.IOException;
import java.util.Collection;
import java.util.Properties;
import java.util.concurrent.TimeUnit;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.yarn.api.records.ApplicationId;
import org.apache.hadoop.yarn.api.records.ApplicationReport;
import org.apache.hadoop.yarn.api.records.YarnApplicationState;
import org.junit.After;
import org.junit.Before;
import org.springframework.data.hadoop.fs.FsShell;
import org.springframework.yarn.client.YarnClient;
import org.springframework.yarn.client.YarnClientFactoryBean;
import org.springframework.yarn.test.context.YarnCluster;
import org.springframework.yarn.test.support.ClusterInfo;
import org.springframework.yarn.test.support.YarnClusterManager;

/**
* Common shared stuff handling for application tests. For example we use rather
* low level minicluster handling here to have hdfs/yarn system setup for tests.
* In tests we want to be as close as possible for real use case so we don't
* even try to use any magic from rest of the testing support.
* <p>
* Tests derived from this class will assume existence of
* build/libs/test-archive-appmaster.jar which is a custom boot packaged jar
* having a dummy StartExitAppmaster class.
* <p>
* We don't run any containers because focus on these tests is to test app
* install/submit/info/query classes.
*
* @author Janne Valkealahti
*
*/
public abstract class AbstractApplicationTests {

  private final static Log log = LogFactory.getLog(AbstractApplicationTests.class);

  protected final static String APPMASTER_ARCHIVE = "test-archive-appmaster.jar";
  protected final static String APPMASTER_ARCHIVE_PATH = "file:build/libs/" + APPMASTER_ARCHIVE;

  protected YarnCluster cluster;
  protected Configuration configuration;

  @Before
  public void setup() throws Exception {
    YarnClusterManager manager = YarnClusterManager.getInstance();
    cluster = manager.getCluster(new ClusterInfo());
    cluster.start();
    configuration = cluster.getConfiguration();
  }

  @After
  public void clean() {
    if (cluster != null) {
      YarnClusterManager manager = YarnClusterManager.getInstance();
      manager.close();
      cluster = null;
    }
    configuration = null;
  }

  protected void listFiles(Configuration configuration) {
    @SuppressWarnings("resource")
    FsShell shell = new FsShell(configuration);
    for (FileStatus s : shell.ls(true, "/")) {
      log.info("status " + s);
    }
  }

  protected void catFile(String path) {
    @SuppressWarnings("resource")
    FsShell shell = new FsShell(configuration);
    Collection<String> text = shell.text(path);
    if (text.size() == 1) {
      log.info(text.iterator().next());
    }
  }

  protected Properties readApplicationProperties(Path path) throws IOException {
    FileSystem fs = null;
    FSDataInputStream in = null;
    Properties properties = null;
    IOException ioe = null;
    try {
      fs = path.getFileSystem(configuration);
      if (fs.exists(path)) {
        in = fs.open(path);
        properties = new Properties();
        properties.load(in);
      }
    }
    catch (IOException e) {
      ioe = e;
    }
    finally {
      if (in != null) {
        try {
          in.close();
          in = null;
        }
        catch (IOException e) {
        }
      }
      fs = null;
    }
    if (ioe != null) {
      throw ioe;
    }
    return properties;
  }

  protected YarnApplicationState waitState(ApplicationId applicationId, long timeout, TimeUnit unit,
      YarnApplicationState... applicationStates) throws Exception {
    YarnApplicationState state = null;
    long end = System.currentTimeMillis() + unit.toMillis(timeout);

    // break label for inner loop
    done: do {
      state = findState(getYarnClient(), applicationId);
      if (state == null) {
        break;
      }
      for (YarnApplicationState stateCheck : applicationStates) {
        if (state.equals(stateCheck)) {
          break done;
        }
      }
      Thread.sleep(1000);
    } while (System.currentTimeMillis() < end);
    return state;
  }

  protected YarnApplicationState findState(YarnClient client, ApplicationId applicationId) {
    YarnApplicationState state = null;
    for (ApplicationReport report : client.listApplications()) {
      if (report.getApplicationId().equals(applicationId)) {
        state = report.getYarnApplicationState();
        break;
      }
    }
    return state;
  }

  protected YarnClient getYarnClient() throws Exception {
    YarnClientFactoryBean factory = new YarnClientFactoryBean();
    factory.setConfiguration(configuration);
    factory.afterPropertiesSet();
    return factory.getObject();
  }

  protected ApplicationReport findApplicationReport(ApplicationId applicationId) throws Exception {
    YarnClient client = getYarnClient();
    for (ApplicationReport report : client.listApplications()) {
      if (report.getApplicationId().equals(applicationId)) {
        client = null;
        return report;
      }
    }
    client = null;
    return null;
  }

}
TOP

Related Classes of org.springframework.yarn.boot.app.AbstractApplicationTests

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.