Package lcmc.drbd.ui.resource

Source Code of lcmc.drbd.ui.resource.BlockDevMenu

/*
* This file is part of LCMC written by Rasto Levrinc.
*
* Copyright (C) 2014, Rastislav Levrinc.
*
* The LCMC 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.
*
* The LCMC 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 LCMC; see the file COPYING.  If not, write to
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
*/

package lcmc.drbd.ui.resource;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;

import lcmc.common.ui.CallbackAction;
import lcmc.common.ui.GUIData;
import lcmc.common.domain.AccessMode;
import lcmc.common.domain.Application;
import lcmc.cluster.domain.Cluster;
import lcmc.drbd.domain.DrbdXml;
import lcmc.host.domain.Host;
import lcmc.drbd.domain.BlockDevice;
import lcmc.cluster.ui.ClusterBrowser;
import lcmc.drbd.ui.DrbdLog;
import lcmc.lvm.ui.LVCreate;
import lcmc.lvm.ui.LVResize;
import lcmc.lvm.ui.LVSnapshot;
import lcmc.lvm.ui.VGCreate;
import lcmc.lvm.ui.VGRemove;
import lcmc.common.ui.utils.ButtonCallback;
import lcmc.drbd.service.DRBD;
import lcmc.common.domain.EnablePredicate;
import lcmc.logger.Logger;
import lcmc.logger.LoggerFactory;
import lcmc.common.ui.utils.MenuAction;
import lcmc.common.ui.utils.MenuFactory;
import lcmc.common.ui.utils.MyMenu;
import lcmc.common.ui.utils.MyMenuItem;
import lcmc.common.domain.Predicate;
import lcmc.common.domain.util.Tools;
import lcmc.common.ui.utils.UpdatableItem;
import lcmc.common.domain.VisiblePredicate;

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

@Named
public class BlockDevMenu {
    private static final Logger LOG = LoggerFactory.getLogger(BlockDevMenu.class);

    private static final String PV_CREATE_MENU_ITEM = "Create PV";
    private static final String PV_CREATE_MENU_DESCRIPTION = "Initialize a disk or partition for use by LVM.";
    private static final String PV_REMOVE_MENU_ITEM = "Remove PV";
    private static final String PV_REMOVE_MENU_DESCRIPTION = "Remove a physical volume.";
    private static final String VG_CREATE_MENU_ITEM = "Create VG";
    private static final String VG_CREATE_MENU_DESCRIPTION = "Create a volume group.";
    private static final String VG_REMOVE_MENU_ITEM = "Remove VG";
    private static final String VG_REMOVE_MENU_DESCRIPTION = "Remove a volume group.";
    private static final String LV_CREATE_MENU_ITEM = "Create LV in VG ";
    private static final String LV_CREATE_MENU_DESCRIPTION = "Create a logical volume.";
    private static final String LV_REMOVE_MENU_ITEM = "Remove LV";
    private static final String LV_REMOVE_MENU_DESCRIPTION = "Remove the logical volume";
    private static final String LV_RESIZE_MENU_ITEM = "Resize LV";
    private static final String LV_RESIZE_MENU_DESCRIPTION = "Resize the logical volume";
    private static final String LV_SNAPSHOT_MENU_ITEM = "Create LV Snapshot ";
    private static final String LV_SNAPSHOT_MENU_DESCRIPTION = "Create a snapshot of the logical volume.";

    private BlockDevInfo blockDevInfo;
    @Inject
    private GUIData guiData;
    @Inject
    private MenuFactory menuFactory;
    @Inject
    private Application application;
    @Inject
    private Provider<VGCreate> vgCreateProvide;
    @Inject
    private Provider<VGRemove> vgRemoveProvider;
    @Inject
    private Provider<LVCreate> lvCreateProvider;
    @Inject
    private Provider<LVResize> lvResizeProvder;
    @Inject
    private Provider<LVSnapshot> lvSnapshotProvider;
    @Inject
    private Provider<DrbdLog> drbdLogProvider;

