Package lcmc.testutils

Source Code of lcmc.testutils.IntegrationTestLauncher$Condition

/*
* This file is part of DRBD Management Console by LINBIT HA-Solutions GmbH
* written by Rasto Levrinc.
*
* Copyright (C) 2009, LINBIT HA-Solutions GmbH.
* Copyright (C) 2011-2012, Rastislav Levrinc.
*
* DRBD Management Console is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published
* by the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* DRBD Management Console 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with drbd; see the file COPYING.  If not, write to
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
*/

package lcmc.testutils;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import lcmc.LCMC;
import lcmc.common.ui.GUIData;
import lcmc.common.ui.ProgressIndicatorPanel;
import lcmc.common.domain.Application;
import lcmc.cluster.domain.Cluster;
import lcmc.host.domain.Host;
import lcmc.host.service.NetInterfaceService;
import lcmc.logger.LoggerFactory;
import lcmc.common.domain.util.Tools;
import lcmc.cluster.ui.ClusterTabFactory;

import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Provider;
import javax.inject.Singleton;

/**
* This class provides tools for testing.
*/
@Named
@Singleton
public class IntegrationTestLauncher {
    private static final String PASSWORD = "rastislav";
    private static final String ID_DSA_KEY = "rastislav";
    private static final String ID_RSA_KEY = "rastislav";

    private static final int NUMBER_OF_HOSTS = 2;
    private static final String TEST_USERNAME = "root";

    private final List<Host> hosts = new ArrayList<Host>();
    private volatile boolean clusterLoaded = false;

    @Inject
    private GUIData guiData;
    @Inject
    private Application application;
    @Inject
    private Provider<Host> hostProvider;
    @Inject
    private Provider<Cluster> clusterProvider;
    @Inject
    private ProgressIndicatorPanel glassPane;
    @Inject
    private LCMC lcmc;
    @Inject
    private ClusterTabFactory clusterTabFactory;
    @Inject
    private NetInterfaceService netInterfaceService;

    public void initTestCluster() {
        initCluster();
        application.waitForSwing();
    }

    /** Returns test hosts. */
    public List<Host> getHosts() {
        return Collections.unmodifiableList(this.hosts);
    }

    public boolean isClusterLoaded() {
        return clusterLoaded;
    }

    /** Print error and exit. */
    private void error(final String s) {
        System.out.println(s);
        System.exit(10);
    }

    private synchronized void initMain() {
        lcmc.launch(new String[]{"--no-upgrade-check"});
        application.waitForSwing();
    }

    /** Adds test cluster to the GUI. */
    private synchronized void initCluster() {
        if (clusterLoaded) {
            return;
        }
        initMain();
        application.waitForSwing();

        LoggerFactory.setDebugLevel(-1);
        final String username = TEST_USERNAME;
        final boolean useSudo = false;
        final Cluster cluster = clusterProvider.get();
        cluster.setName("test");
        for (int i = 1; i <= NUMBER_OF_HOSTS; i++) {
            final String hostName = "test" + i;
            final Host host = hostProvider.get();
            host.init();

            initHost(host, hostName, username, useSudo);
            hosts.add(host);
            host.setCluster(cluster);
            cluster.addHost(host);
            final String saveFile = application.getDefaultSaveFile();
            application.saveConfig(saveFile, false);
        }
        for (final Host host : hosts) {
            host.disconnect();
        }
        cluster.connect(null, true, 0);
        for (final Host host : hosts) {
            final boolean r = waitForCondition(
                new Condition() {
                    @Override
                    public boolean passed() {
                        return host.isConnected();
                    }
                }, 300, 20000);
            if (!r) {
                error("could not establish connection to " + host.getName());
            }
        }
        application.addClusterToClusters(cluster);
        application.invokeAndWait(new Runnable() {
            @Override
            public void run() {
                clusterTabFactory.createClusterTab(cluster);
            }
        });
       
        //guiData.getEmptyBrowser().addClusterBox(cluster);
        final String saveFile = application.getDefaultSaveFile();
        application.saveConfig(saveFile, false);
        guiData.refreshClustersPanel();
       
        guiData.expandTerminalSplitPane(GUIData.TerminalSize.COLLAPSE);
        cluster.getClusterTab().addClusterView();
        cluster.getClusterTab().requestFocus();
        guiData.checkAddClusterButtons();
        for (final Host host : hosts) {
            host.waitForServerStatusLatch();
        }
        clusterLoaded = true;
    }

    private Host initHost(final Host host, final String hostName, final String username, final boolean useSudo) {
        host.setEnteredHostOrIp(hostName);
        host.setUsername(username);
        host.setSSHPort("22");
        host.setUseSudo(useSudo);
       
        if (!application.existsHost(host)) {
            application.addHostToHosts(host);
        }
        String ip;
        InetAddress[] addresses;
        try {
            addresses = InetAddress.getAllByName(hostName);
            ip = addresses[0].getHostAddress();
            if (ip != null) {
                host.setHostname(InetAddress.getByName(ip).getHostName());
            }
        } catch (UnknownHostException e) {
            error("cannot resolve: " + hostName);
            return null;
        }
        host.getSSH().setPasswords(ID_DSA_KEY, ID_RSA_KEY, PASSWORD);
        host.setIpAddress(ip);
        host.setIps(0, new String[]{ip});
        return host;
    }

    /**
     * Wait for condition 'timeout' seconds, check every 'interval' second.
     * Return false if it ran to the timeout.
     */
    private boolean waitForCondition(final Condition condition, final int interval, final int timeout) {
        int timeoutLeft = timeout;
        while (!condition.passed() && timeout >= 0) {
            Tools.sleep(interval);
            timeoutLeft -= interval;
        }
        return timeoutLeft >= 0;
    }

    /** Specify a condition to be passed to the waitForCondition function. */
    private interface Condition {
        /** returns true if condition is true. */
        boolean passed();
    }

    public NetInterfaceService getNetInterfaceService() {
        return netInterfaceService;
    }
}
TOP

Related Classes of lcmc.testutils.IntegrationTestLauncher$Condition

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.