TestServiceLevelAuthorization.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:6k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.security.authorize;
  19. import java.io.File;
  20. import java.io.FileWriter;
  21. import java.io.IOException;
  22. import org.apache.hadoop.conf.Configuration;
  23. import org.apache.hadoop.fs.FileSystem;
  24. import org.apache.hadoop.fs.FileUtil;
  25. import org.apache.hadoop.fs.Path;
  26. import org.apache.hadoop.hdfs.HDFSPolicyProvider;
  27. import org.apache.hadoop.hdfs.MiniDFSCluster;
  28. import org.apache.hadoop.hdfs.tools.DFSAdmin;
  29. import org.apache.hadoop.ipc.RemoteException;
  30. import org.apache.hadoop.mapred.JobConf;
  31. import org.apache.hadoop.mapred.MiniMRCluster;
  32. import org.apache.hadoop.mapred.TestMiniMRWithDFS;
  33. import org.apache.hadoop.security.UnixUserGroupInformation;
  34. import org.apache.hadoop.util.StringUtils;
  35. import junit.framework.TestCase;
  36. public class TestServiceLevelAuthorization extends TestCase {
  37.   public void testServiceLevelAuthorization() throws Exception {
  38.     MiniDFSCluster dfs = null;
  39.     MiniMRCluster mr = null;
  40.     FileSystem fileSys = null;
  41.     try {
  42.       final int slaves = 4;
  43.       // Turn on service-level authorization
  44.       Configuration conf = new Configuration();
  45.       conf.setClass(PolicyProvider.POLICY_PROVIDER_CONFIG, 
  46.                     HadoopPolicyProvider.class, PolicyProvider.class);
  47.       conf.setBoolean(ServiceAuthorizationManager.SERVICE_AUTHORIZATION_CONFIG, 
  48.                       true);
  49.       
  50.       // Start the mini clusters
  51.       dfs = new MiniDFSCluster(conf, slaves, true, null);
  52.       fileSys = dfs.getFileSystem();
  53.       JobConf mrConf = new JobConf(conf);
  54.       mr = new MiniMRCluster(slaves, fileSys.getUri().toString(), 1, 
  55.                              null, null, mrConf);
  56.       // Run examples
  57.       TestMiniMRWithDFS.runPI(mr, mr.createJobConf(mrConf));
  58.       TestMiniMRWithDFS.runWordCount(mr, mr.createJobConf(mrConf));
  59.     } finally {
  60.       if (dfs != null) { dfs.shutdown(); }
  61.       if (mr != null) { mr.shutdown();
  62.       }
  63.     }
  64.   }
  65.   
  66.   private static final String DUMMY_ACL = "nouser nogroup";
  67.   private static final String UNKNOWN_USER = "dev,null";
  68.   
  69.   private void rewriteHadoopPolicyFile(File policyFile) throws IOException {
  70.     FileWriter fos = new FileWriter(policyFile);
  71.     PolicyProvider policyProvider = new HDFSPolicyProvider();
  72.     fos.write("<configuration>n");
  73.     for (Service service : policyProvider.getServices()) {
  74.       String key = service.getServiceKey();
  75.       String value ="*";
  76.       if (key.equals("security.refresh.policy.protocol.acl")) {
  77.         value = DUMMY_ACL;
  78.       }
  79.       fos.write("<property><name>"+ key + "</name><value>" + value + 
  80.                 "</value></property>n");
  81.       System.err.println("<property><name>"+ key + "</name><value>" + value + 
  82.           "</value></property>n");
  83.     }
  84.     fos.write("</configuration>n");
  85.     fos.close();
  86.   }
  87.   
  88.   private void refreshPolicy(Configuration conf)  throws IOException {
  89.     DFSAdmin dfsAdmin = new DFSAdmin(conf);
  90.     dfsAdmin.refreshServiceAcl();
  91.   }
  92.   
  93.   public void testRefresh() throws Exception {
  94.     MiniDFSCluster dfs = null;
  95.     try {
  96.       final int slaves = 4;
  97.       // Turn on service-level authorization
  98.       Configuration conf = new Configuration();
  99.       conf.setClass(PolicyProvider.POLICY_PROVIDER_CONFIG, 
  100.                     HDFSPolicyProvider.class, PolicyProvider.class);
  101.       conf.setBoolean(ServiceAuthorizationManager.SERVICE_AUTHORIZATION_CONFIG, 
  102.                       true);
  103.       
  104.       // Start the mini dfs cluster
  105.       dfs = new MiniDFSCluster(conf, slaves, true, null);
  106.       // Refresh the service level authorization policy
  107.       refreshPolicy(conf);
  108.       
  109.       // Simulate an 'edit' of hadoop-policy.xml
  110.       String confDir = System.getProperty("test.build.extraconf", 
  111.                                           "build/test/extraconf");
  112.       File policyFile = new File(confDir, ConfiguredPolicy.HADOOP_POLICY_FILE);
  113.       String policyFileCopy = ConfiguredPolicy.HADOOP_POLICY_FILE + ".orig";
  114.       FileUtil.copy(policyFile, FileSystem.getLocal(conf),   // first save original 
  115.                     new Path(confDir, policyFileCopy), false, conf);
  116.       rewriteHadoopPolicyFile(                               // rewrite the file
  117.           new File(confDir, ConfiguredPolicy.HADOOP_POLICY_FILE));
  118.       
  119.       // Refresh the service level authorization policy
  120.       refreshPolicy(conf);
  121.       
  122.       // Refresh the service level authorization policy once again, 
  123.       // this time it should fail!
  124.       try {
  125.         // Note: hadoop-policy.xml for tests has 
  126.         // security.refresh.policy.protocol.acl = ${user.name}
  127.         conf.set(UnixUserGroupInformation.UGI_PROPERTY_NAME, UNKNOWN_USER);
  128.         refreshPolicy(conf);
  129.         fail("Refresh of NameNode's policy file cannot be successful!");
  130.       } catch (RemoteException re) {
  131.         System.out.println("Good, refresh worked... refresh failed with: " + 
  132.                            StringUtils.stringifyException(re.unwrapRemoteException()));
  133.       } finally {
  134.         // Reset to original hadoop-policy.xml
  135.         FileUtil.fullyDelete(new File(confDir, 
  136.             ConfiguredPolicy.HADOOP_POLICY_FILE));
  137.         FileUtil.replaceFile(new File(confDir, policyFileCopy), new File(confDir, ConfiguredPolicy.HADOOP_POLICY_FILE));
  138.       }
  139.     } finally {
  140.       if (dfs != null) { dfs.shutdown(); }
  141.     }
  142.   }
  143. }