diff options
| author | Selvam <selvam@gluster.com> | 2011-04-20 10:55:26 +0530 |
|---|---|---|
| committer | Selvam <selvam@gluster.com> | 2011-04-29 14:54:40 +0530 |
| commit | 3cc0768e0baf35ea140262e4f646cbdb9a3b8b84 (patch) | |
| tree | 3e23f01b7270667028592b3ce054374ce8bafdcf /src/com.gluster.storage.management.gui | |
| parent | c11192c4cf06f14ad90d72819ebeee2ad527f16d (diff) | |
Story #18 Add disk, UI, REST client and REST Resource
Diffstat (limited to 'src/com.gluster.storage.management.gui')
| -rw-r--r-- | src/com.gluster.storage.management.gui/plugin.xml | 32 | ||||
| -rw-r--r-- | src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddDiskAction.java | 83 | ||||
| -rw-r--r-- | src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddDiskPage.java | 160 | ||||
| -rw-r--r-- | src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddDiskWizard.java | 88 | ||||
| -rw-r--r-- | src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/DisksSelectionPage.java (renamed from src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumeDisksPage.java) | 9 | ||||
| -rw-r--r-- | src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/SelectDisksDialog.java | 24 |
6 files changed, 372 insertions, 24 deletions
diff --git a/src/com.gluster.storage.management.gui/plugin.xml b/src/com.gluster.storage.management.gui/plugin.xml index 97a60ad1..21dbbf50 100644 --- a/src/com.gluster.storage.management.gui/plugin.xml +++ b/src/com.gluster.storage.management.gui/plugin.xml @@ -251,6 +251,12 @@ id="com.gluster.storage.management.gui.commands.MigrateDisk" name="Migrate Disk"> </command> + <command + categoryId="com.gluster.storage.management.gui.category" + description="Add Disk" + id="com.gluster.storage.management.gui.commands.AddDisk" + name="Add Disk"> + </command> </extension> <extension point="org.eclipse.ui.bindings"> @@ -491,11 +497,11 @@ style="push" toolbarPath="Normal" tooltip="Migrate Disk"> - <enablement> - <objectClass - name="com.gluster.storage.management.core.model.Disk"> - </objectClass> - </enablement> + <enablement> + <objectClass + name="com.gluster.storage.management.core.model.Disk"> + </objectClass> + </enablement> </action> <action allowLabelUpdate="false" @@ -577,6 +583,22 @@ toolbarPath="Normal" tooltip="Start Volume"> </action> + <action + allowLabelUpdate="false" + class="com.gluster.storage.management.gui.actions.AddDiskAction" + definitionId="com.gluster.storage.management.gui.commands.AddDisk" + icon="icons/disk.png" + id="com.gluster.storage.management.gui.actions.AddDiskAction" + label="&Add Disk" + menubarPath="com.gluster.storage.management.gui.menu.volume/volume" + mode="FORCE_TEXT" + pulldown="false" + retarget="false" + state="false" + style="push" + toolbarPath="Normal" + tooltip="Add disk to the volume"> + </action> <menu id="com.gluster.storage.management.gui.menu.volume" label="&Gluster" diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddDiskAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddDiskAction.java new file mode 100644 index 00000000..2e311112 --- /dev/null +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddDiskAction.java @@ -0,0 +1,83 @@ +/** + * AddDiskAction.java + * + * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com> + * This file is part of Gluster Management Console. + * + * Gluster Management Console is free software; you can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Gluster Management Console is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License + * for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see + * <http://www.gnu.org/licenses/>. + */ + +package com.gluster.storage.management.gui.actions; + +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.wizard.WizardDialog; +import org.eclipse.swt.widgets.Display; + +import com.gluster.storage.management.core.model.Volume; +import com.gluster.storage.management.gui.dialogs.AddDiskWizard; + +public class AddDiskAction extends AbstractActionDelegate { + private Volume volume; + + /* (non-Javadoc) + * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose() + */ + @Override + public void dispose() { + window = null; + } + + /* (non-Javadoc) + * @see com.gluster.storage.management.gui.actions.AbstractActionDelegate#performAction(org.eclipse.jface.action.IAction) + */ + @Override + protected void performAction(IAction action) { + //TODO: open a dialog box + // MessageDialog.openInformation(getShell(), "Action captured", action.getDescription() + "\n" + volume.getName()); + Display.getDefault().asyncExec(new Runnable() { + + @Override + public void run() { + AddDiskWizard wizard = new AddDiskWizard(volume); // Also add single page + + WizardDialog dialog = new WizardDialog(getShell(), wizard); + dialog.create(); + dialog.getShell().setSize(1024, 600); + dialog.open(); + } + }); + + } + + + /* + * (non-Javadoc) + * + * @see + * com.gluster.storage.management.gui.actions.AbstractActionDelegate#selectionChanged(org.eclipse.jface.action.IAction + * , org.eclipse.jface.viewers.ISelection) + */ + @Override + public void selectionChanged(IAction action, ISelection selection) { + super.selectionChanged(action, selection); + + if (selectedEntity instanceof Volume) { + this.volume = (Volume) selectedEntity; + // action.setEnabled(volume.getStatus() == VOLUME_STATUS.ONLINE); + } + } + +} diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddDiskPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddDiskPage.java new file mode 100644 index 00000000..ea86774f --- /dev/null +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddDiskPage.java @@ -0,0 +1,160 @@ +/** + * AddDiskPage.java + * + * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com> + * This file is part of Gluster Management Console. + * + * Gluster Management Console is free software; you can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Gluster Management Console is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License + * for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see + * <http://www.gnu.org/licenses/>. + */ +package com.gluster.storage.management.gui.dialogs; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.jface.wizard.WizardPage; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; + +import com.gluster.storage.management.client.GlusterDataModelManager; +import com.gluster.storage.management.core.model.Disk; +import com.gluster.storage.management.core.model.Volume; +import com.gluster.storage.management.core.model.Volume.VOLUME_TYPE; +import com.richclientgui.toolbox.duallists.DualListComposite.ListContentChangedListener; +import com.richclientgui.toolbox.duallists.IRemovableContentProvider; + +/** + * @author root + * + */ +public class AddDiskPage extends WizardPage { + private List<Disk> availableDisks = new ArrayList<Disk>(); + private List<Disk> selectedDisks = new ArrayList<Disk>(); + private Volume volume = null; + private DisksSelectionPage page = null; + + public static final String PAGE_NAME = "add.disk.volume.page"; + + /** + * @param pageName + */ + protected AddDiskPage(Volume volume) { + super(PAGE_NAME); + this.volume = volume; + setTitle("Add Disk"); + + String description = "Add disks to the Volume by choosing disks from the cluster servers.\n"; + if ( volume.getVolumeType() == VOLUME_TYPE.DISTRIBUTED_MIRROR) { + description += "(Disk selection should be multiples of " + volume.getReplicaCount() + ")"; + } else if (volume.getVolumeType() == VOLUME_TYPE.DISTRIBUTED_STRIPE) { + description += "(Disk selection should be multiples of " + volume.getStripeCount() + ")"; + } + setDescription(description); + availableDisks = getAvailableDisks(volume); + + setPageComplete(false); + setErrorMessage("Please select disks to be added to the volume."); + } + + + private boolean isDiskUsed(Volume volume, Disk disk){ + for (String volumeDisk : volume.getDisks()) { // expected form of volumeDisk is "server:diskName" + if ( disk.getQualifiedName().equals(volumeDisk)) { + return true; + } + } + return false; + } + + protected List<Disk> getAvailableDisks(Volume volume) { + List<Disk> availableDisks = new ArrayList<Disk>(); + for (Disk disk : GlusterDataModelManager.getInstance().getReadyDisksOfAllServers()) { + if ( ! isDiskUsed(volume, disk) ) { + availableDisks.add(disk); + } + } + return availableDisks; + } + + public List<Disk> getChosenDisks( ) { + return page.getChosenDisks(); + } + + private boolean isValidDiskSelection(int diskCount) { + if ( diskCount == 0) { + return false; + } + switch (volume.getVolumeType()) { + case DISTRIBUTED_MIRROR: + return (diskCount % volume.getReplicaCount() == 0); + case DISTRIBUTED_STRIPE: + return (diskCount % volume.getStripeCount() == 0); + } + return true; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite) + */ + @Override + public void createControl(Composite parent) { + getShell().setText("Add Disk"); + List<Disk> chosenDisks = new ArrayList<Disk>(); // or volume.getDisks(); + + page = new DisksSelectionPage(parent, SWT.NONE, availableDisks, chosenDisks); + page.addDiskSelectionListener(new ListContentChangedListener<Disk>() { + @Override + public void listContentChanged(IRemovableContentProvider<Disk> contentProvider) { + List<Disk> newChosenDisks = page.getChosenDisks(); + + // validate chosen disks + if(isValidDiskSelection(newChosenDisks.size())) { + clearError(); + } else { + setError(); + } + } + }); + setControl(page); + } + + private void setError() { + String errorMessage = null; + if ( volume.getVolumeType() == VOLUME_TYPE.PLAIN_DISTRIBUTE) { + errorMessage = "Please select at least one disk!"; + } else if( volume.getVolumeType() == VOLUME_TYPE.DISTRIBUTED_MIRROR) { + errorMessage = "Please select disks in multiples of " + volume.getReplicaCount(); + } else { + errorMessage = "Please select disks in multiples of " + volume.getStripeCount(); + } + + setPageComplete(false); + setErrorMessage(errorMessage); + } + + private void clearError() { + setErrorMessage(null); + setPageComplete(true); + } + + public DisksSelectionPage getDialogPage() { + return this.page; + } + + public void setPageComplete() { + + } +} diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddDiskWizard.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddDiskWizard.java new file mode 100644 index 00000000..e12f6a57 --- /dev/null +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddDiskWizard.java @@ -0,0 +1,88 @@ +/** + * AddDiskWizard.java + * + * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com> + * This file is part of Gluster Management Console. + * + * Gluster Management Console is free software; you can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Gluster Management Console is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License + * for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see + * <http://www.gnu.org/licenses/>. + */ +package com.gluster.storage.management.gui.dialogs; + +import java.util.List; + +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.wizard.Wizard; + +import com.gluster.storage.management.client.GlusterDataModelManager; +import com.gluster.storage.management.client.VolumesClient; +import com.gluster.storage.management.core.model.Disk; +import com.gluster.storage.management.core.model.Status; +import com.gluster.storage.management.core.model.Volume; +import com.gluster.storage.management.core.utils.GlusterCoreUtil; + +/** + * + */ +public class AddDiskWizard extends Wizard { + private AddDiskPage page; + private Volume volume; + + public AddDiskWizard(Volume volume) { + setWindowTitle("Gluster Management Console - Add disk"); + setHelpAvailable(false); // TODO: Introduce wizard help + this.volume = volume; + } + + public void addPages() { + page = new AddDiskPage(volume); + addPage(page); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.wizard.Wizard#performFinish() + */ + @Override + public boolean performFinish() { + List<Disk> disks = page.getChosenDisks(); + VolumesClient volumeClient = new VolumesClient(GlusterDataModelManager.getInstance().getSecurityToken()); + try { + Status status = volumeClient.addDisks(volume.getName(), disks); + if (!status.isSuccess()) { + MessageDialog.openError(getShell(), "Add disk(s) to Volume", status.getMessage()); + return status.isSuccess(); + } else { + volume.addDisks(GlusterCoreUtil.getQualifiedDiskNames(disks)); + MessageDialog.openInformation(getShell(), "Add disk(s) to Volume", "Disk(s) are successfully added to " + + volume.getName()); + return status.isSuccess(); + } + } catch (Exception e) { + MessageDialog.openError(getShell(), "Add disk(s) to Volume", e.getMessage()); + return false; + } + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.wizard.Wizard#canFinish() + */ + @Override + public boolean canFinish() { + return super.canFinish() && page.isPageComplete(); + } +} diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumeDisksPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/DisksSelectionPage.java index c78601d9..e50e81a7 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumeDisksPage.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/DisksSelectionPage.java @@ -19,7 +19,6 @@ package com.gluster.storage.management.gui.dialogs; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import org.eclipse.jface.viewers.ITableLabelProvider; @@ -48,7 +47,7 @@ import com.richclientgui.toolbox.duallists.IRemovableContentProvider; import com.richclientgui.toolbox.duallists.RemovableContentProvider; import com.richclientgui.toolbox.duallists.TableColumnData; -public class CreateVolumeDisksPage extends Composite { +public class DisksSelectionPage extends Composite { private enum DISK_TABLE_COLUMN_INDICES { SERVER, DISK, SPACE, SPACE_USED } @@ -67,13 +66,17 @@ public class CreateVolumeDisksPage extends Composite { private Button btnDown; - public CreateVolumeDisksPage(final Composite parent, int style, List<Disk> allDisks, List<Disk> selectedDisks) { + public DisksSelectionPage(final Composite parent, int style, List<Disk> allDisks, List<Disk> selectedDisks) { super(parent, style); createPage(allDisks, selectedDisks); parent.layout(); } + + public void addDiskSelectionListener(ListContentChangedListener<Disk> listener) { + dualTableViewer.addChosenListChangedSelectionListener(listener); + } private TableLabelProviderAdapter getDiskLabelProvider() { return new TableLabelProviderAdapter() { diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/SelectDisksDialog.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/SelectDisksDialog.java index 0ec19d5b..d88317b1 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/SelectDisksDialog.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/SelectDisksDialog.java @@ -24,7 +24,6 @@ import java.util.List; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.osgi.framework.internal.core.Msg; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; @@ -33,13 +32,11 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.core.model.Disk; -import com.gluster.storage.management.core.model.Volume; public class SelectDisksDialog extends Dialog { - private CreateVolumeDisksPage disksPage; + private DisksSelectionPage disksPage; private List<Disk> allDisks; private List<Disk> selectedDisks; @@ -78,14 +75,12 @@ public class SelectDisksDialog extends Dialog { Composite container = new Composite(parent, SWT.NONE); GridLayout containerLayout = new GridLayout(2, false); container.setLayout(containerLayout); - GridData containerLayoutData = new GridData(SWT.FILL, SWT.FILL, true, - true); + GridData containerLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true); container.setLayoutData(containerLayoutData); getShell().setText("Create Volume - Select Disks"); - disksPage = new CreateVolumeDisksPage(container, SWT.NONE, allDisks, - selectedDisks); + disksPage = new DisksSelectionPage(container, SWT.NONE, allDisks, selectedDisks); return container; } @@ -97,10 +92,8 @@ public class SelectDisksDialog extends Dialog { */ @Override protected void createButtonsForButtonBar(Composite parent) { - createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, - true); - createButton(parent, IDialogConstants.CANCEL_ID, - IDialogConstants.CANCEL_LABEL, false); + createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true); + createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); } /** @@ -112,15 +105,14 @@ public class SelectDisksDialog extends Dialog { } @Override - protected void cancelPressed() { + protected void cancelPressed() { System.out.println("Test"); super.cancelPressed(); } @Override protected void okPressed() { if (this.getSelectedDisks().size() == 0) { - MessageDialog.openError(getShell(), "Select Disk(s)", - "Please select atlease one disk"); + MessageDialog.openError(getShell(), "Select Disk(s)", "Please select atlease one disk"); } else { super.okPressed(); } @@ -129,7 +121,7 @@ public class SelectDisksDialog extends Dialog { public List<Disk> getSelectedDisks() { return disksPage.getChosenDisks(); } - + public List<String> getSelectedBricks() { return disksPage.getChosenBricks(); } |