    public List<UpdatableItem> getPulldownMenu(final BlockDevInfo blockDevInfo) {
        this.blockDevInfo = blockDevInfo;
        final List<UpdatableItem> items = new ArrayList<UpdatableItem>();
        final Application.RunMode runMode = Application.RunMode.LIVE;
        final MyMenu repMenuItem = menuFactory.createMenu(
                Tools.getString("HostBrowser.Drbd.AddDrbdResource"),
                new AccessMode(AccessMode.ADMIN, AccessMode.NORMAL),
                new AccessMode(AccessMode.OP, AccessMode.NORMAL))
                .enablePredicate(new EnablePredicate() {
                    @Override
                    public String check() {
                        final DrbdXml dxml = getClusterBrowser().getDrbdXml();
                        if (getDrbdVolumeInfo() != null) {
                            return "it is already a drbd resouce";
                        } else if (!getHost().isConnected()) {
                            return Host.NOT_CONNECTED_MENU_TOOLTIP_TEXT;
                        } else if (!getHost().isDrbdLoaded()) {
                            return "drbd is not loaded";
                        } else if (getBlockDevice().isMounted()) {
                            return "is mounted";
                        } else if (getBlockDevice().isVolumeGroupOnPhysicalVolume()) {
                            return "is volume group";
                        } else if (!getBlockDevice().isAvailable()) {
                            return "not available";
                        } else if (dxml.isDrbdDisabled()) {
                            return "disabled because of config";
                        } else {
                            final String noavail = getClusterBrowser().isDrbdAvailable(getHost());
                            if (noavail != null) {
                                return "DRBD installation problem: " + noavail;
                            }
                        }
                        return null;
                    }
                });
        repMenuItem.onUpdate(new Runnable() {
            @Override
            public void run() {
                repMenuItem.updateMenuComponents();
                final Cluster cluster = getHost().getCluster();
                final Host[] otherHosts = cluster.getHostsArray();
                final Collection<MyMenu> hostMenus = new ArrayList<MyMenu>();
                for (final Host oHost : otherHosts) {
                    if (oHost == getHost()) {
                        continue;
                    }
                    final MyMenu hostMenu = menuFactory.createMenu(oHost.getName(),
                            new AccessMode(AccessMode.ADMIN, AccessMode.NORMAL),
                            new AccessMode(AccessMode.OP, AccessMode.NORMAL))
                            .enablePredicate(new EnablePredicate() {
                                @Override
                                public String check() {
                                    final DrbdXml dxml = getClusterBrowser().getDrbdXml();
                                    if (!oHost.isConnected()) {
                                        return Host.NOT_CONNECTED_MENU_TOOLTIP_TEXT;
                                    } else if (!oHost.isDrbdLoaded()) {
                                        return "drbd is not loaded";
                                    } else {
                                        final String noavail = getClusterBrowser().isDrbdAvailable(getHost());
                                        if (noavail != null) {
                                            return "DRBD installation problem: " + noavail;
                                        }
                                        return null;
                                    }
                                }
                            });
                    hostMenu.onUpdate(new Runnable() {
                        @Override
                        public void run() {
                            hostMenu.updateMenuComponents();
                            hostMenu.removeAll();
                            final Set<BlockDevInfo> blockDevInfos = oHost.getBrowser().getSortedBlockDevInfos();
                            final List<BlockDevInfo> blockDevInfosS = new ArrayList<BlockDevInfo>();
                            for (final BlockDevInfo oBdi : blockDevInfos) {
                                if (oBdi.getName().equals(getBlockDevice().getName())) {
                                    blockDevInfosS.add(0, oBdi);
                                } else {
                                    blockDevInfosS.add(oBdi);
                                }
                            }

                            for (final BlockDevInfo oBdi : blockDevInfosS) {
                                if (oBdi.getDrbdVolumeInfo() == null && oBdi.getBlockDevice().isAvailable()) {
                                    hostMenu.add(addDrbdResourceMenuItem(oBdi, runMode));
                                }
                                if (oBdi.getName().equals(getBlockDevice().getName())) {
                                    hostMenu.addSeparator();
                                }
                            }
                            hostMenu.processAccessMode();
                        }
                    });
                    hostMenu.updateAndWait();
                    hostMenus.add(hostMenu);
                }
                repMenuItem.removeAll();
                for (final MyMenu hostMenu : hostMenus) {
                    repMenuItem.add(hostMenu);
                }
                repMenuItem.processAccessMode();

            }
        });
        items.add(repMenuItem);
        items.add(getPVCreateItem());
        items.add(getPVRemoveItem());
        items.add(getVGCreateItem());
        items.add(getVGRemoveItem());
        items.add(getLVCreateItem());
        items.add(getLVRemoveItem());
        items.add(getLVResizeItem());
        items.add(getLVSnapshotItem());
        final MyMenuItem attachMenu =
                menuFactory.createMenuItem(Tools.getString("HostBrowser.Drbd.Detach"),
                        BlockDevInfo.NO_HARDDISK_ICON_LARGE,
                        Tools.getString("HostBrowser.Drbd.Detach.ToolTip"),

                        Tools.getString("HostBrowser.Drbd.Attach"),
                        BlockDevInfo.HARDDISK_DRBD_ICON_LARGE,
                        Tools.getString("HostBrowser.Drbd.Attach.ToolTip"),
                        new AccessMode(AccessMode.OP, AccessMode.ADVANCED),
                        new AccessMode(AccessMode.OP, AccessMode.NORMAL))
                        .predicate(new Predicate() {
                            @Override
                            public boolean check() {
                                return !getBlockDevice().isDrbd() || getBlockDevice().isAttached();
                            }
                        })

                        .visiblePredicate(new VisiblePredicate() {
                            @Override
                            public boolean check() {
                                return getBlockDevice().isDrbd();
                            }
                        })
                        .enablePredicate(new EnablePredicate() {
                            @Override
                            public String check() {
                                if (!getBlockDevice().isDrbd()) {
                                    return BlockDevInfo.NO_DRBD_RESOURCE_STRING;
                                }
                                if (!application.isAdvancedMode() && getDrbdResourceInfo().isUsedByCRM()) {
                                    return VolumeInfo.IS_USED_BY_CRM_STRING;
                                }
                                if (getBlockDevice().isSyncing()) {
                                    return VolumeInfo.IS_SYNCING_STRING;
                                }
                                return null;
                            }
                        });
        attachMenu.addAction(new MenuAction() {
            @Override
            public void run(final String text) {
                if (attachMenu.getText().equals(Tools.getString("HostBrowser.Drbd.Attach"))) {
                    blockDevInfo.attach(runMode);
                } else {
                    blockDevInfo.detach(runMode);
                }
            }
        });
        final ClusterBrowser cb = getClusterBrowser();
        if (cb != null) {
            final ButtonCallback attachItemCallback = cb.new DRBDMenuItemCallback(getHost())
                    .addAction(new CallbackAction() {
                        @Override
                        public void run(final Host host) {
                            if (blockDevInfo.isDiskless(Application.RunMode.LIVE)) {
                                blockDevInfo.attach(Application.RunMode.TEST);
                            } else {
                                blockDevInfo.detach(Application.RunMode.TEST);
                            }
                        }
                    });
            blockDevInfo.addMouseOverListener(attachMenu, attachItemCallback);
        }
        items.add(attachMenu);

        /* connect / disconnect */
        final MyMenuItem connectMenu =
                menuFactory.createMenuItem(Tools.getString("HostBrowser.Drbd.Disconnect"),
                        null,
                        Tools.getString("HostBrowser.Drbd.Disconnect"),
                        Tools.getString("HostBrowser.Drbd.Connect"),
                        null,
                        Tools.getString("HostBrowser.Drbd.Connect"),
                        new AccessMode(AccessMode.OP, AccessMode.ADVANCED),
                        new AccessMode(AccessMode.OP, AccessMode.NORMAL))
                        .predicate(new Predicate() {
                            @Override
                            public boolean check() {
                                return blockDevInfo.isConnectedOrWF(runMode);
                            }
                        })
                        .visiblePredicate(new VisiblePredicate() {
                            @Override
                            public boolean check() {
                                return getBlockDevice().isDrbd();
                            }
                        })
                        .enablePredicate(new EnablePredicate() {
                            @Override
                            public String check() {
                                if (!getBlockDevice().isDrbd()) {
                                    return BlockDevInfo.NO_DRBD_RESOURCE_STRING;
                                }
                                if (!application.isAdvancedMode() && getDrbdResourceInfo().isUsedByCRM()) {
                                    return VolumeInfo.IS_USED_BY_CRM_STRING;
                                }
                                if (!getBlockDevice().isSyncing()
                                    || ((getBlockDevice().isPrimary()
                                         && getBlockDevice().isSyncSource())
                                         || (blockDevInfo.getOtherBlockDevInfo().getBlockDevice().isPrimary()
                                         && getBlockDevice().isSyncTarget()))) {
                                    return null;
                                } else {
                                    return VolumeInfo.IS_SYNCING_STRING;
                                }
                            }
                        });
        connectMenu.addAction(new MenuAction() {
            @Override
            public void run(final String text) {
                if (connectMenu.getText().equals(Tools.getString("HostBrowser.Drbd.Connect"))) {
                    blockDevInfo.connect(runMode);
                } else {
                    blockDevInfo.disconnect(runMode);
                }
            }
        });
        if (cb != null) {
            final ButtonCallback connectItemCallback =
                    cb.new DRBDMenuItemCallback(getHost())
                            .addAction(new CallbackAction() {
                                @Override
                                public void run(final Host host) {
                                    if (blockDevInfo.isConnectedOrWF(Application.RunMode.LIVE)) {
                                        blockDevInfo.disconnect(Application.RunMode.TEST);
                                    } else {
                                        blockDevInfo.connect(Application.RunMode.TEST);
                                    }
                                }
                            });
            blockDevInfo.addMouseOverListener(connectMenu, connectItemCallback);
        }
        items.add(connectMenu);

        /* set primary */
        final UpdatableItem setPrimaryItem =
                menuFactory.createMenuItem(Tools.getString("HostBrowser.Drbd.SetPrimaryOtherSecondary"),
                        null,
                        Tools.getString("HostBrowser.Drbd.SetPrimaryOtherSecondary"),

                        Tools.getString("HostBrowser.Drbd.SetPrimary"),
                        null,
                        Tools.getString("HostBrowser.Drbd.SetPrimary"),
                        new AccessMode(AccessMode.OP, AccessMode.ADVANCED),
                        new AccessMode(AccessMode.OP, AccessMode.NORMAL))
                        .predicate(new Predicate() {
                            @Override
                            public boolean check() {
                                if (!getBlockDevice().isDrbd()) {
                                    return false;
                                }
                                return getBlockDevice().isSecondary()
                                        && blockDevInfo.getOtherBlockDevInfo().getBlockDevice().isPrimary();
                            }
                        })
                        .visiblePredicate(new VisiblePredicate() {
                            @Override
                            public boolean check() {
                                return getBlockDevice().isDrbd();
                            }
                        })
                        .enablePredicate(new EnablePredicate() {
                            @Override
                            public String check() {
                                if (!getBlockDevice().isDrbd()) {
                                    return BlockDevInfo.NO_DRBD_RESOURCE_STRING;
                                }
                                if (!application.isAdvancedMode() && getDrbdResourceInfo().isUsedByCRM()) {
                                    return VolumeInfo.IS_USED_BY_CRM_STRING;
                                }
                                if (!getBlockDevice().isSecondary()) {
                                    return "cannot do that to the primary";
                                }
                                return null;
                            }
                        })
                        .addAction(new MenuAction() {
                            @Override
                            public void run(final String text) {
                                final BlockDevInfo oBdi = blockDevInfo.getOtherBlockDevInfo();
                                if (oBdi != null
                                        && oBdi.getBlockDevice().isPrimary()
                                        && !"yes".equals(getDrbdResourceInfo().getParamSaved(
                                        BlockDevInfo.ALLOW_TWO_PRIMARIES).getValueForConfig())) {
                                    oBdi.setSecondary(runMode);
                                }
                                blockDevInfo.setPrimary(runMode);
                            }
                        });
        items.add(setPrimaryItem);

        /* set secondary */
        final UpdatableItem setSecondaryItem =
                menuFactory.createMenuItem(Tools.getString("HostBrowser.Drbd.SetSecondary"),
                        null,
                        Tools.getString("HostBrowser.Drbd.SetSecondary.ToolTip"),
                        new AccessMode(AccessMode.OP, AccessMode.ADVANCED),
                        new AccessMode(AccessMode.OP, AccessMode.NORMAL))
                        .visiblePredicate(new VisiblePredicate() {
                            @Override
                            public boolean check() {
                                return getBlockDevice().isDrbd();
                            }
                        })
                        .enablePredicate(new EnablePredicate() {
                            @Override
                            public String check() {
                                if (!getBlockDevice().isDrbd()) {
                                    return BlockDevInfo.NO_DRBD_RESOURCE_STRING;
                                }
                                if (!application.isAdvancedMode() && getDrbdResourceInfo().isUsedByCRM()) {
                                    return VolumeInfo.IS_USED_BY_CRM_STRING;
                                }
                                if (!getBlockDevice().isPrimary()) {
                                    return "cannot do that to the secondary";
                                }
                                return null;
                            }
                        })
                        .addAction(new MenuAction() {
                            @Override
                            public void run(final String text) {
                                blockDevInfo.setSecondary(runMode);
                            }
                        });
        items.add(setSecondaryItem);

        /* force primary */
        final UpdatableItem forcePrimaryItem =
                menuFactory.createMenuItem(Tools.getString("HostBrowser.Drbd.ForcePrimary"),
                        null,
                        Tools.getString("HostBrowser.Drbd.ForcePrimary"),
                        new AccessMode(AccessMode.OP, AccessMode.ADVANCED),
                        new AccessMode(AccessMode.OP, AccessMode.NORMAL))
                        .visiblePredicate(new VisiblePredicate() {
                            @Override
                            public boolean check() {
                                return getBlockDevice().isDrbd();
                            }
                        })
                        .enablePredicate(new EnablePredicate() {
                            @Override
                            public String check() {
                                if (!getBlockDevice().isDrbd()) {
                                    return BlockDevInfo.NO_DRBD_RESOURCE_STRING;
                                }
                                if (!application.isAdvancedMode() && getDrbdResourceInfo().isUsedByCRM()) {
                                    return VolumeInfo.IS_USED_BY_CRM_STRING;
                                }
                                return null;
                            }
                        })
                        .addAction(new MenuAction() {
                            @Override
                            public void run(final String text) {
                                blockDevInfo.forcePrimary(runMode);
                            }
                        });
        items.add(forcePrimaryItem);

        /* invalidate */
        final UpdatableItem invalidateItem =
                menuFactory.createMenuItem(
                        Tools.getString("HostBrowser.Drbd.Invalidate"),
                        null,
                        Tools.getString("HostBrowser.Drbd.Invalidate.ToolTip"),
                        new AccessMode(AccessMode.ADMIN, AccessMode.ADVANCED),
                        new AccessMode(AccessMode.OP, AccessMode.NORMAL))
                        .visiblePredicate(new VisiblePredicate() {
                            @Override
                            public boolean check() {
                                return getBlockDevice().isDrbd();
                            }
                        })
                        .enablePredicate(new EnablePredicate() {
                            @Override
                            public String check() {
                                if (!getBlockDevice().isDrbd()) {
                                    return BlockDevInfo.NO_DRBD_RESOURCE_STRING;
                                }
                                if (!application.isAdvancedMode() && getDrbdResourceInfo().isUsedByCRM()) {
                                    return VolumeInfo.IS_USED_BY_CRM_STRING;
                                }
                                if (getBlockDevice().isSyncing()) {
                                    return VolumeInfo.IS_SYNCING_STRING;
                                }
                                if (getDrbdVolumeInfo().isVerifying()) {
                                    return VolumeInfo.IS_VERIFYING_STRING;
                                }
                                return null;
                            }
                        })
                        .addAction(new MenuAction() {
                            @Override
                            public void run(final String text) {
                                blockDevInfo.invalidateBD(runMode);
                            }
                        });
        items.add(invalidateItem);

        /* resume / pause sync */
        final MyMenuItem resumeSyncItem =
                menuFactory.createMenuItem(
                        Tools.getString("HostBrowser.Drbd.ResumeSync"),
                        null,
                        Tools.getString("HostBrowser.Drbd.ResumeSync.ToolTip"),

                        Tools.getString("HostBrowser.Drbd.PauseSync"),
                        null,
                        Tools.getString("HostBrowser.Drbd.PauseSync.ToolTip"),
                        new AccessMode(AccessMode.OP, AccessMode.ADVANCED),
                        new AccessMode(AccessMode.OP, AccessMode.NORMAL))
                        .predicate(new Predicate() {
                            @Override
                            public boolean check() {
                                return getBlockDevice().isSyncing() && getBlockDevice().isPausedSync();
                            }
                        })
                        .visiblePredicate(new VisiblePredicate() {
                            @Override
                            public boolean check() {
                                return getBlockDevice().isDrbd();
                            }
                        })
                        .enablePredicate(new EnablePredicate() {
                            @Override
                            public String check() {
                                if (!getBlockDevice().isDrbd()) {
                                    return BlockDevInfo.NO_DRBD_RESOURCE_STRING;
                                }
                                if (!application.isAdvancedMode() && getDrbdResourceInfo().isUsedByCRM()) {
                                    return VolumeInfo.IS_USED_BY_CRM_STRING;
                                }
                                if (!getBlockDevice().isSyncing()) {
                                    return "it is not being synced";
                                }
                                return null;
                            }
                        });
        resumeSyncItem.addAction(new MenuAction() {
            @Override
            public void run(final String text) {
                if (resumeSyncItem.getText().equals(Tools.getString("HostBrowser.Drbd.ResumeSync"))) {
                    blockDevInfo.resumeSync(runMode);
                } else {
                    blockDevInfo.pauseSync(runMode);
                }
            }
        });
        items.add(resumeSyncItem);

        /* resize */
        final UpdatableItem resizeItem =
                menuFactory.createMenuItem(Tools.getString("HostBrowser.Drbd.Resize"),
                        null,
                        Tools.getString("HostBrowser.Drbd.Resize.ToolTip"),
                        new AccessMode(AccessMode.ADMIN, AccessMode.ADVANCED),
                        new AccessMode(AccessMode.OP, AccessMode.NORMAL))
                        .visiblePredicate(new VisiblePredicate() {
                            @Override
                            public boolean check() {
                                return getBlockDevice().isDrbd();
                            }
                        })
                        .enablePredicate(new EnablePredicate() {
                            @Override
                            public String check() {
                                if (!getBlockDevice().isDrbd()) {
                                    return BlockDevInfo.NO_DRBD_RESOURCE_STRING;
                                }
                                if (!application.isAdvancedMode() && getDrbdResourceInfo().isUsedByCRM()) {
                                    return VolumeInfo.IS_USED_BY_CRM_STRING;
                                }
                                if (getBlockDevice().isSyncing()) {
                                    return VolumeInfo.IS_SYNCING_STRING;
                                }
                                return null;
                            }
                        })
                        .addAction(new MenuAction() {
                            @Override
                            public void run(final String text) {
                                blockDevInfo.resizeDrbd(runMode);
                            }
                        });
        items.add(resizeItem);

        /* discard my data */
        final UpdatableItem discardDataItem =
                menuFactory.createMenuItem(Tools.getString("HostBrowser.Drbd.DiscardData"),
                        null,
                        Tools.getString("HostBrowser.Drbd.DiscardData.ToolTip"),
                        new AccessMode(AccessMode.ADMIN, AccessMode.ADVANCED),
                        new AccessMode(AccessMode.OP, AccessMode.NORMAL))
                        .visiblePredicate(new VisiblePredicate() {
                            @Override
                            public boolean check() {
                                return getBlockDevice().isDrbd();
                            }
                        })
                        .enablePredicate(new EnablePredicate() {
                            @Override
                            public String check() {
                                if (!getBlockDevice().isDrbd()) {
                                    return BlockDevInfo.NO_DRBD_RESOURCE_STRING;
                                }
                                if (!application.isAdvancedMode() && getDrbdResourceInfo().isUsedByCRM()) {
                                    return VolumeInfo.IS_USED_BY_CRM_STRING;
                                }
                                if (getBlockDevice().isSyncing()) {
                                    return VolumeInfo.IS_SYNCING_STRING;
                                }
                                if (getBlockDevice().isPrimary()) {
                                    return "cannot do that to the primary";
                                }
                                return null;
                            }
                        })
                        .addAction(new MenuAction() {
                            @Override
                            public void run(final String text) {
                                blockDevInfo.discardData(runMode);
                            }
                        });
        items.add(discardDataItem);

        /* proxy up/down */
        final UpdatableItem proxyItem =
                menuFactory.createMenuItem(Tools.getString("BlockDevInfo.Drbd.ProxyDown"),
                        null,
                        getMenuToolTip("DRBD.proxyDown"),
                        Tools.getString("BlockDevInfo.Drbd.ProxyUp"),
                        null,
                        getMenuToolTip("DRBD.proxyUp"),
                        new AccessMode(AccessMode.ADMIN, AccessMode.NORMAL),
                        new AccessMode(AccessMode.OP, AccessMode.NORMAL))
                        .visiblePredicate(new VisiblePredicate() {
                            @Override
                            public boolean check() {
                                if (!getBlockDevice().isDrbd()) {
                                    return false;
                                }
                                return getDrbdResourceInfo().isProxy(getHost());
                            }
                        })
                        .enablePredicate(new EnablePredicate() {
                            @Override
                            public String check() {
                                if (!getBlockDevice().isDrbd()) {
                                    return BlockDevInfo.NO_DRBD_RESOURCE_STRING;
                                }
                                final ResourceInfo dri = getDrbdResourceInfo();
                                final Host pHost = dri.getProxyHost(getHost(), !ResourceInfo.WIZARD);
                                if (pHost == null) {
                                    return "not a proxy";
                                }
                                if (!pHost.isConnected()) {
                                    return Host.NOT_CONNECTED_MENU_TOOLTIP_TEXT;
                                }
                                if (!pHost.isDrbdProxyRunning()) {
                                    return "proxy daemon is not running";
                                }
                                return null;
                            }
                        })
                        .predicate(new Predicate() {
                            @Override
                            public boolean check() {
                                if (!getBlockDevice().isDrbd()) {
                                    return false;
                                }
                                final ResourceInfo dri = getDrbdResourceInfo();
                                final Host pHost = dri.getProxyHost(getHost(), !ResourceInfo.WIZARD);
                                if (pHost == null) {
                                    return false;
                                }
                                if (getBlockDevice().isDrbd()) {
                                    return pHost.isDrbdProxyUp(getDrbdResourceInfo().getName());
                                } else {
                                    return true;
                                }
                            }
                        })
                        .addAction(new MenuAction() {
                            @Override
                            public void run(final String text) {
                                final ResourceInfo dri = getDrbdResourceInfo();
                                final Host pHost = dri.getProxyHost(getHost(), !ResourceInfo.WIZARD);
                                if (pHost.isDrbdProxyUp(getDrbdResourceInfo().getName())) {
                                    DRBD.proxyDown(pHost, getDrbdResourceInfo().getName(), getDrbdVolumeInfo().getName(), runMode);
                                } else {
                                    DRBD.proxyUp(pHost, getDrbdResourceInfo().getName(), getDrbdVolumeInfo().getName(), runMode);
                                }
                                getClusterBrowser().updateProxyHWInfo(pHost);
                            }
                        });
        items.add(proxyItem);

        /* view log */
        final UpdatableItem viewDrbdLogItem =
                menuFactory.createMenuItem(Tools.getString("HostBrowser.Drbd.ViewDrbdLog"),
                        BlockDevInfo.LOGFILE_ICON,
                        null,
                        new AccessMode(AccessMode.RO, AccessMode.NORMAL),
                        new AccessMode(AccessMode.RO, AccessMode.NORMAL))
                        .visiblePredicate(new VisiblePredicate() {
                            @Override
                            public boolean check() {
                                return getBlockDevice().isDrbd();
                            }
                        })
                        .enablePredicate(new EnablePredicate() {
                            @Override
                            public String check() {
                                return null;
                            }
                        })
                        .addAction(new MenuAction() {
                            @Override
                            public void run(final String text) {
                                final String device = getDrbdVolumeInfo().getDevice();
                                final DrbdLog drbdLog = drbdLogProvider.get();
                                drbdLog.init(getHost(), device);
                                drbdLog.showDialog();
                            }
                        });
        items.add(viewDrbdLogItem);

        return items;
    }

