diff options
| author | Shireesh Anjal <shireesh@gluster.com> | 2011-06-01 21:01:28 +0530 |
|---|---|---|
| committer | Shireesh Anjal <shireesh@gluster.com> | 2011-06-01 21:01:28 +0530 |
| commit | 9b7d4f679e92c045285b6c2e1c4f05ee502d1315 (patch) | |
| tree | 5d9d0b13079fca6c972524b0aa02399715546e88 | |
| parent | 60de4708d082ab00f4191ddf9cb4bc86ec0de168 (diff) | |
Design changes - introducing cluster-server mapping on gateway
5 files changed, 71 insertions, 22 deletions
diff --git a/src/com.gluster.storage.management.server/.project b/src/com.gluster.storage.management.server/.project index 259b3726..86d34a3b 100644 --- a/src/com.gluster.storage.management.server/.project +++ b/src/com.gluster.storage.management.server/.project @@ -37,5 +37,6 @@ <nature>org.eclipse.wst.common.project.facet.core.nature</nature> <nature>org.eclipse.jdt.core.javanature</nature> <nature>org.eclipse.wst.jsdt.core.jsNature</nature> + <nature>org.python.pydev.pythonNature</nature> </natures> </projectDescription> diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/ClusterInfo.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/ClusterInfo.java index 093423f0..3b3401e3 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/ClusterInfo.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/ClusterInfo.java @@ -62,6 +62,10 @@ public class ClusterInfo { public List<ServerInfo> getServers() { return servers; } + + public void addServer(ServerInfo server) { + servers.add(server); + } public static void main(String args[]) { AnnotationConfiguration config = new AnnotationConfiguration(); 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 88ce51ca..3564692c 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,10 @@ public class ServerInfo { @JoinColumn(name="cluster_id") private ClusterInfo cluster; + public ServerInfo(String name) { + setName(name); + } + public void setId(Integer id) { this.id = id; } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/ClustersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/ClustersResource.java index 53618610..11a77e87 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/ClustersResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/ClustersResource.java @@ -37,6 +37,8 @@ import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; +import org.springframework.stereotype.Component; + import com.gluster.storage.management.core.exceptions.ConnectionException; import com.gluster.storage.management.core.model.GlusterServer; import com.gluster.storage.management.core.model.Status; @@ -46,10 +48,13 @@ import com.gluster.storage.management.server.data.PersistenceDao; import com.gluster.storage.management.server.data.ServerInfo; import com.gluster.storage.management.server.utils.GlusterUtil; import com.sun.jersey.api.core.InjectParam; +import com.sun.jersey.spi.resource.Singleton; /** * */ +@Component +@Singleton @Path(RESOURCE_PATH_CLUSTERS) public class ClustersResource { 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 9e7e8025..be6c326a 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 @@ -26,6 +26,7 @@ import static com.gluster.storage.management.core.constants.RESTConstants.RESOUR import java.util.ArrayList; import java.util.List; +import javax.persistence.EntityTransaction; import javax.ws.rs.DELETE; import javax.ws.rs.FormParam; import javax.ws.rs.GET; @@ -66,6 +67,7 @@ public class GlusterServersResource extends AbstractServersResource { protected void fetchServerDetails(GlusterServer server) { try { + server.setStatus(SERVER_STATUS.ONLINE); super.fetchServerDetails(server); } catch(ConnectionException e) { server.setStatus(SERVER_STATUS.OFFLINE); @@ -85,18 +87,19 @@ public class GlusterServersResource extends AbstractServersResource { // Doesn't use cache public GlusterServer getNewOnlineServer(String clusterName) { // no known online server for this cluster. find one. - ClusterInfo cluster = clusterDao.findBy("name = ?1", clusterName).get(0); + ClusterInfo cluster = getCluster(clusterName); + if(cluster == null) { + return null; + } + for(ServerInfo serverInfo : cluster.getServers()) { GlusterServer server = new GlusterServer(serverInfo.getName()); - server.setStatus(SERVER_STATUS.ONLINE); - try { - fetchServerDetails(server); + fetchServerDetails(server); + if(server.isOnline()) { // server is online. add it to cache and return clusterServerCache.put(clusterName, server); - return server; - } catch(ConnectionException e) { - // server is offline. check the next server. } + return server; } // no online server found. @@ -171,30 +174,62 @@ public class GlusterServersResource extends AbstractServersResource { @Produces(MediaType.TEXT_XML) public GlusterServerResponse addServer(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName, @FormParam("serverName") String serverName) { - GlusterServer onlineServer = getOnlineServer(clusterName); - if(onlineServer == null) { - return new GlusterServerResponse(new Status(Status.STATUS_CODE_FAILURE, - "No online server found in cluster [" + clusterName + "]"), null); + ClusterInfo cluster = getCluster(clusterName); + if(cluster == null) { + return new GlusterServerResponse(new Status(Status.STATUS_CODE_FAILURE, "Cluster [" + clusterName + + "] doesn't exist!"), null); } - Status status; - try { - status = glusterUtil.addServer(serverName, onlineServer.getName()); - } catch(ConnectionException e) { - onlineServer = getNewOnlineServer(clusterName); + if(!cluster.getServers().isEmpty()) { + GlusterServer onlineServer = getOnlineServer(clusterName); if(onlineServer == null) { return new GlusterServerResponse(new Status(Status.STATUS_CODE_FAILURE, "No online server found in cluster [" + clusterName + "]"), null); } - status = glusterUtil.addServer(serverName, onlineServer.getName()); - } + + Status status; + try { + status = glusterUtil.addServer(serverName, onlineServer.getName()); + } catch(ConnectionException e) { + onlineServer = getNewOnlineServer(clusterName); + if(onlineServer == null) { + return new GlusterServerResponse(new Status(Status.STATUS_CODE_FAILURE, + "No online server found in cluster [" + clusterName + "]"), null); + } + status = glusterUtil.addServer(serverName, onlineServer.getName()); + } - if (!status.isSuccess()) { - return new GlusterServerResponse(status, null); + if (!status.isSuccess()) { + return new GlusterServerResponse(status, null); + } + } else { + // this is the first server to be added to the cluster, which means + // no gluster operation required. just add it to the cluster-server mapping } - return new GlusterServerResponse(Status.STATUS_SUCCESS, getGlusterServer(clusterName, serverName) - .getGlusterServer()); + EntityTransaction txn = clusterDao.startTransaction(); + // Inside a transaction, we must fetch the ClusterInfo object again. + cluster = getCluster(clusterName); + cluster.addServer(new ServerInfo(serverName)); + try { + txn.commit(); + } catch (Exception e) { + txn.rollback(); + return new GlusterServerResponse(new Status(Status.STATUS_CODE_FAILURE, + "Exception while trying to save cluster-server mapping [" + clusterName + "][" + serverName + + "]: [" + e.getMessage() + "]"), null); + } + + return getGlusterServer(clusterName, serverName); + } + + private ClusterInfo getCluster(String clusterName) { + List<ClusterInfo> clusters = clusterDao.findBy("name = ?1", clusterName); + if(clusters.size() == 0) { + return null; + } + + return clusters.get(0); } @DELETE |
