From a2b74b06a488d0f2a336aef71074c231f0825c98 Mon Sep 17 00:00:00 2001 From: Dhandapani Date: Tue, 5 Jul 2011 17:43:30 +0530 Subject: Initialize disk enhancement --- .../management/client/GlusterServersClient.java | 6 +- .../management/core/constants/RESTConstants.java | 1 + .../core/model/InitDiskStatusResponse.java | 86 ++++++++++++++++++++++ .../gui/views/pages/AbstractDisksPage.java | 26 ++++++- .../resources/v1_0/GlusterServersResource.java | 10 ++- .../server/tasks/InitializeDiskTask.java | 22 +++++- .../management/server/utils/GlusterUtil.java | 34 ++++++--- 7 files changed, 164 insertions(+), 21 deletions(-) create mode 100644 src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/InitDiskStatusResponse.java 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 b6d0a426..fa925842 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 @@ -62,8 +62,10 @@ public class GlusterServersClient extends AbstractClient { postRequest(form); } - public void initializeDisk(String serverName, String diskName) { - putRequest(serverName + "/" + RESTConstants.RESOURCE_DISKS + "/" + diskName); + public void initializeDisk(String serverName, String diskName, String fsType) { + Form form = new Form(); + form.add(RESTConstants.FORM_PARAM_FSTYPE, fsType); + putRequest(serverName + "/" + RESTConstants.RESOURCE_DISKS + "/" + diskName, form); } public void removeServer(String serverName) { diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java index 527ae2a1..9450ac48 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java @@ -60,6 +60,7 @@ public class RESTConstants { public static final String FORM_PARAM_BRICKS = "bricks"; public static final String FORM_PARAM_ACCESS_PROTOCOLS = "accessProtocols"; public static final String FORM_PARAM_VOLUME_OPTIONS = "options"; + public static final String FORM_PARAM_FSTYPE = "fsType"; public static final String FORM_PARAM_CLUSTER_NAME = "clusterName"; public static final String FORM_PARAM_SERVER_NAME = "serverName"; diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/InitDiskStatusResponse.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/InitDiskStatusResponse.java new file mode 100644 index 00000000..1a448606 --- /dev/null +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/InitDiskStatusResponse.java @@ -0,0 +1,86 @@ +/******************************************************************************* + * InitDiskStatusResponse.java + * + * Copyright (c) 2011 Gluster, Inc. + * 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 + * . + *******************************************************************************/ +package com.gluster.storage.management.core.model; + + +public class InitDiskStatusResponse extends Status { + + public enum FORMAT_STATUS { + IN_PROGRESS, COMPLETED, NOT_RUNNING + }; + + private String[] FORMAT_STATUS_STR = { "Inprogress", "Completed", "Notrunning" }; + + private String device; + private String message; + private float total; + private float completed; + private FORMAT_STATUS status; + + public InitDiskStatusResponse() { + + } + + public void setDevice(String device) { + this.device = device; + } + + public String getDevice() { + return device; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public void setTotal(float total) { + this.total = total; + } + + public float getTotal() { + return total; + } + + public void setCompleted(float completed) { + this.completed = completed; + } + + public float getCompleted() { + return completed; + } + + public String getStatusStr() { + return FORMAT_STATUS_STR[getStatus().ordinal()]; + } + + public FORMAT_STATUS getStatus() { + return status; + } + + public void setStatus(FORMAT_STATUS status) { + this.status = status; + } + +} diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractDisksPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractDisksPage.java index 221e82b1..e6145997 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractDisksPage.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractDisksPage.java @@ -20,6 +20,7 @@ package com.gluster.storage.management.gui.views.pages; import java.util.List; +import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.IContentProvider; import org.eclipse.jface.viewers.TableViewer; @@ -46,7 +47,9 @@ import com.gluster.storage.management.core.model.Disk.DISK_STATUS; import com.gluster.storage.management.core.model.Entity; import com.gluster.storage.management.gui.Application; import com.gluster.storage.management.gui.IEntityListener; +import com.gluster.storage.management.gui.IImageKeys; import com.gluster.storage.management.gui.jobs.InitializeDiskJob; +import com.gluster.storage.management.gui.utils.GUIHelper; public abstract class AbstractDisksPage extends AbstractTableViewerPage implements IEntityListener { private List disks; @@ -199,11 +202,28 @@ public abstract class AbstractDisksPage extends AbstractTableViewerPage im @Override public void linkActivated(HyperlinkEvent e) { + Integer formatOption = new MessageDialog(getShell(), "Initialize Disk", GUIHelper.getInstance().getImage( + IImageKeys.DISK), "Please choose the file system to Initialize the disk?", MessageDialog.QUESTION, new String[] { + "Cancel", "Ext3", "Ext4", "Xfs" }, -1).open(); + + if (formatOption <= 0) { // By Cancel button(0) or Escape key(-1) + return; + } + + String fsType = null; + if (formatOption == 1) { + fsType = "ext3"; + } else if (formatOption == 2) { + fsType = "ext4"; + } else if (formatOption == 3) { + fsType = "xfs"; + } + updateStatus(DISK_STATUS.INITIALIZING, true); - + GlusterServersClient serversClient = new GlusterServersClient(); - serversClient.initializeDisk(disk.getServerName(), disk.getName()); - + serversClient.initializeDisk(disk.getServerName(), disk.getName(), fsType); + guiHelper.showProgressView(); new InitializeDiskJob(disk).schedule(); } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/GlusterServersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/GlusterServersResource.java index 619e4f55..1430d24f 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/GlusterServersResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/GlusterServersResource.java @@ -19,6 +19,7 @@ package com.gluster.storage.management.server.resources.v1_0; import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_SERVER_NAME; +import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_FSTYPE; import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_CLUSTER_NAME; import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_DISK_NAME; import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_SERVER_NAME; @@ -400,7 +401,8 @@ public class GlusterServersResource extends AbstractServersResource { @Produces(MediaType.APPLICATION_XML) @Path("{" + PATH_PARAM_SERVER_NAME + "}/" + RESOURCE_DISKS + "/{" + PATH_PARAM_DISK_NAME + "}") public Response initializeDisk(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName, - @PathParam(PATH_PARAM_SERVER_NAME) String serverName, @PathParam(PATH_PARAM_DISK_NAME) String diskName) { + @PathParam(PATH_PARAM_SERVER_NAME) String serverName, @PathParam(PATH_PARAM_DISK_NAME) String diskName, + @FormParam(FORM_PARAM_FSTYPE) String fsType) { if (clusterName == null || clusterName.isEmpty()) { return badRequestResponse("Cluster name must not be empty!"); @@ -413,8 +415,12 @@ public class GlusterServersResource extends AbstractServersResource { if (diskName == null || diskName.isEmpty()) { return badRequestResponse("Disk name must not be empty!"); } + + if (fsType == null || fsType.isEmpty()) { + return badRequestResponse("FSType must not be empty!"); + } - InitializeDiskTask initializeTask = new InitializeDiskTask(clusterService, clusterName, serverName, diskName); + InitializeDiskTask initializeTask = new InitializeDiskTask(clusterService, clusterName, serverName, diskName, fsType); try { initializeTask.start(); taskResource.addTask(initializeTask); diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitializeDiskTask.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitializeDiskTask.java index 4592b759..89c8c20f 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitializeDiskTask.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitializeDiskTask.java @@ -38,15 +38,17 @@ public class InitializeDiskTask extends Task { private String serverName; private String diskName; + private String fsType; private SshUtil sshUtil = new SshUtil(); private GlusterUtil glusterUtil; - public InitializeDiskTask(ClusterService clusterService, String clusterName, String serverName, String diskName) { + public InitializeDiskTask(ClusterService clusterService, String clusterName, String serverName, String diskName, String fsType) { super(clusterService, clusterName, TASK_TYPE.DISK_FORMAT, diskName, "Initialize disk " + serverName + ":" + diskName, false, false, false); setServerName(serverName); setDiskName(diskName); + setFsType(fsType); } public InitializeDiskTask(ClusterService clusterService, String clusterName, TaskInfo info) { @@ -106,9 +108,17 @@ public class InitializeDiskTask extends Task { } private void startInitializeDisk(String serverName) { - ProcessResult processResult = sshUtil.executeRemote(serverName, INITIALIZE_DISK_SCRIPT + " " + getDiskName()); + ProcessResult processResult = sshUtil.executeRemote(serverName, INITIALIZE_DISK_SCRIPT + " -t " + getFsType() + + " " + getDiskName()); if (processResult.isSuccess()) { getTaskInfo().setStatus(new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, processResult.getOutput()))); + TaskStatus taskStatus = null; + if (fsType.equals("xfs")) { + taskStatus.setPercentageSupported(false); + } else { + taskStatus.setPercentageSupported(true); + } + return; } @@ -143,4 +153,12 @@ public class InitializeDiskTask extends Task { public String getServerName() { return serverName; } + + public void setFsType(String fsType) { + this.fsType = fsType; + } + + public String getFsType() { + return fsType; + } } 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 a24e147c..ec530365 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 @@ -35,6 +35,8 @@ import com.gluster.storage.management.core.model.Brick; import com.gluster.storage.management.core.model.Brick.BRICK_STATUS; import com.gluster.storage.management.core.model.GlusterServer; import com.gluster.storage.management.core.model.GlusterServer.SERVER_STATUS; +import com.gluster.storage.management.core.model.InitDiskStatusResponse; +import com.gluster.storage.management.core.model.InitDiskStatusResponse.FORMAT_STATUS; import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.model.TaskStatus; import com.gluster.storage.management.core.model.Volume; @@ -76,6 +78,9 @@ public class GlusterUtil { @Autowired private SshUtil sshUtil; + @Autowired + private ServerUtil serverUtil; + @InjectParam private TasksResource taskResource; @@ -574,21 +579,26 @@ public class GlusterUtil { } public TaskStatus checkInitializeDiskStatus(String serverName, String diskName) { - ProcessResult processResult = sshUtil.executeRemote(serverName, INITIALIZE_DISK_STATUS_SCRIPT + " " + diskName); + Object response = serverUtil.executeOnServer(true, serverName, INITIALIZE_DISK_STATUS_SCRIPT + " " + diskName, + InitDiskStatusResponse.class); + TaskStatus taskStatus = new TaskStatus(); - if (processResult.isSuccess()) { - // TODO: Message needs to change according to the script return - if (processResult.getOutput().trim().matches(".*Initailize completed$")) { - taskStatus.setCode(Status.STATUS_CODE_SUCCESS); - } else { - // TODO: Percentage completed needs to be set, according to the script output - taskStatus.setCode(Status.STATUS_CODE_RUNNING); - // taskStatus.setPercentCompleted(processResult.getOutput()); - } - } else { + if (response instanceof Status) { taskStatus.setCode(Status.STATUS_CODE_FAILURE); + taskStatus.setMessage(((Status) response).getMessage()); + throw new GlusterRuntimeException(((Status) response).getMessage()); } - taskStatus.setMessage(processResult.getOutput()); + + InitDiskStatusResponse initDiskStatusResponse = (InitDiskStatusResponse) response; + + if (initDiskStatusResponse.getStatus() == FORMAT_STATUS.COMPLETED) { + taskStatus.setCode(Status.STATUS_CODE_SUCCESS); + } else if (initDiskStatusResponse.getStatus() == FORMAT_STATUS.IN_PROGRESS) { + taskStatus.setCode(Status.STATUS_CODE_RUNNING); + taskStatus.setPercentCompleted(initDiskStatusResponse.getCompleted() / initDiskStatusResponse.getTotal() * 100); + } + + taskStatus.setMessage(initDiskStatusResponse.getMessage()); return taskStatus; } -- cgit From 95d25ea10ed03c92993cea3225f6a1ea1f80cf61 Mon Sep 17 00:00:00 2001 From: Dhandapani Date: Tue, 5 Jul 2011 17:43:30 +0530 Subject: Initialize disk enhancement --- .../management/client/GlusterServersClient.java | 6 +- .../management/core/constants/RESTConstants.java | 1 + .../core/model/InitDiskStatusResponse.java | 86 ++++++++++++++++++++++ .../gui/views/pages/AbstractDisksPage.java | 26 ++++++- .../resources/v1_0/GlusterServersResource.java | 10 ++- .../server/tasks/InitializeDiskTask.java | 22 +++++- .../management/server/utils/GlusterUtil.java | 34 ++++++--- 7 files changed, 164 insertions(+), 21 deletions(-) create mode 100644 src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/InitDiskStatusResponse.java 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 b6d0a426..fa925842 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 @@ -62,8 +62,10 @@ public class GlusterServersClient extends AbstractClient { postRequest(form); } - public void initializeDisk(String serverName, String diskName) { - putRequest(serverName + "/" + RESTConstants.RESOURCE_DISKS + "/" + diskName); + public void initializeDisk(String serverName, String diskName, String fsType) { + Form form = new Form(); + form.add(RESTConstants.FORM_PARAM_FSTYPE, fsType); + putRequest(serverName + "/" + RESTConstants.RESOURCE_DISKS + "/" + diskName, form); } public void removeServer(String serverName) { diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java index 527ae2a1..9450ac48 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java @@ -60,6 +60,7 @@ public class RESTConstants { public static final String FORM_PARAM_BRICKS = "bricks"; public static final String FORM_PARAM_ACCESS_PROTOCOLS = "accessProtocols"; public static final String FORM_PARAM_VOLUME_OPTIONS = "options"; + public static final String FORM_PARAM_FSTYPE = "fsType"; public static final String FORM_PARAM_CLUSTER_NAME = "clusterName"; public static final String FORM_PARAM_SERVER_NAME = "serverName"; diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/InitDiskStatusResponse.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/InitDiskStatusResponse.java new file mode 100644 index 00000000..1a448606 --- /dev/null +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/InitDiskStatusResponse.java @@ -0,0 +1,86 @@ +/******************************************************************************* + * InitDiskStatusResponse.java + * + * Copyright (c) 2011 Gluster, Inc. + * 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 + * . + *******************************************************************************/ +package com.gluster.storage.management.core.model; + + +public class InitDiskStatusResponse extends Status { + + public enum FORMAT_STATUS { + IN_PROGRESS, COMPLETED, NOT_RUNNING + }; + + private String[] FORMAT_STATUS_STR = { "Inprogress", "Completed", "Notrunning" }; + + private String device; + private String message; + private float total; + private float completed; + private FORMAT_STATUS status; + + public InitDiskStatusResponse() { + + } + + public void setDevice(String device) { + this.device = device; + } + + public String getDevice() { + return device; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public void setTotal(float total) { + this.total = total; + } + + public float getTotal() { + return total; + } + + public void setCompleted(float completed) { + this.completed = completed; + } + + public float getCompleted() { + return completed; + } + + public String getStatusStr() { + return FORMAT_STATUS_STR[getStatus().ordinal()]; + } + + public FORMAT_STATUS getStatus() { + return status; + } + + public void setStatus(FORMAT_STATUS status) { + this.status = status; + } + +} diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractDisksPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractDisksPage.java index 221e82b1..e6145997 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractDisksPage.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractDisksPage.java @@ -20,6 +20,7 @@ package com.gluster.storage.management.gui.views.pages; import java.util.List; +import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.IContentProvider; import org.eclipse.jface.viewers.TableViewer; @@ -46,7 +47,9 @@ import com.gluster.storage.management.core.model.Disk.DISK_STATUS; import com.gluster.storage.management.core.model.Entity; import com.gluster.storage.management.gui.Application; import com.gluster.storage.management.gui.IEntityListener; +import com.gluster.storage.management.gui.IImageKeys; import com.gluster.storage.management.gui.jobs.InitializeDiskJob; +import com.gluster.storage.management.gui.utils.GUIHelper; public abstract class AbstractDisksPage extends AbstractTableViewerPage implements IEntityListener { private List disks; @@ -199,11 +202,28 @@ public abstract class AbstractDisksPage extends AbstractTableViewerPage im @Override public void linkActivated(HyperlinkEvent e) { + Integer formatOption = new MessageDialog(getShell(), "Initialize Disk", GUIHelper.getInstance().getImage( + IImageKeys.DISK), "Please choose the file system to Initialize the disk?", MessageDialog.QUESTION, new String[] { + "Cancel", "Ext3", "Ext4", "Xfs" }, -1).open(); + + if (formatOption <= 0) { // By Cancel button(0) or Escape key(-1) + return; + } + + String fsType = null; + if (formatOption == 1) { + fsType = "ext3"; + } else if (formatOption == 2) { + fsType = "ext4"; + } else if (formatOption == 3) { + fsType = "xfs"; + } + updateStatus(DISK_STATUS.INITIALIZING, true); - + GlusterServersClient serversClient = new GlusterServersClient(); - serversClient.initializeDisk(disk.getServerName(), disk.getName()); - + serversClient.initializeDisk(disk.getServerName(), disk.getName(), fsType); + guiHelper.showProgressView(); new InitializeDiskJob(disk).schedule(); } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/GlusterServersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/GlusterServersResource.java index 619e4f55..1430d24f 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/GlusterServersResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/GlusterServersResource.java @@ -19,6 +19,7 @@ package com.gluster.storage.management.server.resources.v1_0; import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_SERVER_NAME; +import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_FSTYPE; import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_CLUSTER_NAME; import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_DISK_NAME; import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_SERVER_NAME; @@ -400,7 +401,8 @@ public class GlusterServersResource extends AbstractServersResource { @Produces(MediaType.APPLICATION_XML) @Path("{" + PATH_PARAM_SERVER_NAME + "}/" + RESOURCE_DISKS + "/{" + PATH_PARAM_DISK_NAME + "}") public Response initializeDisk(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName, - @PathParam(PATH_PARAM_SERVER_NAME) String serverName, @PathParam(PATH_PARAM_DISK_NAME) String diskName) { + @PathParam(PATH_PARAM_SERVER_NAME) String serverName, @PathParam(PATH_PARAM_DISK_NAME) String diskName, + @FormParam(FORM_PARAM_FSTYPE) String fsType) { if (clusterName == null || clusterName.isEmpty()) { return badRequestResponse("Cluster name must not be empty!"); @@ -413,8 +415,12 @@ public class GlusterServersResource extends AbstractServersResource { if (diskName == null || diskName.isEmpty()) { return badRequestResponse("Disk name must not be empty!"); } + + if (fsType == null || fsType.isEmpty()) { + return badRequestResponse("FSType must not be empty!"); + } - InitializeDiskTask initializeTask = new InitializeDiskTask(clusterService, clusterName, serverName, diskName); + InitializeDiskTask initializeTask = new InitializeDiskTask(clusterService, clusterName, serverName, diskName, fsType); try { initializeTask.start(); taskResource.addTask(initializeTask); diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitializeDiskTask.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitializeDiskTask.java index 4592b759..89c8c20f 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitializeDiskTask.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitializeDiskTask.java @@ -38,15 +38,17 @@ public class InitializeDiskTask extends Task { private String serverName; private String diskName; + private String fsType; private SshUtil sshUtil = new SshUtil(); private GlusterUtil glusterUtil; - public InitializeDiskTask(ClusterService clusterService, String clusterName, String serverName, String diskName) { + public InitializeDiskTask(ClusterService clusterService, String clusterName, String serverName, String diskName, String fsType) { super(clusterService, clusterName, TASK_TYPE.DISK_FORMAT, diskName, "Initialize disk " + serverName + ":" + diskName, false, false, false); setServerName(serverName); setDiskName(diskName); + setFsType(fsType); } public InitializeDiskTask(ClusterService clusterService, String clusterName, TaskInfo info) { @@ -106,9 +108,17 @@ public class InitializeDiskTask extends Task { } private void startInitializeDisk(String serverName) { - ProcessResult processResult = sshUtil.executeRemote(serverName, INITIALIZE_DISK_SCRIPT + " " + getDiskName()); + ProcessResult processResult = sshUtil.executeRemote(serverName, INITIALIZE_DISK_SCRIPT + " -t " + getFsType() + + " " + getDiskName()); if (processResult.isSuccess()) { getTaskInfo().setStatus(new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, processResult.getOutput()))); + TaskStatus taskStatus = null; + if (fsType.equals("xfs")) { + taskStatus.setPercentageSupported(false); + } else { + taskStatus.setPercentageSupported(true); + } + return; } @@ -143,4 +153,12 @@ public class InitializeDiskTask extends Task { public String getServerName() { return serverName; } + + public void setFsType(String fsType) { + this.fsType = fsType; + } + + public String getFsType() { + return fsType; + } } 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 a24e147c..ec530365 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 @@ -35,6 +35,8 @@ import com.gluster.storage.management.core.model.Brick; import com.gluster.storage.management.core.model.Brick.BRICK_STATUS; import com.gluster.storage.management.core.model.GlusterServer; import com.gluster.storage.management.core.model.GlusterServer.SERVER_STATUS; +import com.gluster.storage.management.core.model.InitDiskStatusResponse; +import com.gluster.storage.management.core.model.InitDiskStatusResponse.FORMAT_STATUS; import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.model.TaskStatus; import com.gluster.storage.management.core.model.Volume; @@ -76,6 +78,9 @@ public class GlusterUtil { @Autowired private SshUtil sshUtil; + @Autowired + private ServerUtil serverUtil; + @InjectParam private TasksResource taskResource; @@ -574,21 +579,26 @@ public class GlusterUtil { } public TaskStatus checkInitializeDiskStatus(String serverName, String diskName) { - ProcessResult processResult = sshUtil.executeRemote(serverName, INITIALIZE_DISK_STATUS_SCRIPT + " " + diskName); + Object response = serverUtil.executeOnServer(true, serverName, INITIALIZE_DISK_STATUS_SCRIPT + " " + diskName, + InitDiskStatusResponse.class); + TaskStatus taskStatus = new TaskStatus(); - if (processResult.isSuccess()) { - // TODO: Message needs to change according to the script return - if (processResult.getOutput().trim().matches(".*Initailize completed$")) { - taskStatus.setCode(Status.STATUS_CODE_SUCCESS); - } else { - // TODO: Percentage completed needs to be set, according to the script output - taskStatus.setCode(Status.STATUS_CODE_RUNNING); - // taskStatus.setPercentCompleted(processResult.getOutput()); - } - } else { + if (response instanceof Status) { taskStatus.setCode(Status.STATUS_CODE_FAILURE); + taskStatus.setMessage(((Status) response).getMessage()); + throw new GlusterRuntimeException(((Status) response).getMessage()); } - taskStatus.setMessage(processResult.getOutput()); + + InitDiskStatusResponse initDiskStatusResponse = (InitDiskStatusResponse) response; + + if (initDiskStatusResponse.getStatus() == FORMAT_STATUS.COMPLETED) { + taskStatus.setCode(Status.STATUS_CODE_SUCCESS); + } else if (initDiskStatusResponse.getStatus() == FORMAT_STATUS.IN_PROGRESS) { + taskStatus.setCode(Status.STATUS_CODE_RUNNING); + taskStatus.setPercentCompleted(initDiskStatusResponse.getCompleted() / initDiskStatusResponse.getTotal() * 100); + } + + taskStatus.setMessage(initDiskStatusResponse.getMessage()); return taskStatus; } -- cgit From 38d37de20e9a50addf000132f8208c7e87219b91 Mon Sep 17 00:00:00 2001 From: Dhandapani Date: Tue, 5 Jul 2011 17:43:30 +0530 Subject: Initialize disk enhancement --- .../management/client/GlusterServersClient.java | 6 +- .../core/constants/GlusterConstants.java | 3 + .../management/core/constants/RESTConstants.java | 1 + .../core/model/InitDiskStatusResponse.java | 88 ++++++++++++++++++++++ .../gui/views/pages/AbstractDisksPage.java | 27 ++++++- .../resources/v1_0/GlusterServersResource.java | 10 ++- .../server/tasks/InitializeDiskTask.java | 22 +++++- .../management/server/utils/GlusterUtil.java | 34 ++++++--- 8 files changed, 170 insertions(+), 21 deletions(-) create mode 100644 src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/InitDiskStatusResponse.java 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 b6d0a426..fa925842 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 @@ -62,8 +62,10 @@ public class GlusterServersClient extends AbstractClient { postRequest(form); } - public void initializeDisk(String serverName, String diskName) { - putRequest(serverName + "/" + RESTConstants.RESOURCE_DISKS + "/" + diskName); + public void initializeDisk(String serverName, String diskName, String fsType) { + Form form = new Form(); + form.add(RESTConstants.FORM_PARAM_FSTYPE, fsType); + putRequest(serverName + "/" + RESTConstants.RESOURCE_DISKS + "/" + diskName, form); } public void removeServer(String serverName) { diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/GlusterConstants.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/GlusterConstants.java index f48f33cf..567eda61 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/GlusterConstants.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/GlusterConstants.java @@ -31,4 +31,7 @@ public class GlusterConstants { }; public static final List VOLUME_LOG_LEVELS_ARR = StringUtil.enumToArray(VOLUME_LOG_LEVELS.values()); + public static final String FSTYPE_EXT_3 = "ext3"; + public static final String FSTYPE_EXT_4 = "ext4"; + public static final String FSTYPE_XFS = "xfs"; } diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java index 527ae2a1..9450ac48 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java @@ -60,6 +60,7 @@ public class RESTConstants { public static final String FORM_PARAM_BRICKS = "bricks"; public static final String FORM_PARAM_ACCESS_PROTOCOLS = "accessProtocols"; public static final String FORM_PARAM_VOLUME_OPTIONS = "options"; + public static final String FORM_PARAM_FSTYPE = "fsType"; public static final String FORM_PARAM_CLUSTER_NAME = "clusterName"; public static final String FORM_PARAM_SERVER_NAME = "serverName"; diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/InitDiskStatusResponse.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/InitDiskStatusResponse.java new file mode 100644 index 00000000..06c8ae75 --- /dev/null +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/InitDiskStatusResponse.java @@ -0,0 +1,88 @@ +/******************************************************************************* + * InitDiskStatusResponse.java + * + * Copyright (c) 2011 Gluster, Inc. + * 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 + * . + *******************************************************************************/ +package com.gluster.storage.management.core.model; + +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement +public class InitDiskStatusResponse { + + public enum FORMAT_STATUS { + IN_PROGRESS, COMPLETED, NOT_RUNNING + }; + + private String[] FORMAT_STATUS_STR = { "In Progress", "Completed", "Not Running" }; + + private String device; + private String message; + private float totalBlocks; + private float completedBlocks; + private FORMAT_STATUS status; + + public InitDiskStatusResponse() { + + } + + public void setDevice(String device) { + this.device = device; + } + + public String getDevice() { + return device; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public void setTotalBlocks(float totalBlocks) { + this.totalBlocks = totalBlocks; + } + + public float getTotal() { + return totalBlocks; + } + + public void setCompletedBlocks(float completedBlocks) { + this.completedBlocks = completedBlocks; + } + + public float getCompleted() { + return completedBlocks; + } + + public String getStatusStr() { + return FORMAT_STATUS_STR[getStatus().ordinal()]; + } + + public FORMAT_STATUS getStatus() { + return status; + } + + public void setStatus(FORMAT_STATUS status) { + this.status = status; + } + +} diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractDisksPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractDisksPage.java index 221e82b1..a53f500d 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractDisksPage.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractDisksPage.java @@ -20,6 +20,7 @@ package com.gluster.storage.management.gui.views.pages; import java.util.List; +import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.IContentProvider; import org.eclipse.jface.viewers.TableViewer; @@ -39,6 +40,7 @@ import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.widgets.ImageHyperlink; import com.gluster.storage.management.client.GlusterServersClient; +import com.gluster.storage.management.core.constants.GlusterConstants; import com.gluster.storage.management.core.model.ClusterListener; import com.gluster.storage.management.core.model.DefaultClusterListener; import com.gluster.storage.management.core.model.Disk; @@ -46,7 +48,9 @@ import com.gluster.storage.management.core.model.Disk.DISK_STATUS; import com.gluster.storage.management.core.model.Entity; import com.gluster.storage.management.gui.Application; import com.gluster.storage.management.gui.IEntityListener; +import com.gluster.storage.management.gui.IImageKeys; import com.gluster.storage.management.gui.jobs.InitializeDiskJob; +import com.gluster.storage.management.gui.utils.GUIHelper; public abstract class AbstractDisksPage extends AbstractTableViewerPage implements IEntityListener { private List disks; @@ -199,11 +203,28 @@ public abstract class AbstractDisksPage extends AbstractTableViewerPage im @Override public void linkActivated(HyperlinkEvent e) { + Integer formatOption = new MessageDialog(getShell(), "Initialize Disk", GUIHelper.getInstance().getImage( + IImageKeys.DISK), "Please choose the file system to Initialize the disk?", MessageDialog.QUESTION, new String[] { + "Cancel", GlusterConstants.FSTYPE_EXT_3, GlusterConstants.FSTYPE_EXT_4, GlusterConstants.FSTYPE_XFS }, -1).open(); + + if (formatOption <= 0) { // By Cancel button(0) or Escape key(-1) + return; + } + + String fsType = null; + if (formatOption == 1) { + fsType = GlusterConstants.FSTYPE_EXT_3; + } else if (formatOption == 2) { + fsType = GlusterConstants.FSTYPE_EXT_4; + } else if (formatOption == 3) { + fsType = GlusterConstants.FSTYPE_XFS; + } + updateStatus(DISK_STATUS.INITIALIZING, true); - + GlusterServersClient serversClient = new GlusterServersClient(); - serversClient.initializeDisk(disk.getServerName(), disk.getName()); - + serversClient.initializeDisk(disk.getServerName(), disk.getName(), fsType); + guiHelper.showProgressView(); new InitializeDiskJob(disk).schedule(); } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/GlusterServersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/GlusterServersResource.java index 619e4f55..1430d24f 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/GlusterServersResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/GlusterServersResource.java @@ -19,6 +19,7 @@ package com.gluster.storage.management.server.resources.v1_0; import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_SERVER_NAME; +import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_FSTYPE; import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_CLUSTER_NAME; import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_DISK_NAME; import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_SERVER_NAME; @@ -400,7 +401,8 @@ public class GlusterServersResource extends AbstractServersResource { @Produces(MediaType.APPLICATION_XML) @Path("{" + PATH_PARAM_SERVER_NAME + "}/" + RESOURCE_DISKS + "/{" + PATH_PARAM_DISK_NAME + "}") public Response initializeDisk(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName, - @PathParam(PATH_PARAM_SERVER_NAME) String serverName, @PathParam(PATH_PARAM_DISK_NAME) String diskName) { + @PathParam(PATH_PARAM_SERVER_NAME) String serverName, @PathParam(PATH_PARAM_DISK_NAME) String diskName, + @FormParam(FORM_PARAM_FSTYPE) String fsType) { if (clusterName == null || clusterName.isEmpty()) { return badRequestResponse("Cluster name must not be empty!"); @@ -413,8 +415,12 @@ public class GlusterServersResource extends AbstractServersResource { if (diskName == null || diskName.isEmpty()) { return badRequestResponse("Disk name must not be empty!"); } + + if (fsType == null || fsType.isEmpty()) { + return badRequestResponse("FSType must not be empty!"); + } - InitializeDiskTask initializeTask = new InitializeDiskTask(clusterService, clusterName, serverName, diskName); + InitializeDiskTask initializeTask = new InitializeDiskTask(clusterService, clusterName, serverName, diskName, fsType); try { initializeTask.start(); taskResource.addTask(initializeTask); diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitializeDiskTask.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitializeDiskTask.java index 4592b759..89c8c20f 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitializeDiskTask.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitializeDiskTask.java @@ -38,15 +38,17 @@ public class InitializeDiskTask extends Task { private String serverName; private String diskName; + private String fsType; private SshUtil sshUtil = new SshUtil(); private GlusterUtil glusterUtil; - public InitializeDiskTask(ClusterService clusterService, String clusterName, String serverName, String diskName) { + public InitializeDiskTask(ClusterService clusterService, String clusterName, String serverName, String diskName, String fsType) { super(clusterService, clusterName, TASK_TYPE.DISK_FORMAT, diskName, "Initialize disk " + serverName + ":" + diskName, false, false, false); setServerName(serverName); setDiskName(diskName); + setFsType(fsType); } public InitializeDiskTask(ClusterService clusterService, String clusterName, TaskInfo info) { @@ -106,9 +108,17 @@ public class InitializeDiskTask extends Task { } private void startInitializeDisk(String serverName) { - ProcessResult processResult = sshUtil.executeRemote(serverName, INITIALIZE_DISK_SCRIPT + " " + getDiskName()); + ProcessResult processResult = sshUtil.executeRemote(serverName, INITIALIZE_DISK_SCRIPT + " -t " + getFsType() + + " " + getDiskName()); if (processResult.isSuccess()) { getTaskInfo().setStatus(new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, processResult.getOutput()))); + TaskStatus taskStatus = null; + if (fsType.equals("xfs")) { + taskStatus.setPercentageSupported(false); + } else { + taskStatus.setPercentageSupported(true); + } + return; } @@ -143,4 +153,12 @@ public class InitializeDiskTask extends Task { public String getServerName() { return serverName; } + + public void setFsType(String fsType) { + this.fsType = fsType; + } + + public String getFsType() { + return fsType; + } } 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 a24e147c..ec530365 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 @@ -35,6 +35,8 @@ import com.gluster.storage.management.core.model.Brick; import com.gluster.storage.management.core.model.Brick.BRICK_STATUS; import com.gluster.storage.management.core.model.GlusterServer; import com.gluster.storage.management.core.model.GlusterServer.SERVER_STATUS; +import com.gluster.storage.management.core.model.InitDiskStatusResponse; +import com.gluster.storage.management.core.model.InitDiskStatusResponse.FORMAT_STATUS; import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.model.TaskStatus; import com.gluster.storage.management.core.model.Volume; @@ -76,6 +78,9 @@ public class GlusterUtil { @Autowired private SshUtil sshUtil; + @Autowired + private ServerUtil serverUtil; + @InjectParam private TasksResource taskResource; @@ -574,21 +579,26 @@ public class GlusterUtil { } public TaskStatus checkInitializeDiskStatus(String serverName, String diskName) { - ProcessResult processResult = sshUtil.executeRemote(serverName, INITIALIZE_DISK_STATUS_SCRIPT + " " + diskName); + Object response = serverUtil.executeOnServer(true, serverName, INITIALIZE_DISK_STATUS_SCRIPT + " " + diskName, + InitDiskStatusResponse.class); + TaskStatus taskStatus = new TaskStatus(); - if (processResult.isSuccess()) { - // TODO: Message needs to change according to the script return - if (processResult.getOutput().trim().matches(".*Initailize completed$")) { - taskStatus.setCode(Status.STATUS_CODE_SUCCESS); - } else { - // TODO: Percentage completed needs to be set, according to the script output - taskStatus.setCode(Status.STATUS_CODE_RUNNING); - // taskStatus.setPercentCompleted(processResult.getOutput()); - } - } else { + if (response instanceof Status) { taskStatus.setCode(Status.STATUS_CODE_FAILURE); + taskStatus.setMessage(((Status) response).getMessage()); + throw new GlusterRuntimeException(((Status) response).getMessage()); } - taskStatus.setMessage(processResult.getOutput()); + + InitDiskStatusResponse initDiskStatusResponse = (InitDiskStatusResponse) response; + + if (initDiskStatusResponse.getStatus() == FORMAT_STATUS.COMPLETED) { + taskStatus.setCode(Status.STATUS_CODE_SUCCESS); + } else if (initDiskStatusResponse.getStatus() == FORMAT_STATUS.IN_PROGRESS) { + taskStatus.setCode(Status.STATUS_CODE_RUNNING); + taskStatus.setPercentCompleted(initDiskStatusResponse.getCompleted() / initDiskStatusResponse.getTotal() * 100); + } + + taskStatus.setMessage(initDiskStatusResponse.getMessage()); return taskStatus; } -- cgit From 519ffac1f408f2b041123f036a2d0f4bb48f0683 Mon Sep 17 00:00:00 2001 From: Selvasundaram Date: Tue, 5 Jul 2011 19:14:20 +0530 Subject: Tasks toolbar actions and server side task jobs --- src/com.gluster.storage.management.gui/plugin.xml | 322 ++++++++++++++------- .../management/gui/actions/CreateVolumeAction.java | 12 - .../management/gui/actions/IActionConstants.java | 2 +- .../gui/toolbar/GlusterToolbarManager.java | 5 +- .../management/gui/views/GlusterViewsManager.java | 1 - .../gui/views/pages/AbstractTableViewerPage.java | 24 +- .../management/gui/views/pages/TasksPage.java | 24 ++ .../server/resources/v1_0/TasksResource.java | 13 + .../server/tasks/DiskMigrationStatusTask.java | 43 +++ .../management/server/tasks/MigrateBrickTask.java | 10 +- .../src/spring/gluster-server-base.xml | 6 + 11 files changed, 331 insertions(+), 131 deletions(-) create mode 100644 src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/DiskMigrationStatusTask.java diff --git a/src/com.gluster.storage.management.gui/plugin.xml b/src/com.gluster.storage.management.gui/plugin.xml index b0dfa9a9..0a4c068d 100644 --- a/src/com.gluster.storage.management.gui/plugin.xml +++ b/src/com.gluster.storage.management.gui/plugin.xml @@ -403,7 +403,7 @@ icon="icons/volume-delete.png" id="com.gluster.storage.management.gui.actions.DeleteVolumeAction" label="&Delete Volume(s)" - menubarPath="com.gluster.storage.management.gui.menu.volumes/volumes" + menubarPath="com.gluster.storage.management.gui.actionsets.volumes/volumes" mode="FORCE_TEXT" pulldown="false" retarget="false" @@ -419,7 +419,7 @@ icon="icons/volume-stop.png" id="com.gluster.storage.management.gui.actions.StopVolumeAction" label="S&top Volume(s)" - menubarPath="com.gluster.storage.management.gui.menu.volumes/volumes" + menubarPath="com.gluster.storage.management.gui.actionsets.volumes/volumes" mode="FORCE_TEXT" pulldown="false" retarget="false" @@ -435,7 +435,7 @@ icon="icons/volume-start.png" id="com.gluster.storage.management.gui.actions.StartVolumeAction" label="&Start Volume(s)" - menubarPath="com.gluster.storage.management.gui.menu.volumes/volumes" + menubarPath="com.gluster.storage.management.gui.actionsets.volumes/volumes" mode="FORCE_TEXT" pulldown="false" retarget="false" @@ -448,10 +448,10 @@ allowLabelUpdate="false" class="com.gluster.storage.management.gui.actions.CreateVolumeAction" definitionId="com.gluster.storage.management.gui.commands.CreateVolume" - icon="icons/volume-create.png" + icon="icons/tango/32x32/volume-create.png" id="com.gluster.storage.management.gui.actions.CreateVolumeAction" - label="&Create Volume" - menubarPath="com.gluster.storage.management.gui.menu.volumes/volumes" + label="Create &Volume" + menubarPath="com.gluster.storage.management.gui.actionsets.volumes/volumes" mode="FORCE_TEXT" pulldown="false" retarget="false" @@ -461,7 +461,7 @@ tooltip="Create a new Volume"> - - - - - - - - - - - - - - - - + id="com.gluster.storage.management.gui.menu.volume" + label="&Gluster" + path="additions"> + name="volume"> @@ -762,6 +669,22 @@ toolbarPath="Normal" tooltip="Remove Server(s)"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tooltip="Settings"> extends Composite { +public abstract class AbstractTableViewerPage extends Composite implements ISelectionListener { - protected final FormToolkit toolkit = new FormToolkit(Display.getCurrent()); - protected TableViewer tableViewer; private boolean useCheckboxes; private boolean multiSelection; + + protected final FormToolkit toolkit = new FormToolkit(Display.getCurrent()); + protected TableViewer tableViewer; protected GUIHelper guiHelper = GUIHelper.getInstance(); protected Composite parent; @@ -76,8 +81,12 @@ public abstract class AbstractTableViewerPage extends Composite { Text filterText = guiHelper.createFilterText(toolkit, this); setupTableViewer(site, filterText); - tableViewer.setInput(model); + // register as selection provider so that other views can listen to any selection events on the tree + site.setSelectionProvider(tableViewer); + site.getPage().addSelectionListener(this); + + parent.layout(); // Important - this actually paints the table createListeners(parent); @@ -213,4 +222,11 @@ public abstract class AbstractTableViewerPage extends Composite { // Create a case insensitive filter for the table viewer using the filter text field guiHelper.createFilter(tableViewer, filterText, false); } + + /* (non-Javadoc) + * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection) + */ + @Override + public void selectionChanged(IWorkbenchPart part, ISelection selection) { + } } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/TasksPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/TasksPage.java index 8d48af76..b3821c6b 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/TasksPage.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/TasksPage.java @@ -25,21 +25,31 @@ import java.util.List; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.IBaseLabelProvider; import org.eclipse.jface.viewers.IContentProvider; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.FocusAdapter; +import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; +import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchSite; import com.gluster.storage.management.core.model.ClusterListener; import com.gluster.storage.management.core.model.DefaultClusterListener; +import com.gluster.storage.management.core.model.Entity; import com.gluster.storage.management.core.model.Event; import com.gluster.storage.management.core.model.TaskInfo; import com.gluster.storage.management.core.model.Volume; import com.gluster.storage.management.core.model.Event.EVENT_TYPE; import com.gluster.storage.management.gui.TasksTableLabelProvider; +import com.gluster.storage.management.gui.actions.IActionConstants; +import com.gluster.storage.management.gui.toolbar.GlusterToolbarManager; +import com.gluster.storage.management.gui.utils.GUIHelper; public class TasksPage extends AbstractTableViewerPage { private List taskInfoList; + private TaskInfo selectedTask; public enum TASK_TABLE_COLUMN_INDICES { TASK, STATUS @@ -132,4 +142,18 @@ public class TasksPage extends AbstractTableViewerPage { protected List getAllEntities() { return taskInfoList; } + + /* (non-Javadoc) + * @see com.gluster.storage.management.gui.views.pages.AbstractTableViewerPage#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection) + */ + @Override + public void selectionChanged(IWorkbenchPart part, ISelection selection) { + if (selection instanceof StructuredSelection) { + Entity selectedEntity = (Entity) ((StructuredSelection) selection).getFirstElement(); + if (selectedEntity != null && selectedEntity instanceof TaskInfo && selectedEntity != selectedTask) { + selectedTask = (TaskInfo)selectedEntity; + new GlusterToolbarManager(part.getSite().getWorkbenchWindow()).updateToolbar(selectedTask); + } + } + } } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/TasksResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/TasksResource.java index 777565eb..1acba6b7 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/TasksResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/TasksResource.java @@ -42,6 +42,8 @@ import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; +import org.springframework.stereotype.Component; + import com.gluster.storage.management.core.constants.RESTConstants; import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; import com.gluster.storage.management.core.exceptions.GlusterValidationException; @@ -52,6 +54,7 @@ import com.sun.jersey.spi.resource.Singleton; @Path(RESOURCE_PATH_CLUSTERS + "/{" + PATH_PARAM_CLUSTER_NAME + "}/" + RESOURCE_TASKS) @Singleton +@Component public class TasksResource extends AbstractResource { private Map tasksMap = new HashMap(); @@ -84,6 +87,16 @@ public class TasksResource extends AbstractResource { return null; } + public List getAllTasks() { + List tasks = new ArrayList(); + for (Map.Entry entry : tasksMap.entrySet()) { + checkTaskStatus(entry.getKey()); + tasks.add( (Task) entry.getValue()); + } + return tasks; + } + + @GET @Produces(MediaType.APPLICATION_XML) public Response getTasks() { diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/DiskMigrationStatusTask.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/DiskMigrationStatusTask.java new file mode 100644 index 00000000..ccfd58be --- /dev/null +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/DiskMigrationStatusTask.java @@ -0,0 +1,43 @@ +/** + * DiskMigrationStatusTask.java + * + * Copyright (c) 2011 Gluster, Inc. + * 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 + * . + */ +package com.gluster.storage.management.server.tasks; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.gluster.storage.management.core.model.TaskInfo.TASK_TYPE; +import com.gluster.storage.management.server.resources.v1_0.TasksResource; + +@Component +public class DiskMigrationStatusTask { + + @Autowired + private TasksResource tasksResource; + + public void checkMigrationStatus() { + for (Task task : tasksResource.getAllTasks() ) { + if (task.getType() == TASK_TYPE.BRICK_MIGRATE && ((MigrateBrickTask) task).getAutoCommit()) { + tasksResource.getTaskStatus( task.getId()); + } + } + } + +} diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/MigrateBrickTask.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/MigrateBrickTask.java index 3961c427..af5e657a 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/MigrateBrickTask.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/MigrateBrickTask.java @@ -23,6 +23,8 @@ package com.gluster.storage.management.server.tasks; import java.util.concurrent.ExecutionException; import org.apache.derby.iapi.sql.execute.ExecPreparedStatement; +import org.springframework.context.ApplicationContext; +import org.springframework.web.context.ContextLoader; import com.gluster.storage.management.core.exceptions.ConnectionException; import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; @@ -43,8 +45,6 @@ public class MigrateBrickTask extends Task { private Boolean autoCommit; private GlusterUtil glusterUtil = new GlusterUtil(); - private SshUtil sshUtil = new SshUtil(); - public String getFromBrick() { return fromBrick; } @@ -78,10 +78,6 @@ public class MigrateBrickTask extends Task { taskInfo.setName(getId()); } - public MigrateBrickTask(ClusterService clusterService, String clusterName, TaskInfo info) { - super(clusterService, clusterName, info); - } - @Override public String getId() { return new String(Base64.encode(clusterName + "-" + taskInfo.getType() + "-" + taskInfo.getReference() + "-" + fromBrick + "-" @@ -99,6 +95,8 @@ public class MigrateBrickTask extends Task { } private void startMigration(String onlineServerName) { + ApplicationContext ctx = ContextLoader.getCurrentWebApplicationContext(); + glusterUtil = ctx.getBean(GlusterUtil.class); ProcessResult processResult = glusterUtil.executeBrickMigration(onlineServerName, getTaskInfo().getReference(), getFromBrick(), getToBrick(), "start"); if (processResult.getOutput().trim().matches(".*started successfully$")) { diff --git a/src/com.gluster.storage.management.server/src/spring/gluster-server-base.xml b/src/com.gluster.storage.management.server/src/spring/gluster-server-base.xml index 700d996f..0a000732 100644 --- a/src/com.gluster.storage.management.server/src/spring/gluster-server-base.xml +++ b/src/com.gluster.storage.management.server/src/spring/gluster-server-base.xml @@ -16,6 +16,12 @@ + + + + + -- cgit From b1facccacf33b47682f3257f7fbc6ba394ec6b79 Mon Sep 17 00:00:00 2001 From: Dhandapani Date: Wed, 6 Jul 2011 15:06:18 +0530 Subject: Initialize disk enhancement --- .../gluster/storage/management/gui/views/pages/AbstractDisksPage.java | 4 ++-- .../management/server/resources/v1_0/GlusterServersResource.java | 2 +- .../src/com/gluster/storage/management/server/utils/GlusterUtil.java | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractDisksPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractDisksPage.java index a53f500d..63cf65ed 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractDisksPage.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractDisksPage.java @@ -220,11 +220,11 @@ public abstract class AbstractDisksPage extends AbstractTableViewerPage im fsType = GlusterConstants.FSTYPE_XFS; } - updateStatus(DISK_STATUS.INITIALIZING, true); - GlusterServersClient serversClient = new GlusterServersClient(); serversClient.initializeDisk(disk.getServerName(), disk.getName(), fsType); + updateStatus(DISK_STATUS.INITIALIZING, true); + guiHelper.showProgressView(); new InitializeDiskJob(disk).schedule(); } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/GlusterServersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/GlusterServersResource.java index 1430d24f..b97d47f8 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/GlusterServersResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/GlusterServersResource.java @@ -417,7 +417,7 @@ public class GlusterServersResource extends AbstractServersResource { } if (fsType == null || fsType.isEmpty()) { - return badRequestResponse("FSType must not be empty!"); + return badRequestResponse("Parameter [" + FORM_PARAM_FSTYPE + "] is missing in request!"); } InitializeDiskTask initializeTask = new InitializeDiskTask(clusterService, clusterName, serverName, diskName, fsType); 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 7b8fc9b5..e614641c 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 @@ -595,7 +595,8 @@ public class GlusterUtil { taskStatus.setCode(Status.STATUS_CODE_SUCCESS); } else if (initDiskStatusResponse.getStatus() == FORMAT_STATUS.IN_PROGRESS) { taskStatus.setCode(Status.STATUS_CODE_RUNNING); - taskStatus.setPercentCompleted(initDiskStatusResponse.getCompletedBlocks() / initDiskStatusResponse.getTotalBlocks() * 100); + taskStatus.setPercentCompleted(Math.round(initDiskStatusResponse.getCompletedBlocks() + / initDiskStatusResponse.getTotalBlocks() * 100)); } taskStatus.setMessage(initDiskStatusResponse.getMessage()); -- cgit From ee212c6a4d295d63027dbac5ec632c5cc51cf2f2 Mon Sep 17 00:00:00 2001 From: Selvasundaram Date: Wed, 6 Jul 2011 15:15:30 +0530 Subject: Migrate task client call bug fixes and toolbar updates --- .../storage/management/client/AbstractClient.java | 1 - .../management/client/GlusterDataModelManager.java | 3 +- .../management/gui/actions/ClearTaskAction.java | 4 +- .../management/gui/actions/CommitTaskAction.java | 8 +--- .../management/gui/actions/PauseTaskAction.java | 1 + .../management/gui/actions/StopTaskAction.java | 10 ++--- .../gui/views/pages/AbstractTableViewerPage.java | 2 + .../management/gui/views/pages/TasksPage.java | 12 +++--- .../server/resources/v1_0/TasksResource.java | 2 +- .../server/tasks/BrickMigrationStatusTask.java | 42 +++++++++++++++++++++ .../server/tasks/DiskMigrationStatusTask.java | 43 --------------------- .../management/server/tasks/MigrateBrickTask.java | 44 +++++++++++----------- .../src/spring/gluster-server-base.xml | 2 +- 13 files changed, 86 insertions(+), 88 deletions(-) create mode 100644 src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/BrickMigrationStatusTask.java delete mode 100644 src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/DiskMigrationStatusTask.java 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 6f4ba050..3c6a2d40 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 @@ -22,7 +22,6 @@ import javax.ws.rs.core.MultivaluedMap; import com.gluster.storage.management.client.utils.ClientUtil; import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; -import com.gluster.storage.management.core.model.TaskInfo; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.UniformInterfaceException; 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 221651a3..dbb1f46f 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 @@ -600,8 +600,7 @@ public class GlusterDataModelManager { } public void removeTask(TaskInfo taskInfo) { - Cluster cluster = model.getCluster(); - cluster.removeTaskInfo(taskInfo); + model.getCluster().removeTaskInfo(taskInfo); for (ClusterListener listener : listeners) { listener.taskAdded(taskInfo); } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ClearTaskAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ClearTaskAction.java index 6fff4f44..4a580d05 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ClearTaskAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ClearTaskAction.java @@ -17,7 +17,7 @@ public class ClearTaskAction extends AbstractActionDelegate { final String actionDesc = action.getDescription(); try { - new TasksClient().resumeTask(taskInfo.getName()); + new TasksClient().deleteTask(taskInfo.getName()); // taskId modelManager.removeTask(taskInfo); } catch (Exception e) { showErrorDialog(actionDesc, @@ -33,6 +33,8 @@ public class ClearTaskAction extends AbstractActionDelegate { taskInfo = (TaskInfo) selectedEntity; action.setEnabled(taskInfo.getStatus().getCode() == Status.STATUS_CODE_SUCCESS || taskInfo.getStatus().getCode() == Status.STATUS_CODE_FAILURE); + } else { + action.setEnabled(false); } } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/CommitTaskAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/CommitTaskAction.java index 86e3032e..86a71882 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/CommitTaskAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/CommitTaskAction.java @@ -5,11 +5,9 @@ import org.eclipse.jface.viewers.ISelection; import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.TasksClient; -import com.gluster.storage.management.client.VolumesClient; import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.model.TaskInfo; import com.gluster.storage.management.core.model.TaskStatus; -import com.gluster.storage.management.core.model.Volume; public class CommitTaskAction extends AbstractActionDelegate { private TaskInfo taskInfo; @@ -21,12 +19,8 @@ public class CommitTaskAction extends AbstractActionDelegate { try { new TasksClient().commitTask(taskInfo.getName()); taskInfo.setStatus(new TaskStatus(new Status(Status.STATUS_CODE_SUCCESS, "Committed"))); - modelManager.removeTask(taskInfo); - Volume volume = (new VolumesClient()).getVolume(taskInfo.getReference()); - modelManager.updateVolumeBricks(modelManager.getModel().getCluster().getVolume(taskInfo.getReference()), - volume.getBricks()); - showInfoDialog(actionDesc, "Commit successful"); + modelManager.removeTask(taskInfo); } catch (Exception e) { showErrorDialog(actionDesc, "Task [" + taskInfo.getName() + "] could not be Committed! Error: [" + e.getMessage() + "]"); diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/PauseTaskAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/PauseTaskAction.java index e3a4b835..872df738 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/PauseTaskAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/PauseTaskAction.java @@ -28,6 +28,7 @@ import com.gluster.storage.management.client.TasksClient; import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.model.TaskInfo; import com.gluster.storage.management.core.model.TaskStatus; +import com.gluster.storage.management.gui.toolbar.GlusterToolbarManager; public class PauseTaskAction extends AbstractActionDelegate { diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StopTaskAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StopTaskAction.java index 12d14b43..306edbf3 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StopTaskAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StopTaskAction.java @@ -2,13 +2,11 @@ package com.gluster.storage.management.gui.actions; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; -import org.eclipse.swt.widgets.Display; import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.TasksClient; import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.model.TaskInfo; -import com.gluster.storage.management.core.model.TaskStatus; public class StopTaskAction extends AbstractActionDelegate { private TaskInfo taskInfo; @@ -19,9 +17,10 @@ public class StopTaskAction extends AbstractActionDelegate { final String actionDesc = action.getDescription(); try { - new TasksClient().resumeTask(taskInfo.getName()); - taskInfo.setStatus(new TaskStatus(new Status(Status.STATUS_CODE_SUCCESS, "Stopped"))); - modelManager.updateTask(taskInfo); + new TasksClient().stopTask(taskInfo.getName()); + // On successful stop clear from the task list + modelManager.removeTask(taskInfo); + action.setEnabled(false); // TODO disable other task buttons } catch (Exception e) { showErrorDialog(actionDesc, "Task [" + taskInfo.getDescription() + "] could not be Stopped! Error: [" + e.getMessage() + "]"); @@ -42,7 +41,6 @@ public class StopTaskAction extends AbstractActionDelegate { @Override public void dispose() { - } } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractTableViewerPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractTableViewerPage.java index 80aceb8b..5aaf7094 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractTableViewerPage.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractTableViewerPage.java @@ -61,12 +61,14 @@ public abstract class AbstractTableViewerPage extends Composite implements IS protected TableViewer tableViewer; protected GUIHelper guiHelper = GUIHelper.getInstance(); protected Composite parent; + protected IWorkbenchSite site; private Hyperlink linkAll, linkNone; public AbstractTableViewerPage(IWorkbenchSite site, final Composite parent, int style, boolean useChechboxes, boolean multiSelection, Object model) { super(parent, style); this.parent = parent; + this.site = site; this.useCheckboxes = useChechboxes; this.multiSelection = multiSelection; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/TasksPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/TasksPage.java index b3821c6b..8fbeb891 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/TasksPage.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/TasksPage.java @@ -28,8 +28,6 @@ import org.eclipse.jface.viewers.IContentProvider; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.FocusAdapter; -import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.ui.IWorkbenchPart; @@ -39,13 +37,11 @@ import com.gluster.storage.management.core.model.ClusterListener; import com.gluster.storage.management.core.model.DefaultClusterListener; import com.gluster.storage.management.core.model.Entity; import com.gluster.storage.management.core.model.Event; +import com.gluster.storage.management.core.model.Event.EVENT_TYPE; import com.gluster.storage.management.core.model.TaskInfo; import com.gluster.storage.management.core.model.Volume; -import com.gluster.storage.management.core.model.Event.EVENT_TYPE; import com.gluster.storage.management.gui.TasksTableLabelProvider; -import com.gluster.storage.management.gui.actions.IActionConstants; import com.gluster.storage.management.gui.toolbar.GlusterToolbarManager; -import com.gluster.storage.management.gui.utils.GUIHelper; public class TasksPage extends AbstractTableViewerPage { private List taskInfoList; @@ -77,11 +73,17 @@ public class TasksPage extends AbstractTableViewerPage { @Override public void taskRemoved(TaskInfo taskInfo) { refreshViewer(); + // hide the task related actionset as no task is selected + // site.getPage().hideActionSet(IActionConstants.ACTION_SET_TASK); + tableViewer.setSelection(new StructuredSelection(taskInfo)); } @Override public void taskUpdated(TaskInfo taskInfo) { refreshViewer(); + // fire selection event so that toolbar gets updated + // (the action class listens to selection and enables/disables automatically) + tableViewer.setSelection(new StructuredSelection(taskInfo)); } private void refreshViewer() { diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/TasksResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/TasksResource.java index 1acba6b7..38b68040 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/TasksResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/TasksResource.java @@ -153,7 +153,7 @@ public class TasksResource extends AbstractResource { @DELETE @Path("/{" + PATH_PARAM_TASK_ID + "}") @Produces(MediaType.APPLICATION_XML) - public Response deleteTask(@PathParam(PATH_PARAM_TASK_ID) String taskId, + public Response clearTask(@PathParam(PATH_PARAM_TASK_ID) String taskId, @QueryParam(FORM_PARAM_OPERATION) String taskOperation) { Task task = getTask(taskId); if (task == null) { diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/BrickMigrationStatusTask.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/BrickMigrationStatusTask.java new file mode 100644 index 00000000..0f00ad3a --- /dev/null +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/BrickMigrationStatusTask.java @@ -0,0 +1,42 @@ +/** + * DiskMigrationStatusTask.java + * + * Copyright (c) 2011 Gluster, Inc. + * 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 + * . + */ +package com.gluster.storage.management.server.tasks; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.gluster.storage.management.core.model.TaskInfo.TASK_TYPE; +import com.gluster.storage.management.server.resources.v1_0.TasksResource; + +@Component +public class BrickMigrationStatusTask { + + @Autowired + private TasksResource tasksResource; + + public void checkMigrationStatus() { + for (Task task : tasksResource.getAllTasks() ) { + if (task.getType() == TASK_TYPE.BRICK_MIGRATE && ((MigrateBrickTask) task).getAutoCommit()) { + tasksResource.getTaskStatus( task.getId()); + } + } + } +} diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/DiskMigrationStatusTask.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/DiskMigrationStatusTask.java deleted file mode 100644 index ccfd58be..00000000 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/DiskMigrationStatusTask.java +++ /dev/null @@ -1,43 +0,0 @@ -/** - * DiskMigrationStatusTask.java - * - * Copyright (c) 2011 Gluster, Inc. - * 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 - * . - */ -package com.gluster.storage.management.server.tasks; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.gluster.storage.management.core.model.TaskInfo.TASK_TYPE; -import com.gluster.storage.management.server.resources.v1_0.TasksResource; - -@Component -public class DiskMigrationStatusTask { - - @Autowired - private TasksResource tasksResource; - - public void checkMigrationStatus() { - for (Task task : tasksResource.getAllTasks() ) { - if (task.getType() == TASK_TYPE.BRICK_MIGRATE && ((MigrateBrickTask) task).getAutoCommit()) { - tasksResource.getTaskStatus( task.getId()); - } - } - } - -} diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/MigrateBrickTask.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/MigrateBrickTask.java index af5e657a..9236a6d3 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/MigrateBrickTask.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/MigrateBrickTask.java @@ -20,22 +20,16 @@ */ package com.gluster.storage.management.server.tasks; -import java.util.concurrent.ExecutionException; - -import org.apache.derby.iapi.sql.execute.ExecPreparedStatement; import org.springframework.context.ApplicationContext; import org.springframework.web.context.ContextLoader; import com.gluster.storage.management.core.exceptions.ConnectionException; -import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; import com.gluster.storage.management.core.model.Status; -import com.gluster.storage.management.core.model.TaskInfo; import com.gluster.storage.management.core.model.TaskInfo.TASK_TYPE; import com.gluster.storage.management.core.model.TaskStatus; import com.gluster.storage.management.core.utils.ProcessResult; import com.gluster.storage.management.server.services.ClusterService; import com.gluster.storage.management.server.utils.GlusterUtil; -import com.gluster.storage.management.server.utils.SshUtil; import com.sun.jersey.core.util.Base64; public class MigrateBrickTask extends Task { @@ -142,6 +136,19 @@ public class MigrateBrickTask extends Task { commitMigration(getNewOnlineServer().getName()); } } + + private void commitMigration(String serverName) { + ProcessResult processResult = glusterUtil.executeBrickMigration(serverName, getTaskInfo().getReference(), + getFromBrick(), getToBrick(), "commit"); + TaskStatus taskStatus = new TaskStatus(); + if (processResult.isSuccess()) { + if (processResult.getOutput().trim().matches(".*commit successful$")) { + taskStatus.setCode(Status.STATUS_CODE_SUCCESS); + taskStatus.setMessage(processResult.getOutput()); + getTaskInfo().setStatus(taskStatus); + } + } + } @Override public void stop() { @@ -173,30 +180,25 @@ public class MigrateBrickTask extends Task { return checkMigrationStatus(getNewOnlineServer().getName()); } } - - public void commitMigration(String serverName) { - ProcessResult processResult = glusterUtil.executeBrickMigration(serverName, getTaskInfo().getReference(), - getFromBrick(), getToBrick(), "commit"); - TaskStatus taskStatus = new TaskStatus(); - if (processResult.isSuccess()) { - if (processResult.getOutput().trim().matches(".*commit successful$")) { - taskStatus.setCode(Status.STATUS_CODE_SUCCESS); - taskStatus.setMessage(processResult.getOutput()); // Common - getTaskInfo().setStatus(taskStatus); - } - } - } - + private TaskStatus checkMigrationStatus(String serverName) { if (getTaskInfo().getStatus().getCode() == Status.STATUS_CODE_PAUSE) { return getTaskInfo().getStatus(); } + // For committed task, status command (CLI) is invalid, just return current status + if (getTaskInfo().getStatus().getCode() == Status.STATUS_CODE_SUCCESS) { + return getTaskInfo().getStatus(); + } + TaskStatus taskStatus = new TaskStatus(); try { ProcessResult processResult = glusterUtil.executeBrickMigration(serverName, getTaskInfo().getReference(), getFromBrick(), getToBrick(), "status"); - if (processResult.getOutput().trim().matches("^Number of files migrated.*Migration complete$")) { + if (processResult.getOutput().trim().matches("^Number of files migrated.*Migration complete$") + || processResult.getOutput().trim().matches("^Number of files migrated = 0 .*Current file=")) { + // Note: Workaround - if no file in the volume brick to migrate, Gluster CLI is not giving proper + // (complete) status taskStatus.setCode(Status.STATUS_CODE_COMMIT_PENDING); if (autoCommit) { commitMigration(serverName); diff --git a/src/com.gluster.storage.management.server/src/spring/gluster-server-base.xml b/src/com.gluster.storage.management.server/src/spring/gluster-server-base.xml index 0a000732..b9fb2126 100644 --- a/src/com.gluster.storage.management.server/src/spring/gluster-server-base.xml +++ b/src/com.gluster.storage.management.server/src/spring/gluster-server-base.xml @@ -19,7 +19,7 @@ - + -- cgit From 9f0728357a909a9b38d74866ebb03a1be23dae87 Mon Sep 17 00:00:00 2001 From: Shireesh Anjal Date: Wed, 6 Jul 2011 18:00:42 +0530 Subject: Task#111 - Auto-refresh of data in views --- .../management/client/GlusterDataModelManager.java | 14 ++++++ .../storage/management/core/model/Cluster.java | 2 +- .../storage/management/core/model/Server.java | 47 ++++++------------ .../storage/management/gui/Application.java | 28 +++++++++++ .../storage/management/gui/jobs/DataSyncJob.java | 55 ++++++++++++++++++++++ .../gui/preferences/GlusterPreferencePage.java | 2 +- .../gui/preferences/PreferenceConstants.java | 3 +- .../gui/preferences/PreferenceInitializer.java | 3 ++ .../gui/views/GlusterServerSummaryView.java | 48 +++++++++++++++---- .../management/gui/views/VolumeSummaryView.java | 18 ++----- .../management/server/tasks/InitServerTask.java | 6 +-- .../src/spring/gluster-server-security.xml | 8 ++-- 12 files changed, 166 insertions(+), 68 deletions(-) create mode 100644 src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/jobs/DataSyncJob.java 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 dbb1f46f..8d821174 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 @@ -24,6 +24,8 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import org.apache.log4j.Logger; + import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; import com.gluster.storage.management.core.model.Brick; import com.gluster.storage.management.core.model.Cluster; @@ -53,6 +55,8 @@ public class GlusterDataModelManager { private List listeners = new ArrayList(); private List volumeOptionsDefaults; private String clusterName; + private static Boolean syncInProgress = false; + private static final Logger logger = Logger.getLogger(GlusterDataModelManager.class); private GlusterDataModelManager() { } @@ -106,7 +110,17 @@ public class GlusterDataModelManager { } public void refreshModel() { + synchronized (syncInProgress) { + if(syncInProgress) { + logger.info("Previous data sync is still running. Skipping this one."); + return; + } + syncInProgress = true; + } + + logger.info("Starting data sync"); updateModel(fetchData(clusterName)); + syncInProgress = false; } private void updateModel(GlusterDataModel model) { diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Cluster.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Cluster.java index 4f6c317c..289978ad 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Cluster.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Cluster.java @@ -155,7 +155,7 @@ public class Cluster extends Entity { public GlusterServer getServer(String serverName) { for(GlusterServer server : servers) { - if (server.getName().equals(serverName)) { + if (server.getName().equalsIgnoreCase(serverName)) { return server; } } diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Server.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Server.java index 9e9212dc..39696665 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Server.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Server.java @@ -1,5 +1,4 @@ /******************************************************************************* - * Copyright (c) 2011 Gluster, Inc. * This file is part of Gluster Management Console. * * Gluster Management Console is free software; you can redistribute it and/or @@ -35,8 +34,6 @@ public class Server extends Entity { private double cpuUsage; private double totalMemory; private double memoryInUse; - private double totalDiskSpace = 0; - private double diskSpaceInUse = 0; private List disks = new ArrayList(); private List networkInterfaces = new ArrayList(); @@ -89,19 +86,22 @@ public class Server extends Entity { } public double getTotalDiskSpace() { + double totalDiskSpace = 0; + for(Disk disk : getDisks()) { + if(disk.isReady()) { + totalDiskSpace += disk.getSpace(); + } + } return totalDiskSpace; } - /** - * Total disk space is automatically calculated, and hence this method should never be called. It is required only - * to make sure that the element "totalDiskSpace" gets added to the XML tag when jersey converts the server object - * to XML for sending to client. - */ - public void setTotalDiskSpace(double totalDiskSpace) { - this.totalDiskSpace = totalDiskSpace; - } - public double getDiskSpaceInUse() { + double diskSpaceInUse = 0; + for(Disk disk : getDisks()) { + if(disk.isReady()) { + diskSpaceInUse += disk.getSpaceInUse(); + } + } return diskSpaceInUse; } @@ -109,15 +109,6 @@ public class Server extends Entity { return getTotalDiskSpace() - getDiskSpaceInUse(); } - /** - * Total disk space in use is automatically calculated, and hence this method should never be called. It is required - * only to make sure that the element "diskSpaceInUse" gets added to the XML tag when jersey converts the server - * object to XML for sending to client. - */ - public void setDiskSpaceInUse(double diskSpaceInUse) { - this.diskSpaceInUse = diskSpaceInUse; - } - @XmlElementWrapper(name = "networkInterfaces") @XmlElement(name = "networkInterface", type = NetworkInterface.class) public List getNetworkInterfaces() { @@ -139,10 +130,7 @@ public class Server extends Entity { } public void addDisk(Disk disk) { - if (disks.add(disk) && disk.isReady()) { - totalDiskSpace += disk.getSpace(); - diskSpaceInUse += disk.getSpaceInUse(); - } + disks.add(disk); } public void addDisks(Collection disks) { @@ -152,16 +140,11 @@ public class Server extends Entity { } public void removeDisk(Disk disk) { - if (disks.remove(disk)) { - totalDiskSpace -= disk.getSpace(); - diskSpaceInUse -= disk.getSpaceInUse(); - } + disks.remove(disk); } public void removeAllDisks() { disks.clear(); - totalDiskSpace = 0; - diskSpaceInUse = 0; } public void setDisks(List disks) { @@ -203,8 +186,6 @@ public class Server extends Entity { setCpuUsage(server.getCpuUsage()); setTotalMemory(server.getTotalMemory()); setMemoryInUse(server.getMemoryInUse()); - setTotalDiskSpace(server.getTotalDiskSpace()); - setDiskSpaceInUse(server.getDiskSpaceInUse()); } @Override diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/Application.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/Application.java index 598f9639..bff46096 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/Application.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/Application.java @@ -23,10 +23,14 @@ import java.util.Collections; import java.util.List; import org.eclipse.core.databinding.observable.Realm; +import org.eclipse.core.runtime.jobs.IJobChangeEvent; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.core.runtime.jobs.JobChangeAdapter; import org.eclipse.equinox.app.IApplication; import org.eclipse.equinox.app.IApplicationContext; import org.eclipse.jface.action.IStatusLineManager; import org.eclipse.jface.databinding.swt.SWTObservables; +import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.window.Window; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; @@ -35,6 +39,8 @@ import org.eclipse.ui.PlatformUI; import com.gluster.storage.management.core.model.Entity; import com.gluster.storage.management.gui.dialogs.LoginDialog; +import com.gluster.storage.management.gui.jobs.DataSyncJob; +import com.gluster.storage.management.gui.preferences.PreferenceConstants; /** * This class controls all aspects of the application's execution @@ -45,6 +51,7 @@ public class Application implements IApplication { private static Application instance; private List entityListeners = Collections.synchronizedList(new ArrayList()); private IStatusLineManager statusLineManager; + private Job syncJob; public Application() { instance = this; @@ -88,16 +95,36 @@ public class Application implements IApplication { return IApplication.EXIT_OK; } try { + setupBackgroundJobs(); + int returnCode = PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor()); if (returnCode == PlatformUI.RETURN_RESTART) { return IApplication.EXIT_RESTART; } + return IApplication.EXIT_OK; } finally { display.dispose(); } } + private void setupBackgroundJobs() { + // 1 minute delay for first run + final IPreferenceStore preferenceStore = Activator.getDefault().getPreferenceStore(); + final long JOB_INTERVAL = preferenceStore.getLong(PreferenceConstants.P_DATA_SYNC_INTERVAL) * 1000; + + syncJob = new DataSyncJob("Syncing cluster data in background"); + syncJob.schedule(JOB_INTERVAL); + syncJob.addJobChangeListener(new JobChangeAdapter() { + @Override + public void done(IJobChangeEvent event) { + super.done(event); + // job done. schedule again after the pre-defined interval + syncJob.schedule(JOB_INTERVAL); + } + }); + } + private void setSystemProperties() { // TODO: Trying this to avoid the webstart authentication dialog // to be tested, and removed if this doesn't work. @@ -116,6 +143,7 @@ public class Application implements IApplication { final Display display = workbench.getDisplay(); display.syncExec(new Runnable() { public void run() { + syncJob.cancel(); if (!display.isDisposed()) workbench.close(); } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/jobs/DataSyncJob.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/jobs/DataSyncJob.java new file mode 100644 index 00000000..f6fd1ba4 --- /dev/null +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/jobs/DataSyncJob.java @@ -0,0 +1,55 @@ +/******************************************************************************* + * Copyright (c) 2011 Gluster, Inc. + * 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 + * . + *******************************************************************************/ +package com.gluster.storage.management.gui.jobs; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.swt.widgets.Display; + +import com.gluster.storage.management.client.GlusterDataModelManager; +import com.gluster.storage.management.gui.utils.GUIHelper; + +/** + * + */ +public class DataSyncJob extends Job { + public DataSyncJob(String name) { + super(name); + } + + /* (non-Javadoc) + * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor) + */ + @Override + protected IStatus run(IProgressMonitor monitor) { + Display.getDefault().asyncExec(new Runnable() { + + @Override + public void run() { + GUIHelper.getInstance().setStatusMessage("Data sync in progress..."); + GlusterDataModelManager.getInstance().refreshModel(); + GUIHelper.getInstance().setStatusMessage(null); + } + }); + + return Status.OK_STATUS; + } +} diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/GlusterPreferencePage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/GlusterPreferencePage.java index 431a8128..d8eee3e4 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/GlusterPreferencePage.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/GlusterPreferencePage.java @@ -77,7 +77,7 @@ public class GlusterPreferencePage addField(new ComboFieldEditor(PreferenceConstants.P_DEFAULT_CLUSTER_NAME, "Default &Cluster to manage:", clusterNamesArr, getFieldEditorParent())); - addField(new IntegerFieldEditor(PreferenceConstants.P_DATA_REFRESH_INTERVAL, "&Data Refresh Interval:", + addField(new IntegerFieldEditor(PreferenceConstants.P_DATA_SYNC_INTERVAL, "&Data Sync Interval (sec):", getFieldEditorParent())); } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/PreferenceConstants.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/PreferenceConstants.java index 260aadb6..039cf488 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/PreferenceConstants.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/PreferenceConstants.java @@ -25,12 +25,11 @@ public class PreferenceConstants { public static final String P_SHOW_CLUSTER_SELECTION_DIALOG = "show.cluster.selection.dialog"; public static final String P_DEFAULT_CLUSTER_NAME = "default.cluster.name"; - public static final String P_DATA_REFRESH_INTERVAL = "data.refresh.interval"; + public static final String P_DATA_SYNC_INTERVAL = "data.sync.interval"; // TODO: Remove after proper preferences are added public static final String P_PATH = "pathPreference"; public static final String P_BOOLEAN = "booleanPreference"; public static final String P_CHOICE = "choicePreference"; public static final String P_STRING = "stringPreference"; - } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/PreferenceInitializer.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/PreferenceInitializer.java index 1a4104ac..909b957a 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/PreferenceInitializer.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/PreferenceInitializer.java @@ -37,5 +37,8 @@ public class PreferenceInitializer extends AbstractPreferenceInitializer { IPreferenceStore store = Activator.getDefault().getPreferenceStore(); store.setDefault(PreferenceConstants.P_SHOW_CLUSTER_SELECTION_DIALOG, true); + + // default data sync interval = 5 minutes + store.setDefault(PreferenceConstants.P_DATA_SYNC_INTERVAL, 300); } } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServerSummaryView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServerSummaryView.java index 77e902ab..f9526ef9 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServerSummaryView.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServerSummaryView.java @@ -41,11 +41,17 @@ import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.part.ViewPart; +import com.gluster.storage.management.client.GlusterDataModelManager; +import com.gluster.storage.management.core.model.ClusterListener; +import com.gluster.storage.management.core.model.DefaultClusterListener; +import com.gluster.storage.management.core.model.Event; import com.gluster.storage.management.core.model.GlusterServer; import com.gluster.storage.management.core.model.GlusterServer.SERVER_STATUS; +import com.gluster.storage.management.core.model.Volume; import com.gluster.storage.management.core.utils.NumberUtil; import com.gluster.storage.management.gui.IImageKeys; import com.gluster.storage.management.gui.NetworkInterfaceTableLabelProvider; +import com.gluster.storage.management.gui.toolbar.GlusterToolbarManager; import com.gluster.storage.management.gui.utils.GUIHelper; import com.richclientgui.toolbox.gauges.CoolGauge; @@ -55,6 +61,7 @@ public class GlusterServerSummaryView extends ViewPart { private final FormToolkit toolkit = new FormToolkit(Display.getCurrent()); private ScrolledForm form; private GlusterServer server; + private ClusterListener serverChangedListener; public enum NETWORK_INTERFACE_TABLE_COLUMN_INDICES { INTERFACE, MODEL, SPEED, IP_ADDRESS, NETMASK, GATEWAY @@ -62,6 +69,7 @@ public class GlusterServerSummaryView extends ViewPart { private static final String[] NETWORK_INTERFACE_TABLE_COLUMN_NAMES = { "Interface", "Model", "Speed", "IP Address", "Netmask", "Gateway" }; + private CoolGauge cpuGauge; @Override public void createPartControl(Composite parent) { @@ -70,6 +78,28 @@ public class GlusterServerSummaryView extends ViewPart { } setPartName("Summary"); createSections(parent); + + final GlusterToolbarManager toolbarManager = new GlusterToolbarManager(getSite().getWorkbenchWindow()); + // Refresh the navigation tree whenever there is a change to the data model + serverChangedListener = new DefaultClusterListener() { + @Override + public void serverChanged(GlusterServer server, Event event) { + updateServerDetails(); + toolbarManager.updateToolbar(server); + } + }; + GlusterDataModelManager.getInstance().addClusterListener(serverChangedListener); + } + + private void updateServerDetails() { + // TODO Auto-generated method stub + + } + + @Override + public void dispose() { + super.dispose(); + GlusterDataModelManager.getInstance().removeClusterListener(serverChangedListener); } private void createSections(Composite parent) { @@ -100,15 +130,15 @@ public class GlusterServerSummaryView extends ViewPart { // toolkit.createLabel(section, online ? "" + server.getCpuUsage() : "NA", SWT.NONE); toolkit.createLabel(section, "% CPU Usage (avg): ", SWT.NONE); - CoolGauge gauge = new CoolGauge(section, guiHelper.getImage(IImageKeys.GAUGE_SMALL)); - gauge.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false)); - gauge.setGaugeNeedleColour(Display.getDefault().getSystemColor(SWT.COLOR_RED)); - gauge.setGaugeNeedleWidth(2); - gauge.setGaugeNeedlePivot(new Point(66, 65)); - - gauge.setPoints(getPnts()); - gauge.setLevel(server.getCpuUsage() / 100); - gauge.setToolTipText(server.getCpuUsage() + "%"); + cpuGauge = new CoolGauge(section, guiHelper.getImage(IImageKeys.GAUGE_SMALL)); + cpuGauge.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false)); + cpuGauge.setGaugeNeedleColour(Display.getDefault().getSystemColor(SWT.COLOR_RED)); + cpuGauge.setGaugeNeedleWidth(2); + cpuGauge.setGaugeNeedlePivot(new Point(66, 65)); + + cpuGauge.setPoints(getPnts()); + cpuGauge.setLevel(server.getCpuUsage() / 100); + cpuGauge.setToolTipText(server.getCpuUsage() + "%"); toolkit.createLabel(section, "Memory Usage: ", SWT.NONE); ProgressBar memoryUsageBar = new ProgressBar(section, SWT.SMOOTH); diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeSummaryView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeSummaryView.java index 17bb28f4..e0df170b 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeSummaryView.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeSummaryView.java @@ -80,24 +80,14 @@ public class VolumeSummaryView extends ViewPart { setPartName("Summary"); createSections(); + final GlusterToolbarManager toolbarManager = new GlusterToolbarManager(getSite().getWorkbenchWindow()); // Refresh the navigation tree whenever there is a change to the data model volumeChangedListener = new DefaultClusterListener() { - @SuppressWarnings("unchecked") @Override public void volumeChanged(Volume volume, Event event) { - if (event.getEventType() == EVENT_TYPE.VOLUME_STATUS_CHANGED) { - updateVolumeStatusLabel(); - new GlusterToolbarManager(getSite().getWorkbenchWindow()).updateToolbar(volume); - } else if (event.getEventType() == EVENT_TYPE.VOLUME_OPTION_SET) { - Entry option = (Entry) event.getEventData(); - if (option.getKey().equals(Volume.OPTION_AUTH_ALLOW)) { - // access control option value has changed. update the text field with new value. - populateAccessControlText(); - } - } else if (event.getEventType() == EVENT_TYPE.VOLUME_OPTIONS_RESET) { - // all volume options reset. populate access control text with default value. - populateAccessControlText(); - } + updateVolumeStatusLabel(); + populateAccessControlText(); + toolbarManager.updateToolbar(volume); } }; GlusterDataModelManager.getInstance().addClusterListener(volumeChangedListener); diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitServerTask.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitServerTask.java index 8e38bd40..3fe794f5 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitServerTask.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitServerTask.java @@ -94,7 +94,7 @@ public class InitServerTask extends JdbcDaoSupport { } private void initDatabase() { - logger.debug("Initializing server data..."); + logger.info("Initializing server data..."); executeScriptsFrom(getDirFromRelativePath(SCRIPT_DIR + appVersion)); securePasswords(); // encrypt the passwords @@ -134,7 +134,7 @@ public class InitServerTask extends JdbcDaoSupport { upgradeData(dbVersion, appVersion); } } catch (Exception ex) { - ex.printStackTrace(); + logger.info("No cluster created yet. DB version query failed with error [" + ex.getMessage() + "]", ex); // Database not created yet. Create it! initDatabase(); } @@ -148,7 +148,7 @@ public class InitServerTask extends JdbcDaoSupport { logger.info("Cluster: [" + cluster.getId() + "][" + cluster.getName() + "]"); } } else { - logger.info("No cluster created yet."); + } } diff --git a/src/com.gluster.storage.management.server/src/spring/gluster-server-security.xml b/src/com.gluster.storage.management.server/src/spring/gluster-server-security.xml index c8301c7b..6f3ad72f 100644 --- a/src/com.gluster.storage.management.server/src/spring/gluster-server-security.xml +++ b/src/com.gluster.storage.management.server/src/spring/gluster-server-security.xml @@ -11,15 +11,13 @@ "> - - - + + -- cgit