    private ClusterBrowser getClusterBrowser() {
        return blockDevInfo.getBrowser().getClusterBrowser();
    }

    private Host getHost() {
        return blockDevInfo.getHost();
    }

    private BlockDevice getBlockDevice() {
        return blockDevInfo.getBlockDevice();
    }

    private VolumeInfo getDrbdVolumeInfo() {
        return blockDevInfo.getDrbdVolumeInfo();
    }

    private ResourceInfo getDrbdResourceInfo() {
        return getDrbdVolumeInfo().getDrbdResourceInfo();
    }

    /**
     * Returns 'add drbd resource' menu item.
     */
    private MyMenuItem addDrbdResourceMenuItem(final BlockDevInfo oBdi, final Application.RunMode runMode) {
        final MyMenuItem drbdResourceMenuItem = menuFactory.createMenuItem(oBdi.toString(),
                null,
                null,
                new AccessMode(AccessMode.ADMIN, AccessMode.NORMAL),
                new AccessMode(AccessMode.OP, AccessMode.NORMAL));
        drbdResourceMenuItem.addAction(new MenuAction() {
            @Override
            public void run(final String text) {
                drbdResourceMenuItem.cleanup();
                blockDevInfo.resetInfoPanel();
                blockDevInfo.setInfoPanel(null);
                oBdi.cleanup();
                oBdi.resetInfoPanel();
                oBdi.setInfoPanel(null);
                getClusterBrowser().getGlobalInfo().addDrbdVolume(blockDevInfo, oBdi, true, runMode);
            }
        });
        return drbdResourceMenuItem;
    }

