DataNodeUGIProvider { UserGroupInformation ugi() throws IOException { UserGroupInformation ugi; try { if (UserGroupInformation.isSecurityEnabled()) { final Token<DelegationTokenIdentifier> token = params.delegationToken(); ugi = ugiCache.get(buildTokenCacheKey(token), new Callable<UserGroupInformation>() { @Override public UserGroupInformation call() throws Exception { return tokenUGI(token); } }); } else { final String usernameFromQuery = params.userName(); final String doAsUserFromQuery = params.doAsUser(); final String remoteUser = usernameFromQuery == null ? JspHelper .getDefaultWebUserName(params.conf()) : usernameFromQuery; ugi = ugiCache.get( buildNonTokenCacheKey(doAsUserFromQuery, remoteUser), new Callable<UserGroupInformation>() { @Override public UserGroupInformation call() throws Exception { return nonTokenUGI(usernameFromQuery, doAsUserFromQuery, remoteUser); } }); } } catch (ExecutionException e) { Throwable cause = e.getCause(); if (cause instanceof IOException) { throw (IOException) cause; } else { throw new IOException(cause); } } return ugi; } DataNodeUGIProvider(ParameterParser params); static synchronized void init(Configuration conf); static final Log LOG; }
@Test public void testUGICacheSecure() throws Exception { SecurityUtil.setAuthenticationMethod(KERBEROS, conf); UserGroupInformation.setConfiguration(conf); UserGroupInformation ugi = UserGroupInformation .createRemoteUser("test-user"); ugi.setAuthenticationMethod(KERBEROS); ugi = UserGroupInformation.createProxyUser("test-proxy-user", ugi); UserGroupInformation.setLoginUser(ugi); List<Token<DelegationTokenIdentifier>> tokens = Lists.newArrayList(); getWebHdfsFileSystem(ugi, conf, tokens); String uri1 = WebHdfsFileSystem.PATH_PREFIX + PATH + "?op=OPEN" + Param.toSortedString("&", new NamenodeAddressParam("127.0.0.1:1010"), new OffsetParam((long) OFFSET), new LengthParam((long) LENGTH), new DelegationParam(tokens.get(0).encodeToUrlString())); String uri2 = WebHdfsFileSystem.PATH_PREFIX + PATH + "?op=OPEN" + Param.toSortedString("&", new NamenodeAddressParam("127.0.0.1:1010"), new OffsetParam((long) OFFSET), new LengthParam((long) LENGTH), new DelegationParam(tokens.get(1).encodeToUrlString())); DataNodeUGIProvider ugiProvider1 = new DataNodeUGIProvider( new ParameterParser(new QueryStringDecoder(URI.create(uri1)), conf)); UserGroupInformation ugi11 = ugiProvider1.ugi(); UserGroupInformation ugi12 = ugiProvider1.ugi(); Assert.assertEquals( "With UGI cache, two UGIs returned by the same token should be same", ugi11, ugi12); DataNodeUGIProvider ugiProvider2 = new DataNodeUGIProvider( new ParameterParser(new QueryStringDecoder(URI.create(uri2)), conf)); UserGroupInformation url21 = ugiProvider2.ugi(); UserGroupInformation url22 = ugiProvider2.ugi(); Assert.assertEquals( "With UGI cache, two UGIs returned by the same token should be same", url21, url22); Assert.assertNotEquals( "With UGI cache, two UGIs for the different token should not be same", ugi11, url22); awaitCacheEmptyDueToExpiration(); ugi12 = ugiProvider1.ugi(); url22 = ugiProvider2.ugi(); String msg = "With cache eviction, two UGIs returned" + " by the same token should not be same"; Assert.assertNotEquals(msg, ugi11, ugi12); Assert.assertNotEquals(msg, url21, url22); Assert.assertNotEquals( "With UGI cache, two UGIs for the different token should not be same", ugi11, url22); }
@Test public void testUGICacheInSecure() throws Exception { String uri1 = WebHdfsFileSystem.PATH_PREFIX + PATH + "?op=OPEN" + Param.toSortedString("&", new OffsetParam((long) OFFSET), new LengthParam((long) LENGTH), new UserParam("root")); String uri2 = WebHdfsFileSystem.PATH_PREFIX + PATH + "?op=OPEN" + Param.toSortedString("&", new OffsetParam((long) OFFSET), new LengthParam((long) LENGTH), new UserParam("hdfs")); DataNodeUGIProvider ugiProvider1 = new DataNodeUGIProvider( new ParameterParser(new QueryStringDecoder(URI.create(uri1)), conf)); UserGroupInformation ugi11 = ugiProvider1.ugi(); UserGroupInformation ugi12 = ugiProvider1.ugi(); Assert.assertEquals( "With UGI cache, two UGIs for the same user should be same", ugi11, ugi12); DataNodeUGIProvider ugiProvider2 = new DataNodeUGIProvider( new ParameterParser(new QueryStringDecoder(URI.create(uri2)), conf)); UserGroupInformation url21 = ugiProvider2.ugi(); UserGroupInformation url22 = ugiProvider2.ugi(); Assert.assertEquals( "With UGI cache, two UGIs for the same user should be same", url21, url22); Assert.assertNotEquals( "With UGI cache, two UGIs for the different user should not be same", ugi11, url22); awaitCacheEmptyDueToExpiration(); ugi12 = ugiProvider1.ugi(); url22 = ugiProvider2.ugi(); String msg = "With cache eviction, two UGIs returned by" + " the same user should not be same"; Assert.assertNotEquals(msg, ugi11, ugi12); Assert.assertNotEquals(msg, url21, url22); Assert.assertNotEquals( "With UGI cache, two UGIs for the different user should not be same", ugi11, url22); }