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.rest.model;
019
020import static org.junit.jupiter.api.Assertions.assertEquals;
021import static org.junit.jupiter.api.Assertions.assertFalse;
022
023import java.util.Iterator;
024import org.apache.hadoop.hbase.TableName;
025import org.apache.hadoop.hbase.testclassification.RestTests;
026import org.apache.hadoop.hbase.testclassification.SmallTests;
027import org.apache.hadoop.hbase.util.Bytes;
028import org.junit.jupiter.api.Tag;
029
030@Tag(RestTests.TAG)
031@Tag(SmallTests.TAG)
032public class TestStorageClusterStatusModel extends TestModelBase<StorageClusterStatusModel> {
033
034  public TestStorageClusterStatusModel() throws Exception {
035    super(StorageClusterStatusModel.class);
036
037    AS_XML = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"
038      + "<ClusterStatus averageLoad=\"1.0\" regions=\"2\" requests=\"0\">"
039      + "<DeadNodes/><LiveNodes>"
040      + "<Node heapSizeMB=\"128\" maxHeapSizeMB=\"1024\" name=\"test1\" requests=\"0\" "
041      + "startCode=\"1245219839331\"><Region currentCompactedKVs=\"1\" memstoreSizeMB=\"0\" "
042      + "name=\"aGJhc2U6cm9vdCwsMA==\" readRequestsCount=\"1\" rootIndexSizeKB=\"1\" "
043      + "storefileIndexSizeKB=\"0\" storefileSizeMB=\"0\" storefiles=\"1\" stores=\"1\" "
044      + "totalCompactingKVs=\"1\" totalStaticBloomSizeKB=\"1\" totalStaticIndexSizeKB=\"1\" "
045      + "writeRequestsCount=\"2\"/></Node>"
046      + "<Node heapSizeMB=\"512\" maxHeapSizeMB=\"1024\" name=\"test2\" requests=\"0\" "
047      + "startCode=\"1245239331198\">" + "<Region currentCompactedKVs=\"1\" memstoreSizeMB=\"0\" "
048      + "name=\"aGJhc2U6bWV0YSwsMTI0NjAwMDA0MzcyNA==\" readRequestsCount=\"1\" "
049      + "rootIndexSizeKB=\"1\" storefileIndexSizeKB=\"0\" storefileSizeMB=\"0\" "
050      + "storefiles=\"1\" stores=\"1\" totalCompactingKVs=\"1\" totalStaticBloomSizeKB=\"1\" "
051      + "totalStaticIndexSizeKB=\"1\" writeRequestsCount=\"2\"/></Node></LiveNodes>"
052      + "</ClusterStatus>";
053
054    AS_PB = "Cj8KBXRlc3QxEOO6i+eeJBgAIIABKIAIMicKDWhiYXNlOnJvb3QsLDAQARgBIAAoADAAOAFAAkgB"
055      + "UAFYAWABaAEKSwoFdGVzdDIQ/pKx8J4kGAAggAQogAgyMwoZaGJhc2U6bWV0YSwsMTI0NjAwMDA0"
056      + "MzcyNBABGAEgACgAMAA4AUACSAFQAVgBYAFoARgCIAApAAAAAAAA8D8=";
057
058    // Using jackson will break json backward compatibilty for this representation
059    // but the original one was broken as it would only print one Node element
060    // so the format itself was broken
061    AS_JSON =
062      "{\"regions\":2,\"requests\":0,\"averageLoad\":1.0,\"LiveNodes\":[{\"name\":\"test1\","
063        + "\"Region\":[{\"name\":\"aGJhc2U6cm9vdCwsMA==\",\"stores\":1,\"storefiles\":1,"
064        + "\"storefileSizeMB\":0,\"memStoreSizeMB\":0,\"storefileIndexSizeKB\":0,"
065        + "\"readRequestsCount\":1,\"cpRequestsCount\":1,\"writeRequestsCount\":2,"
066        + "\"rootIndexSizeKB\":1,\"totalStaticIndexSizeKB\":1,\"totalStaticBloomSizeKB\":1,"
067        + "\"totalCompactingKVs\":1,\"currentCompactedKVs\":1}],\"requests\":0,"
068        + "\"startCode\":1245219839331,\"heapSizeMB\":128,\"maxHeapSizeMB\":1024},"
069        + "{\"name\":\"test2\",\"Region\":[{\"name\":\"aGJhc2U6bWV0YSwsMTI0NjAwMDA0MzcyNA==\","
070        + "\"stores\":1,\"storefiles\":1,\"storefileSizeMB\":0,\"memStoreSizeMB\":0,"
071        + "\"storefileIndexSizeKB\":0,\"readRequestsCount\":1,\"cpRequestsCount\":1,"
072        + "\"writeRequestsCount\":2,\"rootIndexSizeKB\":1,\"totalStaticIndexSizeKB\":1,"
073        + "\"totalStaticBloomSizeKB\":1,\"totalCompactingKVs\":1,\"currentCompactedKVs\":1}],"
074        + "\"requests\":0,\"startCode\":1245239331198,\"heapSizeMB\":512,"
075        + "\"maxHeapSizeMB\":1024}],\"DeadNodes\":[]}";
076  }
077
078  @Override
079  protected StorageClusterStatusModel buildTestModel() {
080    StorageClusterStatusModel model = new StorageClusterStatusModel();
081    model.setRegions(2);
082    model.setRequests(0);
083    model.setAverageLoad(1.0);
084    model.addLiveNode("test1", 1245219839331L, 128, 1024).addRegion(Bytes.toBytes("hbase:root,,0"),
085      1, 1, 0, 0, 0, 1, 1, 2, 1, 1, 1, 1, 1);
086    model.addLiveNode("test2", 1245239331198L, 512, 1024).addRegion(
087      Bytes.toBytes(TableName.META_TABLE_NAME + ",,1246000043724"), 1, 1, 0, 0, 0, 1, 1, 2, 1, 1, 1,
088      1, 1);
089    return model;
090  }
091
092  @Override
093  protected void checkModel(StorageClusterStatusModel model) {
094    assertEquals(2, model.getRegions());
095    assertEquals(0, model.getRequests());
096    assertEquals(1.0, model.getAverageLoad(), 0.0);
097    Iterator<StorageClusterStatusModel.Node> nodes = model.getLiveNodes().iterator();
098    StorageClusterStatusModel.Node node = nodes.next();
099    assertEquals("test1", node.getName());
100    assertEquals(1245219839331L, node.getStartCode());
101    assertEquals(128, node.getHeapSizeMB());
102    assertEquals(1024, node.getMaxHeapSizeMB());
103    Iterator<StorageClusterStatusModel.Node.Region> regions = node.getRegions().iterator();
104    StorageClusterStatusModel.Node.Region region = regions.next();
105    assertEquals("hbase:root,,0", Bytes.toString(region.getName()));
106    assertEquals(1, region.getStores());
107    assertEquals(1, region.getStorefiles());
108    assertEquals(0, region.getStorefileSizeMB());
109    assertEquals(0, region.getMemStoreSizeMB());
110    assertEquals(0, region.getStorefileIndexSizeKB());
111    assertEquals(1, region.getReadRequestsCount());
112    assertEquals(2, region.getWriteRequestsCount());
113    assertEquals(1, region.getRootIndexSizeKB());
114    assertEquals(1, region.getTotalStaticIndexSizeKB());
115    assertEquals(1, region.getTotalStaticBloomSizeKB());
116    assertEquals(1, region.getTotalCompactingKVs());
117    assertEquals(1, region.getCurrentCompactedKVs());
118    assertFalse(regions.hasNext());
119    node = nodes.next();
120    assertEquals("test2", node.getName());
121    assertEquals(1245239331198L, node.getStartCode());
122    assertEquals(512, node.getHeapSizeMB());
123    assertEquals(1024, node.getMaxHeapSizeMB());
124    regions = node.getRegions().iterator();
125    region = regions.next();
126    assertEquals(TableName.META_TABLE_NAME + ",,1246000043724", Bytes.toString(region.getName()));
127    assertEquals(1, region.getStores());
128    assertEquals(1, region.getStorefiles());
129    assertEquals(0, region.getStorefileSizeMB());
130    assertEquals(0, region.getMemStoreSizeMB());
131    assertEquals(0, region.getStorefileIndexSizeKB());
132    assertEquals(1, region.getReadRequestsCount());
133    assertEquals(2, region.getWriteRequestsCount());
134    assertEquals(1, region.getRootIndexSizeKB());
135    assertEquals(1, region.getTotalStaticIndexSizeKB());
136    assertEquals(1, region.getTotalStaticBloomSizeKB());
137    assertEquals(1, region.getTotalCompactingKVs());
138    assertEquals(1, region.getCurrentCompactedKVs());
139
140    assertFalse(regions.hasNext());
141    assertFalse(nodes.hasNext());
142  }
143}