1   /*
2    * Copyright 2010 The Apache Software Foundation
3    *
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *     http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing, software
15   * distributed under the License is distributed on an "AS IS" BASIS,
16   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17   * See the License for the specific language governing permissions and
18   * limitations under the License.
19   */
20  
21  package org.apache.hadoop.hbase.rest.model;
22  
23  import java.io.IOException;
24  import java.io.StringReader;
25  import java.io.StringWriter;
26  import java.util.Iterator;
27  
28  import javax.xml.bind.JAXBContext;
29  import javax.xml.bind.JAXBException;
30  
31  import org.apache.hadoop.hbase.SmallTests;
32  import org.apache.hadoop.hbase.util.Base64;
33  import org.apache.hadoop.hbase.util.Bytes;
34  
35  import junit.framework.TestCase;
36  import org.junit.experimental.categories.Category;
37  
38  @Category(SmallTests.class)
39  public class TestStorageClusterStatusModel extends TestCase {
40  
41    private static final String AS_XML =
42      "<ClusterStatus requests=\"0\" regions=\"2\" averageLoad=\"1.0\">" +
43      "<DeadNodes/>" + 
44      "<LiveNodes><Node startCode=\"1245219839331\" requests=\"0\"" + 
45        " name=\"test1\" maxHeapSizeMB=\"1024\" heapSizeMB=\"128\">" + 
46          "<Region stores=\"1\" storefiles=\"1\" storefileSizeMB=\"0\"" + 
47          " storefileIndexSizeMB=\"0\" name=\"LVJPT1QtLCww\"" + 
48          " memstoreSizeMB=\"0\" readRequestsCount=\"1\"" +
49          " writeRequestsCount=\"2\" rootIndexSizeKB=\"1\"" +
50          " totalStaticIndexSizeKB=\"1\" totalStaticBloomSizeKB=\"1\"" +
51          " totalCompactingKVs=\"1\" currentCompactedKVs=\"1\"/></Node>" + 
52        "<Node startCode=\"1245239331198\" requests=\"0\" name=\"test2\"" + 
53          " maxHeapSizeMB=\"1024\" heapSizeMB=\"512\">" + 
54          "<Region stores=\"1\" storefiles=\"1\" storefileSizeMB=\"0\"" +
55          " storefileIndexSizeMB=\"0\" name=\"Lk1FVEEuLCwxMjQ2MDAwMDQzNzI0\"" +
56          " memstoreSizeMB=\"0\" readRequestsCount=\"1\"" +
57          " writeRequestsCount=\"2\" rootIndexSizeKB=\"1\"" +
58          " totalStaticIndexSizeKB=\"1\" totalStaticBloomSizeKB=\"1\"" +
59          " totalCompactingKVs=\"1\" currentCompactedKVs=\"1\"/></Node>"+
60      "</LiveNodes></ClusterStatus>";
61  
62    private static final String AS_PB =
63    "CjsKBXRlc3QxEOO6i+eeJBgAIIABKIAIMiMKCS1ST09ULSwsMBABGAEgACgAMAA4AUACSAFQAVgB" +
64    "YAFoAQpHCgV0ZXN0MhD+krHwniQYACCABCiACDIvChUuTUVUQS4sLDEyNDYwMDAwNDM3MjQQARgB" +
65    "IAAoADAAOAFAAkgBUAFYAWABaAEYAiAAKQAAAAAAAPA/";
66    
67    private JAXBContext context;
68  
69    public TestStorageClusterStatusModel() throws JAXBException {
70      super();
71      context = JAXBContext.newInstance(StorageClusterStatusModel.class);
72    }
73  
74    private StorageClusterStatusModel buildTestModel() {
75      StorageClusterStatusModel model = new StorageClusterStatusModel();
76      model.setRegions(2);
77      model.setRequests(0);
78      model.setAverageLoad(1.0);
79      model.addLiveNode("test1", 1245219839331L, 128, 1024)
80        .addRegion(Bytes.toBytes("-ROOT-,,0"), 1, 1, 0, 0, 0, 1, 2, 1, 1, 1, 1, 1);
81      model.addLiveNode("test2", 1245239331198L, 512, 1024)
82        .addRegion(Bytes.toBytes(".META.,,1246000043724"),1, 1, 0, 0, 0,
83            1, 2, 1, 1, 1, 1, 1);
84      return model;
85    }
86  
87    @SuppressWarnings("unused")
88    private String toXML(StorageClusterStatusModel model) throws JAXBException {
89      StringWriter writer = new StringWriter();
90      context.createMarshaller().marshal(model, writer);
91      return writer.toString();
92    }
93  
94    private StorageClusterStatusModel fromXML(String xml) throws JAXBException {
95      return (StorageClusterStatusModel)
96        context.createUnmarshaller().unmarshal(new StringReader(xml));
97    }
98  
99    @SuppressWarnings("unused")
100   private byte[] toPB(StorageClusterStatusModel model) {
101     return model.createProtobufOutput();
102   }
103 
104   private StorageClusterStatusModel fromPB(String pb) throws IOException {
105     return (StorageClusterStatusModel) 
106       new StorageClusterStatusModel().getObjectFromMessage(Base64.decode(AS_PB));
107   }
108 
109   private void checkModel(StorageClusterStatusModel model) {
110     assertEquals(model.getRegions(), 2);
111     assertEquals(model.getRequests(), 0);
112     assertEquals(model.getAverageLoad(), 1.0);
113     Iterator<StorageClusterStatusModel.Node> nodes =
114       model.getLiveNodes().iterator();
115     StorageClusterStatusModel.Node node = nodes.next();
116     assertEquals(node.getName(), "test1");
117     assertEquals(node.getStartCode(), 1245219839331L);
118     assertEquals(node.getHeapSizeMB(), 128);
119     assertEquals(node.getMaxHeapSizeMB(), 1024);
120     Iterator<StorageClusterStatusModel.Node.Region> regions = 
121       node.getRegions().iterator();
122     StorageClusterStatusModel.Node.Region region = regions.next();
123     assertTrue(Bytes.toString(region.getName()).equals("-ROOT-,,0"));
124     assertEquals(region.getStores(), 1);
125     assertEquals(region.getStorefiles(), 1);
126     assertEquals(region.getStorefileSizeMB(), 0);
127     assertEquals(region.getMemstoreSizeMB(), 0);
128     assertEquals(region.getStorefileIndexSizeMB(), 0);
129     assertEquals(region.getReadRequestsCount(), 1);
130     assertEquals(region.getWriteRequestsCount(), 2);
131     assertEquals(region.getRootIndexSizeKB(), 1);
132     assertEquals(region.getTotalStaticIndexSizeKB(), 1);
133     assertEquals(region.getTotalStaticBloomSizeKB(), 1);
134     assertEquals(region.getTotalCompactingKVs(), 1);
135     assertEquals(region.getCurrentCompactedKVs(), 1);
136     assertFalse(regions.hasNext());
137     node = nodes.next();
138     assertEquals(node.getName(), "test2");
139     assertEquals(node.getStartCode(), 1245239331198L);
140     assertEquals(node.getHeapSizeMB(), 512);
141     assertEquals(node.getMaxHeapSizeMB(), 1024);
142     regions = node.getRegions().iterator();
143     region = regions.next();
144     assertEquals(Bytes.toString(region.getName()), ".META.,,1246000043724");
145     assertEquals(region.getStores(), 1);
146     assertEquals(region.getStorefiles(), 1);
147     assertEquals(region.getStorefileSizeMB(), 0);
148     assertEquals(region.getMemstoreSizeMB(), 0);
149     assertEquals(region.getStorefileIndexSizeMB(), 0);
150     assertEquals(region.getReadRequestsCount(), 1);
151     assertEquals(region.getWriteRequestsCount(), 2);
152     assertEquals(region.getRootIndexSizeKB(), 1);
153     assertEquals(region.getTotalStaticIndexSizeKB(), 1);
154     assertEquals(region.getTotalStaticBloomSizeKB(), 1);
155     assertEquals(region.getTotalCompactingKVs(), 1);
156     assertEquals(region.getCurrentCompactedKVs(), 1);
157     
158     assertFalse(regions.hasNext());
159     assertFalse(nodes.hasNext());
160   }
161 
162   public void testBuildModel() throws Exception {
163     checkModel(buildTestModel());
164   }
165 
166   public void testFromXML() throws Exception {
167     checkModel(fromXML(AS_XML));
168   }
169 
170   public void testFromPB() throws Exception {
171     checkModel(fromPB(AS_PB));
172   }
173 
174   @org.junit.Rule
175   public org.apache.hadoop.hbase.ResourceCheckerJUnitRule cu =
176     new org.apache.hadoop.hbase.ResourceCheckerJUnitRule();
177 }
178