| package org.apache.hadoop.mapreduce.security; |
| |
| /** Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.fail; |
| |
| import java.io.File; |
| import java.io.FileNotFoundException; |
| import java.io.FileOutputStream; |
| import java.io.IOException; |
| import java.net.URI; |
| |
| import org.apache.hadoop.conf.Configuration; |
| import org.apache.hadoop.fs.FileSystem; |
| import org.apache.hadoop.hdfs.MiniDFSCluster; |
| import org.apache.hadoop.hdfs.server.namenode.NameNode; |
| import org.apache.hadoop.mapred.JobConf; |
| import org.apache.hadoop.mapred.MiniMRClientCluster; |
| import org.apache.hadoop.mapred.MiniMRClientClusterFactory; |
| import org.apache.hadoop.mapreduce.JobContext; |
| import org.apache.hadoop.util.ToolRunner; |
| import org.junit.AfterClass; |
| import org.junit.BeforeClass; |
| import org.junit.Test; |
| |
| /** |
| * Tests whether a protected secret passed from JobClient is |
| * available to the child task |
| */ |
| |
| public class TestMRCredentials { |
| |
| static final int NUM_OF_KEYS = 10; |
| private static MiniMRClientCluster mrCluster; |
| private static MiniDFSCluster dfsCluster; |
| private static int numSlaves = 1; |
| private static JobConf jConf; |
| |
| @SuppressWarnings("deprecation") |
| @BeforeClass |
| public static void setUp() throws Exception { |
| System.setProperty("hadoop.log.dir", "logs"); |
| Configuration conf = new Configuration(); |
| dfsCluster = new MiniDFSCluster(conf, numSlaves, true, null); |
| jConf = new JobConf(conf); |
| FileSystem.setDefaultUri(conf, dfsCluster.getFileSystem().getUri().toString()); |
| mrCluster = MiniMRClientClusterFactory.create(TestMRCredentials.class, 1, jConf); |
| createKeysAsJson("keys.json"); |
| } |
| |
| @AfterClass |
| public static void tearDown() throws Exception { |
| if(mrCluster != null) |
| mrCluster.stop(); |
| mrCluster = null; |
| if(dfsCluster != null) |
| dfsCluster.shutdown(); |
| dfsCluster = null; |
| |
| new File("keys.json").delete(); |
| |
| } |
| |
| public static void createKeysAsJson (String fileName) |
| throws FileNotFoundException, IOException{ |
| StringBuilder jsonString = new StringBuilder(); |
| jsonString.append("{"); |
| for(int i=0; i<NUM_OF_KEYS; i++) { |
| String keyName = "alias"+i; |
| String password = "password"+i; |
| jsonString.append("\""+ keyName +"\":"+ "\""+password+"\"" ); |
| if (i < (NUM_OF_KEYS-1)){ |
| jsonString.append(","); |
| } |
| |
| } |
| jsonString.append("}"); |
| |
| FileOutputStream fos= new FileOutputStream (fileName); |
| fos.write(jsonString.toString().getBytes()); |
| fos.close(); |
| } |
| |
| |
| /** |
| * run a distributed job and verify that TokenCache is available |
| * @throws IOException |
| */ |
| @Test |
| public void test () throws IOException { |
| |
| // make sure JT starts |
| Configuration jobConf = new JobConf(mrCluster.getConfig()); |
| |
| // provide namenodes names for the job to get the delegation tokens for |
| //String nnUri = dfsCluster.getNameNode().getUri(namenode).toString(); |
| NameNode nn = dfsCluster.getNameNode(); |
| URI nnUri = NameNode.getUri(nn.getNameNodeAddress()); |
| jobConf.set(JobContext.JOB_NAMENODES, nnUri + "," + nnUri.toString()); |
| |
| |
| jobConf.set("mapreduce.job.credentials.json" , "keys.json"); |
| |
| // using argument to pass the file name |
| String[] args = { |
| "-m", "1", "-r", "1", "-mt", "1", "-rt", "1" |
| }; |
| |
| int res = -1; |
| try { |
| res = ToolRunner.run(jobConf, new CredentialsTestJob(), args); |
| } catch (Exception e) { |
| System.out.println("Job failed with" + e.getLocalizedMessage()); |
| e.printStackTrace(System.out); |
| fail("Job failed"); |
| } |
| assertEquals("dist job res is not 0", res, 0); |
| |
| } |
| } |