diff --git a/hadoop-ozone/objectstore-service/pom.xml b/hadoop-ozone/objectstore-service/pom.xml index 47d7e3782a8a9..feb816055ea9d 100644 --- a/hadoop-ozone/objectstore-service/pom.xml +++ b/hadoop-ozone/objectstore-service/pom.xml @@ -46,6 +46,31 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd"> provided + + org.apache.hadoop + hadoop-common + test + test-jar + + + + com.sun.xml.bind + jaxb-impl + test + + + + com.sun.xml.bind + jaxb-core + test + + + + javax.xml.bind + jaxb-api + test + + org.apache.hadoop hadoop-hdfs diff --git a/hadoop-ozone/objectstore-service/src/main/java/org/apache/hadoop/ozone/web/OzoneHddsDatanodeService.java b/hadoop-ozone/objectstore-service/src/main/java/org/apache/hadoop/ozone/web/OzoneHddsDatanodeService.java index 621b659711e40..6907732d3680e 100644 --- a/hadoop-ozone/objectstore-service/src/main/java/org/apache/hadoop/ozone/web/OzoneHddsDatanodeService.java +++ b/hadoop-ozone/objectstore-service/src/main/java/org/apache/hadoop/ozone/web/OzoneHddsDatanodeService.java @@ -19,17 +19,18 @@ import java.io.IOException; +import org.apache.commons.io.IOUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hdds.protocol.DatanodeDetails; import org.apache.hadoop.hdfs.server.datanode.ObjectStoreHandler; import org.apache.hadoop.ozone.HddsDatanodeService; import org.apache.hadoop.ozone.web.netty.ObjectStoreRestHttpServer; - -import org.apache.commons.io.IOUtils; import org.apache.hadoop.util.ServicePlugin; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.annotations.VisibleForTesting; + /** * DataNode service plugin implementation to start ObjectStore rest server. */ @@ -49,12 +50,12 @@ public void start(Object service) { HddsDatanodeService hddsDatanodeService = (HddsDatanodeService) service; conf = hddsDatanodeService.getConf(); handler = new ObjectStoreHandler(conf); - objectStoreRestHttpServer = new ObjectStoreRestHttpServer( - conf, null, handler); + objectStoreRestHttpServer = + new ObjectStoreRestHttpServer(conf, null, handler); objectStoreRestHttpServer.start(); - DatanodeDetails.Port restPort = DatanodeDetails.newPort( - DatanodeDetails.Port.Name.REST, - objectStoreRestHttpServer.getHttpAddress().getPort()); + DatanodeDetails.Port restPort = + DatanodeDetails.newPort(DatanodeDetails.Port.Name.REST, + objectStoreRestHttpServer.getHttpAddress().getPort()); hddsDatanodeService.getDatanodeDetails().setPort(restPort); } catch (IOException e) { @@ -68,7 +69,6 @@ public void start(Object service) { } } - @Override public void stop() { try { @@ -86,4 +86,13 @@ public void close() { IOUtils.closeQuietly(handler); } + @VisibleForTesting + public ObjectStoreHandler getHandler() { + return handler; + } + + @VisibleForTesting + public ObjectStoreRestHttpServer getObjectStoreRestHttpServer() { + return objectStoreRestHttpServer; + } } diff --git a/hadoop-ozone/objectstore-service/src/test/java/org/apache/hadoop/ozone/web/TestOzoneHddsDatanodeService.java b/hadoop-ozone/objectstore-service/src/test/java/org/apache/hadoop/ozone/web/TestOzoneHddsDatanodeService.java new file mode 100644 index 0000000000000..8099835ddc091 --- /dev/null +++ b/hadoop-ozone/objectstore-service/src/test/java/org/apache/hadoop/ozone/web/TestOzoneHddsDatanodeService.java @@ -0,0 +1,101 @@ +/** + * 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.ozone.web; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.mock; + +import java.io.File; +import java.io.IOException; +import java.util.UUID; + +import org.apache.hadoop.fs.FileUtil; +import org.apache.hadoop.hdds.HddsConfigKeys; +import org.apache.hadoop.hdds.conf.OzoneConfiguration; +import org.apache.hadoop.hdds.protocol.DatanodeDetails; +import org.apache.hadoop.hdds.scm.ScmConfigKeys; +import org.apache.hadoop.hdfs.DFSConfigKeys; +import org.apache.hadoop.ozone.HddsDatanodeService; +import org.apache.hadoop.ozone.OzoneConfigKeys; +import org.apache.hadoop.test.GenericTestUtils; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; + +import com.google.protobuf.Service; + +/** + * Test class for {@link OzoneHddsDatanodeService}. + */ +public class TestOzoneHddsDatanodeService { + private File testDir; + private OzoneConfiguration conf; + + @Before + public void setUp() { + testDir = GenericTestUtils.getRandomizedTestDir(); + String volumeDir = testDir + "/disk1"; + + conf = new OzoneConfiguration(); + conf.set(ScmConfigKeys.OZONE_SCM_NAMES, "localhost"); + conf.setBoolean(OzoneConfigKeys.OZONE_ENABLED, true); + conf.set(HddsConfigKeys.OZONE_METADATA_DIRS, testDir.getPath()); + conf.set(DFSConfigKeys.DFS_DATANODE_DATA_DIR_KEY, volumeDir); + } + + @After + public void tearDown() { + FileUtil.fullyDelete(testDir); + } + + @Test + public void testStartup() throws IOException { + OzoneHddsDatanodeService ozoneHddsService = new OzoneHddsDatanodeService(); + String[] args = new String[] {}; + HddsDatanodeService hddsServiceSpy = + Mockito.spy(HddsDatanodeService.createHddsDatanodeService(args)); + hddsServiceSpy.setConfiguration(conf); + + DatanodeDetails.Builder builder = DatanodeDetails.newBuilder(); + builder.setUuid(UUID.randomUUID().toString()); + DatanodeDetails datanodeDetails = builder.build(); + Mockito.doReturn(datanodeDetails).when(hddsServiceSpy).getDatanodeDetails(); + + ozoneHddsService.start(hddsServiceSpy); + + assertNotNull(ozoneHddsService.getHandler()); + assertNotNull(ozoneHddsService.getObjectStoreRestHttpServer()); + + ozoneHddsService.close(); + } + + @Test + public void testStartupFail() throws IOException { + OzoneHddsDatanodeService ozoneHddsService = new OzoneHddsDatanodeService(); + Service mockService = mock(Service.class); + ozoneHddsService.start(mockService); + + assertNull(ozoneHddsService.getHandler()); + assertNull(ozoneHddsService.getObjectStoreRestHttpServer()); + + ozoneHddsService.close(); + } +}