From 8c7203104004e425579a4fcbc1b9b91bb82f8f2e Mon Sep 17 00:00:00 2001 From: Selvasundaram Date: Thu, 24 Nov 2011 14:28:46 +0530 Subject: Disk Initialization enhanced with user selectable file system and mount point --- .../management/client/GlusterServersClient.java | 10 +- .../dialogs/InitializeDiskTypeSelection.java | 110 ++++++++++++++++++--- .../console/views/pages/AbstractDisksPage.java | 18 +++- .../management/core/constants/RESTConstants.java | 2 + .../resources/v1_0/GlusterServersResource.java | 14 ++- .../gateway/services/GlusterServerService.java | 23 +++++ .../gateway/tasks/InitializeDiskTask.java | 18 +++- .../management/gateway/utils/ServerUtil.java | 8 ++ 8 files changed, 177 insertions(+), 26 deletions(-) diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java index 3d27afb2..cb3519b1 100644 --- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java @@ -31,6 +31,7 @@ import com.gluster.storage.management.core.constants.RESTConstants; import com.gluster.storage.management.core.model.GlusterServer; import com.gluster.storage.management.core.model.ServerStats; import com.gluster.storage.management.core.response.GlusterServerListResponse; +import com.gluster.storage.management.core.response.StringListResponse; import com.gluster.storage.management.core.utils.GlusterCoreUtil; import com.sun.jersey.api.representation.Form; import com.sun.jersey.core.util.MultivaluedMapImpl; @@ -76,9 +77,16 @@ public class GlusterServersClient extends AbstractClient { return postRequest(form); } - public URI initializeDisk(String serverName, String diskName, String fsType) { + public List getFSType(String serverName) { + List fsType = ((StringListResponse) fetchSubResource(serverName + "/" + RESTConstants.RESOURCE_FSTYPE, + StringListResponse.class)).getData(); + return fsType; + } + + public URI initializeDisk(String serverName, String diskName, String fsType, String mountPoint) { Form form = new Form(); form.add(RESTConstants.FORM_PARAM_FSTYPE, fsType); + form.add(RESTConstants.FORM_PARAM_MOUNTPOINT, fsType); return putRequestURI(serverName + "/" + RESTConstants.RESOURCE_DISKS + "/" + diskName, form); } diff --git a/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/dialogs/InitializeDiskTypeSelection.java b/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/dialogs/InitializeDiskTypeSelection.java index 4b64ea96..b484d6d2 100644 --- a/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/dialogs/InitializeDiskTypeSelection.java +++ b/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/dialogs/InitializeDiskTypeSelection.java @@ -21,23 +21,30 @@ *******************************************************************************/ package com.gluster.storage.management.console.dialogs; -import java.util.ArrayList; import java.util.List; import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.TraverseEvent; import org.eclipse.swt.events.TraverseListener; +import org.eclipse.swt.graphics.Color; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.forms.events.HyperlinkAdapter; +import org.eclipse.ui.forms.events.HyperlinkEvent; +import org.eclipse.ui.forms.widgets.Hyperlink; import com.gluster.storage.management.console.utils.GUIHelper; -import com.gluster.storage.management.core.constants.GlusterConstants; public class InitializeDiskTypeSelection extends Dialog { @@ -46,9 +53,16 @@ public class InitializeDiskTypeSelection extends Dialog { private Composite initializeDiskTypeComposite; private Composite composite; private String fsType; + private String mountPointText; + private Text mountPoint; + private String deviceName; + private List possibleFsType; + private String defaultMountPoint = "/export/"; - public InitializeDiskTypeSelection(Shell parentShell) { + public InitializeDiskTypeSelection(Shell parentShell, String formatingDeviceName, List possibleFsType) { super(parentShell); + this.possibleFsType = possibleFsType; + this.deviceName = formatingDeviceName; // TODO Auto-generated constructor stub } @@ -98,32 +112,84 @@ public class InitializeDiskTypeSelection extends Dialog { GridLayout layout = new GridLayout(3, false); initializeDiskTypeComposite.setLayout(layout); - createLabel(initializeDiskTypeComposite, "Format disk using "); + createLabel(initializeDiskTypeComposite, "File system "); createFormatTypeCombo(initializeDiskTypeComposite); - createLabel(initializeDiskTypeComposite, " file system"); + createLabel(initializeDiskTypeComposite, "Mount point "); + createMountPointText(initializeDiskTypeComposite); + createChangeLink(initializeDiskTypeComposite); } private void createLabel(Composite composite, String labelText) { Label formatTypeLabel = new Label(composite, SWT.NONE); formatTypeLabel.setText(labelText); - formatTypeLabel.setLayoutData(new GridData(GridData.END, GridData.CENTER, false, false)); + formatTypeLabel.setLayoutData(new GridData(GridData.BEGINNING, GridData.CENTER, false, false)); } private void createFormatTypeCombo(Composite composite) { - List fsType = new ArrayList(); - fsType.add(GlusterConstants.FSTYPE_DEFAULT); - fsType.add(GlusterConstants.FSTYPE_EXT_3); - fsType.add(GlusterConstants.FSTYPE_EXT_4); - fsType.add(GlusterConstants.FSTYPE_XFS); formatTypeCombo = new Combo(composite, SWT.READ_ONLY); - formatTypeCombo.setItems(fsType.toArray(new String[0])); + formatTypeCombo.setItems(possibleFsType.toArray(new String[0])); formatTypeCombo.select(0); + new Label(composite, SWT.NONE); } + private void createMountPointText(Composite container) { + mountPoint = new Text(container, SWT.BORDER); + GridData txtNameData = new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1); + txtNameData.horizontalSpan = 1; + txtNameData.widthHint = 400; + mountPoint.setTextLimit(100); + mountPoint.setLayoutData(txtNameData); + mountPoint.setText(defaultMountPoint + deviceName); + mountPoint.setEnabled(false); + mountPoint.addModifyListener(new ModifyListener() { + @Override + public void modifyText(ModifyEvent e) { + validateMountPoint(mountPoint.getText().trim()); + } + }); + } + + private void createChangeLink(Composite container) { + final Hyperlink changeLink = new Hyperlink(container, SWT.UNDERLINE_SINGLE); + changeLink.setText("change"); + changeLink.setUnderlined(true); + changeLink.setForeground(new Color(Display.getDefault(), 0, 0, 255)); + + changeLink.addHyperlinkListener(new HyperlinkAdapter() { + + // private void finishEdit() { + // changeLink.setText("change"); + // mountPoint.setEnabled(false); + // } + + private void startEdit() { + // changeLink.setText("update"); + changeLink.setVisible(false); + mountPoint.setEnabled(true); + } + + @Override + public void linkActivated(HyperlinkEvent e) { + if (mountPoint.isEnabled()) { + // we were already in edit mode. + // finishEdit(); + } else { + // Get in to edit mode + startEdit(); + } + } + }); + } + @Override protected void okPressed() { - fsType = formatTypeCombo.getText(); - super.okPressed(); + fsType = formatTypeCombo.getText().trim(); + mountPointText = mountPoint.getText().trim(); + if (validateForm()) { + super.okPressed(); + } else { + MessageDialog.openError(getShell(), "Error: Validation error!", "Empty or Invalid mountpoint."); + } } @Override @@ -131,6 +197,17 @@ public class InitializeDiskTypeSelection extends Dialog { super.cancelPressed(); } + private boolean validateMountPoint(String deviceMountPoint) { + if (deviceMountPoint.isEmpty()) { + return false; + } + return deviceMountPoint.matches("^/.+"); + } + + private boolean validateForm() { + return (!formatTypeCombo.getText().trim().isEmpty() && validateMountPoint( mountPoint.getText().trim())); + } + /** * Overriding to make sure that the dialog is centered in screen */ @@ -142,7 +219,10 @@ public class InitializeDiskTypeSelection extends Dialog { } public String getFSType() { - return fsType.trim(); + return fsType; } + public String getMountPoint() { + return mountPointText; + } } diff --git a/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/views/pages/AbstractDisksPage.java b/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/views/pages/AbstractDisksPage.java index 417e67ea..b131ccc2 100644 --- a/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/views/pages/AbstractDisksPage.java +++ b/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/views/pages/AbstractDisksPage.java @@ -19,6 +19,7 @@ package com.gluster.storage.management.console.views.pages; import java.net.URI; +import java.util.ArrayList; import java.util.List; import org.eclipse.jface.dialogs.MessageDialog; @@ -45,6 +46,7 @@ import com.gluster.storage.management.console.Application; import com.gluster.storage.management.console.GlusterDataModelManager; import com.gluster.storage.management.console.IEntityListener; import com.gluster.storage.management.console.dialogs.InitializeDiskTypeSelection; +import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; import com.gluster.storage.management.core.model.ClusterListener; import com.gluster.storage.management.core.model.DefaultClusterListener; import com.gluster.storage.management.core.model.Device; @@ -255,17 +257,26 @@ public abstract class AbstractDisksPage extends AbstractTableTreeViewerPage possibleFsType = new ArrayList(); + try { + possibleFsType = serversClient.getFSType(device.getServerName()); + } catch (GlusterRuntimeException eFsType) { + MessageDialog.openError(getShell(), "Error: File System Type", eFsType.getMessage()); + return; + } + + InitializeDiskTypeSelection formatDialog = new InitializeDiskTypeSelection(getShell(), device.getName(), possibleFsType); int userAction = formatDialog.open(); if (userAction == Window.CANCEL) { formatDialog.cancelPressed(); return; } - GlusterServersClient serversClient = new GlusterServersClient(); try { - URI uri = serversClient.initializeDisk(device.getServerName(), device.getName(), formatDialog.getFSType()); + URI uri = serversClient.initializeDisk(device.getServerName(), device.getName(), formatDialog.getFSType(), formatDialog.getMountPoint()); TasksClient taskClient = new TasksClient(); TaskInfo taskInfo = taskClient.getTaskInfo(uri); @@ -289,6 +300,7 @@ public abstract class AbstractDisksPage extends AbstractTableTreeViewerPage