/**
* 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.hbase.zookeeper;
import java.io.IOException;
import java.util.Properties;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HConstants;
import org.apache.hadoop.hbase.testclassification.MiscTests;
import org.apache.hadoop.hbase.testclassification.SmallTests;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
@Category({MiscTests.class, SmallTests.class})
public class TestZKConfig {
@Test
public void testZKConfigLoading() throws Exception {
Configuration conf = HBaseConfiguration.create();
// Test that we read only from the config instance
// (i.e. via hbase-default.xml and hbase-site.xml)
conf.setInt(HConstants.ZOOKEEPER_CLIENT_PORT, 2181);
Properties props = ZKConfig.makeZKProps(conf);
assertEquals("Property client port should have been default from the HBase config",
"2181",
props.getProperty("clientPort"));
}
@Test
public void testGetZooKeeperClusterKey() {
Configuration conf = HBaseConfiguration.create();
conf.set(HConstants.ZOOKEEPER_QUORUM, "\tlocalhost\n");
conf.set(HConstants.ZOOKEEPER_CLIENT_PORT, "3333");
conf.set(HConstants.ZOOKEEPER_ZNODE_PARENT, "hbase");
String clusterKey = ZKConfig.getZooKeeperClusterKey(conf, "test");
assertTrue(!clusterKey.contains("\t") && !clusterKey.contains("\n"));
assertEquals("localhost:3333:hbase,test", clusterKey);
}
@Test
public void testClusterKey() throws Exception {
testKey("server", 2181, "/hbase");
testKey("server1,server2,server3", 2181, "/hbase");
try {
ZKConfig.validateClusterKey("2181:/hbase");
} catch (IOException ex) {
// OK
}
}
@Test
public void testClusterKeyWithMultiplePorts() throws Exception {
// server has different port than the default port
testKey("server1:2182", 2181, "/hbase", true);
// multiple servers have their own port
testKey("server1:2182,server2:2183,server3:2184", 2181, "/hbase", true);
// one server has no specified port, should use default port
testKey("server1:2182,server2,server3:2184", 2181, "/hbase", true);
// the last server has no specified port, should use default port
testKey("server1:2182,server2:2183,server3", 2181, "/hbase", true);
// multiple servers have no specified port, should use default port for those servers
testKey("server1:2182,server2,server3:2184,server4", 2181, "/hbase", true);
// same server, different ports
testKey("server1:2182,server1:2183,server1", 2181, "/hbase", true);
// mix of same server/different port and different server
testKey("server1:2182,server2:2183,server1", 2181, "/hbase", true);
}
private void testKey(String ensemble, int port, String znode)
throws IOException {
testKey(ensemble, port, znode, false); // not support multiple client ports
}
private void testKey(String ensemble, int port, String znode, Boolean multiplePortSupport)
throws IOException {
Configuration conf = new Configuration();
String key = ensemble+":"+port+":"+znode;
String ensemble2 = null;
ZKConfig.ZKClusterKey zkClusterKey = ZKConfig.transformClusterKey(key);
if (multiplePortSupport) {
ensemble2 = ZKConfig.standardizeZKQuorumServerString(ensemble,
Integer.toString(port));
assertEquals(ensemble2, zkClusterKey.getQuorumString());
}
else {
assertEquals(ensemble, zkClusterKey.getQuorumString());
}
assertEquals(port, zkClusterKey.getClientPort());
assertEquals(znode, zkClusterKey.getZnodeParent());
conf = HBaseConfiguration.createClusterConf(conf, key);
assertEquals(zkClusterKey.getQuorumString(), conf.get(HConstants.ZOOKEEPER_QUORUM));
assertEquals(zkClusterKey.getClientPort(), conf.getInt(HConstants.ZOOKEEPER_CLIENT_PORT, -1));
assertEquals(zkClusterKey.getZnodeParent(), conf.get(HConstants.ZOOKEEPER_ZNODE_PARENT));
String reconstructedKey = ZKConfig.getZooKeeperClusterKey(conf);
if (multiplePortSupport) {
String key2 = ensemble2 + ":" + port + ":" + znode;
assertEquals(key2, reconstructedKey);
}
else {
assertEquals(key, reconstructedKey);
}
}
}