functionaltests.RestFuncTHelper.java Source code

Java tutorial

Introduction

Here is the source code for functionaltests.RestFuncTHelper.java

Source

/*
 * ProActive Parallel Suite(TM):
 * The Open Source library for parallel and distributed
 * Workflows & Scheduling, Orchestration, Cloud Automation
 * and Big Data Analysis on Enterprise Grids & Clouds.
 *
 * Copyright (c) 2007 - 2017 ActiveEon
 * Contact: contact@activeeon.com
 *
 * This library is free software: you can redistribute it and/or
 * modify it under the terms of the GNU Affero General Public License
 * as published by the Free Software Foundation: version 3 of
 * the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 *
 * If needed, contact us to obtain a release under GPL Version 2 or 3
 * or a different license than the AGPL.
 */
package functionaltests;

import static com.jayway.awaitility.Awaitility.await;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URL;
import java.security.PublicKey;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;

import org.apache.commons.httpclient.HttpStatus;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
import org.objectweb.proactive.api.PARemoteObject;
import org.objectweb.proactive.core.config.CentralPAPropertyRepository;
import org.objectweb.proactive.core.runtime.ProActiveRuntime;
import org.objectweb.proactive.extensions.pnp.PNPConfig;
import org.ow2.proactive.authentication.crypto.Credentials;
import org.ow2.proactive.resourcemanager.authentication.RMAuthentication;
import org.ow2.proactive.resourcemanager.core.properties.PAResourceManagerProperties;
import org.ow2.proactive.resourcemanager.frontend.RMConnection;
import org.ow2.proactive.resourcemanager.frontend.ResourceManager;
import org.ow2.proactive.scheduler.common.Scheduler;
import org.ow2.proactive.scheduler.common.SchedulerAuthenticationInterface;
import org.ow2.proactive.scheduler.common.SchedulerConnection;
import org.ow2.proactive.scheduler.common.SchedulerConstants;
import org.ow2.proactive.scheduler.core.properties.PASchedulerProperties;
import org.ow2.proactive.scheduler.util.SchedulerStarter;
import org.ow2.proactive.utils.CookieBasedProcessTreeKiller;

import com.jayway.awaitility.Duration;

import functionaltests.utils.ProcessStreamReader;
import functionaltests.utils.RestFuncTUtils;

public class RestFuncTHelper {

    final static URL defaultJobXml = AbstractRestFuncTestCase.class.getResource("config/test-job.xml");

    final static URL serverJavaPolicy = RestFuncTHelper.class.getResource("config/server-java.security.policy");

    final static URL rmHibernateConfig = RestFuncTHelper.class.getResource("config/rmHibernateConfig.xml");

    final static URL schedHibernateConfig = RestFuncTHelper.class.getResource("config/schedHibernateConfig.xml");

    public final static int DEFAULT_NUMBER_OF_NODES = 1;

    private static String restServerUrl;

    private static String restfulSchedulerUrl;

    private static Process schedProcess;

    private static Scheduler scheduler;

    private static ResourceManager rm;

    private static PublicKey schedulerPublicKey;

    private RestFuncTHelper() {
    }

    public static void startRestfulSchedulerWebapp(int nbNodes) throws Exception {
        // Kill all children processes on exit
        org.apache.log4j.BasicConfigurator.configure(new org.apache.log4j.varia.NullAppender());
        CookieBasedProcessTreeKiller.registerKillChildProcessesOnShutdown("rest_tests");

        List<String> cmd = new ArrayList<>();
        String javaPath = RestFuncTUtils.getJavaPathFromSystemProperties();
        cmd.add(javaPath);
        cmd.add("-Djava.security.manager");
        cmd.add(CentralPAPropertyRepository.JAVA_SECURITY_POLICY.getCmdLine() + toPath(serverJavaPolicy));

        cmd.add(CentralPAPropertyRepository.PA_HOME.getCmdLine() + getSchedHome());
        cmd.add(PASchedulerProperties.SCHEDULER_HOME.getCmdLine() + getSchedHome());
        cmd.add(PAResourceManagerProperties.RM_HOME.getCmdLine() + getRmHome());

        cmd.add(PAResourceManagerProperties.RM_DB_HIBERNATE_DROPDB.getCmdLine()
                + System.getProperty("rm.deploy.dropDB", "true"));
        cmd.add(PAResourceManagerProperties.RM_DB_HIBERNATE_CONFIG.getCmdLine() + toPath(rmHibernateConfig));

        cmd.add(PASchedulerProperties.SCHEDULER_DB_HIBERNATE_DROPDB.getCmdLine()
                + System.getProperty("scheduler.deploy.dropDB", "true"));
        cmd.add(PASchedulerProperties.SCHEDULER_DB_HIBERNATE_CONFIG.getCmdLine() + toPath(schedHibernateConfig));

        cmd.add(CentralPAPropertyRepository.PA_COMMUNICATION_PROTOCOL.getCmdLine() + "pnp");
        cmd.add(PNPConfig.PA_PNP_PORT.getCmdLine() + "1200");

        cmd.add("-cp");
        cmd.add(getClassPath());
        cmd.add(SchedulerStarter.class.getName());
        cmd.add("-ln");
        cmd.add("" + nbNodes);

        ProcessBuilder processBuilder = new ProcessBuilder(cmd);
        processBuilder.redirectErrorStream(true);
        schedProcess = processBuilder.start();

        ProcessStreamReader out = new ProcessStreamReader("scheduler-output: ", schedProcess.getInputStream());
        out.start();

        // RM and scheduler are on the same url
        String port = "1200";
        String url = "pnp://localhost:" + port + "/";

        // Connect a scheduler client
        SchedulerAuthenticationInterface schedAuth = SchedulerConnection.waitAndJoin(url,
                TimeUnit.SECONDS.toMillis(60));
        schedulerPublicKey = schedAuth.getPublicKey();
        Credentials schedCred = RestFuncTUtils.createCredentials("admin", "admin", schedulerPublicKey);
        scheduler = schedAuth.login(schedCred);

        // Connect a rm client
        RMAuthentication rmAuth = RMConnection.waitAndJoin(url, TimeUnit.SECONDS.toMillis(60));
        Credentials rmCredentials = getRmCredentials();
        rm = rmAuth.login(rmCredentials);

        restServerUrl = "http://localhost:8080/rest/";
        restfulSchedulerUrl = restServerUrl + "scheduler";

        await().atMost(Duration.FIVE_MINUTES).until(restIsStarted());
    }

