/*
* 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.cluster.ui.wizard;
import javax.inject.Inject;
import javax.inject.Named;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.SpringLayout;
import lcmc.common.ui.utils.SwingUtils;
import lcmc.host.domain.Host;
import lcmc.common.ui.SpringUtilities;
import lcmc.common.ui.WizardDialog;
import lcmc.logger.Logger;
import lcmc.logger.LoggerFactory;
import lcmc.common.domain.util.Tools;
/**
* An implementation of a dialog where connection to every host will be checked
* and established if there isn't one.
*/
@Named
final class Connect extends DialogCluster {
private static final Logger LOG = LoggerFactory.getLogger(Connect.class);
@Inject
private CommStack commStackDialog;
@Inject
private SwingUtils swingUtils;
@Override
public WizardDialog nextDialog() {
commStackDialog.init(getPreviousDialog(), getCluster());
return commStackDialog;
}
@Override
protected String getClusterDialogTitle() {
return Tools.getString("Dialog.Cluster.Connect.Title");
}
@Override
protected String getDescription() {
return Tools.getString("Dialog.Cluster.Connect.Description");
}
/** Checks hosts, if they are connected and if not reconnects them. */
protected void checkHosts() {
final StringBuilder text = new StringBuilder();
boolean pending = false;
boolean oneFailed = false;
for (final Host host : getCluster().getHosts()) {
final String status;
if (host.getSSH().isConnectionFailed()) {
status = "failed.";
oneFailed = true;
} else if (host.isConnected()) {
status = "connected.";
} else {
pending = true;
status = "connecting...";
}
text.append(host.getName()).append(' ').append(status).append('\n');
}
LOG.debug("checkHosts: pending: " + pending + ", one failed: " + oneFailed);
if (pending) {
answerPaneSetText(text.toString());
} else if (oneFailed) {
printErrorAndRetry(text.toString());
} else {
answerPaneSetText(text.toString());
try {
Thread.sleep(1000);
} catch (final InterruptedException ex) {
Thread.currentThread().interrupt();
}
swingUtils.invokeLater(new Runnable() {
@Override
public void run() {
buttonClass(nextButton()).pressButton();
}
});
}
}
protected void connectHosts() {
getCluster().connect(getDialogPanel(), true, 1);
for (final Host host : getCluster().getHosts()) {
host.waitOnLoading();
}
checkHosts();
}
@Override
protected void initDialogBeforeVisible() {
super.initDialogBeforeVisible();
enableComponentsLater(new JComponent[]{buttonClass(nextButton())});
}
@Override
protected void initDialogAfterVisible() {
final Thread t = new Thread(new Runnable() {
@Override
public void run() {
connectHosts();
}
});
t.start();
}
@Override
protected JComponent getInputPane() {
final JPanel pane = new JPanel(new SpringLayout());
final StringBuilder text = new StringBuilder();
for (final Host host : getCluster().getHosts()) {
text.append(host.getName());
text.append(" connecting...\n");
}
pane.add(getAnswerPane(text.toString()));
SpringUtilities.makeCompactGrid(pane, 1, 1, // rows, cols
1, 1, // initX, initY
1, 1); // xPad, yPad
return pane;
}
@Override
protected boolean skipButtonEnabled() {
return true;
}
}