    private UpdatableItem getPVCreateItem() {
        return menuFactory.createMenuItem(PV_CREATE_MENU_ITEM,
                null,
                PV_CREATE_MENU_DESCRIPTION,
                new AccessMode(AccessMode.OP, AccessMode.NORMAL),
                new AccessMode(AccessMode.OP, AccessMode.NORMAL))
                .visiblePredicate(new VisiblePredicate() {
                    @Override
                    public boolean check() {
                        return blockDevInfo.canCreatePV();
                    }
                })
                .enablePredicate(new EnablePredicate() {
                    @Override
                    public String check() {
                        if (getBlockDevice().isDrbd() && !getBlockDevice().isPrimary()) {
                            return "must be primary";
                        }
                        return null;
                    }
                })
                .addAction(new MenuAction() {
                    @Override
                    public void run(final String text) {
                        final boolean ret = blockDevInfo.pvCreate(Application.RunMode.LIVE);
                        if (!ret) {
                            guiData.progressIndicatorFailed(Tools.getString("BlockDevInfo.PVCreate.Failed",
                                    blockDevInfo.getName()));
                        }
                        getClusterBrowser().updateHWInfo(getHost(), Host.UPDATE_LVM);
                    }
                });
    }

    private UpdatableItem getPVRemoveItem() {
        return menuFactory.createMenuItem(PV_REMOVE_MENU_ITEM,
                null,
                PV_REMOVE_MENU_DESCRIPTION,
                new AccessMode(AccessMode.OP, AccessMode.NORMAL),
                new AccessMode(AccessMode.OP, AccessMode.NORMAL))
                .visiblePredicate(new VisiblePredicate() {
                    @Override
                    public boolean check() {
                        return blockDevInfo.canRemovePV();
                    }
                })
                .enablePredicate(new EnablePredicate() {
                    @Override
                    public String check() {
                        if (getBlockDevice().isDrbd()
                                && !getBlockDevice().isDrbdPhysicalVolume()) {
                            return "DRBD is on it";
                        }
                        return null;
                    }
                })
                .addAction(new MenuAction() {
                    @Override
                    public void run(final String text) {
                        final boolean ret = blockDevInfo.pvRemove(Application.RunMode.LIVE);
                        if (!ret) {
                            guiData.progressIndicatorFailed(
                                    Tools.getString("BlockDevInfo.PVRemove.Failed", blockDevInfo.getName()));
                        }
                        getClusterBrowser().updateHWInfo(getHost(), Host.UPDATE_LVM);
                    }
                });
    }

