Java tutorial
/** * 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 * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <p> * 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. */ package org.apache.hadoop.gateway; import org.apache.hadoop.gateway.shell.Shell; import org.apache.hadoop.test.category.ReleaseTest; import org.junit.experimental.categories.Category; import java.io.File; import java.io.IOException; import java.net.URISyntaxException; import java.net.URL; import java.security.Principal; import com.mycila.xmltool.XMLDoc; import com.mycila.xmltool.XMLTag; import groovy.lang.Binding; import groovy.lang.GroovyShell; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.permission.FsPermission; import org.apache.hadoop.hdfs.DistributedFileSystem; import org.apache.hadoop.hdfs.HdfsConfiguration; import org.apache.hadoop.hdfs.MiniDFSCluster; import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.security.ssl.KeyStoreTestUtil; import org.apache.hadoop.test.TestUtils; import org.apache.http.auth.AuthScope; import org.apache.http.auth.BasicUserPrincipal; import org.apache.http.auth.Credentials; import org.apache.http.client.CredentialsProvider; import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.log4j.PropertyConfigurator; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import static org.hamcrest.Matchers.containsString; import static org.junit.Assert.assertNotNull; import static org.hamcrest.MatcherAssert.assertThat; @Category(ReleaseTest.class) public class ShellTest { private static MiniDFSCluster miniDFSCluster; private static HdfsConfiguration configuration; private static int nameNodeHttpPort; private static String userName; private static GatewayTestDriver driver = new GatewayTestDriver(); private static File baseDir; @BeforeClass public static void setupSuite() throws Exception { nameNodeHttpPort = TestUtils.findFreePort(); configuration = new HdfsConfiguration(); baseDir = new File(KeyStoreTestUtil.getClasspathDir(ShellTest.class)); System.setProperty(MiniDFSCluster.PROP_TEST_BUILD_DATA, baseDir.getAbsolutePath()); miniDFSCluster = new MiniDFSCluster.Builder(configuration).nameNodePort(TestUtils.findFreePort()) .nameNodeHttpPort(nameNodeHttpPort).numDataNodes(2).format(true).racks(null).build(); userName = UserGroupInformation.createUserForTesting("guest", new String[] { "users" }).getUserName(); setupKnox(); } private static void setupKnox() throws Exception { //knox setup System.setProperty("gateway.hadoop.kerberos.secured", "false"); GatewayTestConfig config = new GatewayTestConfig(); config.setGatewayPath("gateway"); config.setHadoopKerberosSecured(false); driver.setResourceBase(ShellTest.class); driver.setupLdap(0); driver.setupGateway(config, "cluster", createTopology(), true); } @AfterClass public static void cleanupSuite() throws Exception { miniDFSCluster.shutdown(); driver.cleanup(); } @Test public void basicInsecureShell() throws Exception { testPutGetScript("InsecureWebHdfsPutGet.groovy"); } private void testPutGetScript(String script) throws IOException, URISyntaxException { setupLogging(); DistributedFileSystem fileSystem = miniDFSCluster.getFileSystem(); Path dir = new Path("/user/guest/example"); fileSystem.delete(dir, true); fileSystem.mkdirs(dir, new FsPermission("777")); fileSystem.setOwner(dir, "guest", "users"); Binding binding = new Binding(); binding.setProperty("gateway", driver.getClusterUrl()); URL readme = driver.getResourceUrl("README"); File file = new File(readme.toURI()); System.out.println(file.exists()); binding.setProperty("file", file.getAbsolutePath()); GroovyShell shell = new GroovyShell(binding); shell.evaluate(driver.getResourceUrl(script).toURI()); String status = (String) binding.getProperty("status"); assertNotNull(status); System.out.println(status); String fetchedFile = (String) binding.getProperty("fetchedFile"); assertNotNull(fetchedFile); System.out.println(fetchedFile); assertThat(fetchedFile, containsString("README")); } @Test public void basicSecureShell() throws Exception { testPutGetScript("WebHdfsPutGet.groovy"); } private static void setupLogging() { PropertyConfigurator.configure(ClassLoader.getSystemResource("log4j.properties")); } /** * Creates a topology that is deployed to the gateway instance for the test suite. * Note that this topology is shared by all of the test methods in this suite. * @return A populated XML structure for a topology file. */ private static XMLTag createTopology() { XMLTag xml = XMLDoc.newDocument(true).addRoot("topology").addTag("gateway").addTag("provider") .addTag("role").addText("webappsec").addTag("name").addText("WebAppSec").addTag("enabled") .addText("true").addTag("param").addTag("name").addText("csrf.enabled").addTag("value") .addText("false").gotoParent().gotoParent().addTag("provider").addTag("role") .addText("authentication").addTag("name").addText("ShiroProvider").addTag("enabled").addText("true") .addTag("param").addTag("name").addText("main.ldapRealm").addTag("value") .addText("org.apache.hadoop.gateway.shirorealm.KnoxLdapRealm").gotoParent().addTag("param") .addTag("name").addText("main.ldapRealm.userDnTemplate").addTag("value") .addText("uid={0},ou=people,dc=hadoop,dc=apache,dc=org").gotoParent().addTag("param").addTag("name") .addText("main.ldapRealm.contextFactory.url").addTag("value").addText(driver.getLdapUrl()) .gotoParent().addTag("param").addTag("name") .addText("main.ldapRealm.contextFactory.authenticationMechanism").addTag("value").addText("simple") .gotoParent().addTag("param").addTag("name").addText("urls./**").addTag("value") .addText("authcBasic").gotoParent().gotoParent().addTag("provider").addTag("role") .addText("identity-assertion").addTag("enabled").addText("true").addTag("name").addText("Default") .gotoParent().addTag("provider").addTag("role").addText("authorization").addTag("enabled") .addText("true").addTag("name").addText("AclsAuthz").gotoParent().addTag("param").addTag("name") .addText("webhdfs-acl").addTag("value").addText("hdfs;*;*").gotoParent().gotoRoot() .addTag("service").addTag("role").addText("WEBHDFS").addTag("url") .addText("http://localhost:" + nameNodeHttpPort + "/webhdfs/").gotoParent().gotoRoot(); // System.out.println( "GATEWAY=" + xml.toString() ); return xml; } }