diff options
| author | Shireesh Anjal <anjalshireesh@gmail.com> | 2011-06-28 09:25:32 -0700 |
|---|---|---|
| committer | Shireesh Anjal <anjalshireesh@gmail.com> | 2011-06-28 09:25:32 -0700 |
| commit | d7185f7fbba958edddc3b03b6f7f312798ea6d27 (patch) | |
| tree | 5b9c4e663c3ccc7c38229cc1e0fc18b0bcb36e9e /src | |
| parent | d827bdefc79906894a1a9cafdbc7ce77c46b6468 (diff) | |
| parent | 5c9b6a12aab8e4ea95d404c4312a89ca2b07ddc6 (diff) | |
Merge pull request #88 from Selvasundaram/11b1cfbb18a4deaa63a69868aadfaf51086fb482
Task progress view UI
Diffstat (limited to 'src')
12 files changed, 98 insertions, 45 deletions
diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java index 514217ad..14539b87 100644 --- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java @@ -9,6 +9,7 @@ import static com.gluster.storage.management.client.constants.ClientConstants.TR import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.net.URI;
import java.security.KeyStore;
import javax.net.ssl.HostnameVerifier;
@@ -31,6 +32,7 @@ import com.sun.jersey.api.representation.Form; import com.sun.jersey.client.urlconnection.HTTPSProperties;
import com.sun.jersey.core.util.MultivaluedMapImpl;
+
public abstract class AbstractClient {
private static final String HTTP_HEADER_AUTH = "Authorization";
protected static final MultivaluedMap<String, String> NO_PARAMS = new MultivaluedMapImpl();
@@ -263,9 +265,9 @@ public abstract class AbstractClient { postRequest(resource.path(subResourceName), form);
}
- private void putRequest(WebResource resource, Form form) {
+ private ClientResponse putRequest(WebResource resource, Form form) {
try {
- prepareFormRequestBuilder(resource).put(form);
+ return prepareFormRequestBuilder(resource).put(ClientResponse.class, form);
} catch (UniformInterfaceException e) {
throw new GlusterRuntimeException(e.getResponse().getEntity(String.class));
}
@@ -287,6 +289,11 @@ public abstract class AbstractClient { protected void putRequest(String subResourceName, Form form) {
putRequest(resource.path(subResourceName), form);
}
+
+
+ protected URI putRequestURI(String subResourceName, Form form) {
+ return putRequest(resource.path(subResourceName), form).getLocation();
+ }
/**
* Submits given Form using PUT method to the given sub-resource and returns the object received as response
diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java index 02a387e0..87fbed31 100644 --- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java @@ -203,7 +203,7 @@ public class GlusterDataModelManager { Disk disk = null; List<Disk> volumeDisks = new ArrayList<Disk>(); for (Brick brick : volume.getBricks()) { - disk = getDisk(brick.getDiskName()); + disk = getDisk(brick.getServerName() + ":" + brick.getDiskName()); // disk = new Disk(); // disk.setServerName(brick.getServerName()); // disk.setName(brick.getDiskName()); diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/TasksClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/TasksClient.java index 8e608983..aff4f5d2 100644 --- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/TasksClient.java +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/TasksClient.java @@ -27,7 +27,7 @@ import javax.ws.rs.core.MultivaluedMap; import com.gluster.storage.management.core.constants.RESTConstants; import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; import com.gluster.storage.management.core.model.TaskInfo; -import com.gluster.storage.management.core.response.TaskListResponse; +import com.gluster.storage.management.core.response.TaskInfoListResponse; import com.sun.jersey.api.representation.Form; import com.sun.jersey.core.util.MultivaluedMapImpl; @@ -51,7 +51,7 @@ public class TasksClient extends AbstractClient { } public List<TaskInfo> getAllTasks() { // TaskListResponse get only the list of taskInfo not list of Tasks - return ((TaskListResponse) fetchResource(TaskListResponse.class)).getTaskList(); + return ((TaskInfoListResponse) fetchResource(TaskInfoListResponse.class)).getTaskList(); } // see startMigration @ VolumesClient, etc diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java index be9b82b0..6be67e65 100644 --- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java @@ -29,6 +29,7 @@ import static com.gluster.storage.management.core.constants.RESTConstants.FORM_P import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_VOLUME_OPTIONS; import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_VOLUME_TYPE; +import java.net.URI; import java.util.Date; import java.util.List; import java.util.Set; @@ -228,7 +229,9 @@ public class VolumesClient extends AbstractClient { form.add(RESTConstants.FORM_PARAM_OPERATION, RESTConstants.TASK_START); form.add(RESTConstants.FORM_PARAM_AUTO_COMMIT, autoCommit); - putRequest(volumeName + "/" + RESTConstants.RESOURCE_BRICKS, form); + // putRequest(volumeName + "/" + RESTConstants.RESOURCE_BRICKS, form); + URI uri = putRequestURI(volumeName + "/" + RESTConstants.RESOURCE_BRICKS, form); + System.out.println(uri.getRawPath()); } public void rebalanceStart(String volumeName, Boolean fixLayout, Boolean migrateData, Boolean forcedDataMigrate) { diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/TaskListResponse.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/TaskInfoListResponse.java index 110f4e63..0ab27c35 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/TaskListResponse.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/TaskInfoListResponse.java @@ -27,19 +27,19 @@ import javax.xml.bind.annotation.XmlRootElement; import com.gluster.storage.management.core.model.TaskInfo; -@XmlRootElement(name = "response") -public class TaskListResponse { +@XmlRootElement(name = "tasks") +public class TaskInfoListResponse { private List<TaskInfo> taskInfoList; - public TaskListResponse() { + public TaskInfoListResponse() { } - public TaskListResponse(List<TaskInfo> taskInfoList) { + public TaskInfoListResponse(List<TaskInfo> taskInfoList) { this.taskInfoList = taskInfoList; } - @XmlElement(name="TaskInfo", type=TaskInfo.class) + @XmlElement(name="task", type=TaskInfo.class) public List<TaskInfo> getTaskList() { return taskInfoList; } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/MigrateDiskAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/MigrateDiskAction.java index bbb29253..56ea8179 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/MigrateDiskAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/MigrateDiskAction.java @@ -18,14 +18,16 @@ *******************************************************************************/ package com.gluster.storage.management.gui.actions; +import java.util.Set; + import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.wizard.WizardDialog; import com.gluster.storage.management.core.model.Brick; import com.gluster.storage.management.core.model.Volume; import com.gluster.storage.management.gui.dialogs.MigrateDiskWizard; +import com.gluster.storage.management.gui.utils.GUIHelper; public class MigrateDiskAction extends AbstractActionDelegate { private Volume volume; @@ -33,9 +35,6 @@ public class MigrateDiskAction extends AbstractActionDelegate { @Override protected void performAction(IAction action) { -// MigrateDiskDialog dialog = new MigrateDiskDialog(window.getShell(), volume, disk); -// dialog.create(); -// dialog.open(); MigrateDiskWizard wizard = new MigrateDiskWizard(volume, brick); WizardDialog dialog = new WizardDialog(window.getShell(), wizard); @@ -47,15 +46,16 @@ public class MigrateDiskAction extends AbstractActionDelegate { @Override public void selectionChanged(IAction action, ISelection selection) { super.selectionChanged(action, selection); - + Set<Brick> bricks; if (selectedEntity instanceof Volume) { volume = (Volume) selectedEntity; } action.setEnabled(false); if (selectedEntity instanceof Brick) { - brick = (Brick) selectedEntity; - action.setEnabled(((StructuredSelection) selection).size() == 1); + bricks = GUIHelper.getInstance().getSelectedEntities(getWindow(), Brick.class); + brick = (Brick) bricks.iterator().next(); + action.setEnabled(brick != null); } } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskPage1.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskPage1.java index ba5ef867..4533ca23 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskPage1.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskPage1.java @@ -23,13 +23,16 @@ import java.util.List; import org.eclipse.jface.layout.TableColumnLayout; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ColumnWeightData; +import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ITableLabelProvider; +import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Table; @@ -62,6 +65,8 @@ public class MigrateDiskPage1 extends WizardPage { private TableViewer tableViewerFrom; + private Button autoCompleteCheckbox; + private ITableLabelProvider getDiskLabelProvider(final String volumeName) { return new TableLabelProviderAdapter() { @@ -74,9 +79,9 @@ public class MigrateDiskPage1 extends WizardPage { return (columnIndex == DISK_TABLE_COLUMN_INDICES.SERVER.ordinal() ? disk.getServerName() : columnIndex == DISK_TABLE_COLUMN_INDICES.BRICK_DIRECTORY.ordinal() ? disk.getMountPoint() + "/" + volumeName : columnIndex == DISK_TABLE_COLUMN_INDICES.FREE_SPACE.ordinal() ? NumberUtil - .formatNumber(disk.getFreeSpace()) + .formatNumber(disk.getFreeSpace() / 1024 ) /* Coverted to GB */ : columnIndex == DISK_TABLE_COLUMN_INDICES.TOTAL_SPACE.ordinal() ? NumberUtil - .formatNumber(disk.getSpace()) : "Invalid"); + .formatNumber(disk.getSpace() / 1024) : "Invalid"); } }; } @@ -118,10 +123,6 @@ public class MigrateDiskPage1 extends WizardPage { this.volume = volume; this.fromBrick = brick; setTitle("Migrate Brick [" + volume.getName() + "]"); - // setDescription("Migrate data from one disk to another for the chosen Volume. " + - // "This will copy all data present in the \"from disk\" of the volume " + - // "to \"to disk\", remove \"from disk\" from the volume, and " + - // "add \"to disk\" to the volume"); setPageDescription(null, null); setPageComplete(false); } @@ -162,12 +163,18 @@ public class MigrateDiskPage1 extends WizardPage { return tableViewerComposite; } - public Disk getSourceDisk() { - return getSelectedDisk(tableViewerFrom); + public String getSourceBrickDir() { + Disk sourceDisk = getSelectedDisk(tableViewerFrom); + return sourceDisk.getQualifiedBrickName(volume.getName()); } - public Disk getTargetDisk() { - return getSelectedDisk(tableViewerTo); + public String getTargetBrickDir() { + Disk targetDisk = getSelectedDisk(tableViewerTo); + return targetDisk.getQualifiedBrickName(volume.getName()); + } + + public Boolean getAutoCommitSelection() { + return autoCompleteCheckbox.getSelection(); } /** @@ -200,7 +207,7 @@ public class MigrateDiskPage1 extends WizardPage { GlusterDataModelManager glusterDataModelManager = GlusterDataModelManager.getInstance(); List<Disk> fromBricks = glusterDataModelManager.getReadyDisksOfVolume(volume); - List<Disk> toDisks = glusterDataModelManager.getReadyDisksOfAllServersExcluding( glusterDataModelManager.getReadyDisksOfVolume(volume)); + List<Disk> toDisks = glusterDataModelManager.getReadyDisksOfAllServersExcluding( fromBricks ); tableViewerFrom = createTableViewer(container, diskLabelProvider, fromBricks, txtFilterFrom); @@ -208,6 +215,17 @@ public class MigrateDiskPage1 extends WizardPage { setFromDisk(tableViewerFrom, fromBrick); } tableViewerTo = createTableViewer(container, diskLabelProvider, toDisks, txtFilterTo); + + // Auto commit selection field + Composite autoCommitContainer = new Composite(container, SWT.NONE); + GridData data = new GridData(); + data.horizontalSpan = 2; + autoCommitContainer.setLayoutData(data); + autoCompleteCheckbox = new Button(autoCommitContainer, SWT.CHECK); + autoCompleteCheckbox.setSelection(true); + Label lblAutoComplete = new Label(autoCommitContainer, SWT.NONE); + lblAutoComplete.setText("Auto commit on migration complete"); + autoCommitContainer.setLayout( container.getLayout()); } private void setFromDisk(TableViewer tableViewer, Brick brickToSelect) { @@ -220,9 +238,17 @@ public class MigrateDiskPage1 extends WizardPage { } } } + + private void refreshButtonStatus() { + if(tableViewerFrom.getSelection().isEmpty() || tableViewerTo.getSelection().isEmpty()) { + setPageComplete(false); + } else { + setPageComplete(true); + } + } private TableViewer createTableViewer(Composite container, ITableLabelProvider diskLabelProvider, - List<Disk> fromDisks, Text txtFilterText) { + List<Disk> bricks, Text txtFilterText) { Composite tableViewerComposite = createTableViewerComposite(container); TableViewer tableViewer = new TableViewer(tableViewerComposite, SWT.SINGLE); @@ -232,7 +258,15 @@ public class MigrateDiskPage1 extends WizardPage { setupDiskTable(tableViewerComposite, tableViewer.getTable()); guiHelper.createFilter(tableViewer, txtFilterText, false); - tableViewer.setInput(fromDisks.toArray()); + tableViewer.setInput(bricks.toArray()); + + tableViewer.addSelectionChangedListener(new ISelectionChangedListener() { + + @Override + public void selectionChanged(SelectionChangedEvent event) { + refreshButtonStatus(); + } + }); return tableViewer; } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskWizard.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskWizard.java index 60cbd387..514f805e 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskWizard.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskWizard.java @@ -18,9 +18,9 @@ *******************************************************************************/ package com.gluster.storage.management.gui.dialogs; +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.Brick; import com.gluster.storage.management.core.model.Disk; @@ -47,14 +47,19 @@ public class MigrateDiskWizard extends Wizard { @Override public boolean performFinish() { - Disk sourceDisk = page.getSourceDisk(); - Disk targetDisk = page.getTargetDisk(); - Boolean autoCommit = true; //TODO get auto commit from user selection - // TODO add custom confirm dialog - + String sourceDir = page.getSourceBrickDir(); + String targetDir = page.getTargetBrickDir(); + Boolean autoCommit = page.getAutoCommitSelection(); VolumesClient volumesClient = new VolumesClient(); - volumesClient.startMigration(volume.getName(), sourceDisk.getQualifiedName(), targetDisk.getQualifiedName(), autoCommit); - + + try { + volumesClient.startMigration(volume.getName(), sourceDir, targetDir, autoCommit); + MessageDialog.openInformation(getShell(), "Brick migration", + "Brick migration is initiated, Please check the status..."); + //TODO Add the task to model + } catch (Exception e) { + MessageDialog.openError(getShell(), "Error: Migrate brick", e.getMessage()); + } return true; } } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/GUIHelper.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/GUIHelper.java index 31d762ec..d6fd5d03 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/GUIHelper.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/GUIHelper.java @@ -417,6 +417,7 @@ public class GUIHelper { return selectedEntities; } + public void configureCheckboxTableViewer(final CheckboxTableViewer tableViewer) { tableViewer.addCheckStateListener(new ICheckStateListener() { diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/TasksResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/TasksResource.java index d86cede2..44d86b1b 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/TasksResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/TasksResource.java @@ -47,6 +47,7 @@ import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; import com.gluster.storage.management.core.exceptions.GlusterValidationException; import com.gluster.storage.management.core.model.Task; import com.gluster.storage.management.core.model.TaskInfo; +import com.gluster.storage.management.core.response.TaskInfoListResponse; import com.sun.jersey.spi.resource.Singleton; @Path(RESOURCE_PATH_CLUSTERS + "/{" + PATH_PARAM_CLUSTER_NAME + "}/" + RESOURCE_TASKS) @@ -87,7 +88,7 @@ public class TasksResource extends AbstractResource { @Produces(MediaType.APPLICATION_XML) public Response getTasks() { try { - return okResponse(getAllTasksInfo(), MediaType.APPLICATION_XML); + return okResponse(new TaskInfoListResponse(getAllTasksInfo()), MediaType.APPLICATION_XML); } catch (GlusterRuntimeException e) { return errorResponse(e.getMessage()); } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/MigrateDiskTask.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/MigrateDiskTask.java index 1f044d77..0b1b67e4 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/MigrateDiskTask.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/MigrateDiskTask.java @@ -20,6 +20,7 @@ */ package com.gluster.storage.management.server.tasks; +import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.model.Task; import com.gluster.storage.management.core.model.TaskInfo; @@ -83,7 +84,7 @@ public class MigrateDiskTask extends Task { ProcessResult processResult = sshUtil.executeRemote(serverName, command); TaskStatus taskStatus = new TaskStatus(); if (processResult.isSuccess()) { - if (processResult.getOutput().matches("*started successfully")) { + if (processResult.getOutput().trim().matches(".*started successfully$")) { taskStatus.setCode(Status.STATUS_CODE_RUNNING); } else { taskStatus.setCode(Status.STATUS_CODE_FAILURE); @@ -136,7 +137,7 @@ public class MigrateDiskTask extends Task { ProcessResult processResult = sshUtil.executeRemote(serverName, command); TaskStatus taskStatus = new TaskStatus(); if (processResult.isSuccess()) { - if (processResult.getOutput().matches("*abort")) { + if (processResult.getOutput().trim().matches(".*aborted successfully$")) { taskStatus.setCode(Status.STATUS_CODE_SUCCESS); } else { taskStatus.setCode(Status.STATUS_CODE_FAILURE); @@ -156,10 +157,12 @@ public class MigrateDiskTask extends Task { ProcessResult processResult = sshUtil.executeRemote(serverName, command); TaskStatus taskStatus = new TaskStatus(); if (processResult.isSuccess()) { - if (processResult.getOutput().matches("*Migration complete")) { + if (processResult.getOutput().trim().matches("^Number of files migrated.*Migration complete$")) { taskStatus.setCode(Status.STATUS_CODE_SUCCESS); - } else { + } else if ( processResult.getOutput().trim().matches("^Number of files migrated.*Current file=.*")) { taskStatus.setCode(Status.STATUS_CODE_RUNNING); + } else { + taskStatus.setCode(Status.STATUS_CODE_FAILURE); } } else { taskStatus.setCode(Status.STATUS_CODE_FAILURE); diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java index 767b15c3..aa44b016 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java @@ -550,7 +550,6 @@ public class GlusterUtil { } else { throw new GlusterRuntimeException( migrateDiskTask.getTaskInfo().getStatus().getMessage()); } - return migrateDiskTask.getId(); } |
