@Override
 public void removeRSGroup(String name) throws IOException {
   RSGroupAdminProtos.RemoveRSGroupRequest request =
       RSGroupAdminProtos.RemoveRSGroupRequest.newBuilder().setRSGroupName(name).build();
   try {
     proxy.removeRSGroup(null, request);
   } catch (ServiceException e) {
     throw ProtobufUtil.handleRemoteException(e);
   }
 }
  @Override
  public boolean balanceRSGroup(String name) throws IOException {
    RSGroupAdminProtos.BalanceRSGroupRequest request =
        RSGroupAdminProtos.BalanceRSGroupRequest.newBuilder().setRSGroupName(name).build();

    try {
      return proxy.balanceRSGroup(null, request).getBalanceRan();
    } catch (ServiceException e) {
      throw ProtobufUtil.handleRemoteException(e);
    }
  }
 @Override
 public void moveTables(Set<TableName> tables, String targetGroup) throws IOException {
   RSGroupAdminProtos.MoveTablesRequest.Builder builder =
       RSGroupAdminProtos.MoveTablesRequest.newBuilder().setTargetGroup(targetGroup);
   for (TableName tableName : tables) {
     builder.addTableName(ProtobufUtil.toProtoTableName(tableName));
   }
   try {
     proxy.moveTables(null, builder.build());
   } catch (ServiceException e) {
     throw ProtobufUtil.handleRemoteException(e);
   }
 }
  @Override
  public RSGroupInfo getRSGroupInfoOfTable(TableName tableName) throws IOException {
    RSGroupAdminProtos.GetRSGroupInfoOfTableRequest request =
        RSGroupAdminProtos.GetRSGroupInfoOfTableRequest.newBuilder()
            .setTableName(ProtobufUtil.toProtoTableName(tableName))
            .build();

    try {
      GetRSGroupInfoOfTableResponse resp = proxy.getRSGroupInfoOfTable(null, request);
      if (resp.hasRSGroupInfo()) {
        return RSGroupSerDe.toGroupInfo(resp.getRSGroupInfo());
      }
      return null;
    } catch (ServiceException e) {
      throw ProtobufUtil.handleRemoteException(e);
    }
  }
 @Override
 public RSGroupInfo getRSGroupInfo(String groupName) throws IOException {
   try {
     RSGroupAdminProtos.GetRSGroupInfoResponse resp =
         proxy.getRSGroupInfo(
             null,
             RSGroupAdminProtos.GetRSGroupInfoRequest.newBuilder()
                 .setRSGroupName(groupName)
                 .build());
     if (resp.hasRSGroupInfo()) {
       return RSGroupSerDe.toGroupInfo(resp.getRSGroupInfo());
     }
     return null;
   } catch (ServiceException e) {
     throw ProtobufUtil.handleRemoteException(e);
   }
 }
 @Override
 public List<RSGroupInfo> listRSGroups() throws IOException {
   try {
     List<RSGroupProtos.RSGroupInfo> resp =
         proxy
             .listRSGroupInfos(
                 null, RSGroupAdminProtos.ListRSGroupInfosRequest.newBuilder().build())
             .getRSGroupInfoList();
     List<RSGroupInfo> result = new ArrayList<RSGroupInfo>(resp.size());
     for (RSGroupProtos.RSGroupInfo entry : resp) {
       result.add(RSGroupSerDe.toGroupInfo(entry));
     }
     return result;
   } catch (ServiceException e) {
     throw ProtobufUtil.handleRemoteException(e);
   }
 }
 @Override
 public RSGroupInfo getRSGroupOfServer(HostAndPort hostPort) throws IOException {
   RSGroupAdminProtos.GetRSGroupInfoOfServerRequest request =
       RSGroupAdminProtos.GetRSGroupInfoOfServerRequest.newBuilder()
           .setServer(
               HBaseProtos.ServerName.newBuilder()
                   .setHostName(hostPort.getHostText())
                   .setPort(hostPort.getPort())
                   .build())
           .build();
   try {
     GetRSGroupInfoOfServerResponse resp = proxy.getRSGroupInfoOfServer(null, request);
     if (resp.hasRSGroupInfo()) {
       return RSGroupSerDe.toGroupInfo(resp.getRSGroupInfo());
     }
     return null;
   } catch (ServiceException e) {
     throw ProtobufUtil.handleRemoteException(e);
   }
 }
  @Override
  public void moveServers(Set<HostAndPort> servers, String targetGroup) throws IOException {
    Set<HBaseProtos.ServerName> hostPorts = Sets.newHashSet();
    for (HostAndPort el : servers) {
      hostPorts.add(
          HBaseProtos.ServerName.newBuilder()
              .setHostName(el.getHostText())
              .setPort(el.getPort())
              .build());
    }
    RSGroupAdminProtos.MoveServersRequest request =
        RSGroupAdminProtos.MoveServersRequest.newBuilder()
            .setTargetGroup(targetGroup)
            .addAllServers(hostPorts)
            .build();

    try {
      proxy.moveServers(null, request);
    } catch (ServiceException e) {
      throw ProtobufUtil.handleRemoteException(e);
    }
  }