    private UpdatableItem getVGCreateItem() {
        return menuFactory.createMenuItem(
                VG_CREATE_MENU_ITEM,
                null,
                VG_CREATE_MENU_DESCRIPTION,
                new AccessMode(AccessMode.OP, AccessMode.NORMAL),
                new AccessMode(AccessMode.OP, AccessMode.NORMAL))
                .visiblePredicate(new VisiblePredicate() {
                    @Override
                    public boolean check() {
                        final BlockDevice bd;
                        if (getBlockDevice().isDrbd()) {
                            if (!getBlockDevice().isPrimary()) {
                                return false;
                            }
                            bd = getBlockDevice().getDrbdBlockDevice();
                            if (bd == null) {
                                return false;
                            }
                        } else {
                            bd = getBlockDevice();
                        }
                        return bd.isPhysicalVolume() && !bd.isVolumeGroupOnPhysicalVolume();
                    }
                })
                .enablePredicate(new EnablePredicate() {
                    @Override
                    public String check() {
                        return null;
                    }
                })
                .addAction(new MenuAction() {
                    @Override
                    public void run(final String text) {
                        final VGCreate vgCreate = vgCreateProvide.get();
                        vgCreate.init(getHost(), blockDevInfo);
                        while (true) {
                            vgCreate.showDialog();
                            if (vgCreate.isPressedCancelButton()) {
                                vgCreate.cancelDialog();
                                return;
                            } else if (vgCreate.isPressedFinishButton()) {
                                break;
                            }
                        }
                    }
                });
    }

