001/** 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018package org.apache.hadoop.hbase.master; 019 020import java.io.IOException; 021import java.io.StringWriter; 022import java.util.ArrayList; 023import java.util.HashSet; 024import java.util.List; 025import java.util.Set; 026import org.apache.hadoop.conf.Configuration; 027import org.apache.hadoop.hbase.HBaseClassTestRule; 028import org.apache.hadoop.hbase.HBaseConfiguration; 029import org.apache.hadoop.hbase.HRegionInfo; 030import org.apache.hadoop.hbase.HTableDescriptor; 031import org.apache.hadoop.hbase.ServerName; 032import org.apache.hadoop.hbase.TableName; 033import org.apache.hadoop.hbase.client.Admin; 034import org.apache.hadoop.hbase.master.assignment.AssignmentManager; 035import org.apache.hadoop.hbase.master.assignment.RegionStates; 036import org.apache.hadoop.hbase.regionserver.MetricsRegionServer; 037import org.apache.hadoop.hbase.regionserver.MetricsRegionServerWrapperStub; 038import org.apache.hadoop.hbase.testclassification.MasterTests; 039import org.apache.hadoop.hbase.testclassification.MediumTests; 040import org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl; 041import org.apache.hadoop.hbase.util.Bytes; 042import org.apache.hadoop.hbase.zookeeper.MasterAddressTracker; 043import org.apache.hadoop.hbase.zookeeper.ZKWatcher; 044import org.apache.hadoop.hbase.zookeeper.ZNodePaths; 045import org.junit.Before; 046import org.junit.ClassRule; 047import org.junit.Test; 048import org.junit.experimental.categories.Category; 049import org.mockito.Mockito; 050 051import org.apache.hbase.thirdparty.com.google.common.collect.Lists; 052 053/** 054 * Tests for the master status page and its template. 055 */ 056@Category({MasterTests.class,MediumTests.class}) 057public class TestMasterStatusServlet { 058 059 @ClassRule 060 public static final HBaseClassTestRule CLASS_RULE = 061 HBaseClassTestRule.forClass(TestMasterStatusServlet.class); 062 063 private HMaster master; 064 private Configuration conf; 065 private Admin admin; 066 067 static final ServerName FAKE_HOST = 068 ServerName.valueOf("fakehost", 12345, 1234567890); 069 static final HTableDescriptor FAKE_TABLE = 070 new HTableDescriptor(TableName.valueOf("mytable")); 071 static final HRegionInfo FAKE_HRI = 072 new HRegionInfo(FAKE_TABLE.getTableName(), 073 Bytes.toBytes("a"), Bytes.toBytes("b")); 074 075 @Before 076 public void setupBasicMocks() { 077 conf = HBaseConfiguration.create(); 078 079 master = Mockito.mock(HMaster.class); 080 Mockito.doReturn(FAKE_HOST).when(master).getServerName(); 081 Mockito.doReturn(conf).when(master).getConfiguration(); 082 083 //Fake DeadServer 084 DeadServer deadServer = Mockito.mock(DeadServer.class); 085 // Fake serverManager 086 ServerManager serverManager = Mockito.mock(ServerManager.class); 087 Mockito.doReturn(1.0).when(serverManager).getAverageLoad(); 088 Mockito.doReturn(serverManager).when(master).getServerManager(); 089 Mockito.doReturn(deadServer).when(serverManager).getDeadServers(); 090 091 // Fake AssignmentManager and RIT 092 AssignmentManager am = Mockito.mock(AssignmentManager.class); 093 RegionStates rs = Mockito.mock(RegionStates.class); 094 List<RegionState> regionsInTransition = new ArrayList<>(); 095 regionsInTransition.add(new RegionState(FAKE_HRI, RegionState.State.CLOSING, 12345L, FAKE_HOST)); 096 Mockito.doReturn(rs).when(am).getRegionStates(); 097 Mockito.doReturn(regionsInTransition).when(rs).getRegionsInTransition(); 098 Mockito.doReturn(am).when(master).getAssignmentManager(); 099 Mockito.doReturn(serverManager).when(master).getServerManager(); 100 101 // Fake ZKW 102 ZKWatcher zkw = Mockito.mock(ZKWatcher.class); 103 Mockito.doReturn(new ZNodePaths(conf)).when(zkw).getZNodePaths(); 104 Mockito.doReturn("fakequorum").when(zkw).getQuorum(); 105 Mockito.doReturn(zkw).when(master).getZooKeeper(); 106 107 // Fake MasterAddressTracker 108 MasterAddressTracker tracker = Mockito.mock(MasterAddressTracker.class); 109 Mockito.doReturn(tracker).when(master).getMasterAddressTracker(); 110 Mockito.doReturn(FAKE_HOST).when(tracker).getMasterAddress(); 111 112 MetricsRegionServer rms = Mockito.mock(MetricsRegionServer.class); 113 Mockito.doReturn(new MetricsRegionServerWrapperStub()).when(rms).getRegionServerWrapper(); 114 Mockito.doReturn(rms).when(master).getRegionServerMetrics(); 115 116 // Mock admin 117 admin = Mockito.mock(Admin.class); 118 } 119 120 private void setupMockTables() throws IOException { 121 HTableDescriptor tables[] = new HTableDescriptor[] { 122 new HTableDescriptor(TableName.valueOf("foo")), 123 new HTableDescriptor(TableName.valueOf("bar")) 124 }; 125 Mockito.doReturn(tables).when(admin).listTables(); 126 } 127 128 @Test 129 public void testStatusTemplateNoTables() throws IOException { 130 new MasterStatusTmpl().render(new StringWriter(), master); 131 } 132 133 @Test 134 public void testStatusTemplateMetaAvailable() throws IOException { 135 setupMockTables(); 136 137 new MasterStatusTmpl() 138 .setMetaLocation(ServerName.valueOf("metaserver,123,12345")) 139 .render(new StringWriter(), master); 140 } 141 142 @Test 143 public void testStatusTemplateWithServers() throws IOException { 144 setupMockTables(); 145 146 List<ServerName> servers = Lists.newArrayList( 147 ServerName.valueOf("rootserver,123,12345"), 148 ServerName.valueOf("metaserver,123,12345")); 149 Set<ServerName> deadServers = new HashSet<>( 150 Lists.newArrayList( 151 ServerName.valueOf("badserver,123,12345"), 152 ServerName.valueOf("uglyserver,123,12345")) 153 ); 154 155 new MasterStatusTmpl() 156 .setMetaLocation(ServerName.valueOf("metaserver,123,12345")) 157 .setServers(servers) 158 .setDeadServers(deadServers) 159 .render(new StringWriter(), master); 160 } 161}