package com.twitter.common.zookeeper.testing.angrybird; import java.io.IOException; import com.google.common.base.Optional; import com.twitter.common.zookeeper.testing.angrybird.gen.ExpireEndpointRequest; import com.twitter.common.zookeeper.testing.angrybird.gen.ExpireFollowerRequest; import com.twitter.common.zookeeper.testing.angrybird.gen.ExpireLeaderRequest; import com.twitter.common.zookeeper.testing.angrybird.gen.ExpireSessionRequest; import com.twitter.common.zookeeper.testing.angrybird.gen.ExpireResponse; import com.twitter.common.zookeeper.testing.angrybird.gen.RestartResponse; import com.twitter.common.zookeeper.testing.angrybird.gen.ServerPortResponse; import com.twitter.common.zookeeper.testing.angrybird.gen.ShutdownResponse; import com.twitter.common.zookeeper.testing.angrybird.gen.StartupResponse; import com.twitter.common.zookeeper.testing.angrybird.gen.ZooKeeperThriftServer; import com.twitter.util.Future; import static com.twitter.common.zookeeper.testing.angrybird.gen.ResponseCode.ERROR; import static com.twitter.common.zookeeper.testing.angrybird.gen.ResponseCode.OK; /** * Thrift interface for the angrybird ZooKeeper server. */ public class AngryBirdZooKeeperThriftService implements ZooKeeperThriftServer.ServiceIface { private final AngryBirdZooKeeperServer zkServer; private Future<ExpireResponse> sessionIdToExpireResponse(Optional<Long> sessionId) { ExpireResponse response = new ExpireResponse(); if (sessionId.isPresent()) { response.setResponseCode(OK).setSessionId(sessionId.get().longValue()); } else { response.setResponseCode(ERROR).setSessionId(0); } return Future.value(response); } /** * Creates a new angrybird thrift server * * @param zkServer Thrift server to interact with. */ public AngryBirdZooKeeperThriftService(AngryBirdZooKeeperServer zkServer) { this.zkServer = zkServer; } @Override public Future<ServerPortResponse> getZooKeeperServerPort() { ServerPortResponse response = new ServerPortResponse(); int port = zkServer.getPort(); return Future.value(response.setResponseCode(OK).setPort(port)); } @Override public Future<ExpireResponse> expireSession(ExpireSessionRequest expireRequest) { return sessionIdToExpireResponse(zkServer.expireSession(expireRequest.sessionId)); } @Override public Future<ExpireResponse> expireEndpoint(ExpireEndpointRequest expireRequest) { return sessionIdToExpireResponse( zkServer.expireEndpoint(expireRequest.host, expireRequest.port)); } @Override public Future<ExpireResponse> expireLeader(ExpireLeaderRequest request) { return sessionIdToExpireResponse(zkServer.expireLeader(request.zkPath)); } @Override public Future<ExpireResponse> expireFollower(ExpireFollowerRequest request) { return sessionIdToExpireResponse( zkServer.expireFollower(request.zkPath, Optional.of(request.nodeId))); } @Override public Future<StartupResponse> startup() { StartupResponse response = new StartupResponse(); try { zkServer.startNetwork(); response.setResponseCode(OK); response.setResponseMessage("OK"); } catch (IOException e) { response.setResponseCode(ERROR).setResponseMessage(e.getMessage()); } catch (InterruptedException e) { response.setResponseCode(ERROR).setResponseMessage(e.getMessage()); } return Future.value(response); } @Override public Future<ShutdownResponse> shutdown() { ShutdownResponse response = new ShutdownResponse(); zkServer.shutdownNetwork(); return Future.value(response.setResponseCode(OK).setResponseMessage("OK")); } @Override public Future<RestartResponse> restart() { RestartResponse response = new RestartResponse(); try { zkServer.shutdownNetwork(); zkServer.restartNetwork(); response.setResponseCode(OK).setResponseMessage("OK"); } catch (IOException e) { response.setResponseCode(ERROR).setResponseMessage(e.getMessage()); } catch (InterruptedException e) { response.setResponseCode(ERROR).setResponseMessage(e.getMessage()); } return Future.value(response); } }