blob: 17542f177c1e53fc351feb0c006934c525acc5f5 [file] [log] [blame]
/*
* 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.hive.metastore;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hadoop.hive.conf.HiveConf.ConfVars;
import org.apache.hive.service.server.HiveServer2;
import org.junit.Before;
import org.junit.Test;
public class TestServerSpecificConfig {
private static URL oldDefaultHiveSite = HiveConf.getHiveSiteLocation();
/**
* Verify if appropriate server configuration (metastore, hiveserver2) get
* loaded when the embedded clients are loaded
*
* Checks values used in the configs used for testing.
*
* @throws IOException
* @throws Throwable
*/
@Test
public void testServerConfigsEmbeddedMetastore() throws IOException, Throwable {
// set hive-site.xml to default hive-site.xml that has embedded metastore
HiveConf.setHiveSiteLocation(oldDefaultHiveSite);
HiveConf conf = new HiveConf();
// check config properties expected with embedded metastore client
assertTrue(HiveConf.isLoadMetastoreConfig());
assertEquals("from.hivemetastore-site.xml",
conf.get("hive.dummyparam.test.server.specific.config.override"));
assertEquals("from.hivemetastore-site.xml",
conf.get("hive.dummyparam.test.server.specific.config.metastoresite"));
assertEquals("from.hive-site.xml",
conf.get("hive.dummyparam.test.server.specific.config.hivesite"));
// verify that hiveserver2 config is not loaded
assertFalse(HiveConf.isLoadHiveServer2Config());
assertNull(conf.get("hive.dummyparam.test.server.specific.config.hiveserver2site"));
// check if hiveserver2 config gets loaded when HS2 is started
new HiveServer2();
conf = new HiveConf();
verifyHS2ConfParams(conf);
assertEquals("from.hivemetastore-site.xml",
conf.get("hive.dummyparam.test.server.specific.config.metastoresite"));
}
private void verifyHS2ConfParams(HiveConf conf) {
assertTrue(HiveConf.isLoadHiveServer2Config());
assertEquals("from.hiveserver2-site.xml",
conf.get("hive.dummyparam.test.server.specific.config.override"));
assertEquals("from.hiveserver2-site.xml",
conf.get("hive.dummyparam.test.server.specific.config.hiveserver2site"));
assertEquals("from.hive-site.xml",
conf.get("hive.dummyparam.test.server.specific.config.hivesite"));
}
/**
* Ensure that system properties still get precedence. Config params set as
* -hiveconf on commandline get set as system properties They should have the
* final say
*/
@Test
public void testSystemPropertyPrecedence() {
// Using property defined in HiveConf.ConfVars to test System property
// overriding
final String OVERRIDE_KEY = "hive.conf.restricted.list";
try {
HiveConf.setHiveSiteLocation(oldDefaultHiveSite);
System.setProperty(OVERRIDE_KEY, "from.sysprop");
HiveConf conf = new HiveConf();
// ensure metatore site.xml does not get to override this
assertEquals("from.sysprop", conf.get(OVERRIDE_KEY));
// get HS2 site.xml loaded
new HiveServer2();
conf = new HiveConf();
assertTrue(HiveConf.isLoadHiveServer2Config());
// ensure hiveserver2 site.xml does not get to override this
assertEquals("from.sysprop", conf.get(OVERRIDE_KEY));
} finally {
System.getProperties().remove(OVERRIDE_KEY);
}
}
@Before
public void resetDefaults() throws SecurityException, IllegalArgumentException,
NoSuchFieldException, IllegalAccessException {
// re-set the static variables in HiveConf to default values
// set load server conf booleans to false
HiveConf.setLoadMetastoreConfig(false);
HiveConf.setLoadHiveServer2Config(false);
}
/**
* Test to ensure that HiveConf does not try to load hivemetastore-site.xml,
* when remote metastore is used.
*
* @throws IOException
* @throws Throwable
*/
@Test
public void testHiveMetastoreRemoteConfig() throws IOException, Throwable {
// switch to hive-site.xml with remote metastore
setHiveSiteWithRemoteMetastore();
// Set HiveConf statics to default values
resetDefaults();
// create hiveconf again to run initialization code, to see if value changes
HiveConf conf = new HiveConf();
// check the properties expected in hive client without metastore
verifyMetastoreConfNotLoaded(conf);
assertEquals("from.hive-site.xml",
conf.get("hive.dummyparam.test.server.specific.config.override"));
// get HS2 site.xml loaded
new HiveServer2();
conf = new HiveConf();
verifyHS2ConfParams(conf);
verifyMetastoreConfNotLoaded(conf);
}
private void verifyMetastoreConfNotLoaded(HiveConf conf) {
assertFalse(HiveConf.isLoadMetastoreConfig());
assertNull(conf.get("hive.dummyparam.test.server.specific.config.metastoresite"));
}
/**
* Set new hive-site.xml file location that has remote metastore config
*
* @throws IOException
*/
private void setHiveSiteWithRemoteMetastore() throws IOException {
// new *hive-site.xml file
String newConfFile = System.getProperty("test.tmp.dir") + File.separator
+ this.getClass().getSimpleName() + "hive-site.xml";
// create a new conf file, using contents from current one
// modifying the meastore.uri property
File hiveSite = new File(newConfFile);
FileOutputStream out = new FileOutputStream(hiveSite);
HiveConf.setHiveSiteLocation(oldDefaultHiveSite);
HiveConf defaultHiveConf = new HiveConf();
defaultHiveConf.setVar(ConfVars.METASTOREURIS, "dummyvalue");
// reset to the hive-site.xml values for following param
defaultHiveConf.set("hive.dummyparam.test.server.specific.config.override",
"from.hive-site.xml");
defaultHiveConf.unset("hive.dummyparam.test.server.specific.config.metastoresite");
defaultHiveConf.writeXml(out);
// set the new hive-site.xml
HiveConf.setHiveSiteLocation(hiveSite.toURI().toURL());
}
}