| /** |
| * 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. |
| */ |
| |
| package org.apache.hadoop.hdfs.server.federation.router; |
| |
| import static org.apache.hadoop.hdfs.server.federation.FederationTestUtils.createMountTableEntry; |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.fail; |
| |
| import java.io.FileNotFoundException; |
| import java.net.HttpURLConnection; |
| import java.net.URL; |
| import java.util.Collections; |
| |
| import org.apache.hadoop.conf.Configuration; |
| import org.apache.hadoop.fs.FileSystem; |
| import org.apache.hadoop.fs.Path; |
| import org.apache.hadoop.hdfs.server.federation.MiniRouterDFSCluster.RouterContext; |
| import org.apache.hadoop.hdfs.server.federation.RouterConfigBuilder; |
| import org.apache.hadoop.hdfs.server.federation.StateStoreDFSCluster; |
| import org.apache.hadoop.hdfs.server.federation.resolver.order.DestinationOrder; |
| import org.junit.AfterClass; |
| import org.junit.BeforeClass; |
| import org.junit.Test; |
| import org.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| |
| /** |
| * Test suite for Router Web Hdfs methods. |
| */ |
| public class TestRouterWebHdfsMethods { |
| static final Logger LOG = |
| LoggerFactory.getLogger(TestRouterWebHdfsMethods.class); |
| |
| private static StateStoreDFSCluster cluster; |
| private static RouterContext router; |
| private static String httpUri; |
| |
| @BeforeClass |
| public static void globalSetUp() throws Exception { |
| cluster = new StateStoreDFSCluster(false, 2); |
| Configuration conf = new RouterConfigBuilder() |
| .stateStore() |
| .rpc() |
| .http() |
| .admin() |
| .build(); |
| cluster.addRouterOverrides(conf); |
| cluster.startCluster(); |
| cluster.startRouters(); |
| cluster.waitClusterUp(); |
| router = cluster.getRandomRouter(); |
| httpUri = "http://"+router.getHttpAddress(); |
| } |
| |
| @AfterClass |
| public static void tearDown() { |
| if (cluster != null) { |
| cluster.shutdown(); |
| cluster = null; |
| } |
| } |
| |
| @Test |
| public void testWebHdfsCreate() throws Exception { |
| // the file is created at default ns (ns0) |
| String path = "/tmp/file"; |
| URL url = new URL(getUri(path)); |
| LOG.info("URL: {}", url); |
| HttpURLConnection conn = (HttpURLConnection) url.openConnection(); |
| conn.setRequestMethod("PUT"); |
| assertEquals(HttpURLConnection.HTTP_CREATED, conn.getResponseCode()); |
| verifyFile("ns0", path, true); |
| verifyFile("ns1", path, false); |
| conn.disconnect(); |
| } |
| |
| @Test |
| public void testWebHdfsCreateWithMounts() throws Exception { |
| // the file is created at mounted ns (ns1) |
| String mountPoint = "/tmp-ns1"; |
| String path = "/tmp-ns1/file"; |
| createMountTableEntry( |
| router.getRouter(), mountPoint, |
| DestinationOrder.RANDOM, Collections.singletonList("ns1")); |
| URL url = new URL(getUri(path)); |
| LOG.info("URL: {}", url); |
| HttpURLConnection conn = (HttpURLConnection) url.openConnection(); |
| conn.setRequestMethod("PUT"); |
| assertEquals(HttpURLConnection.HTTP_CREATED, conn.getResponseCode()); |
| verifyFile("ns1", path, true); |
| verifyFile("ns0", path, false); |
| conn.disconnect(); |
| } |
| |
| private String getUri(String path) { |
| final String user = System.getProperty("user.name"); |
| final StringBuilder uri = new StringBuilder(httpUri); |
| uri.append("/webhdfs/v1"). |
| append(path). |
| append("?op=CREATE"). |
| append("&user.name=" + user); |
| return uri.toString(); |
| } |
| |
| private void verifyFile(String ns, String path, boolean shouldExist) |
| throws Exception { |
| FileSystem fs = cluster.getNamenode(ns, null).getFileSystem(); |
| try { |
| fs.getFileStatus(new Path(path)); |
| if (!shouldExist) { |
| fail(path + " should not exist in ns " + ns); |
| } |
| } catch (FileNotFoundException e) { |
| if (shouldExist) { |
| fail(path + " should exist in ns " + ns); |
| } |
| } |
| } |
| |
| @Test |
| public void testGetNsFromDataNodeNetworkLocation() { |
| assertEquals("ns0", RouterWebHdfsMethods |
| .getNsFromDataNodeNetworkLocation("/ns0/rack-info1")); |
| assertEquals("ns0", RouterWebHdfsMethods |
| .getNsFromDataNodeNetworkLocation("/ns0/row1/rack-info1")); |
| assertEquals("", RouterWebHdfsMethods |
| .getNsFromDataNodeNetworkLocation("/row0")); |
| assertEquals("", RouterWebHdfsMethods |
| .getNsFromDataNodeNetworkLocation("whatever-rack-info1")); |
| } |
| } |