/** * 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()); } }