    public static void stopRestfulSchedulerWebapp() {
        // Kill all rm nodes
        try {
            Set<String> urls = rm.listAliveNodeUrls();
            for (String nodeUrl : urls) {
                try {
                    ProActiveRuntime runtime = (ProActiveRuntime) PARemoteObject.lookup(URI.create(nodeUrl));
                    runtime.killRT(false);
                } catch (Throwable noNeed) {
                }
            }
            rm.shutdown(true);
        } catch (Throwable noNeed) {
        }

        System.out.println("Shutting down the scheduler.");
        try {
            scheduler.shutdown();
        } catch (Throwable ignore) {
        }

        // Destroy the scheduler process
        System.out.println("Shutting down scheduler process.");
        if (schedProcess != null) {
            try {
                RestFuncTUtils.destroy(schedProcess);
            } catch (Throwable error) {
                System.err.println("An error occurred while shutting down scheduler process:");
                error.printStackTrace();
            } finally {
                try {
                    RestFuncTUtils.cleanupActiveObjectRegistry(SchedulerConstants.SCHEDULER_DEFAULT_NAME);
                } catch (Throwable error) {

                }
            }
        }
    }

    private static Callable<Boolean> restIsStarted() {
        return new Callable<Boolean>() {
            @Override
            public Boolean call() throws Exception {
                try {
                    String resourceUrl = getResourceUrl("version");
                    HttpResponse response = HttpClientBuilder.create().build().execute(new HttpGet(resourceUrl));
                    int statusCode = response.getStatusLine().getStatusCode();
                    if (statusCode == HttpStatus.SC_OK) {
                        return true;
                    }
                } catch (IOException e) {
                }
                return false;
            }
        };
    }

    public static Scheduler getScheduler() {
        return scheduler;
    }

    public static PublicKey getSchedulerPublicKey() {
        return schedulerPublicKey;
    }

    public static String getString(InputStream is) {
        return new Scanner(is).useDelimiter("\\A").next();
    }

    public static File getDefaultJobXmlfile() throws Exception {
        return new File(defaultJobXml.toURI());
    }

    private static String toPath(URL url) throws Exception {
        return (new File(url.toURI())).getCanonicalPath();
    }

    private static String getRmHome() throws Exception {
        return RestFuncTestConfig.getInstance().getProperty(RestFuncTestConfig.RESTAPI_TEST_RM_HOME);
    }

    private static String getSchedHome() throws Exception {
        return RestFuncTestConfig.getInstance().getProperty(RestFuncTestConfig.RESTAPI_TEST_SCHEDULER_HOME);
    }

    private static Credentials getRmCredentials() throws Exception {
        File rmCredentails = new File(getRmHome(), "config/authentication/rm.cred");
        return Credentials.getCredentials(new FileInputStream(rmCredentails));
    }

    private static String getClassPath() throws Exception {
        return (getRmHome() + File.separator + "dist" + File.separator + "lib" + File.separator + "*")
                + File.pathSeparatorChar + getRmHome() + File.separator + "addons" + File.separator + "*"
                + File.pathSeparatorChar + System.getProperty("java.class.path");
    }

    public static String getRestServerUrl() {
        return restServerUrl;
    }

    public static String getRestfulSchedulerUrl() {
        return restfulSchedulerUrl;
    }

    public static String getResourceUrl(String resource) {
        String restUrl = RestFuncTHelper.getRestfulSchedulerUrl();
        if (!restUrl.endsWith("/")) {
            restUrl = restUrl + "/";
        }
        return restUrl + resource;
    }
}