From 8c7203104004e425579a4fcbc1b9b91bb82f8f2e Mon Sep 17 00:00:00 2001 From: Selvasundaram Date: Thu, 24 Nov 2011 14:28:46 +0530 Subject: Disk Initialization enhanced with user selectable file system and mount point --- .../resources/v1_0/GlusterServersResource.java | 14 +++++++++++-- .../gateway/services/GlusterServerService.java | 23 ++++++++++++++++++++++ .../gateway/tasks/InitializeDiskTask.java | 18 ++++++++++++----- .../management/gateway/utils/ServerUtil.java | 8 ++++++++ 4 files changed, 56 insertions(+), 7 deletions(-) (limited to 'src/com.gluster.storage.management.gateway/src/com') diff --git a/src/com.gluster.storage.management.gateway/src/com/gluster/storage/management/gateway/resources/v1_0/GlusterServersResource.java b/src/com.gluster.storage.management.gateway/src/com/gluster/storage/management/gateway/resources/v1_0/GlusterServersResource.java index 8d3784e9..ccb11726 100644 --- a/src/com.gluster.storage.management.gateway/src/com/gluster/storage/management/gateway/resources/v1_0/GlusterServersResource.java +++ b/src/com.gluster.storage.management.gateway/src/com/gluster/storage/management/gateway/resources/v1_0/GlusterServersResource.java @@ -20,6 +20,7 @@ package com.gluster.storage.management.gateway.resources.v1_0; import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_FSTYPE; import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_SERVER_NAME; +import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_MOUNTPOINT; 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; @@ -30,6 +31,7 @@ import static com.gluster.storage.management.core.constants.RESTConstants.QUERY_ import static com.gluster.storage.management.core.constants.RESTConstants.QUERY_PARAM_PERIOD; import static com.gluster.storage.management.core.constants.RESTConstants.QUERY_PARAM_TYPE; import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_DISKS; +import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_FSTYPE; import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_PATH_CLUSTERS; import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_SERVERS; import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_STATISTICS; @@ -63,6 +65,7 @@ import com.gluster.storage.management.core.model.ServerStats; import com.gluster.storage.management.core.model.TaskStatus; import com.gluster.storage.management.core.response.GlusterServerListResponse; import com.gluster.storage.management.core.response.ServerNameListResponse; +import com.gluster.storage.management.core.response.StringListResponse; import com.gluster.storage.management.gateway.data.ClusterInfo; import com.gluster.storage.management.gateway.services.ClusterService; import com.gluster.storage.management.gateway.services.GlusterServerService; @@ -197,12 +200,19 @@ public class GlusterServersResource extends AbstractResource { return noContentResponse(); } + @GET + @Produces(MediaType.APPLICATION_XML) + @Path("{" + PATH_PARAM_SERVER_NAME + "}/" + RESOURCE_FSTYPE) + public StringListResponse getFsType(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName, @PathParam(PATH_PARAM_SERVER_NAME) String serverName) { + return glusterServerService.getFsType(clusterName, serverName); + } + @PUT @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, - @FormParam(FORM_PARAM_FSTYPE) String fsType) { + @FormParam(FORM_PARAM_FSTYPE) String fsType, @FormParam(FORM_PARAM_MOUNTPOINT) String mountPoint) { if (clusterName == null || clusterName.isEmpty()) { return badRequestResponse("Cluster name must not be empty!"); @@ -221,7 +231,7 @@ public class GlusterServersResource extends AbstractResource { // return badRequestResponse("Parameter [" + FORM_PARAM_FSTYPE + "] is missing in request!"); } - InitializeDiskTask initializeTask = new InitializeDiskTask(clusterService, clusterName, serverName, diskName, fsType); + InitializeDiskTask initializeTask = new InitializeDiskTask(clusterService, clusterName, serverName, diskName, fsType, mountPoint); try { initializeTask.start(); // Check the initialize disk status diff --git a/src/com.gluster.storage.management.gateway/src/com/gluster/storage/management/gateway/services/GlusterServerService.java b/src/com.gluster.storage.management.gateway/src/com/gluster/storage/management/gateway/services/GlusterServerService.java index da1a8487..fcaec52e 100644 --- a/src/com.gluster.storage.management.gateway/src/com/gluster/storage/management/gateway/services/GlusterServerService.java +++ b/src/com.gluster.storage.management.gateway/src/com/gluster/storage/management/gateway/services/GlusterServerService.java @@ -35,6 +35,7 @@ import com.gluster.storage.management.core.exceptions.GlusterValidationException import com.gluster.storage.management.core.model.GlusterServer; import com.gluster.storage.management.core.model.Server; import com.gluster.storage.management.core.model.Server.SERVER_STATUS; +import com.gluster.storage.management.core.response.StringListResponse; import com.gluster.storage.management.core.utils.GlusterCoreUtil; import com.gluster.storage.management.core.utils.ProcessUtil; import com.gluster.storage.management.core.utils.StringUtil; @@ -142,6 +143,20 @@ public class GlusterServerService { return server; } } + + // Server not found. It's possible that the server name returned by glusterfs is actually IP address + // Hence fetch details of all servers and then compare the host names again. + String errMsg = fetchDetailsOfServers(Collections.synchronizedList(servers)); + if (!errMsg.isEmpty()) { + throw new GlusterRuntimeException("Couldn't fetch details for server(s): " + errMsg); + } + for (GlusterServer server : servers) { + if (server.getName().equalsIgnoreCase(serverName)) { + return server; + } + } + + // still not found! return null; } @@ -504,4 +519,12 @@ public class GlusterServerService { } } } + + public StringListResponse getFsType(String clusterName, String serverName) { + if (isValidServer(clusterName, serverName)) { + return serverUtil.getFsType(serverName); + } else { + throw new GlusterRuntimeException(serverName + " is not belongs to the cluster [" + clusterName + "]"); + } + } } diff --git a/src/com.gluster.storage.management.gateway/src/com/gluster/storage/management/gateway/tasks/InitializeDiskTask.java b/src/com.gluster.storage.management.gateway/src/com/gluster/storage/management/gateway/tasks/InitializeDiskTask.java index 4c437737..ffb9619d 100644 --- a/src/com.gluster.storage.management.gateway/src/com/gluster/storage/management/gateway/tasks/InitializeDiskTask.java +++ b/src/com.gluster.storage.management.gateway/src/com/gluster/storage/management/gateway/tasks/InitializeDiskTask.java @@ -43,10 +43,11 @@ public class InitializeDiskTask extends Task { private String serverName; private String diskName; private String fsType; + private String mountPoint; private ServerUtil serverUtil; public InitializeDiskTask(ClusterService clusterService, String clusterName, String serverName, String diskName, - String fsType) { + String fsType, String deviceMountPoint) { // Reference contains "Server:disk" super(clusterService, clusterName, TASK_TYPE.DISK_FORMAT, serverName + ":" + diskName, "Initialize disk " + serverName + ":" + diskName, false, false, false); @@ -54,6 +55,7 @@ public class InitializeDiskTask extends Task { setServerName(serverName); setDiskName(diskName); setFsType(fsType); + setMountpoint(deviceMountPoint); taskInfo.setName(getId()); init(); } @@ -117,10 +119,8 @@ public class InitializeDiskTask extends Task { } private void startInitializeDisk(String serverName) { - String fsTypeCommand = (getFsType().equals(GlusterConstants.FSTYPE_DEFAULT)) ? "" : " -t " + getFsType(); - - String output = serverUtil.executeScriptOnServer(serverName, INITIALIZE_DISK_SCRIPT + fsTypeCommand + " " - + getDiskName()); + String output = serverUtil.executeScriptOnServer(serverName, INITIALIZE_DISK_SCRIPT + getFsType() + " " + + mountPoint + " " + getDiskName() ); TaskStatus taskStatus = new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, output)); taskStatus.setPercentageSupported((getFsType().equals(GlusterConstants.FSTYPE_XFS)) ? false : true); getTaskInfo().setStatus(taskStatus); @@ -187,4 +187,12 @@ public class InitializeDiskTask extends Task { public String getFsType() { return fsType; } + + public void setMountpoint(String deviceMountPoint) { + this.mountPoint = deviceMountPoint; + } + + public String getMountpoint() { + return mountPoint; + } } diff --git a/src/com.gluster.storage.management.gateway/src/com/gluster/storage/management/gateway/utils/ServerUtil.java b/src/com.gluster.storage.management.gateway/src/com/gluster/storage/management/gateway/utils/ServerUtil.java index 0d09d616..b53d0042 100644 --- a/src/com.gluster.storage.management.gateway/src/com/gluster/storage/management/gateway/utils/ServerUtil.java +++ b/src/com.gluster.storage.management.gateway/src/com/gluster/storage/management/gateway/utils/ServerUtil.java @@ -44,6 +44,7 @@ import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; import com.gluster.storage.management.core.model.Server; import com.gluster.storage.management.core.model.Server.SERVER_STATUS; import com.gluster.storage.management.core.model.Status; +import com.gluster.storage.management.core.response.StringListResponse; import com.gluster.storage.management.core.utils.ProcessResult; import com.gluster.storage.management.core.utils.ProcessUtil; import com.gluster.storage.management.gateway.services.GlusterInterfaceService; @@ -65,6 +66,7 @@ public class ServerUtil { private static final String SCRIPT_COMMAND = "python"; private static final String REMOTE_SCRIPT_GET_DISK_FOR_DIR = "get_disk_for_dir.py"; private static final String REMOTE_SCRIPT_GET_SERVER_DETAILS = "get_server_details.py"; + private static final String REMOTE_SCRIPT_GET_FILE_SYSTEM_TYPE = "get_filesystem_type.py"; private static final String REMOTE_SCRIPT_BASE_DIR = "/opt/glustermg"; private static final String REMOTE_SCRIPT_DIR_NAME = "backend"; @@ -360,4 +362,10 @@ public class ServerUtil { ApplicationContext ctx = ContextLoader.getCurrentWebApplicationContext(); return ctx.getBean(clazz); } + + public StringListResponse getFsType(String serverName) { + String output = executeScriptOnServer(serverName, REMOTE_SCRIPT_GET_FILE_SYSTEM_TYPE); + StringListResponse response = new StringListResponse(Arrays.asList(output.trim().split(CoreConstants.NEWLINE))); + return response; + } } -- cgit