/** * Starts file chooser. * * @param dir whether it needs dir or file */ protected void startFileChooser( final Widget paramWi, final String directory, final boolean dirOnly) { final Host host = getFirstConnectedHost(); if (host == null) { Tools.appError("Connection to host lost."); return; } final VMSHardwareInfo thisClass = this; final JFileChooser fc = new JFileChooser(getLinuxDir(directory, host), getFileSystemView(host, directory)) { /** Serial version UID. */ private static final long serialVersionUID = 1L; @Override public final void setCurrentDirectory(final File dir) { super.setCurrentDirectory(new LinuxFile(thisClass, host, dir.toString(), "d", 0, 0)); } }; fc.setBackground(ClusterBrowser.STATUS_BACKGROUND); fc.setDialogType(JFileChooser.CUSTOM_DIALOG); if (dirOnly) { fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); } fc.setDialogTitle(Tools.getString("VMSDiskInfo.FileChooserTitle") + host.getName()); // fc.setApproveButtonText(Tools.getString("VMSDiskInfo.Approve")); fc.setApproveButtonToolTipText(Tools.getString("VMSDiskInfo.Approve.ToolTip")); fc.putClientProperty("FileChooser.useShellFolder", Boolean.FALSE); final int ret = fc.showDialog(Tools.getGUIData().getMainFrame(), Tools.getString("VMSDiskInfo.Approve")); linuxFileCache.clear(); if (ret == JFileChooser.APPROVE_OPTION && fc.getSelectedFile() != null) { final String name = fc.getSelectedFile().getAbsolutePath(); paramWi.setValue(name); } }
static void start(final int count) { slowFactor = 0.5f; aborted = false; final int gx = 235; final int gy = 207; disableStonith(); for (int i = count; i > 0; i--) { if (i % 5 == 0) { info("testA I: " + i); } checkTest("testA", 1); /* group with dummy resources */ moveTo(gx, gy); sleep(1000); rightClick(); /* popup */ sleep(1000); moveTo(Tools.getString("ClusterBrowser.Hb.AddGroup")); leftClick(); sleep(3000); /* create dummy */ moveTo(gx + 46, gy + 11); rightClick(); /* group popup */ sleep(2000); moveTo(Tools.getString("ClusterBrowser.Hb.AddGroupService")); sleep(1000); moveTo("OCF Resource Agents"); sleep(1000); typeDummy(); sleep(300); setTimeouts(true); moveTo(Tools.getString("Browser.ApplyResource")); sleep(6000); leftClick(); sleep(6000); checkTest("testA", 2); stopResource(gx, gy); sleep(6000); checkTest("testA", 3); /* copy/paste */ moveTo(gx + 10, gy + 10); leftClick(); robot.keyPress(KeyEvent.VK_CONTROL); press(KeyEvent.VK_C); press(KeyEvent.VK_V); robot.keyRelease(KeyEvent.VK_CONTROL); moveTo(gx + 10, gy + 90); leftClick(); moveTo(Tools.getString("Browser.ApplyGroup")); sleep(4000); leftClick(); checkTest("testA", 4); removeResource(gx, gy, CONFIRM_REMOVE); removeResource(gx, gy + 90, CONFIRM_REMOVE); resetTerminalAreas(); } System.gc(); }
/** prints error text in the answer pane, reenables buttons and adds retry button. */ public final void printErrorAndRetry(String text, final String ans, final int exitCode) { if (ans != null) { text += "\n" + Tools.getString("Dialog.Dialog.PrintErrorAndRetry") + exitCode + "\n" + ans; } answerPaneSetTextError(text); addRetryButton(); if (buttonClass(retryButton()) != null) { SwingUtilities.invokeLater( new Runnable() { @Override public void run() { buttonClass(retryButton()).requestFocus(); } }); } if (buttonClass(nextButton()) != null) { enableComponents(new JComponent[] {buttonClass(nextButton())}); SwingUtilities.invokeLater( new Runnable() { @Override public void run() { buttonClass(nextButton()).setEnabled(false); } }); } }
/** Removes this group from the cib. */ @Override public void removeMyself(final boolean testOnly) { if (getService().isNew()) { removeMyselfNoConfirm(getBrowser().getDCHost(), testOnly); getService().setNew(false); super.removeInfo(); getService().doneRemoving(); return; } String desc = Tools.getString("ClusterBrowser.confirmRemoveGroup.Description"); final StringBuilder services = new StringBuilder(); @SuppressWarnings("unchecked") final Enumeration<DefaultMutableTreeNode> e = getNode().children(); try { while (e.hasMoreElements()) { final DefaultMutableTreeNode n = e.nextElement(); final ServiceInfo child = (ServiceInfo) n.getUserObject(); services.append(child.toString()); if (e.hasMoreElements()) { services.append(", "); } } } catch (java.util.NoSuchElementException ele) { LOG.info("removeMyself: removing aborted"); return; } desc = desc.replaceAll("@GROUP@", "'" + Matcher.quoteReplacement(toString()) + "'"); desc = desc.replaceAll("@SERVICES@", Matcher.quoteReplacement(services.toString())); if (Tools.confirmDialog( Tools.getString("ClusterBrowser.confirmRemoveGroup.Title"), desc, Tools.getString("ClusterBrowser.confirmRemoveGroup.Yes"), Tools.getString("ClusterBrowser.confirmRemoveGroup.No"))) { if (!testOnly) { getService().setRemoved(true); } removeMyselfNoConfirm(getBrowser().getDCHost(), testOnly); super.removeInfo(); getService().setNew(false); } getService().doneRemoving(); }
/** Removes this hardware from the libvirt with confirmation dialog. */ @Override public final void removeMyself(final boolean testOnly) { if (getResource().isNew()) { super.removeMyself(testOnly); getResource().setNew(false); removeNode(); return; } String desc = Tools.getString("VMSHardwareInfo.confirmRemove.Description"); desc = desc.replaceAll("@HW@", Matcher.quoteReplacement(toString())); if (Tools.confirmDialog( Tools.getString("VMSHardwareInfo.confirmRemove.Title"), desc, Tools.getString("VMSHardwareInfo.confirmRemove.Yes"), Tools.getString("VMSHardwareInfo.confirmRemove.No"))) { removeMyselfNoConfirm(testOnly); getResource().setNew(false); } }
/** Returns list of menu items. */ @Override public final List<UpdatableItem> createPopup() { final List<UpdatableItem> items = new ArrayList<UpdatableItem>(); final boolean testOnly = false; /* remove service */ final MyMenuItem removeMenuItem = new MyMenuItem( Tools.getString("VMSHardwareInfo.Menu.Remove"), ClusterBrowser.REMOVE_ICON, ClusterBrowser.STARTING_PTEST_TOOLTIP, Tools.getString("VMSHardwareInfo.Menu.Cancel"), ClusterBrowser.REMOVE_ICON, ClusterBrowser.STARTING_PTEST_TOOLTIP, new AccessMode(ConfigData.AccessType.ADMIN, false), new AccessMode(ConfigData.AccessType.OP, false)) { private static final long serialVersionUID = 1L; @Override public boolean predicate() { return !getResource().isNew(); } @Override public String enablePredicate() { if (getResource().isNew()) { return null; } return isRemoveable(); } @Override public void action() { hidePopup(); removeMyself(false); } }; addMouseOverListener(removeMenuItem, null); items.add((UpdatableItem) removeMenuItem); return items; }
/** Returns string representation of the ip address. In the form of 'ip (interface)' */ @Override public String toString() { final String id = getService().getId(); if (id == null) { return super.toString(); /* this is for 'new IPaddrInfo' */ } final StringBuilder s = new StringBuilder(getName()); final String inside = id + " / "; String ip = getParamSaved("ip"); if (ip == null || "".equals(ip)) { ip = Tools.getString("ClusterBrowser.Ip.Unconfigured"); } s.append(" ("); s.append(inside); s.append(ip); s.append(')'); return s.toString(); }
/** Returns combo box for parameter. */ @Override protected GuiComboBox getParamComboBox(final String param, final String prefix, final int width) { GuiComboBox paramCb; if ("ip".equals(param)) { /* get networks */ String ip = getPreviouslySelected(param, prefix); if (ip == null) { ip = getParamSaved(param); } Info defaultValue; if (ip == null || "".equals(ip)) { defaultValue = new StringInfo(Tools.getString("ClusterBrowser.SelectNetInterface"), ip, getBrowser()); } else { defaultValue = new StringInfo(ip, ip, getBrowser()); } final Info[] networks = enumToInfoArray(defaultValue, getName(), getBrowser().getNetworksNode().children()); final String regexp = "^[\\d.*]*|Select\\.\\.\\.$"; paramCb = new GuiComboBox( ip, networks, null, /* units */ GuiComboBox.Type.COMBOBOX, regexp, width, null, /* abbrv */ new AccessMode(getAccessType(param), isEnabledOnlyInAdvancedMode(param))); paramCb.setAlwaysEditable(true); paramComboBoxAdd(param, prefix, paramCb); } else { paramCb = super.getParamComboBox(param, prefix, width); } return paramCb; }
/** * Returns the title of the dialog. It is defined as Dialog.DrbdConfig.Resource.Title in * TextResources. */ @Override protected String getDialogTitle() { return Tools.getString("Dialog.DrbdConfig.Resource.Title"); }
/** * Returns the description of the dialog. It is defined as Dialog.DrbdConfig.Resource.Description * in TextResources. */ @Override protected String getDescription() { return Tools.getString("Dialog.DrbdConfig.Resource.Description"); }
/** Returns text that appears above the icon in the graph. */ public String getIconTextForGraph(final boolean testOnly) { if (!getHost().isConnected()) { return Tools.getString("HostBrowser.Hb.NoInfoAvailable"); } return null; }
static { TOOLTIP_MAP.put( DiskData.SOURCE_HOST_NAME, Tools.getString("VMSDiskInfo.Param.SourceHostName.ToolTip")); TOOLTIP_MAP.put( DiskData.SOURCE_HOST_PORT, Tools.getString("VMSDiskInfo.Param.SourceHostPort.ToolTip")); }
/** Returns info panel. */ @Override public JComponent getInfoPanel() { if (getBrowser().getClusterBrowser() == null) { return new JPanel(); } final Font f = new Font("Monospaced", Font.PLAIN, Tools.getConfigData().scaled(12)); crmShowInProgress = true; final JTextArea ta = new JTextArea(Tools.getString("HostInfo.crmShellLoading")); ta.setEditable(false); ta.setFont(f); final MyButton crmConfigureCommitButton = new MyButton(Tools.getString("HostInfo.crmShellCommitButton"), Browser.APPLY_ICON); registerComponentEnableAccessMode( crmConfigureCommitButton, new AccessMode(ConfigData.AccessType.ADMIN, false)); final MyButton hostInfoButton = new MyButton(Tools.getString("HostInfo.crmShellStatusButton")); hostInfoButton.miniButton(); final MyButton crmConfigureShowButton = new MyButton(Tools.getString("HostInfo.crmShellShowButton")); crmConfigureShowButton.miniButton(); crmConfigureCommitButton.setEnabled(false); final ExecCallback execCallback = new ExecCallback() { @Override public void done(final String ans) { ta.setText(ans); SwingUtilities.invokeLater( new Runnable() { public void run() { crmConfigureShowButton.setEnabled(true); hostInfoButton.setEnabled(true); crmShowInProgress = false; } }); } @Override public void doneError(final String ans, final int exitCode) { ta.setText(ans); Tools.sshError(host, "", ans, "", exitCode); SwingUtilities.invokeLater( new Runnable() { public void run() { crmConfigureCommitButton.setEnabled(false); } }); } }; hostInfoButton.addActionListener( new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { registerComponentEditAccessMode(ta, new AccessMode(ConfigData.AccessType.GOD, false)); crmInfo = true; hostInfoButton.setEnabled(false); crmConfigureCommitButton.setEnabled(false); String command = "HostBrowser.getHostInfo"; if (!host.isCsInit()) { command = "HostBrowser.getHostInfoHeartbeat"; } host.execCommand( command, execCallback, null, /* ConvertCmdCallback */ false, /* outputVisible */ SSH.DEFAULT_COMMAND_TIMEOUT); } }); host.registerEnableOnConnect(hostInfoButton); crmConfigureShowButton.addActionListener( new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { registerComponentEditAccessMode(ta, new AccessMode(ConfigData.AccessType.ADMIN, false)); updateAdvancedPanels(); crmShowInProgress = true; crmInfo = false; crmConfigureShowButton.setEnabled(false); crmConfigureCommitButton.setEnabled(false); host.execCommand( "HostBrowser.getCrmConfigureShow", execCallback, null, /* ConvertCmdCallback */ false, /* outputVisible */ SSH.DEFAULT_COMMAND_TIMEOUT); } }); final CRMGraph crmg = getBrowser().getClusterBrowser().getCRMGraph(); final Document taDocument = ta.getDocument(); taDocument.addDocumentListener( new DocumentListener() { private void update() { if (!crmShowInProgress && !crmInfo) { crmConfigureCommitButton.setEnabled(true); } } public void changedUpdate(final DocumentEvent documentEvent) { update(); } public void insertUpdate(final DocumentEvent documentEvent) { update(); } public void removeUpdate(final DocumentEvent documentEvent) { update(); } }); final ButtonCallback buttonCallback = new ButtonCallback() { private volatile boolean mouseStillOver = false; /** Whether the whole thing should be enabled. */ @Override public boolean isEnabled() { if (Tools.versionBeforePacemaker(host)) { return false; } return true; } @Override public void mouseOut() { if (!isEnabled()) { return; } mouseStillOver = false; crmg.stopTestAnimation(crmConfigureCommitButton); crmConfigureCommitButton.setToolTipText(null); } @Override public void mouseOver() { if (!isEnabled()) { return; } mouseStillOver = true; crmConfigureCommitButton.setToolTipText(ClusterBrowser.STARTING_PTEST_TOOLTIP); crmConfigureCommitButton.setToolTipBackground( Tools.getDefaultColor("ClusterBrowser.Test.Tooltip.Background")); Tools.sleep(250); if (!mouseStillOver) { return; } mouseStillOver = false; final CountDownLatch startTestLatch = new CountDownLatch(1); crmg.startTestAnimation(crmConfigureCommitButton, startTestLatch); final Host dcHost = getBrowser().getClusterBrowser().getDCHost(); getBrowser().getClusterBrowser().ptestLockAcquire(); final ClusterStatus clStatus = getBrowser().getClusterBrowser().getClusterStatus(); clStatus.setPtestData(null); CRM.crmConfigureCommit(host, ta.getText(), true); final PtestData ptestData = new PtestData(CRM.getPtest(dcHost)); crmConfigureCommitButton.setToolTipText(ptestData.getToolTip()); clStatus.setPtestData(ptestData); getBrowser().getClusterBrowser().ptestLockRelease(); startTestLatch.countDown(); } }; addMouseOverListener(crmConfigureCommitButton, buttonCallback); crmConfigureCommitButton.addActionListener( new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { crmConfigureCommitButton.setEnabled(false); final Thread thread = new Thread( new Runnable() { @Override public void run() { getBrowser().getClusterBrowser().clStatusLock(); final String ret = CRM.crmConfigureCommit(host, ta.getText(), false); getBrowser().getClusterBrowser().clStatusUnlock(); } }); thread.start(); } }); final JPanel mainPanel = new JPanel(); mainPanel.setBackground(HostBrowser.PANEL_BACKGROUND); mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); final JPanel buttonPanel = new JPanel(new BorderLayout()); buttonPanel.setBackground(HostBrowser.BUTTON_PANEL_BACKGROUND); buttonPanel.setMinimumSize(new Dimension(0, 50)); buttonPanel.setPreferredSize(new Dimension(0, 50)); buttonPanel.setMaximumSize(new Dimension(Short.MAX_VALUE, 50)); mainPanel.add(buttonPanel); /* Actions */ buttonPanel.add(getActionsButton(), BorderLayout.EAST); final JPanel p = new JPanel(new SpringLayout()); p.setBackground(HostBrowser.BUTTON_PANEL_BACKGROUND); p.add(hostInfoButton); p.add(crmConfigureShowButton); p.add(crmConfigureCommitButton); p.add(new JLabel("")); SpringUtilities.makeCompactGrid( p, 1, 3, // rows, cols 1, 1, // initX, initY 1, 1); // xPad, yPad mainPanel.setMinimumSize( new Dimension( Tools.getDefaultSize("HostBrowser.ResourceInfoArea.Width"), Tools.getDefaultSize("HostBrowser.ResourceInfoArea.Height"))); mainPanel.setPreferredSize( new Dimension( Tools.getDefaultSize("HostBrowser.ResourceInfoArea.Width"), Tools.getDefaultSize("HostBrowser.ResourceInfoArea.Height"))); buttonPanel.add(p); mainPanel.add(new JLabel(Tools.getString("HostInfo.crmShellInfo"))); mainPanel.add(new JScrollPane(ta)); String command = "HostBrowser.getHostInfo"; if (!host.isCsInit()) { command = "HostBrowser.getHostInfoHeartbeat"; } host.execCommand( command, execCallback, null, /* ConvertCmdCallback */ false, /* outputVisible */ SSH.DEFAULT_COMMAND_TIMEOUT); return mainPanel; }
/** Creates the popup for the host. */ @Override public List<UpdatableItem> createPopup() { final List<UpdatableItem> items = new ArrayList<UpdatableItem>(); final boolean testOnly = false; /* host wizard */ final MyMenuItem hostWizardItem = new MyMenuItem( Tools.getString("HostBrowser.HostWizard"), HostBrowser.HOST_ICON_LARGE, "", new AccessMode(ConfigData.AccessType.RO, false), new AccessMode(ConfigData.AccessType.RO, false)) { private static final long serialVersionUID = 1L; @Override public String enablePredicate() { return null; } @Override public void action() { final EditHostDialog dialog = new EditHostDialog(host); dialog.showDialogs(); } }; items.add(hostWizardItem); Tools.getGUIData().registerAddHostButton(hostWizardItem); /* cluster manager standby on/off */ final HostInfo thisClass = this; final MyMenuItem standbyItem = new MyMenuItem( Tools.getString("HostBrowser.CRM.StandByOn"), HOST_STANDBY_ICON, ClusterBrowser.STARTING_PTEST_TOOLTIP, Tools.getString("HostBrowser.CRM.StandByOff"), HOST_STANDBY_OFF_ICON, ClusterBrowser.STARTING_PTEST_TOOLTIP, new AccessMode(ConfigData.AccessType.OP, false), new AccessMode(ConfigData.AccessType.OP, false)) { private static final long serialVersionUID = 1L; @Override public boolean predicate() { return !isStandby(testOnly); } @Override public String enablePredicate() { if (!getHost().isClStatus()) { return NO_PCMK_STATUS_STRING; } return null; } @Override public void action() { final Host dcHost = getBrowser().getClusterBrowser().getDCHost(); if (isStandby(testOnly)) { CRM.standByOff(dcHost, host, testOnly); } else { CRM.standByOn(dcHost, host, testOnly); } } }; final ClusterBrowser cb = getBrowser().getClusterBrowser(); if (cb != null) { final ClusterBrowser.ClMenuItemCallback standbyItemCallback = cb.new ClMenuItemCallback(standbyItem, host) { @Override public void action(final Host dcHost) { if (isStandby(false)) { CRM.standByOff(dcHost, host, true); } else { CRM.standByOn(dcHost, host, true); } } }; addMouseOverListener(standbyItem, standbyItemCallback); } items.add(standbyItem); /* Migrate all services from this host. */ final MyMenuItem allMigrateFromItem = new MyMenuItem( Tools.getString("HostInfo.CRM.AllMigrateFrom"), HOST_STANDBY_ICON, ClusterBrowser.STARTING_PTEST_TOOLTIP, new AccessMode(ConfigData.AccessType.OP, false), new AccessMode(ConfigData.AccessType.OP, false)) { private static final long serialVersionUID = 1L; @Override public boolean predicate() { return true; } @Override public String enablePredicate() { if (!getHost().isClStatus()) { return NO_PCMK_STATUS_STRING; } if (getBrowser().getClusterBrowser().getExistingServiceList(null).isEmpty()) { return "there are no services to migrate"; } return null; } @Override public void action() { for (final ServiceInfo si : cb.getExistingServiceList(null)) { if (!si.isConstraintPH() && si.getGroupInfo() == null && si.getCloneInfo() == null) { final List<String> runningOnNodes = si.getRunningOnNodes(false); if (runningOnNodes != null && runningOnNodes.contains(getHost().getName())) { final Host dcHost = getHost(); si.migrateFromResource(dcHost, getHost().getName(), false); } } } } }; if (cb != null) { final ClusterBrowser.ClMenuItemCallback allMigrateFromItemCallback = cb.new ClMenuItemCallback(allMigrateFromItem, host) { @Override public void action(final Host dcHost) { for (final ServiceInfo si : cb.getExistingServiceList(null)) { if (!si.isConstraintPH() && si.getGroupInfo() == null) { final List<String> runningOnNodes = si.getRunningOnNodes(false); if (runningOnNodes != null && runningOnNodes.contains(host.getName())) { si.migrateFromResource(dcHost, host.getName(), true); } } } } }; addMouseOverListener(allMigrateFromItem, allMigrateFromItemCallback); } items.add(allMigrateFromItem); /* Stop corosync/openais. */ final MyMenuItem stopCorosyncItem = new MyMenuItem( Tools.getString("HostInfo.StopCorosync"), HOST_STOP_COMM_LAYER_ICON, ClusterBrowser.STARTING_PTEST_TOOLTIP, Tools.getString("HostInfo.StopOpenais"), HOST_STOP_COMM_LAYER_ICON, ClusterBrowser.STARTING_PTEST_TOOLTIP, new AccessMode(ConfigData.AccessType.ADMIN, true), new AccessMode(ConfigData.AccessType.ADMIN, false)) { private static final long serialVersionUID = 1L; @Override public boolean predicate() { /* when both are running it's openais. */ return getHost().isCsRunning() && !getHost().isAisRunning(); } @Override public boolean visiblePredicate() { return getHost().isCsRunning() || getHost().isAisRunning(); } @Override public void action() { if (Tools.confirmDialog( Tools.getString("HostInfo.confirmCorosyncStop.Title"), Tools.getString("HostInfo.confirmCorosyncStop.Desc"), Tools.getString("HostInfo.confirmCorosyncStop.Yes"), Tools.getString("HostInfo.confirmCorosyncStop.No"))) { final Host host = getHost(); host.setCommLayerStopping(true); if (!host.isPcmkStartedByCorosync() && host.isPcmkInit() && host.isPcmkRunning()) { Corosync.stopCorosyncWithPcmk(host); } else { Corosync.stopCorosync(host); } getBrowser().getClusterBrowser().updateHWInfo(host); } } }; if (cb != null) { final ClusterBrowser.ClMenuItemCallback stopCorosyncItemCallback = cb.new ClMenuItemCallback(stopCorosyncItem, host) { @Override public void action(final Host dcHost) { if (!isStandby(false)) { CRM.standByOn(dcHost, host, true); } } }; addMouseOverListener(stopCorosyncItem, stopCorosyncItemCallback); } items.add(stopCorosyncItem); /* Stop heartbeat. */ final MyMenuItem stopHeartbeatItem = new MyMenuItem( Tools.getString("HostInfo.StopHeartbeat"), HOST_STOP_COMM_LAYER_ICON, ClusterBrowser.STARTING_PTEST_TOOLTIP, new AccessMode(ConfigData.AccessType.ADMIN, true), new AccessMode(ConfigData.AccessType.ADMIN, false)) { private static final long serialVersionUID = 1L; @Override public boolean visiblePredicate() { return getHost().isHeartbeatRunning(); } @Override public void action() { if (Tools.confirmDialog( Tools.getString("HostInfo.confirmHeartbeatStop.Title"), Tools.getString("HostInfo.confirmHeartbeatStop.Desc"), Tools.getString("HostInfo.confirmHeartbeatStop.Yes"), Tools.getString("HostInfo.confirmHeartbeatStop.No"))) { getHost().setCommLayerStopping(true); Heartbeat.stopHeartbeat(getHost()); getBrowser().getClusterBrowser().updateHWInfo(host); } } }; if (cb != null) { final ClusterBrowser.ClMenuItemCallback stopHeartbeatItemCallback = cb.new ClMenuItemCallback(stopHeartbeatItem, host) { @Override public void action(final Host dcHost) { if (!isStandby(false)) { CRM.standByOn(dcHost, host, true); } } }; addMouseOverListener(stopHeartbeatItem, stopHeartbeatItemCallback); } items.add(stopHeartbeatItem); /* Start corosync. */ final MyMenuItem startCorosyncItem = new MyMenuItem( Tools.getString("HostInfo.StartCorosync"), HOST_START_COMM_LAYER_ICON, ClusterBrowser.STARTING_PTEST_TOOLTIP, new AccessMode(ConfigData.AccessType.ADMIN, false), new AccessMode(ConfigData.AccessType.ADMIN, false)) { private static final long serialVersionUID = 1L; @Override public boolean visiblePredicate() { final Host h = getHost(); return h.isCorosync() && h.isCsInit() && h.isCsAisConf() && !h.isCsRunning() && !h.isAisRunning() && !h.isHeartbeatRunning() && !h.isHeartbeatRc(); } @Override public String enablePredicate() { final Host h = getHost(); if (h.isAisRc() && !h.isCsRc()) { return "Openais is in rc.d"; } return null; } @Override public void action() { getHost().setCommLayerStarting(true); if (getHost().isPcmkRc()) { Corosync.startCorosyncWithPcmk(getHost()); } else { Corosync.startCorosync(getHost()); } getBrowser().getClusterBrowser().updateHWInfo(host); } }; if (cb != null) { final ClusterBrowser.ClMenuItemCallback startCorosyncItemCallback = cb.new ClMenuItemCallback(startCorosyncItem, host) { @Override public void action(final Host host) { // TODO } }; addMouseOverListener(startCorosyncItem, startCorosyncItemCallback); } items.add(startCorosyncItem); /* Start openais. */ final MyMenuItem startOpenaisItem = new MyMenuItem( Tools.getString("HostInfo.StartOpenais"), HOST_START_COMM_LAYER_ICON, ClusterBrowser.STARTING_PTEST_TOOLTIP, new AccessMode(ConfigData.AccessType.ADMIN, false), new AccessMode(ConfigData.AccessType.ADMIN, false)) { private static final long serialVersionUID = 1L; @Override public boolean visiblePredicate() { final Host h = getHost(); return h.isAisInit() && h.isCsAisConf() && !h.isCsRunning() && !h.isAisRunning() && !h.isHeartbeatRunning() && !h.isHeartbeatRc(); } @Override public String enablePredicate() { final Host h = getHost(); if (h.isCsRc() && !h.isAisRc()) { return "Corosync is in rc.d"; } return null; } @Override public void action() { getHost().setCommLayerStarting(true); Openais.startOpenais(getHost()); getBrowser().getClusterBrowser().updateHWInfo(host); } }; if (cb != null) { final ClusterBrowser.ClMenuItemCallback startOpenaisItemCallback = cb.new ClMenuItemCallback(startOpenaisItem, host) { @Override public void action(final Host host) { // TODO } }; addMouseOverListener(startOpenaisItem, startOpenaisItemCallback); } items.add(startOpenaisItem); /* Start heartbeat. */ final MyMenuItem startHeartbeatItem = new MyMenuItem( Tools.getString("HostInfo.StartHeartbeat"), HOST_START_COMM_LAYER_ICON, ClusterBrowser.STARTING_PTEST_TOOLTIP, new AccessMode(ConfigData.AccessType.ADMIN, false), new AccessMode(ConfigData.AccessType.ADMIN, false)) { private static final long serialVersionUID = 1L; @Override public boolean visiblePredicate() { final Host h = getHost(); return h.isHeartbeatInit() && h.isHeartbeatConf() && !h.isCsRunning() && !h.isAisRunning() && !h.isHeartbeatRunning(); // && !h.isAisRc() // && !h.isCsRc(); TODO should check /etc/defaults/ } @Override public void action() { getHost().setCommLayerStarting(true); Heartbeat.startHeartbeat(getHost()); getBrowser().getClusterBrowser().updateHWInfo(host); } }; if (cb != null) { final ClusterBrowser.ClMenuItemCallback startHeartbeatItemCallback = cb.new ClMenuItemCallback(startHeartbeatItem, host) { @Override public void action(final Host host) { // TODO } }; addMouseOverListener(startHeartbeatItem, startHeartbeatItemCallback); } items.add(startHeartbeatItem); /* Start pacemaker. */ final MyMenuItem startPcmkItem = new MyMenuItem( Tools.getString("HostInfo.StartPacemaker"), HOST_START_COMM_LAYER_ICON, ClusterBrowser.STARTING_PTEST_TOOLTIP, new AccessMode(ConfigData.AccessType.ADMIN, false), new AccessMode(ConfigData.AccessType.ADMIN, false)) { private static final long serialVersionUID = 1L; @Override public boolean visiblePredicate() { final Host h = getHost(); return !h.isPcmkStartedByCorosync() && !h.isPcmkRunning() && (h.isCsRunning() || h.isAisRunning()) && !h.isHeartbeatRunning(); } @Override public String enablePredicate() { return null; } @Override public void action() { host.setPcmkStarting(true); Corosync.startPacemaker(host); getBrowser().getClusterBrowser().updateHWInfo(host); } }; if (cb != null) { final ClusterBrowser.ClMenuItemCallback startPcmkItemCallback = cb.new ClMenuItemCallback(startPcmkItem, host) { @Override public void action(final Host host) { // TODO } }; addMouseOverListener(startPcmkItem, startPcmkItemCallback); } items.add(startPcmkItem); /* change host color */ final MyMenuItem changeHostColorItem = new MyMenuItem( Tools.getString("HostBrowser.Drbd.ChangeHostColor"), null, "", new AccessMode(ConfigData.AccessType.RO, false), new AccessMode(ConfigData.AccessType.RO, false)) { private static final long serialVersionUID = 1L; @Override public String enablePredicate() { return null; } @Override public void action() { final Color newColor = JColorChooser.showDialog( Tools.getGUIData().getMainFrame(), "Choose " + host.getName() + " color", host.getPmColors()[0]); if (newColor != null) { host.setSavedColor(newColor); } } }; items.add(changeHostColorItem); /* view logs */ final MyMenuItem viewLogsItem = new MyMenuItem( Tools.getString("HostBrowser.Drbd.ViewLogs"), LOGFILE_ICON, "", new AccessMode(ConfigData.AccessType.RO, false), new AccessMode(ConfigData.AccessType.RO, false)) { private static final long serialVersionUID = 1L; @Override public String enablePredicate() { if (!getHost().isConnected()) { return Host.NOT_CONNECTED_STRING; } return null; } @Override public void action() { HostLogs l = new HostLogs(host); l.showDialog(); } }; items.add(viewLogsItem); /* advacend options */ final MyMenu hostAdvancedSubmenu = new MyMenu( Tools.getString("HostBrowser.AdvancedSubmenu"), new AccessMode(ConfigData.AccessType.OP, false), new AccessMode(ConfigData.AccessType.OP, false)) { private static final long serialVersionUID = 1L; @Override public String enablePredicate() { if (!host.isConnected()) { return Host.NOT_CONNECTED_STRING; } return null; } @Override public void update() { super.update(); getBrowser().addAdvancedMenu(this); } }; items.add(hostAdvancedSubmenu); /* remove host from gui */ final MyMenuItem removeHostItem = new MyMenuItem( Tools.getString("HostBrowser.RemoveHost"), HostBrowser.HOST_REMOVE_ICON, Tools.getString("HostBrowser.RemoveHost"), new AccessMode(ConfigData.AccessType.RO, false), new AccessMode(ConfigData.AccessType.RO, false)) { private static final long serialVersionUID = 1L; @Override public String enablePredicate() { if (getHost().getCluster() != null) { return "it is a member of a cluster"; } return null; } @Override public void action() { getHost().disconnect(); Tools.getConfigData().removeHostFromHosts(getHost()); Tools.getGUIData().allHostsUpdate(); } }; items.add(removeHostItem); return items; }
static void start(final int count) { slowFactor = 0.3f; aborted = false; disableStonith(); final String testName = "test3"; for (int i = count; i > 0; i--) { if (i % 5 == 0) { info(testName + " I: " + i); } checkTest(testName, 1); /* filesystem/drbd */ moveTo(577, 205); rightClick(); /* popup */ sleep(1000); moveTo(Tools.getString("ClusterBrowser.Hb.AddService")); sleep(1000); moveTo("Filesystem + Linbit:DRBD"); leftClick(); /* choose fs */ moveTo("block device", Widget.MComboBox.class); /* choose drbd */ leftClick(); sleep(2000); press(KeyEvent.VK_DOWN); sleep(200); press(KeyEvent.VK_DOWN); sleep(200); press(KeyEvent.VK_ENTER); moveTo("mount point", Widget.MComboBox.class); leftClick(); sleep(2000); press(KeyEvent.VK_DOWN); sleep(200); press(KeyEvent.VK_DOWN); sleep(200); press(KeyEvent.VK_ENTER); moveTo("filesystem type", Widget.MComboBox.class); leftClick(); sleep(2000); press(KeyEvent.VK_E); sleep(200); press(KeyEvent.VK_E); sleep(200); press(KeyEvent.VK_ENTER); moveTo(Tools.getString("Browser.ApplyResource")); leftClick(); sleep(2000); checkTest(testName, 2); checkNumberOfVertices(testName, 4); stopEverything(); checkTest(testName, 3); removeEverything(); resetTerminalAreas(); /* filesystem/drbd - with name */ moveTo(577, 205); rightClick(); /* popup */ sleep(1000); moveTo(Tools.getString("ClusterBrowser.Hb.AddService")); sleep(1000); moveTo("Filesystem + Linbit:DRBD"); leftClick(); /* choose fs */ checkTest(testName, 4); moveTo("Name", Widget.MTextField.class); leftClick(); press(KeyEvent.VK_X); sleep(200); press(KeyEvent.VK_Y); sleep(200); moveTo("block device", Widget.MComboBox.class); /* choose drbd */ leftClick(); sleep(2000); press(KeyEvent.VK_DOWN); sleep(200); press(KeyEvent.VK_DOWN); sleep(200); press(KeyEvent.VK_ENTER); moveTo("mount point", Widget.MComboBox.class); leftClick(); sleep(2000); press(KeyEvent.VK_DOWN); sleep(200); press(KeyEvent.VK_DOWN); sleep(200); press(KeyEvent.VK_ENTER); moveTo("filesystem type", Widget.MComboBox.class); leftClick(); sleep(2000); press(KeyEvent.VK_E); sleep(200); press(KeyEvent.VK_E); sleep(200); press(KeyEvent.VK_ENTER); moveTo(Tools.getString("Browser.ApplyResource")); leftClick(); sleep(2000); checkTest(testName, 5); checkNumberOfVertices(testName, 4); stopEverything(); checkTest(testName, 6); removeEverything(); resetTerminalAreas(); } System.gc(); }
static { SHORTNAME_MAP.put(DiskData.TYPE, Tools.getString("VMSDiskInfo.Param.Type")); SHORTNAME_MAP.put(DiskData.TARGET_DEVICE, Tools.getString("VMSDiskInfo.Param.TargetDevice")); SHORTNAME_MAP.put(DiskData.SOURCE_FILE, Tools.getString("VMSDiskInfo.Param.SourceFile")); SHORTNAME_MAP.put(DiskData.SOURCE_DEVICE, Tools.getString("VMSDiskInfo.Param.SourceDevice")); SHORTNAME_MAP.put( DiskData.SOURCE_PROTOCOL, Tools.getString("VMSDiskInfo.Param.SourceProtocol")); SHORTNAME_MAP.put(DiskData.SOURCE_NAME, Tools.getString("VMSDiskInfo.Param.SourceName")); SHORTNAME_MAP.put( DiskData.SOURCE_HOST_NAME, Tools.getString("VMSDiskInfo.Param.SourceHostName")); SHORTNAME_MAP.put( DiskData.SOURCE_HOST_PORT, Tools.getString("VMSDiskInfo.Param.SourceHostPort")); SHORTNAME_MAP.put(DiskData.AUTH_USERNAME, Tools.getString("VMSDiskInfo.Param.AuthUsername")); SHORTNAME_MAP.put( DiskData.AUTH_SECRET_TYPE, Tools.getString("VMSDiskInfo.Param.AuthSecretType")); SHORTNAME_MAP.put( DiskData.AUTH_SECRET_UUID, Tools.getString("VMSDiskInfo.Param.AuthSecretUuid")); SHORTNAME_MAP.put(DiskData.TARGET_BUS_TYPE, Tools.getString("VMSDiskInfo.Param.TargetBusType")); SHORTNAME_MAP.put(DiskData.DRIVER_NAME, Tools.getString("VMSDiskInfo.Param.DriverName")); SHORTNAME_MAP.put(DiskData.DRIVER_TYPE, Tools.getString("VMSDiskInfo.Param.DriverType")); SHORTNAME_MAP.put(DiskData.DRIVER_CACHE, Tools.getString("VMSDiskInfo.Param.DriverCache")); SHORTNAME_MAP.put(DiskData.READONLY, Tools.getString("VMSDiskInfo.Param.Readonly")); SHORTNAME_MAP.put(DiskData.SHAREABLE, Tools.getString("VMSDiskInfo.Param.Shareable")); }
/** * TextResource files contain texts in different languages. Text for every button has to be * defined there. If Ok button is used, resource file has to contain ConfigDialog.Ok item. */ protected final String buttonString(final String b) { return Tools.getString("Dialog.Dialog." + b); }
/** Returns items for the group popup. */ @Override public List<UpdatableItem> createPopup() { final boolean testOnly = false; final GroupInfo thisGroupInfo = this; /* add group service */ final MyMenu addGroupServiceMenuItem = new MyMenu( Tools.getString("ClusterBrowser.Hb.AddGroupService"), new AccessMode(ConfigData.AccessType.ADMIN, false), new AccessMode(ConfigData.AccessType.OP, false)) { private static final long serialVersionUID = 1L; private final Lock mUpdateLock = new ReentrantLock(); @Override public String enablePredicate() { if (getBrowser().clStatusFailed()) { return ClusterBrowser.UNKNOWN_CLUSTER_STATUS_STRING; } else { return null; } } @Override public void update() { final Thread t = new Thread( new Runnable() { @Override public void run() { if (mUpdateLock.tryLock()) { try { updateThread(); } finally { mUpdateLock.unlock(); } } } }); t.start(); } private void updateThread() { Tools.invokeLater( new Runnable() { @Override public void run() { setEnabled(false); } }); Tools.invokeAndWait( new Runnable() { @Override public void run() { removeAll(); } }); final List<JDialog> popups = new ArrayList<JDialog>(); for (final String cl : ClusterBrowser.HB_CLASSES) { final MyMenu classItem = new MyMenu( ClusterBrowser.HB_CLASS_MENU.get(cl), new AccessMode(ConfigData.AccessType.ADMIN, false), new AccessMode(ConfigData.AccessType.OP, false)); MyListModel<MyMenuItem> dlm = new MyListModel<MyMenuItem>(); for (final ResourceAgent ra : getAddGroupServiceList(cl)) { final MyMenuItem mmi = new MyMenuItem( ra.getMenuName(), null, null, new AccessMode(ConfigData.AccessType.ADMIN, false), new AccessMode(ConfigData.AccessType.OP, false)) { private static final long serialVersionUID = 1L; @Override public void action() { final CloneInfo ci = getCloneInfo(); if (ci != null) { ci.hidePopup(); } hidePopup(); for (final JDialog otherP : popups) { otherP.dispose(); } if (ra.isLinbitDrbd() && !getBrowser().linbitDrbdConfirmDialog()) { return; } addGroupServicePanel(ra, true); repaint(); } }; dlm.addElement(mmi); } final boolean ret = Tools.getScrollingMenu( ClusterBrowser.HB_CLASS_MENU.get(cl), null, /* options */ classItem, dlm, new MyList<MyMenuItem>(dlm, getBackground()), thisGroupInfo, popups, null); if (!ret) { classItem.setEnabled(false); } Tools.invokeLater( new Runnable() { @Override public void run() { add(classItem); } }); } Tools.waitForSwing(); super.update(); } }; final List<UpdatableItem> items = new ArrayList<UpdatableItem>(); items.add((UpdatableItem) addGroupServiceMenuItem); for (final UpdatableItem item : super.createPopup()) { items.add(item); } /* group services */ if (!Tools.getConfigData().isSlow()) { final ClusterStatus cs = getBrowser().getClusterStatus(); final List<String> resources = cs.getGroupResources(getHeartbeatId(testOnly), testOnly); if (resources != null) { for (final String hbId : resources) { final ServiceInfo gsi = getBrowser().getServiceInfoFromCRMId(hbId); if (gsi == null) { continue; } final MyMenu groupServicesMenu = new MyMenu( gsi.toString(), new AccessMode(ConfigData.AccessType.RO, false), new AccessMode(ConfigData.AccessType.RO, false)) { private static final long serialVersionUID = 1L; private final Lock mUpdateLock = new ReentrantLock(); @Override public String enablePredicate() { return null; } @Override public void update() { final Thread t = new Thread( new Runnable() { @Override public void run() { if (mUpdateLock.tryLock()) { try { updateThread(); } finally { mUpdateLock.unlock(); } } } }); t.start(); } public void updateThread() { Tools.invokeLater( new Runnable() { @Override public void run() { setEnabled(false); } }); Tools.invokeAndWait( new Runnable() { @Override public void run() { removeAll(); } }); final List<UpdatableItem> serviceMenus = new ArrayList<UpdatableItem>(); for (final UpdatableItem u : gsi.createPopup()) { serviceMenus.add(u); u.update(); } Tools.invokeLater( new Runnable() { @Override public void run() { for (final UpdatableItem u : serviceMenus) { add((JMenuItem) u); } } }); super.update(); } }; items.add((UpdatableItem) groupServicesMenu); } } } return items; }
/** This class holds info about Virtual Disks. */ public final class VMSDiskInfo extends VMSHardwareInfo { /** Logger. */ private static final Logger LOG = LoggerFactory.getLogger(VMSDiskInfo.class); /** Source file combo box, so that it can be disabled, depending on type. */ private final Map<String, Widget> sourceFileWi = new HashMap<String, Widget>(); /** Source block combo box, so that it can be disabled, depending on type. */ private final Map<String, Widget> sourceDeviceWi = new HashMap<String, Widget>(); private final Map<String, Widget> sourceNameWi = new HashMap<String, Widget>(); private final Map<String, Widget> sourceProtocolWi = new HashMap<String, Widget>(); private final Map<String, Widget> sourceHostNameWi = new HashMap<String, Widget>(); private final Map<String, Widget> sourceHostPortWi = new HashMap<String, Widget>(); private final Map<String, Widget> authUsernameWi = new HashMap<String, Widget>(); private final Map<String, Widget> authSecretTypeWi = new HashMap<String, Widget>(); private final Map<String, Widget> authSecretUuidWi = new HashMap<String, Widget>(); /** Target device combo box, that needs to be reloaded if target type has changed. */ private final Map<String, Widget> targetDeviceWi = new HashMap<String, Widget>(); /** Driver name combo box. */ private final Map<String, Widget> driverNameWi = new HashMap<String, Widget>(); /** Driver type combo box. */ private final Map<String, Widget> driverTypeWi = new HashMap<String, Widget>(); /** Driver cache combo box. */ private final Map<String, Widget> driverCacheWi = new HashMap<String, Widget>(); /** Readonly combo box. */ private final Map<String, Widget> readonlyWi = new HashMap<String, Widget>(); /** Previous target device value. */ private String prevTargetBusType = null; /** Previous target bus type (disk type) value. */ private String previousTargetBusType = null; /** Parameters. */ private static final String[] PARAMETERS = { DiskData.TYPE, DiskData.TARGET_BUS_TYPE, DiskData.TARGET_DEVICE, DiskData.SOURCE_FILE, DiskData.SOURCE_DEVICE, DiskData.SOURCE_PROTOCOL, DiskData.SOURCE_NAME, DiskData.SOURCE_HOST_NAME, DiskData.SOURCE_HOST_PORT, DiskData.AUTH_USERNAME, DiskData.AUTH_SECRET_TYPE, DiskData.AUTH_SECRET_UUID, DiskData.DRIVER_NAME, DiskData.DRIVER_TYPE, DiskData.DRIVER_CACHE, DiskData.READONLY, DiskData.SHAREABLE }; /** Block parameters. */ private static final String[] BLOCK_PARAMETERS = { DiskData.TYPE, DiskData.TARGET_BUS_TYPE, DiskData.TARGET_DEVICE, DiskData.SOURCE_DEVICE, DiskData.DRIVER_NAME, DiskData.DRIVER_TYPE, DiskData.DRIVER_CACHE, DiskData.READONLY, DiskData.SHAREABLE }; /** File parameters. */ private static final String[] FILE_PARAMETERS = { DiskData.TYPE, DiskData.TARGET_DEVICE, DiskData.SOURCE_FILE, DiskData.TARGET_BUS_TYPE, DiskData.DRIVER_NAME, DiskData.DRIVER_TYPE, DiskData.DRIVER_CACHE, DiskData.READONLY, DiskData.SHAREABLE }; /** Network parameters. */ private static final String[] NETWORK_PARAMETERS = { DiskData.TYPE, DiskData.TARGET_BUS_TYPE, DiskData.TARGET_DEVICE, DiskData.SOURCE_PROTOCOL, DiskData.SOURCE_NAME, DiskData.SOURCE_HOST_NAME, DiskData.SOURCE_HOST_PORT, DiskData.AUTH_USERNAME, DiskData.AUTH_SECRET_TYPE, DiskData.AUTH_SECRET_UUID, DiskData.DRIVER_NAME, DiskData.DRIVER_TYPE, DiskData.DRIVER_CACHE, DiskData.READONLY, DiskData.SHAREABLE }; /** Whether the parameter is enabled only in advanced mode. */ private static final Set<String> IS_ENABLED_ONLY_IN_ADVANCED = new HashSet<String>( Arrays.asList( new String[] { DiskData.TARGET_DEVICE, DiskData.DRIVER_NAME, DiskData.DRIVER_TYPE, DiskData.DRIVER_CACHE })); /** Whether the parameter is required. */ private static final Set<String> IS_REQUIRED = new HashSet<String>(Arrays.asList(new String[] {DiskData.TYPE})); static { IS_REQUIRED.add(DiskData.SOURCE_PROTOCOL); IS_REQUIRED.add(DiskData.SOURCE_NAME); IS_REQUIRED.add(DiskData.SOURCE_HOST_NAME); IS_REQUIRED.add(DiskData.SOURCE_HOST_PORT); IS_REQUIRED.add(DiskData.AUTH_USERNAME); } /** Field type. */ private static final Map<String, Widget.Type> FIELD_TYPES = new HashMap<String, Widget.Type>(); /** Target devices depending on the target type. */ private static final Map<String, String[]> TARGET_DEVICES_MAP = new HashMap<String, String[]>(); static { FIELD_TYPES.put(DiskData.TYPE, Widget.Type.RADIOGROUP); FIELD_TYPES.put(DiskData.SOURCE_FILE, Widget.Type.COMBOBOX); FIELD_TYPES.put(DiskData.READONLY, Widget.Type.CHECKBOX); FIELD_TYPES.put(DiskData.SHAREABLE, Widget.Type.CHECKBOX); FIELD_TYPES.put(DiskData.TARGET_DEVICE, Widget.Type.COMBOBOX); } /** Short name. */ private static final Map<String, String> SHORTNAME_MAP = new HashMap<String, String>(); static { SHORTNAME_MAP.put(DiskData.TYPE, Tools.getString("VMSDiskInfo.Param.Type")); SHORTNAME_MAP.put(DiskData.TARGET_DEVICE, Tools.getString("VMSDiskInfo.Param.TargetDevice")); SHORTNAME_MAP.put(DiskData.SOURCE_FILE, Tools.getString("VMSDiskInfo.Param.SourceFile")); SHORTNAME_MAP.put(DiskData.SOURCE_DEVICE, Tools.getString("VMSDiskInfo.Param.SourceDevice")); SHORTNAME_MAP.put( DiskData.SOURCE_PROTOCOL, Tools.getString("VMSDiskInfo.Param.SourceProtocol")); SHORTNAME_MAP.put(DiskData.SOURCE_NAME, Tools.getString("VMSDiskInfo.Param.SourceName")); SHORTNAME_MAP.put( DiskData.SOURCE_HOST_NAME, Tools.getString("VMSDiskInfo.Param.SourceHostName")); SHORTNAME_MAP.put( DiskData.SOURCE_HOST_PORT, Tools.getString("VMSDiskInfo.Param.SourceHostPort")); SHORTNAME_MAP.put(DiskData.AUTH_USERNAME, Tools.getString("VMSDiskInfo.Param.AuthUsername")); SHORTNAME_MAP.put( DiskData.AUTH_SECRET_TYPE, Tools.getString("VMSDiskInfo.Param.AuthSecretType")); SHORTNAME_MAP.put( DiskData.AUTH_SECRET_UUID, Tools.getString("VMSDiskInfo.Param.AuthSecretUuid")); SHORTNAME_MAP.put(DiskData.TARGET_BUS_TYPE, Tools.getString("VMSDiskInfo.Param.TargetBusType")); SHORTNAME_MAP.put(DiskData.DRIVER_NAME, Tools.getString("VMSDiskInfo.Param.DriverName")); SHORTNAME_MAP.put(DiskData.DRIVER_TYPE, Tools.getString("VMSDiskInfo.Param.DriverType")); SHORTNAME_MAP.put(DiskData.DRIVER_CACHE, Tools.getString("VMSDiskInfo.Param.DriverCache")); SHORTNAME_MAP.put(DiskData.READONLY, Tools.getString("VMSDiskInfo.Param.Readonly")); SHORTNAME_MAP.put(DiskData.SHAREABLE, Tools.getString("VMSDiskInfo.Param.Shareable")); } /** Tool tips. */ private static final Map<String, String> TOOLTIP_MAP = new HashMap<String, String>(); static { TOOLTIP_MAP.put( DiskData.SOURCE_HOST_NAME, Tools.getString("VMSDiskInfo.Param.SourceHostName.ToolTip")); TOOLTIP_MAP.put( DiskData.SOURCE_HOST_PORT, Tools.getString("VMSDiskInfo.Param.SourceHostPort.ToolTip")); } /** Sections. */ private static final Map<String, String> SECTION_MAP = new HashMap<String, String>(); private static final String SECTION_DISK_OPTIONS = Tools.getString("VMSDiskInfo.Section.DiskOptions"); private static final String SECTION_SOURCE = Tools.getString("VMSDiskInfo.Section.Source"); private static final String SECTION_AUTHENTICATION = Tools.getString("VMSDiskInfo.Section.Authentication"); static { SECTION_MAP.put(DiskData.TYPE, SECTION_SOURCE); SECTION_MAP.put(DiskData.SOURCE_FILE, SECTION_SOURCE); SECTION_MAP.put(DiskData.SOURCE_DEVICE, SECTION_SOURCE); SECTION_MAP.put(DiskData.SOURCE_PROTOCOL, SECTION_SOURCE); SECTION_MAP.put(DiskData.SOURCE_NAME, SECTION_SOURCE); SECTION_MAP.put(DiskData.SOURCE_HOST_NAME, SECTION_SOURCE); SECTION_MAP.put(DiskData.SOURCE_HOST_PORT, SECTION_SOURCE); SECTION_MAP.put(DiskData.AUTH_USERNAME, SECTION_AUTHENTICATION); SECTION_MAP.put(DiskData.AUTH_SECRET_TYPE, SECTION_AUTHENTICATION); SECTION_MAP.put(DiskData.AUTH_SECRET_UUID, SECTION_AUTHENTICATION); } /** Preferred values. */ private static final Map<String, String> PREFERRED_MAP = new HashMap<String, String>(); /** Defaults. */ private static final Map<String, String> DEFAULTS_MAP = new HashMap<String, String>(); /** Possible values. */ private static final Map<String, Object[]> POSSIBLE_VALUES = new HashMap<String, Object[]>(); /** Default location for libvirt images. */ public static final String LIBVIRT_IMAGE_LOCATION = "/var/lib/libvirt/images/"; /** * A map from target bus and type as it is saved to the string representation that appears in the * menus. */ private static final Map<String, String> TARGET_BUS_TYPES = new HashMap<String, String>(); /** Disk types. */ private static final String FILE_TYPE = "file"; private static final String BLOCK_TYPE = "block"; private static final String NETWORK_TYPE = "network"; /** Drivers. */ private static final String DRIVER_NAME_DEFUALT = null; private static final String DRIVER_NAME_FILE = "file"; private static final String DRIVER_NAME_QEMU = "qemu"; private static final String DRIVER_NAME_PHY = "phy"; static { POSSIBLE_VALUES.put( DiskData.TYPE, new StringInfo[] { new StringInfo("Image file", FILE_TYPE, null), new StringInfo("Disk/block device", BLOCK_TYPE, null), new StringInfo("Network", NETWORK_TYPE, null) }); POSSIBLE_VALUES.put( DiskData.TARGET_BUS_TYPE, new StringInfo[] { new StringInfo("IDE Disk", "ide/disk", null), new StringInfo("IDE CDROM", "ide/cdrom", null), new StringInfo("Floppy Disk", "fdc/floppy", null), new StringInfo("SCSI Disk", "scsi/disk", null), new StringInfo("USB Disk", "usb/disk", null), new StringInfo("Virtio Disk", "virtio/disk", null) }); POSSIBLE_VALUES.put( DiskData.DRIVER_NAME, new String[] {DRIVER_NAME_DEFUALT, DRIVER_NAME_FILE, DRIVER_NAME_QEMU, DRIVER_NAME_PHY}); POSSIBLE_VALUES.put(DiskData.DRIVER_TYPE, new String[] {null, "raw"}); POSSIBLE_VALUES.put( DiskData.DRIVER_CACHE, new String[] { null, "default", "none", "writethrough", "writeback", "directsync", "unsafe" }); POSSIBLE_VALUES.put( DiskData.SOURCE_PROTOCOL, new String[] {null, "rbd", "nbd", "iscsi", "sheepdog", "gluster"}); POSSIBLE_VALUES.put( DiskData.SOURCE_NAME, new String[] {"", "poolname/imagename", "poolname/imagename:rbd_cache=1"}); POSSIBLE_VALUES.put(DiskData.AUTH_SECRET_TYPE, new String[] {"", "ceph", "iscsi"}); for (final StringInfo tbt : (StringInfo[]) POSSIBLE_VALUES.get(DiskData.TARGET_BUS_TYPE)) { TARGET_BUS_TYPES.put(tbt.getInternalValue(), tbt.toString()); } DEFAULTS_MAP.put(DiskData.READONLY, "False"); DEFAULTS_MAP.put(DiskData.SHAREABLE, "False"); PREFERRED_MAP.put(DiskData.DRIVER_NAME, "file"); TARGET_DEVICES_MAP.put("ide/disk", new String[] {"hda", "hdb", "hdd"}); TARGET_DEVICES_MAP.put("ide/cdrom", new String[] {"hdc"}); TARGET_DEVICES_MAP.put("fdc/floppy", new String[] {"fda", "fdb", "fdc", "fdd"}); TARGET_DEVICES_MAP.put("scsi/disk", new String[] {"sda", "sdb", "sdc", "sdd"}); TARGET_DEVICES_MAP.put("usb/disk", new String[] {"sda", "sdb", "sdc", "sdd"}); TARGET_DEVICES_MAP.put("virtio/disk", new String[] {"vda", "vdb", "vdc", "vdd", "vde"}); } /** Default source port if none is specified (and it is needed). */ public static final String DEFAULT_SOURCE_HOST_PORT = "6789"; private final List<Map<String, Widget>> checkFieldList = new ArrayList<Map<String, Widget>>(); /** Table panel. */ private JComponent tablePanel = null; /** Creates the VMSDiskInfo object. */ VMSDiskInfo( final String name, final Browser browser, final VMSVirtualDomainInfo vmsVirtualDomainInfo) { super(name, browser, vmsVirtualDomainInfo); checkFieldList.add(sourceNameWi); checkFieldList.add(sourceProtocolWi); checkFieldList.add(sourceHostNameWi); checkFieldList.add(sourceHostPortWi); checkFieldList.add(authUsernameWi); checkFieldList.add(authSecretTypeWi); checkFieldList.add(authSecretUuidWi); } /** Adds disk table with only this disk to the main panel. */ @Override protected void addHardwareTable(final JPanel mainPanel) { tablePanel = getTablePanel( "Disk", VMSVirtualDomainInfo.DISK_TABLE, getNewBtn(getVMSVirtualDomainInfo())); if (getResource().isNew()) { Tools.invokeLater( !Tools.CHECK_SWING_THREAD, new Runnable() { @Override public void run() { tablePanel.setVisible(false); } }); } mainPanel.add(tablePanel); } /** Returns service icon in the menu. */ @Override public ImageIcon getMenuIcon(final boolean testOnly) { return BlockDevInfo.HARDDISK_ICON; } /** Returns long description of the specified parameter. */ @Override protected String getParamLongDesc(final String param) { return getParamShortDesc(param); } /** Returns short description of the specified parameter. */ @Override protected String getParamShortDesc(final String param) { final String name = SHORTNAME_MAP.get(param); if (name == null) { return param; } return name; } /** Returns preferred value for specified parameter. */ @Override protected String getParamPreferred(final String param) { final String domainType = getVMSVirtualDomainInfo().getWidget(VMSXML.VM_PARAM_DOMAIN_TYPE, null).getStringValue(); if (DiskData.DRIVER_NAME.equals(param) && VMSVirtualDomainInfo.DOMAIN_TYPE_KVM.equals(domainType)) { return DRIVER_NAME_QEMU; } return PREFERRED_MAP.get(param); } /** Returns default value for specified parameter. */ @Override protected String getParamDefault(final String param) { return DEFAULTS_MAP.get(param); } /** Returns parameters. */ @Override public String[] getParametersFromXML() { return PARAMETERS.clone(); } /** Returns real parameters. */ @Override public String[] getRealParametersFromXML() { if (BLOCK_TYPE.equals(getComboBoxValue(DiskData.TYPE))) { return BLOCK_PARAMETERS.clone(); } else if (FILE_TYPE.equals(getComboBoxValue(DiskData.TYPE))) { return FILE_PARAMETERS.clone(); } else { return NETWORK_PARAMETERS.clone(); } } /** Returns possible choices for drop down lists. */ @Override protected Object[] getParamPossibleChoices(final String param) { if (DiskData.SOURCE_FILE.equals(param)) { final Set<String> sourceFileDirs = new TreeSet<String>(); sourceFileDirs.add(LIBVIRT_IMAGE_LOCATION); for (final Host h : getVMSVirtualDomainInfo().getDefinedOnHosts()) { final VMSXML vmsxml = getBrowser().getVMSXML(h); if (vmsxml != null) { sourceFileDirs.addAll(vmsxml.getsourceFileDirs()); } } return sourceFileDirs.toArray(new String[sourceFileDirs.size()]); } else if (DiskData.SOURCE_DEVICE.equals(param)) { for (final Host h : getVMSVirtualDomainInfo().getDefinedOnHosts()) { final VMSXML vmsxml = getBrowser().getVMSXML(h); final List<String> bds = new ArrayList<String>(); bds.add(null); if (vmsxml != null) { for (final BlockDevInfo bdi : h.getBrowser().getBlockDevInfos()) { if (bdi.getBlockDevice().isDrbd()) { bds.add(bdi.getDrbdVolumeInfo().getDeviceByRes()); } else { bds.add(bdi.getName()); } } return bds.toArray(new String[bds.size()]); } } } return POSSIBLE_VALUES.get(param); } /** Returns section to which the specified parameter belongs. */ @Override protected String getSection(final String param) { final String section = SECTION_MAP.get(param); if (section == null) { return SECTION_DISK_OPTIONS; } else { return section; } } /** Returns true if the specified parameter is required. */ @Override protected boolean isRequired(final String param) { final String type = getComboBoxValue(DiskData.TYPE); if ((DiskData.SOURCE_FILE.equals(param) && FILE_TYPE.equals(type)) || (DiskData.SOURCE_DEVICE.equals(param) && BLOCK_TYPE.equals(type))) { if ("ide/cdrom".equals(getComboBoxValue(DiskData.TARGET_BUS_TYPE)) || "fdc/floppy".equals(getComboBoxValue(DiskData.TARGET_BUS_TYPE))) { return false; } else { return true; } } return IS_REQUIRED.contains(param); } /** Returns true if the specified parameter is integer. */ @Override protected boolean isInteger(final String param) { return false; } /** Returns true if the specified parameter is label. */ @Override protected boolean isLabel(final String param) { return false; } /** Returns true if the specified parameter is of time type. */ @Override protected boolean isTimeType(final String param) { return false; } /** Returns whether parameter is checkbox. */ @Override protected boolean isCheckBox(final String param) { return false; } /** Returns the type of the parameter. */ @Override protected String getParamType(final String param) { return "undef"; // TODO: } /** Returns type of the field. */ @Override protected Widget.Type getFieldType(final String param) { return FIELD_TYPES.get(param); } /** Returns device parameters. */ @Override protected Map<String, String> getHWParameters(final boolean allParams) { Tools.invokeAndWait( new Runnable() { @Override public void run() { getInfoPanel(); } }); final String[] params = getRealParametersFromXML(); final Map<String, String> parameters = new LinkedHashMap<String, String>(); for (final String param : params) { final String value = getComboBoxValue(param); if (DiskData.TYPE.equals(param)) { parameters.put(param, value); } else if (DiskData.TARGET_BUS_TYPE.equals(param)) { if (value == null) { parameters.put(DiskData.TARGET_BUS, null); parameters.put(DiskData.TARGET_TYPE, null); } else { final String[] values = value.split("/"); if (values.length == 2) { parameters.put(DiskData.TARGET_BUS, values[0]); parameters.put(DiskData.TARGET_TYPE, values[1]); } else { LOG.appWarning("getHWParameters: cannot parse: " + param + " = " + value); } } } else if (allParams) { if (Tools.areEqual(getParamDefault(param), value)) { parameters.put(param, null); } else { parameters.put(param, value); } } else if (!Tools.areEqual(getParamSaved(param), value) || DiskData.SOURCE_FILE.equals(param) || DiskData.SOURCE_DEVICE.equals(param) || DiskData.SOURCE_PROTOCOL.equals(param) || DiskData.SOURCE_NAME.equals(param) || DiskData.SOURCE_HOST_NAME.equals(param) || DiskData.SOURCE_HOST_PORT.equals(param) || DiskData.AUTH_USERNAME.equals(param) || DiskData.AUTH_SECRET_TYPE.equals(param) || DiskData.AUTH_SECRET_UUID.equals(param)) { if (Tools.areEqual(getParamDefault(param), value)) { parameters.put(param, null); } else { parameters.put(param, value); } } } parameters.put(DiskData.SAVED_TARGET_DEVICE, getName()); setName(getParamSaved(DiskData.TARGET_DEVICE)); return parameters; } /** Fix ports. Make the number of ports delimited with "," to match the host names. */ private static void fixSourceHostParams(final Map<String, String> params) { final String names = params.get(DiskData.SOURCE_HOST_NAME); String ports = params.get(DiskData.SOURCE_HOST_PORT); if (names == null) { params.put(DiskData.SOURCE_HOST_PORT, null); return; } if ("".equals(names)) { params.put(DiskData.SOURCE_HOST_PORT, ""); return; } if (ports == null || "".equals(ports)) { ports = DEFAULT_SOURCE_HOST_PORT; } final String[] namesA = names.trim().split("\\s*,\\s*"); final String[] portsA = ports.trim().split("\\s*,\\s*"); final String lastPort = portsA[portsA.length - 1]; final String fixedNames = Tools.join(", ", namesA); String fixedPorts; if (namesA.length == portsA.length) { fixedPorts = Tools.join(", ", portsA); } else if (portsA.length < namesA.length) { /* add ports */ fixedPorts = Tools.join(", ", portsA); for (int i = 0; i < namesA.length - portsA.length; i++) { fixedPorts += ", " + lastPort; } } else { /* remove ports */ fixedPorts = Tools.join(", ", portsA, namesA.length); } params.put(DiskData.SOURCE_HOST_NAME, fixedNames); params.put(DiskData.SOURCE_HOST_PORT, fixedPorts); } /** Applies the changes. */ @Override void apply(final boolean testOnly) { if (testOnly) { return; } Tools.invokeAndWait( new Runnable() { @Override public void run() { getApplyButton().setEnabled(false); getRevertButton().setEnabled(false); getInfoPanel(); } }); waitForInfoPanel(); final Map<String, String> parameters = getHWParameters(getResource().isNew()); final String[] params = getRealParametersFromXML(); for (final Host h : getVMSVirtualDomainInfo().getDefinedOnHosts()) { final VMSXML vmsxml = getBrowser().getVMSXML(h); if (vmsxml != null) { final String domainName = getVMSVirtualDomainInfo().getDomainName(); final Node domainNode = vmsxml.getDomainNode(domainName); /* fix host ports */ fixSourceHostParams(parameters); final String fixedNames = parameters.get(DiskData.SOURCE_HOST_NAME); final String fixedPorts = parameters.get(DiskData.SOURCE_HOST_PORT); for (final String p : sourceHostNameWi.keySet()) { sourceHostNameWi.get(p).setValueAndWait(fixedNames); } for (final String p : sourceHostPortWi.keySet()) { sourceHostPortWi.get(p).setValueAndWait(fixedPorts); } modifyXML(vmsxml, domainNode, domainName, parameters); final String virshOptions = getVMSVirtualDomainInfo().getVirshOptions(); vmsxml.saveAndDefine(domainNode, domainName, virshOptions); } } getResource().setNew(false); getBrowser().reload(getNode(), false); getBrowser().periodicalVMSUpdate(getVMSVirtualDomainInfo().getDefinedOnHosts()); Tools.invokeLater( new Runnable() { @Override public void run() { tablePanel.setVisible(true); } }); if (!testOnly) { storeComboBoxValues(params); } checkResourceFieldsChanged(null, params); } /** Modify device xml. */ @Override protected void modifyXML( final VMSXML vmsxml, final Node node, final String domainName, final Map<String, String> params) { if (vmsxml != null) { vmsxml.modifyDiskXML(node, domainName, params); } } /** Returns data for the table. */ @Override protected Object[][] getTableData(final String tableName) { if (VMSVirtualDomainInfo.HEADER_TABLE.equals(tableName)) { return getVMSVirtualDomainInfo().getMainTableData(); } else if (VMSVirtualDomainInfo.DISK_TABLE.equals(tableName)) { if (getResource().isNew()) { return new Object[][] {}; } return new Object[][] { getVMSVirtualDomainInfo() .getDiskDataRow(getName(), null, getVMSVirtualDomainInfo().getDisks(), true) }; } return new Object[][] {}; } /** Returns whether this parameter is advanced. */ @Override protected boolean isAdvanced(final String param) { return false; } /** Returns access type of this parameter. */ @Override protected ConfigData.AccessType getAccessType(final String param) { return ConfigData.AccessType.ADMIN; } /** Returns true if the value of the parameter is ok. */ @Override protected boolean checkParam(final String param, final String newValue) { if (DiskData.TYPE.equals(param)) { Tools.invokeLater( !Tools.CHECK_SWING_THREAD, new Runnable() { @Override public void run() { final boolean file = FILE_TYPE.equals(newValue); final boolean block = BLOCK_TYPE.equals(newValue); final boolean network = NETWORK_TYPE.equals(newValue); for (final String p : sourceFileWi.keySet()) { sourceFileWi.get(p).setVisible(file); } for (final String p : sourceDeviceWi.keySet()) { sourceDeviceWi.get(p).setVisible(block); } for (final Map<String, Widget> w : checkFieldList) { for (String p : w.keySet()) { w.get(p).setVisible(network); } } } }); checkOneParam(DiskData.SOURCE_FILE); checkOneParam(DiskData.SOURCE_DEVICE); } else if (DiskData.TARGET_BUS_TYPE.equals(param)) { final Set<String> devices = new LinkedHashSet<String>(); devices.add(null); if (newValue != null) { final String[] targetDevices = TARGET_DEVICES_MAP.get(newValue); if (targetDevices != null) { for (final String dev : targetDevices) { if (!getVMSVirtualDomainInfo().isDevice(dev)) { devices.add(dev); } } } } final String saved = getParamSaved(DiskData.TARGET_DEVICE); String selected = null; devices.add(saved); if (saved == null || getResource().isNew()) { if (devices.size() > 1) { selected = devices.toArray(new String[devices.size()])[1]; } } else { selected = saved; } if (prevTargetBusType == null || !prevTargetBusType.equals(newValue)) { final String sel = selected; for (final String p : targetDeviceWi.keySet()) { targetDeviceWi.get(p).reloadComboBox(sel, devices.toArray(new String[devices.size()])); } prevTargetBusType = newValue; } final String tbs = getComboBoxValue(DiskData.TARGET_BUS_TYPE); if (getParamSaved(DiskData.DRIVER_NAME) == null && !tbs.equals(previousTargetBusType)) { if ("ide/cdrom".equals(newValue)) { for (final String p : readonlyWi.keySet()) { readonlyWi.get(p).setValue("True"); } for (final String p : driverTypeWi.keySet()) { if (getResource().isNew()) { driverTypeWi.get(p).setValue("raw"); } else { if (driverTypeWi.get(p).getValue() != null) { driverTypeWi.get(p).setValue(null); } } } } else if ("virtio/disk".equals(newValue)) { for (final String p : driverTypeWi.keySet()) { driverTypeWi.get(p).setValue("raw"); } for (final String p : driverCacheWi.keySet()) { driverCacheWi.get(p).setValue("none"); } } else { for (final String p : readonlyWi.keySet()) { readonlyWi.get(p).setValue("False"); driverTypeWi.get(p).setValue("raw"); } } } previousTargetBusType = tbs; checkOneParam(DiskData.SOURCE_FILE); checkOneParam(DiskData.SOURCE_DEVICE); } if (isRequired(param) && (newValue == null || "".equals(newValue))) { return false; } return true; } /** Whether the parameter should be enabled. */ @Override protected String isEnabled(final String param) { return null; } /** Whether the parameter should be enabled only in advanced mode. */ @Override protected boolean isEnabledOnlyInAdvancedMode(final String param) { return IS_ENABLED_ONLY_IN_ADVANCED.contains(param); } /** Updates parameters. */ @Override void updateParameters() { final Map<String, DiskData> disks = getVMSVirtualDomainInfo().getDisks(); if (disks != null) { final DiskData diskData = disks.get(getName()); if (diskData != null) { for (final String param : getParametersFromXML()) { final String oldValue = getParamSaved(param); String value = getParamSaved(param); final Widget wi = getWidget(param, null); for (final Host h : getVMSVirtualDomainInfo().getDefinedOnHosts()) { final VMSXML vmsxml = getBrowser().getVMSXML(h); if (vmsxml != null) { final String savedValue = diskData.getValue(param); if (savedValue != null) { value = savedValue; } } } if (!Tools.areEqual(value, oldValue)) { getResource().setValue(param, value); if (wi != null) { /* only if it is not changed by user. */ wi.setValue(value); } } } } } updateTable(VMSVirtualDomainInfo.HEADER_TABLE); updateTable(VMSVirtualDomainInfo.DISK_TABLE); // checkResourceFieldsChanged(null, getParametersFromXML()); setApplyButtons(null, getRealParametersFromXML()); } /** Returns combo box for parameter. */ @Override protected Widget createWidget(final String param, final String prefix, final int width) { String prefixS; if (prefix == null) { prefixS = ""; } else { prefixS = prefix; } if (DiskData.SOURCE_FILE.equals(param)) { final String sourceFile = getParamSaved(DiskData.SOURCE_FILE); final String regexp = ".*[^/]$"; final MyButton fileChooserBtn = new MyButton("Browse..."); fileChooserBtn.miniButton(); final Widget paramWi = WidgetFactory.createInstance( getFieldType(param), sourceFile, getParamPossibleChoices(param), regexp, width, Widget.NO_ABBRV, new AccessMode(getAccessType(param), false), /* only adv. mode */ fileChooserBtn); paramWi.setAlwaysEditable(true); sourceFileWi.put(prefixS, paramWi); if (Tools.isWindows()) { /* does not work on windows and I tried, ultimately because FilePane.usesShellFolder(fc) in BasicFileChooserUI returns true and it is not possible to descent into a directory. TODO: It may work in the future. */ paramWi.setTFButtonEnabled(false); } fileChooserBtn.addActionListener( new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { final Thread t = new Thread( new Runnable() { @Override public void run() { String file; final String oldFile = paramWi.getStringValue(); if (oldFile == null || "".equals(oldFile)) { file = LIBVIRT_IMAGE_LOCATION; } else { file = oldFile; } startFileChooser(paramWi, file, FILECHOOSER_FILE_ONLY); } }); t.start(); } }); widgetAdd(param, prefix, paramWi); return paramWi; } else { final Widget paramWi = super.createWidget(param, prefix, width); if (DiskData.TYPE.equals(param) || DiskData.TARGET_BUS_TYPE.equals(param)) { paramWi.setAlwaysEditable(false); } else if (DiskData.SOURCE_DEVICE.equals(param)) { paramWi.setAlwaysEditable(true); sourceDeviceWi.put(prefixS, paramWi); } else if (DiskData.SOURCE_NAME.equals(param)) { sourceNameWi.put(prefixS, paramWi); } else if (DiskData.SOURCE_PROTOCOL.equals(param)) { sourceProtocolWi.put(prefixS, paramWi); } else if (DiskData.SOURCE_HOST_NAME.equals(param)) { sourceHostNameWi.put(prefixS, paramWi); } else if (DiskData.SOURCE_HOST_PORT.equals(param)) { sourceHostPortWi.put(prefixS, paramWi); } else if (DiskData.AUTH_USERNAME.equals(param)) { authUsernameWi.put(prefixS, paramWi); } else if (DiskData.AUTH_SECRET_TYPE.equals(param)) { authSecretTypeWi.put(prefixS, paramWi); } else if (DiskData.AUTH_SECRET_UUID.equals(param)) { authSecretUuidWi.put(prefixS, paramWi); } else if (DiskData.TARGET_DEVICE.equals(param)) { paramWi.setAlwaysEditable(true); targetDeviceWi.put(prefixS, paramWi); } else if (DiskData.DRIVER_NAME.equals(param)) { driverNameWi.put(prefixS, paramWi); } else if (DiskData.DRIVER_TYPE.equals(param)) { driverTypeWi.put(prefixS, paramWi); } else if (DiskData.DRIVER_CACHE.equals(param)) { driverCacheWi.put(prefixS, paramWi); } else if (DiskData.READONLY.equals(param)) { readonlyWi.put(prefixS, paramWi); } return paramWi; } } /** Removes this disk without confirmation dialog. */ @Override protected void removeMyselfNoConfirm(final boolean testOnly) { final String virshOptions = getVMSVirtualDomainInfo().getVirshOptions(); for (final Host h : getVMSVirtualDomainInfo().getDefinedOnHosts()) { final VMSXML vmsxml = getBrowser().getVMSXML(h); if (vmsxml != null) { final Map<String, String> parameters = new HashMap<String, String>(); parameters.put(DiskData.SAVED_TARGET_DEVICE, getName()); vmsxml.removeDiskXML(getVMSVirtualDomainInfo().getDomainName(), parameters, virshOptions); } } getBrowser().periodicalVMSUpdate(getVMSVirtualDomainInfo().getDefinedOnHosts()); removeNode(); } /** Returns string representation. */ @Override public String toString() { final StringBuilder s = new StringBuilder(30); final String name = getName(); if (name == null) { return "new disk..."; } s.append(name); s.append(" ("); final String saved = getParamSaved(DiskData.TARGET_BUS_TYPE); if (saved == null) { s.append("new..."); } else if (TARGET_BUS_TYPES.containsKey(saved)) { s.append(TARGET_BUS_TYPES.get(saved)); } else { s.append(saved); } s.append(')'); return s.toString(); } /** Returns whether this item is removeable (null), or string why it isn't. */ @Override protected String isRemoveable() { return null; } /** Returns "add new" button. */ static MyButton getNewBtn(final VMSVirtualDomainInfo vdi) { final MyButton newBtn = new MyButton("Add Disk"); newBtn.addActionListener( new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { final Thread t = new Thread( new Runnable() { @Override public void run() { vdi.addDiskPanel(); } }); t.start(); } }); return newBtn; } /** Returns the regexp of the parameter. */ @Override protected String getParamRegexp(final String param) { if (FILE_TYPE.equals(getComboBoxValue(DiskData.TYPE)) && DiskData.SOURCE_FILE.equals(param)) { return ".*[^/]$"; } return super.getParamRegexp(param); } /** Additional tool tip. */ @Override protected String additionalToolTip(final String param) { final String tt = TOOLTIP_MAP.get(param); if (tt == null) { return ""; } return tt; } }
/** Returns cluster dialog title. */ @Override protected String getClusterDialogTitle() { return Tools.getString("Dialog.Cluster.Connect.Title"); }
/** Returns description. */ @Override protected String getDescription() { return Tools.getString("Dialog.Cluster.Connect.Description"); }
/** * Shows dialog and wait for answer. Returns next dialog, or null if it there is no next dialog. */ public final ConfigDialog showDialog() { /* making non modal dialog */ dialogGate = new CountDownLatch(1); dialogPanel = null; /* TODO: disabled caching because back button wouldn't work with dialogPanel.setContentPane(optionPane) method it would work with optionPane.createDialog... but that causes lockups with old javas and gnome. */ if (dialogPanel == null) { final ImageIcon[] icons = getIcons(); MyButton defaultButtonClass = null; final List<JComponent> allOptions = new ArrayList<JComponent>(additionalOptions); if (skipButtonEnabled()) { skipButton = new JCheckBox(Tools.getString("Dialog.ConfigDialog.SkipButton")); skipButton.setEnabled(false); skipButton.setBackground(Tools.getDefaultColor("ConfigDialog.Background.Light")); skipButton.addItemListener(skipButtonListener()); allOptions.add(skipButton); } final String[] buttons = buttons(); /* populate buttonToObjectMap */ for (int i = 0; i < buttons.length; i++) { options[i] = new MyButton(buttons[i], icons[i]); options[i].setBackgroundColor(Tools.getDefaultColor("ConfigDialog.Button")); allOptions.add(options[i]); buttonToObjectMap.put(buttons[i], options[i]); if (buttons[i].equals(defaultButton())) { defaultButtonClass = options[i]; } } /* create option pane */ final JPanel b = body(); final MyButton dbc = defaultButtonClass; Tools.invokeAndWait( new Runnable() { public void run() { optionPane = new JOptionPane( b, getMessageType(), JOptionPane.DEFAULT_OPTION, icon(), allOptions.toArray(new JComponent[allOptions.size()]), dbc); optionPane.setPreferredSize(new Dimension(dialogWidth(), dialogHeight())); optionPane.setMaximumSize(new Dimension(dialogWidth(), dialogHeight())); optionPane.setMinimumSize(new Dimension(dialogWidth(), dialogHeight())); optionPane.setBackground(Tools.getDefaultColor("ConfigDialog.Background.Dark")); final Container mainFrame = Tools.getGUIData().getMainFrame(); if (mainFrame instanceof JApplet) { final JFrame noframe = new JFrame(); dialogPanel = new JDialog(noframe); dialogPanel.setContentPane(optionPane); } else { dialogPanel = new JDialog((JFrame) mainFrame); dialogPanel.setContentPane(optionPane); } dialogPanel.setModal(false); dialogPanel.setResizable(true); } }); /* set location like the previous dialog */ } /* add action listeners */ final Map<MyButton, OptionPaneActionListener> optionPaneActionListeners = new HashMap<MyButton, OptionPaneActionListener>(); for (final MyButton o : options) { final OptionPaneActionListener ol = new OptionPaneActionListener(); optionPaneActionListeners.put(o, ol); o.addActionListener(ol); } final PropertyChangeListener propertyChangeListener = new PropertyChangeListener() { @Override public void propertyChange(final PropertyChangeEvent evt) { if (JOptionPane.VALUE_PROPERTY.equals(evt.getPropertyName()) && !"uninitializedValue".equals(evt.getNewValue())) { optionPaneAnswer = optionPane.getValue(); dialogGate.countDown(); } } }; optionPane.addPropertyChangeListener(propertyChangeListener); initDialog(); Tools.invokeAndWait( new Runnable() { public void run() { dialogPanel.setPreferredSize(new Dimension(dialogWidth(), dialogHeight())); dialogPanel.setMaximumSize(new Dimension(dialogWidth(), dialogHeight())); dialogPanel.setMinimumSize(new Dimension(dialogWidth(), dialogHeight())); dialogPanel.setLocationRelativeTo(Tools.getGUIData().getMainFrame()); dialogPanel.setVisible(true); } }); SwingUtilities.invokeLater( new Runnable() { public void run() { dialogPanel.setLocationRelativeTo(Tools.getGUIData().getMainFrameContentPane()); /* although the location was set before, it is set again as a * workaround for gray dialogs with nothing in it, that appear * in some comination of Java and compiz. */ } }); initDialogAfterVisible(); try { dialogGate.await(); } catch (InterruptedException ignored) { Thread.currentThread().interrupt(); } if (optionPaneAnswer instanceof String) { setPressedButton((String) optionPaneAnswer); } else { setPressedButton(cancelButton()); } optionPane.removePropertyChangeListener(propertyChangeListener); /* remove action listeners */ for (final MyButton o : options) { o.removeActionListener(optionPaneActionListeners.get(o)); } dialogPanel.dispose(); return checkAnswer(); }
/** Prepares a new <code>ClusterViewPanel</code> object. */ EmptyViewPanel() { super(); browser = new EmptyBrowser(); Tools.getGUIData().setEmptyBrowser(browser); browser.setEmptyViewPanel(this); browser.initHosts(); final JPanel buttonPanel = new JPanel(new FlowLayout()); buttonPanel.setMinimumSize(new Dimension(0, 110)); buttonPanel.setPreferredSize(new Dimension(0, 110)); buttonPanel.setMaximumSize(new Dimension(Short.MAX_VALUE, 110)); buttonPanel.setBackground(STATUS_BACKGROUND); add(buttonPanel, BorderLayout.NORTH); final JPanel logoPanel = new JPanel(new CardLayout()); logoPanel.setBackground(java.awt.Color.WHITE); final ImageIcon logoImage = Tools.createImageIcon("startpage_head.jpg"); final JLabel logo = new JLabel(logoImage); final JPanel lPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); lPanel.setBackground(java.awt.Color.WHITE); lPanel.add(logo); logoPanel.add(lPanel, LOGO_PANEL_STRING); final JPanel smallButtonPanel = new JPanel(); smallButtonPanel.setBackground(STATUS_BACKGROUND); smallButtonPanel.setLayout(new BoxLayout(smallButtonPanel, BoxLayout.Y_AXIS)); buttonPanel.add(smallButtonPanel); /* check for upgrade field. */ smallButtonPanel.add(Tools.getGUIData().getClustersPanel().registerUpgradeTextField()); /* add new host button */ final MyButton addHostButton = new MyButton(Tools.getString("ClusterTab.AddNewHost"), HOST_ICON); addHostButton.setBackgroundColor(Browser.STATUS_BACKGROUND); addHostButton.setPreferredSize(BIG_BUTTON_DIMENSION); addHostButton.addActionListener( new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { final Thread thread = new Thread( new Runnable() { @Override public void run() { final AddHostDialog ahd = new AddHostDialog(); ahd.showDialogs(); } }); thread.start(); } }); Tools.getGUIData().registerAddHostButton(addHostButton); buttonPanel.add(addHostButton); createEmptyView(); add(logoPanel, BorderLayout.SOUTH); Tools.getGUIData().registerAllHostsUpdate(this); Tools.getGUIData().allHostsUpdate(); /* add new cluster button */ final MyButton addClusterButton = new MyButton(Tools.getString("ClusterTab.AddNewCluster"), CLUSTER_ICON); addClusterButton.setBackgroundColor(Browser.STATUS_BACKGROUND); addClusterButton.setPreferredSize(BIG_BUTTON_DIMENSION); addClusterButton.setMinimumSize(BIG_BUTTON_DIMENSION); addClusterButton.addActionListener( new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { final Thread thread = new Thread( new Runnable() { @Override public void run() { AddClusterDialog acd = new AddClusterDialog(); acd.showDialogs(); } }); thread.start(); } }); Tools.getGUIData().registerAddClusterButton(addClusterButton); Tools.getGUIData().checkAddClusterButtons(); buttonPanel.add(addClusterButton); if (!Tools.getConfigData().getAutoHosts().isEmpty()) { SwingUtilities.invokeLater( new Runnable() { @Override public void run() { addHostButton.pressButton(); } }); } }