Java 类org.apache.hadoop.hdfs.web.resources.ExceptionHandler 实例源码

项目:aliyun-oss-hadoop-fs    文件:TestWebHDFSForHA.java   
@Test
public void testClientFailoverWhenStandbyNNHasStaleCredentials()
    throws IOException {
  Configuration conf = DFSTestUtil.newHAConfiguration(LOGICAL_NAME);
  conf.setBoolean(DFSConfigKeys
                      .DFS_NAMENODE_DELEGATION_TOKEN_ALWAYS_USE_KEY, true);

  MiniDFSCluster cluster = null;
  WebHdfsFileSystem fs = null;
  try {
    cluster = new MiniDFSCluster.Builder(conf).nnTopology(topo).numDataNodes(
        0).build();

    HATestUtil.setFailoverConfigurations(cluster, conf, LOGICAL_NAME);
    cluster.waitActive();

    fs = (WebHdfsFileSystem) FileSystem.get(WEBHDFS_URI, conf);

    cluster.transitionToActive(0);
    Token<?> token = fs.getDelegationToken(null);
    final DelegationTokenIdentifier identifier = new DelegationTokenIdentifier();
    identifier.readFields(
        new DataInputStream(new ByteArrayInputStream(token.getIdentifier())));
    cluster.transitionToStandby(0);
    cluster.transitionToActive(1);

    final DelegationTokenSecretManager secretManager = NameNodeAdapter.getDtSecretManager(
        cluster.getNamesystem(0));

    ExceptionHandler eh = new ExceptionHandler();
    eh.initResponse(mock(HttpServletResponse.class));
    Response resp = null;
    try {
      secretManager.retrievePassword(identifier);
    } catch (IOException e) {
      // Mimic the UserProvider class logic (server side) by throwing
      // SecurityException here
      Assert.assertTrue(e instanceof SecretManager.InvalidToken);
      resp = eh.toResponse(new SecurityException(e));
    }
    // The Response (resp) below is what the server will send to client
    //
    // BEFORE HDFS-6475 fix, the resp.entity is
    //     {"RemoteException":{"exception":"SecurityException",
    //      "javaClassName":"java.lang.SecurityException",
    //      "message":"Failed to obtain user group information:
    //      org.apache.hadoop.security.token.SecretManager$InvalidToken:
    //        StandbyException"}}
    // AFTER the fix, the resp.entity is
    //     {"RemoteException":{"exception":"StandbyException",
    //      "javaClassName":"org.apache.hadoop.ipc.StandbyException",
    //      "message":"Operation category READ is not supported in
    //       state standby"}}
    //

    // Mimic the client side logic by parsing the response from server
    //
    Map<?, ?> m = (Map<?, ?>) JSON.parse(resp.getEntity().toString());
    RemoteException re = JsonUtilClient.toRemoteException(m);
    Exception unwrapped = re.unwrapRemoteException(StandbyException.class);
    Assert.assertTrue(unwrapped instanceof StandbyException);
  } finally {
    IOUtils.cleanup(null, fs);
    if (cluster != null) {
      cluster.shutdown();
    }
  }
}