    private UpdatableItem getVGRemoveItem() {
        return menuFactory.createMenuItem(VG_REMOVE_MENU_ITEM,
                null,
                VG_REMOVE_MENU_DESCRIPTION,
                new AccessMode(AccessMode.OP, AccessMode.NORMAL),
                new AccessMode(AccessMode.OP, AccessMode.NORMAL))
                .visiblePredicate(new VisiblePredicate() {
                    @Override
                    public boolean check() {
                        final BlockDevice bd;
                        if (getBlockDevice().isDrbd()) {
                            if (!getBlockDevice().isPrimary()) {
                                return false;
                            }
                            bd = getBlockDevice().getDrbdBlockDevice();
                            if (bd == null) {
                                return false;
                            }
                        } else {
                            bd = getBlockDevice();
                        }
                        return bd.isVolumeGroupOnPhysicalVolume();
                    }
                })
                .enablePredicate(new EnablePredicate() {
                    @Override
                    public String check() {
                        final String vg;
                        final BlockDevice bd = getBlockDevice();
                        final BlockDevice drbdBD = bd.getDrbdBlockDevice();
                        if (drbdBD == null) {
                            vg = bd.getVgOnPhysicalVolume();
                        } else {
                            vg = drbdBD.getVgOnPhysicalVolume();
                        }
                        if (getHost().getLogicalVolumesFromVolumeGroup(vg) != null) {
                            return "has LV on it";
                        }
                        return null;
                    }
                })
                .addAction(new MenuAction() {
                    @Override
                    public void run(final String text) {
                        final VGRemove vgRemove = vgRemoveProvider.get();
                        vgRemove.init(blockDevInfo);
                        while (true) {
                            vgRemove.showDialog();
                            if (vgRemove.isPressedCancelButton()) {
                                vgRemove.cancelDialog();
                                return;
                            } else if (vgRemove.isPressedFinishButton()) {
                                break;
                            }
                        }
                    }
                });
    }

