From 18d66ad7918af9396dd191507fb9d5c1d86acfe7 Mon Sep 17 00:00:00 2001 From: Dhandapani Date: Thu, 2 Jun 2011 18:40:52 +0530 Subject: Add brick issue fixes --- .../management/client/GlusterDataModelManager.java | 20 ++++++++---- .../storage/management/core/model/Event.java | 6 ++-- .../storage/management/core/model/Volume.java | 2 +- .../management/gui/dialogs/AddDiskWizard.java | 4 +++ .../management/gui/views/details/BricksPage.java | 38 +++++++++++++++++++--- 5 files changed, 55 insertions(+), 15 deletions(-) (limited to 'src') 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 24f5e70b..7566850a 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 @@ -80,15 +80,15 @@ public class GlusterDataModelManager { public static GlusterDataModelManager getInstance() { return instance; } - + public void initializeModelWithNewCluster(String securityToken, String clusterName) { model = new GlusterDataModel("Gluster Data Model"); setSecurityToken(securityToken); - + Cluster cluster = new Cluster(clusterName, model); cluster.setServers(new ArrayList()); - cluster.setVolumes(new ArrayList()); + cluster.setVolumes(new ArrayList()); initializeAutoDiscoveredServers(cluster); // initializeDisks(); @@ -103,7 +103,7 @@ public class GlusterDataModelManager { model = new GlusterDataModel("Gluster Data Model"); setSecurityToken(securityToken); setClusterName(clusterName); - + Cluster cluster = new Cluster(clusterName, model); initializeGlusterServers(cluster); @@ -323,6 +323,12 @@ public class GlusterDataModelManager { } } + public void addBricks(Volume volume, List bricks) { + for (ClusterListener listener : listeners) { + listener.volumeChanged(volume, new Event(EVENT_TYPE.BRICKS_ADDED, bricks)); + } + } + public void setVolumeOption(Volume volume, Entry entry) { volume.setOption(entry.getKey(), (String) entry.getValue()); for (ClusterListener listener : listeners) { @@ -385,16 +391,16 @@ public class GlusterDataModelManager { throw new GlusterRuntimeException("Couldn't find entry for option [" + optionKey + "] on volume [" + volume.getName()); } - + private Boolean isDiskUsed(Volume volume, Disk disk) { - for(Brick brick: volume.getBricks()) { + for (Brick brick : volume.getBricks()) { if (disk.getName().equals(brick.getDiskName()) && disk.getServerName().equals(brick.getServerName())) { return true; } } return false; } - + public String getDiskStatus(Disk disk) { if (disk.getStatus() == DISK_STATUS.READY) { for (Volume volume : model.getCluster().getVolumes()) { diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Event.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Event.java index 22b938d2..99594b5d 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Event.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Event.java @@ -20,12 +20,12 @@ package com.gluster.storage.management.core.model; public class Event { public enum EVENT_TYPE { - DISK_ADDED, - DISK_REMOVED, + BRICKS_ADDED, + BRICKS_REMOVED, NETWORK_INTERFACE_ADDED, NETWORK_INTERFACE_REMOVED, VOLUME_STATUS_CHANGED, - VOLUME_OPTIONS_RESET, + VOLUME_OPTIONS_RESET, VOLUME_OPTION_SET } diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java index dae07dbc..013ca5b7 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java @@ -230,7 +230,7 @@ public class Volume extends Entity { } public void addBricks(List bricks) { - bricks.addAll(bricks); + this.bricks.addAll(bricks); } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddDiskWizard.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddDiskWizard.java index 8feeacc3..18161076 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddDiskWizard.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddDiskWizard.java @@ -72,6 +72,10 @@ public class AddDiskWizard extends Wizard { List disks = page.getChosenDisks(); volume.addDisks(GlusterCoreUtil.getQualifiedDiskNames(disks)); volume.addBricks(bricks); + + // Update model with new bricks in the volume + GlusterDataModelManager.getInstance().addBricks(volume, bricks); + MessageDialog.openInformation(getShell(), "Add brick(s) to Volume", "Volume [" + volume.getName() + "] is expanded with bricks [" + StringUtil.ListToString(brickList, ", ") + "]"); return status.isSuccess(); diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/BricksPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/BricksPage.java index 374a9724..9ebab70b 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/BricksPage.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/BricksPage.java @@ -23,16 +23,25 @@ import java.util.List; import org.eclipse.jface.layout.TableColumnLayout; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.ui.IWorkbenchSite; +import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.core.model.Brick; +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.Volume; +import com.gluster.storage.management.core.model.Event.EVENT_TYPE; import com.gluster.storage.management.gui.BrickTableLabelProvider; public class BricksPage extends AbstractBricksPage { - + private Composite parent; + public enum BRICK_TABLE_COLUMN_INDICES { SERVER, BRICK, FREE_SPACE, TOTAL_SPACE, STATUS }; @@ -40,12 +49,35 @@ public class BricksPage extends AbstractBricksPage { private static final String[] DISK_TABLE_COLUMN_NAMES = new String[] { "Server", "Brick Directory", "Free Space (GB)", "Total Space (GB)", "Status" }; - public BricksPage(final Composite parent, int style, IWorkbenchSite site, List bricks) { + public BricksPage(final Composite parent, int style, IWorkbenchSite site, final List bricks) { super(parent, style, site, bricks); + createListeners(); + } + + private void createListeners() { + final ClusterListener clusterListener = new DefaultClusterListener() { + @Override + public void volumeChanged(Volume volume, Event event) { + if (event.getEventType() == EVENT_TYPE.BRICKS_ADDED) { + tableViewer.refresh(); + parent.update(); + } + + } + }; + GlusterDataModelManager.getInstance().addClusterListener(clusterListener); + addDisposeListener(new DisposeListener() { + + @Override + public void widgetDisposed(DisposeEvent e) { + GlusterDataModelManager.getInstance().removeClusterListener(clusterListener); + } + }); } @Override protected void setupDiskTable(Composite parent, Table table) { + this.parent = parent; table.setHeaderVisible(true); table.setLinesVisible(false); @@ -71,7 +103,5 @@ public class BricksPage extends AbstractBricksPage { @Override public void entityChanged(Entity entity, String[] paremeters) { - // TODO Auto-generated method stub - } } \ No newline at end of file -- cgit From 9f9a2c2850f4b2d1b5ac2ad44750e0b82282e4b2 Mon Sep 17 00:00:00 2001 From: Shireesh Anjal Date: Wed, 1 Jun 2011 21:01:28 +0530 Subject: Design changes - introducing cluster-server mapping on gateway --- .../server/resources/GlusterServersResource.java | 48 +++++++++++++++++----- 1 file changed, 38 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java index 15992608..562b630f 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java @@ -240,26 +240,45 @@ public class GlusterServersResource extends AbstractServersResource { try { addServerToCluster(clusterName, serverName); - } catch (Exception e){ - return new GlusterServerResponse(new Status(Status.STATUS_CODE_PART_SUCCESS, - "Exception while trying to save cluster-server mapping [" + clusterName + "][" + serverName - + "]: [" + e.getMessage() + "]"), serverResponse.getGlusterServer()); + } catch (Exception e) { + return new GlusterServerResponse(new Status(Status.STATUS_CODE_PART_SUCCESS, e.getMessage()), + serverResponse.getGlusterServer()); } return serverResponse; } private void addServerToCluster(String clusterName, String serverName) { - ClusterInfo cluster; EntityTransaction txn = clusterDao.startTransaction(); - // Inside a transaction, we must fetch the ClusterInfo object again. - cluster = getCluster(clusterName); + ClusterInfo cluster = getCluster(clusterName); cluster.addServer(new ServerInfo(serverName)); try { + clusterDao.update(cluster); txn.commit(); } catch (Exception e) { txn.rollback(); - throw new GlusterRuntimeException("Couldn't commit transaction! Error: " + e.getMessage(), e); + throw new GlusterRuntimeException("Couldn't create cluster-server mapping [" + clusterName + "][" + + serverName + "]! Error: " + e.getMessage(), e); + } + } + + private void removeServerFromCluster(String clusterName, String serverName) { + EntityTransaction txn = clusterDao.startTransaction(); + ClusterInfo cluster = getCluster(clusterName); + List servers = cluster.getServers(); + for(ServerInfo server : servers) { + if(server.getName().equals(serverName)) { + servers.remove(server); + break; + } + } + try { + clusterDao.update(cluster); + txn.commit(); + } catch(Exception e) { + txn.rollback(); + throw new GlusterRuntimeException("Couldn't unmap server [" + serverName + "] from cluster [" + clusterName + + "]! Error: " + e.getMessage(), e); } } @@ -274,6 +293,7 @@ public class GlusterServersResource extends AbstractServersResource { @DELETE @Produces(MediaType.TEXT_XML) + @Path("{" + PATH_PARAM_SERVER_NAME + "}") public Status removeServer(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName, @PathParam(PATH_PARAM_SERVER_NAME) String serverName) { GlusterServer onlineServer = getOnlineServer(clusterName); @@ -291,10 +311,18 @@ public class GlusterServersResource extends AbstractServersResource { return new Status(Status.STATUS_CODE_FAILURE, "No online server found in cluster [" + clusterName + "]"); } - return glusterUtil.removeServer(onlineServer.getName(), serverName); + status = glusterUtil.removeServer(onlineServer.getName(), serverName); + } + + if (status.isSuccess()) { + try { + removeServerFromCluster(clusterName, serverName); + } catch (Exception e) { + return new Status(Status.STATUS_CODE_PART_SUCCESS, e.getMessage()); + } } - // TODO: Remove the server from cluster-server mapping + return status; } private void setGlusterUtil(GlusterUtil glusterUtil) { -- cgit From ad437a67712efb0f03db71914363b09c65e4a952 Mon Sep 17 00:00:00 2001 From: selvam Date: Thu, 2 Jun 2011 19:51:31 +0530 Subject: Remove server REST path issue fix Removed server comes to Discovered list (UI) if it is online. --- .../management/client/GlusterDataModelManager.java | 18 ++++++++++++++++++ .../management/client/GlusterServersClient.java | 4 +--- .../management/gui/actions/RemoveServerAction.java | 6 ++++++ .../storage/management/server/utils/GlusterUtil.java | 2 +- 4 files changed, 26 insertions(+), 4 deletions(-) (limited to 'src') 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 7566850a..37230d08 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 @@ -290,6 +290,15 @@ public class GlusterDataModelManager { listener.serverAdded(server); } } + + public void addDiscoveredServer(Server server) { + Cluster cluster = model.getCluster(); + cluster.addDiscoveredServer(server); + + for (ClusterListener listener : listeners) { + listener.discoveredServerAdded(server);; + } + } public void removeDiscoveredServer(Server server) { Cluster cluster = model.getCluster(); @@ -299,6 +308,15 @@ public class GlusterDataModelManager { listener.discoveredServerRemoved(server); } } + + public void removeGlusterServer(GlusterServer server) { + Cluster cluster = model.getCluster(); + cluster.removeServer(server); + + for (ClusterListener listener : listeners) { + listener.serverRemoved(server); + } + } public void deleteVolume(Volume volume) { Cluster cluster = model.getCluster(); 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 f5609584..4eba0ca9 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 @@ -75,9 +75,7 @@ public class GlusterServersClient extends AbstractClient { } public Status removeServer(String serverName) { - MultivaluedMap queryParams = new MultivaluedMapImpl(); - queryParams.add(RESTConstants.QUERY_PARAM_SERVER_NAME, serverName); - return (Status) deleteResource(Status.class, queryParams); + return (Status) deleteSubResource(serverName, Status.class); } public static void main(String[] args) { diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java index 93f28e11..060b3c38 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java @@ -27,6 +27,7 @@ import org.eclipse.jface.viewers.ISelection; import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.GlusterServersClient; import com.gluster.storage.management.core.model.Cluster; +import com.gluster.storage.management.core.model.GlusterServer; import com.gluster.storage.management.core.model.Server; import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.model.Volume; @@ -61,6 +62,11 @@ public class RemoveServerAction extends AbstractActionDelegate { if (status.isSuccess()) { showInfoDialog(actionDesc, "Server removed successfully"); + GlusterServer glusterServer = (GlusterServer) server; + GlusterDataModelManager.getInstance().removeGlusterServer(glusterServer); + if (glusterServer.isOnline()) { + GlusterDataModelManager.getInstance().addDiscoveredServer(server); + } } else { showErrorDialog(actionDesc, "Server could not be removed. Error: [" + status + "]"); } 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 6005f6dd..77549add 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 @@ -506,7 +506,7 @@ System.out.println(brickDir); } public Status removeServer(String existingServer, String serverName) { - return new Status(sshUtil.executeRemote(existingServer, "gluster peer detach " + serverName)); + return new Status(sshUtil.executeRemote(existingServer, "gluster --mode=script peer detach " + serverName)); } public static void main(String args[]) { -- cgit From 6042cff10e50796df2d0e87e86f6aa76ea8c6e12 Mon Sep 17 00:00:00 2001 From: Shireesh Anjal Date: Wed, 1 Jun 2011 21:01:28 +0530 Subject: Design changes - introducing cluster-server mapping on gateway --- .../management/client/GlusterDataModelManager.java | 1 + .../management/client/GlusterServersClient.java | 2 +- .../management/server/data/PersistenceDao.java | 7 +++- .../storage/management/server/data/ServerInfo.java | 3 ++ .../resources/DiscoveredServersResource.java | 3 ++ .../server/resources/GlusterServersResource.java | 42 ++++++++++++---------- .../management/server/utils/ServerUtil.java | 7 ++-- .../storage/management/server/utils/SshUtil.java | 13 +++++-- 8 files changed, 51 insertions(+), 27 deletions(-) (limited to 'src') 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 37230d08..98071128 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 @@ -84,6 +84,7 @@ public class GlusterDataModelManager { public void initializeModelWithNewCluster(String securityToken, String clusterName) { model = new GlusterDataModel("Gluster Data Model"); setSecurityToken(securityToken); + setClusterName(clusterName); Cluster cluster = new Cluster(clusterName, model); 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 4eba0ca9..6c75b7c5 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 @@ -70,7 +70,7 @@ public class GlusterServersClient extends AbstractClient { public GlusterServerResponse addServer(Server discoveredServer) { Form form = new Form(); - form.add("serverName", discoveredServer.getName()); + form.add(RESTConstants.FORM_PARAM_SERVER_NAME, discoveredServer.getName()); return (GlusterServerResponse)postRequest(GlusterServerResponse.class, form); } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/PersistenceDao.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/PersistenceDao.java index 6fd7ecdc..1534e78c 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/PersistenceDao.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/PersistenceDao.java @@ -73,6 +73,11 @@ public class PersistenceDao { public Object getSingleResultFromSQL(String sqlQuery) { return getEntityManager().createNativeQuery(sqlQuery).getSingleResult(); } + + @SuppressWarnings("rawtypes") + public List findBySQL(String sqlQuery) { + return getEntityManager().createNativeQuery(sqlQuery).getResultList(); + } public T findById(int id) { return getEntityManager().find(type, id); @@ -94,7 +99,7 @@ public class PersistenceDao { return createQuery("select t from " + type.getName() + " t where " + whereClause, params).getResultList(); } - public void save(T obj) { + public void save(Object obj) { getEntityManager().persist(obj); } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/ServerInfo.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/ServerInfo.java index 3564692c..72818200 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/ServerInfo.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/ServerInfo.java @@ -39,6 +39,9 @@ public class ServerInfo { @JoinColumn(name="cluster_id") private ClusterInfo cluster; + public ServerInfo() { + } + public ServerInfo(String name) { setName(name); } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/DiscoveredServersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/DiscoveredServersResource.java index eba06bf5..90692634 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/DiscoveredServersResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/DiscoveredServersResource.java @@ -28,6 +28,7 @@ import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.gluster.storage.management.core.constants.CoreConstants; @@ -37,6 +38,8 @@ import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.response.GenericResponse; import com.gluster.storage.management.core.response.ServerListResponse; import com.gluster.storage.management.core.response.StringListResponse; +import com.gluster.storage.management.server.data.ClusterInfo; +import com.gluster.storage.management.server.data.PersistenceDao; import com.gluster.storage.management.server.utils.ServerUtil; import com.sun.jersey.api.core.InjectParam; import com.sun.jersey.spi.resource.Singleton; diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java index 562b630f..2650b226 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java @@ -20,6 +20,7 @@ package com.gluster.storage.management.server.resources; import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_CLUSTER_NAME; import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_SERVER_NAME; +import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_SERVER_NAME; import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_PATH_CLUSTERS; import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_SERVERS; @@ -161,7 +162,7 @@ public class GlusterServersResource extends AbstractServersResource { @Produces(MediaType.TEXT_XML) public GlusterServerResponse getGlusterServer( @PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName, - @PathParam("serverName") String serverName) { + @PathParam(PATH_PARAM_SERVER_NAME) String serverName) { GlusterServer server = glusterUtil.getGlusterServer(getOnlineServer(clusterName), serverName); Status status = Status.STATUS_SUCCESS; if(server.isOnline()) { @@ -199,7 +200,7 @@ public class GlusterServersResource extends AbstractServersResource { @POST @Produces(MediaType.TEXT_XML) public GlusterServerResponse addServer(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName, - @FormParam("serverName") String serverName) { + @FormParam(FORM_PARAM_SERVER_NAME) String serverName) { ClusterInfo cluster = getCluster(clusterName); if(cluster == null) { return new GlusterServerResponse(new Status(Status.STATUS_CODE_FAILURE, "Cluster [" + clusterName @@ -216,7 +217,8 @@ public class GlusterServersResource extends AbstractServersResource { + "Please reset it back to the standard default password and try again."), null); } - if(!cluster.getServers().isEmpty()) { + List servers = cluster.getServers(); + if(servers != null && !servers.isEmpty()) { Status status = performAddServer(clusterName, serverName); if(!status.isSuccess()) { return new GlusterServerResponse(status, null); @@ -226,23 +228,24 @@ public class GlusterServersResource extends AbstractServersResource { // gluster CLI operation required. just add it to the cluster-server mapping } - // fetch server details - GlusterServerResponse serverResponse = getGlusterServer(clusterName, serverName); - - try { - // install public key (this will also disable password based ssh login) - sshUtil.installPublicKey(serverName); - } catch(Exception e) { - return new GlusterServerResponse(new Status(Status.STATUS_CODE_PART_SUCCESS, - "Public key could not be installed! Error: [" + e.getMessage() - + "]"), serverResponse.getGlusterServer()); - } - try { addServerToCluster(clusterName, serverName); } catch (Exception e) { - return new GlusterServerResponse(new Status(Status.STATUS_CODE_PART_SUCCESS, e.getMessage()), - serverResponse.getGlusterServer()); + return new GlusterServerResponse(new Status(Status.STATUS_CODE_PART_SUCCESS, e.getMessage()), null); + } + + // fetch server details + GlusterServerResponse serverResponse = getGlusterServer(clusterName, serverName); + + if (!publicKeyInstalled) { + try { + // install public key (this will also disable password based ssh login) + sshUtil.installPublicKey(serverName); + } catch (Exception e) { + return new GlusterServerResponse(new Status(Status.STATUS_CODE_PART_SUCCESS, + "Public key could not be installed! Error: [" + e.getMessage() + "]"), + serverResponse.getGlusterServer()); + } } return serverResponse; @@ -251,8 +254,11 @@ public class GlusterServersResource extends AbstractServersResource { private void addServerToCluster(String clusterName, String serverName) { EntityTransaction txn = clusterDao.startTransaction(); ClusterInfo cluster = getCluster(clusterName); - cluster.addServer(new ServerInfo(serverName)); + ServerInfo server = new ServerInfo(serverName); + server.setCluster(cluster); try { + clusterDao.save(server); + cluster.addServer(server); clusterDao.update(cluster); txn.commit(); } catch (Exception e) { diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java index 4a72ebce..2a055ee8 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java @@ -63,10 +63,6 @@ public class ServerUtil { this.sshUtil = sshUtil; } - public SshUtil getSshUtil() { - return sshUtil; - } - public ProcessResult executeGlusterScript(boolean runInForeground, String scriptName, List arguments) { List command = new ArrayList(); @@ -119,7 +115,8 @@ public class ServerUtil { } private String executeOnServer(String serverName, String commandWithArgs) { - ProcessResult result = getSshUtil().executeRemote(serverName, commandWithArgs); + ProcessResult result = sshUtil.executeRemote(serverName, commandWithArgs); + if (!result.isSuccess()) { throw new GlusterRuntimeException("Command [" + commandWithArgs + "] failed on [" + serverName + "] with error [" + result.getExitValue() + "][" + result.getOutput() + "]"); diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/SshUtil.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/SshUtil.java index 04639ba9..c0dd4a96 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/SshUtil.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/SshUtil.java @@ -291,7 +291,11 @@ public class SshUtil { public ProcessResult executeRemoteWithPassword(String serverName, String command) { return executeCommand(getConnectionWithPassword(serverName), command); } - + + private ProcessResult executeRemoteWithPubKey(String serverName, String command) { + return executeCommand(getConnection(serverName), command); + } + /** * Executes given command on remote machine using public key authentication * @@ -300,7 +304,12 @@ public class SshUtil { * @return Result of remote execution */ public ProcessResult executeRemote(String serverName, String command) { - return executeCommand(getConnection(serverName), command); + try { + return executeRemoteWithPubKey(serverName, command); + } catch(ConnectionException e) { + // Couldn't connect with public key. Try with default password. + return executeRemoteWithPassword(serverName, command); + } } /** -- cgit From 2c614a825f177e1dfb9b916a404bb1955d16e211 Mon Sep 17 00:00:00 2001 From: Dhandapani Date: Fri, 3 Jun 2011 14:33:24 +0530 Subject: Remove Brick issues --- .../management/client/GlusterDataModelManager.java | 6 ++++ .../management/gui/actions/RemoveDiskAction.java | 32 +++++++++++++--------- .../management/gui/views/details/BricksPage.java | 2 +- .../management/server/utils/GlusterUtil.java | 2 +- 4 files changed, 27 insertions(+), 15 deletions(-) (limited to 'src') 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 98071128..a5e480af 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 @@ -347,6 +347,12 @@ public class GlusterDataModelManager { listener.volumeChanged(volume, new Event(EVENT_TYPE.BRICKS_ADDED, bricks)); } } + + public void removeBricks(Volume volume, List bricks) { + for (ClusterListener listener : listeners) { + listener.volumeChanged(volume, new Event(EVENT_TYPE.BRICKS_REMOVED, bricks)); + } + } public void setVolumeOption(Volume volume, Entry entry) { volume.setOption(entry.getKey(), (String) entry.getValue()); diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveDiskAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveDiskAction.java index 3ad72e76..8c5d8405 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveDiskAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveDiskAction.java @@ -22,7 +22,6 @@ import com.gluster.storage.management.gui.IImageKeys; import com.gluster.storage.management.gui.utils.GUIHelper; import com.gluster.storage.management.gui.views.VolumeBricksView; - public class RemoveDiskAction extends AbstractActionDelegate { private GlusterDataModelManager modelManager = GlusterDataModelManager.getInstance(); private GUIHelper guiHelper = GUIHelper.getInstance(); @@ -36,8 +35,8 @@ public class RemoveDiskAction extends AbstractActionDelegate { List brickList = getBrickList(bricks); Integer deleteOption = new MessageDialog(getShell(), "Remove Bricks(s)", GUIHelper.getInstance().getImage( IImageKeys.VOLUME), "Are you sure you want to remove following bricks from volume [" + volume.getName() - + "] ? \n" + StringUtil.ListToString(brickList, ", "), MessageDialog.QUESTION, new String[] { "Cancel", "Remove bricks, delete data", - "Remove bricks, keep data" }, 2).open(); + + "] ? \n" + StringUtil.ListToString(brickList, ", "), MessageDialog.QUESTION, new String[] { "Cancel", + "Remove bricks, delete data", "Remove bricks, keep data" }, 2).open(); if (deleteOption <= 0) { // By Cancel button(0) or Escape key(-1) return; } @@ -51,15 +50,22 @@ public class RemoveDiskAction extends AbstractActionDelegate { Status status = client.removeBricks(volume.getName(), bricks, confirmDelete); if (status.isSuccess()) { + + // Remove the bricks from the volume object + for (Brick brick : bricks) { + volume.removeBrick(brick); + } + // Update model with removed bricks in the volume + modelManager.removeBricks(volume, bricks); + showInfoDialog(actionDesc, "Volume [" + volume.getName() + "] bricks(s) removed successfully!"); - modelManager.deleteVolume(volume); } else { - showErrorDialog(actionDesc, "Volume [" + volume.getName() + "] bricks(s) could not be removed! Error: [" - + status + "]"); + showErrorDialog(actionDesc, "Volume [" + volume.getName() + + "] bricks(s) could not be removed! Error: [" + status + "]"); } } }); - + } @Override @@ -71,11 +77,11 @@ public class RemoveDiskAction extends AbstractActionDelegate { super.selectionChanged(action, selection); action.setEnabled(false); - volume = (Volume)guiHelper.getSelectedEntity(window, Volume.class); + volume = (Volume) guiHelper.getSelectedEntity(window, Volume.class); if (volume != null) { // a volume is selected on navigation tree. Let's check if the currently open view is volume disks view IWorkbenchPart view = guiHelper.getActiveView(); - if(view instanceof VolumeBricksView) { + if (view instanceof VolumeBricksView) { // volume disks view is open. check if any brick is selected bricks = getSelectedBricks(selection); action.setEnabled(bricks.size() > 0); @@ -85,22 +91,22 @@ public class RemoveDiskAction extends AbstractActionDelegate { private List getSelectedBricks(ISelection selection) { List selectedBricks = new ArrayList(); - + if (selection instanceof IStructuredSelection) { Iterator iter = ((IStructuredSelection) selection).iterator(); while (iter.hasNext()) { Object selectedObj = iter.next(); if (selectedObj instanceof Brick) { - selectedBricks.add((Brick)selectedObj); + selectedBricks.add((Brick) selectedObj); } } } return selectedBricks; } - + private List getBrickList(List bricks) { List brickList = new ArrayList(); - for(Brick brick : bricks) { + for (Brick brick : bricks) { brickList.add(brick.getServerName() + ":" + brick.getBrickDirectory()); } return brickList; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/BricksPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/BricksPage.java index 9ebab70b..51425174 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/BricksPage.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/BricksPage.java @@ -58,7 +58,7 @@ public class BricksPage extends AbstractBricksPage { final ClusterListener clusterListener = new DefaultClusterListener() { @Override public void volumeChanged(Volume volume, Event event) { - if (event.getEventType() == EVENT_TYPE.BRICKS_ADDED) { + if (event.getEventType() == EVENT_TYPE.BRICKS_ADDED || event.getEventType() == EVENT_TYPE.BRICKS_REMOVED) { tableViewer.refresh(); parent.update(); } 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 77549add..7f2afc3f 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 @@ -498,7 +498,7 @@ System.out.println(brickDir); } public Status removeBricks(String volumeName, List bricks, String knownServer) { - StringBuilder command = new StringBuilder("gluster volume remove-brick " + volumeName); + StringBuilder command = new StringBuilder("gluster --mode=script volume remove-brick " + volumeName); for(String brickDir : bricks) { command.append(" " + brickDir); } -- cgit