/**
  * Convert a protobuf ClusterStatus to a ClusterStatus
  *
  * @param proto the protobuf ClusterStatus
  * @return the converted ClusterStatus
  */
 public static ClusterStatus convert(ClusterStatusProtos.ClusterStatus proto) {
   Map<ServerName, ServerLoad> servers = new HashMap<ServerName, ServerLoad>();
   for (LiveServerInfo lsi : proto.getLiveServersList()) {
     servers.put(ProtobufUtil.toServerName(lsi.getServer()), new ServerLoad(lsi.getServerLoad()));
   }
   Collection<ServerName> deadServers = new LinkedList<ServerName>();
   for (HBaseProtos.ServerName sn : proto.getDeadServersList()) {
     deadServers.add(ProtobufUtil.toServerName(sn));
   }
   Collection<ServerName> backupMasters = new LinkedList<ServerName>();
   for (HBaseProtos.ServerName sn : proto.getBackupMastersList()) {
     backupMasters.add(ProtobufUtil.toServerName(sn));
   }
   final Map<String, RegionState> rit = new HashMap<String, RegionState>();
   for (RegionInTransition region : proto.getRegionsInTransitionList()) {
     String key = new String(region.getSpec().getValue().toByteArray());
     RegionState value = RegionState.convert(region.getRegionState());
     rit.put(key, value);
   }
   final int numMasterCoprocessors = proto.getMasterCoprocessorsCount();
   final String[] masterCoprocessors = new String[numMasterCoprocessors];
   for (int i = 0; i < numMasterCoprocessors; i++) {
     masterCoprocessors[i] = proto.getMasterCoprocessors(i).getName();
   }
   return new ClusterStatus(
       proto.getHbaseVersion().getVersion(),
       ClusterId.convert(proto.getClusterId()).toString(),
       servers,
       deadServers,
       ProtobufUtil.toServerName(proto.getMaster()),
       backupMasters,
       rit,
       masterCoprocessors,
       proto.getBalancerOn());
 }
  /**
   * Convert a ClutserStatus to a protobuf ClusterStatus
   *
   * @return the protobuf ClusterStatus
   */
  public ClusterStatusProtos.ClusterStatus convert() {
    ClusterStatusProtos.ClusterStatus.Builder builder =
        ClusterStatusProtos.ClusterStatus.newBuilder();
    builder.setHbaseVersion(HBaseVersionFileContent.newBuilder().setVersion(getHBaseVersion()));

    for (Map.Entry<ServerName, ServerLoad> entry : liveServers.entrySet()) {
      LiveServerInfo.Builder lsi =
          LiveServerInfo.newBuilder().setServer(ProtobufUtil.toServerName(entry.getKey()));
      lsi.setServerLoad(entry.getValue().obtainServerLoadPB());
      builder.addLiveServers(lsi.build());
    }
    for (ServerName deadServer : getDeadServerNames()) {
      builder.addDeadServers(ProtobufUtil.toServerName(deadServer));
    }
    for (Map.Entry<String, RegionState> rit : getRegionsInTransition().entrySet()) {
      ClusterStatusProtos.RegionState rs = rit.getValue().convert();
      RegionSpecifier.Builder spec =
          RegionSpecifier.newBuilder().setType(RegionSpecifierType.REGION_NAME);
      spec.setValue(ByteString.copyFrom(Bytes.toBytes(rit.getKey())));

      RegionInTransition pbRIT =
          RegionInTransition.newBuilder().setSpec(spec.build()).setRegionState(rs).build();
      builder.addRegionsInTransition(pbRIT);
    }
    builder.setClusterId(new ClusterId(getClusterId()).convert());
    for (String coprocessor : getMasterCoprocessors()) {
      builder.addMasterCoprocessors(HBaseProtos.Coprocessor.newBuilder().setName(coprocessor));
    }
    builder.setMaster(ProtobufUtil.toServerName(getMaster()));
    for (ServerName backup : getBackupMasters()) {
      builder.addBackupMasters(ProtobufUtil.toServerName(backup));
    }
    builder.setBalancerOn(balancerOn);
    return builder.build();
  }