    private UpdatableItem getLVCreateItem() {
        String name = LV_CREATE_MENU_ITEM;
        final String vgName = blockDevInfo.getVGName();
        if (vgName != null) {
            name += vgName;
        }

        final MyMenuItem mi = menuFactory.createMenuItem(
                name,
                null,
                LV_CREATE_MENU_DESCRIPTION,
                new AccessMode(AccessMode.OP, AccessMode.NORMAL),
                new AccessMode(AccessMode.OP, AccessMode.NORMAL))
                .visiblePredicate(new VisiblePredicate() {
                    @Override
                    public boolean check() {
                        final String vg = blockDevInfo.getVGName();
                        return vg != null && !"".equals(vg) && getHost().getVolumeGroupNames().contains(vg);
                    }
                })
                .enablePredicate(new EnablePredicate() {
                    @Override
                    public String check() {
                        return null;
                    }
                })
                .addAction(new MenuAction() {
                    @Override
                    public void run(final String text) {
                        final LVCreate lvCreate = lvCreateProvider.get();
                        lvCreate.init(getHost(), blockDevInfo.getVGName(), blockDevInfo.getBlockDevice());
                        while (true) {
                            lvCreate.showDialog();
                            if (lvCreate.isPressedCancelButton()) {
                                lvCreate.cancelDialog();
                                return;
                            } else if (lvCreate.isPressedFinishButton()) {
                                break;
                            }
                        }
                    }
                });
        mi.onUpdate(new Runnable() {
            @Override
            public void run() {
                mi.setText1(LV_CREATE_MENU_ITEM + blockDevInfo.getVGName());
            }
        });
        mi.setToolTipText(LV_CREATE_MENU_DESCRIPTION);
        return mi;
    }

    private UpdatableItem getLVRemoveItem() {
        return menuFactory.createMenuItem(LV_REMOVE_MENU_ITEM,
                null,
                LV_REMOVE_MENU_DESCRIPTION,
                new AccessMode(AccessMode.OP, AccessMode.NORMAL),
                new AccessMode(AccessMode.OP, AccessMode.NORMAL))
                .predicate(new Predicate() {
                    @Override
                    public boolean check() {
                        return true;
                    }
                })
                .visiblePredicate(new VisiblePredicate() {
                    @Override
                    public boolean check() {
                        return blockDevInfo.isLVM();
                    }
                })
                .enablePredicate(new EnablePredicate() {
                    @Override
                    public String check() {
                        if (getBlockDevice().isDrbd()) {
                            return "DRBD is on it";
                        }
                        return null;
                    }
                })
                .addAction(new MenuAction() {
                    @Override
                    public void run(final String text) {
                        if (application.confirmDialog(
                                "Remove Logical Volume",
                                "Remove logical volume and DESTROY all the data on it?",
                                "Remove",
                                "Cancel")) {
                            final boolean ret = blockDevInfo.lvRemove(Application.RunMode.LIVE);
                            if (!ret) {
                                LOG.info("Removing of logical volume failed");
                            }
                            getClusterBrowser().updateHWInfo(getHost(), Host.UPDATE_LVM);
                        }
                    }
                });
    }

    private UpdatableItem getLVResizeItem() {
        return menuFactory.createMenuItem(LV_RESIZE_MENU_ITEM,
                null,
                LV_RESIZE_MENU_DESCRIPTION,
                new AccessMode(AccessMode.OP, AccessMode.NORMAL),
                new AccessMode(AccessMode.OP, AccessMode.NORMAL))
                .visiblePredicate(new VisiblePredicate() {
                    @Override
                    public boolean check() {
                        return blockDevInfo.isLVM();
                    }
                })
                .enablePredicate(new EnablePredicate() {
                    @Override
                    public String check() {
                        return null;
                    }
                })
                .addAction(new MenuAction() {
                    @Override
                    public void run(final String text) {
                        final LVResize lvResize = lvResizeProvder.get();
                        lvResize.init(blockDevInfo);
                        while (true) {
                            lvResize.showDialog();
                            if (lvResize.isPressedCancelButton()) {
                                lvResize.cancelDialog();
                                return;
                            } else if (lvResize.isPressedFinishButton()) {
                                break;
                            }
                        }
                    }
                });
    }

    private UpdatableItem getLVSnapshotItem() {
        return menuFactory.createMenuItem(LV_SNAPSHOT_MENU_ITEM,
                null,
                LV_SNAPSHOT_MENU_DESCRIPTION,
                new AccessMode(AccessMode.OP, AccessMode.NORMAL),
                new AccessMode(AccessMode.OP, AccessMode.NORMAL))
                .visiblePredicate(new VisiblePredicate() {
                    @Override
                    public boolean check() {
                        return blockDevInfo.isLVM();
                    }
                })
                .enablePredicate(new EnablePredicate() {
                    @Override
                    public String check() {
                        return null;
                    }
                })
                .addAction(new MenuAction() {
                    @Override
                    public void run(final String text) {
                        final LVSnapshot lvSnapshot = lvSnapshotProvider.get();
                        lvSnapshot.init(blockDevInfo);
                        while (true) {
                            lvSnapshot.showDialog();
                            if (lvSnapshot.isPressedCancelButton()) {
                                lvSnapshot.cancelDialog();
                                return;
                            } else if (lvSnapshot.isPressedFinishButton()) {
                                break;
                            }
                        }
                    }
                });
    }

    private String getMenuToolTip(final String cmd) {
        if (getBlockDevice().isDrbd()) {
            return DRBD.getDistCommand(cmd,
                                       getHost(),
                                       getDrbdResourceInfo().getName(),
                                       getDrbdVolumeInfo().getName()).replaceAll("@.*?@", "");
        } else {
            return null;
        }
    }
}
TOP

Related Classes of lcmc.drbd.ui.resource.BlockDevMenu

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.