You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by li...@apache.org on 2016/08/17 06:08:06 UTC

[2/2] kylin git commit: KYLIN-1962 Split configuration into normal and account two files

KYLIN-1962 Split configuration into normal and account two files

Signed-off-by: Li Yang <li...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/kylin/repo
Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/d6745eaf
Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/d6745eaf
Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/d6745eaf

Branch: refs/heads/master
Commit: d6745eafefc102f7a52742c0189c5b61c2a5e436
Parents: 83419cf
Author: Yiming Liu <li...@gmail.com>
Authored: Sun Jul 31 11:24:16 2016 +0800
Committer: Li Yang <li...@apache.org>
Committed: Wed Aug 17 14:07:51 2016 +0800

----------------------------------------------------------------------
 build/conf/kylin.properties                     |  51 +-------
 build/conf/kylin_account.properties             |  50 +++++++
 .../org/apache/kylin/common/KylinConfig.java    | 130 +++++++++++--------
 .../apache/kylin/common/KylinConfigBase.java    |  14 +-
 .../apache/kylin/common/KylinConfigTest.java    |  12 ++
 .../test_case_data/localmeta/kylin.properties   |   3 +
 .../localmeta/kylin_account.properties          |  50 +++++++
 .../security/PasswordPlaceholderConfigurer.java |  16 ++-
 .../PasswordPlaceHolderConfigurerTest.java      |  16 +++
 .../kylin/rest/service/CacheServiceTest.java    |   2 +-
 .../coprocessor/endpoint/CubeVisitService.java  |   8 +-
 11 files changed, 234 insertions(+), 118 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/d6745eaf/build/conf/kylin.properties
----------------------------------------------------------------------
diff --git a/build/conf/kylin.properties b/build/conf/kylin.properties
index 0139a6b..9cc0ec1 100644
--- a/build/conf/kylin.properties
+++ b/build/conf/kylin.properties
@@ -28,7 +28,7 @@ kylin.owner=whoami@kylin.apache.org
 kylin.rest.servers=localhost:7070
 
 # Display timezone on UI,format like[GMT+N or GMT-N]
-kylin.rest.timezone=GMT-8
+kylin.rest.timezone=GMT+8
 
 ### SOURCE ###
 
@@ -87,12 +87,6 @@ kylin.job.remote.cli.hostname=
 
 kylin.job.remote.cli.port=22
 
-# Only necessary when kylin.job.run.as.remote.cmd=true
-kylin.job.remote.cli.username=
-
-# Only necessary when kylin.job.run.as.remote.cmd=true
-kylin.job.remote.cli.password=
-
 # Used by test cases to prepare synthetic data for sample cube
 kylin.job.remote.cli.working.dir=/tmp/kylin
 
@@ -146,49 +140,6 @@ kylin.query.security.enabled=true
 
 kylin.query.cache.enabled=true
 
-### SECURITY ###
-
-# Spring security profile, options: testing, ldap, saml
-# with "testing" profile, user can use pre-defined name/pwd like KYLIN/ADMIN to login
-kylin.security.profile=testing
-
-# Default roles and admin roles in LDAP, for ldap and saml
-acl.defaultRole=ROLE_ANALYST,ROLE_MODELER
-acl.adminRole=ROLE_ADMIN
-
-# LDAP authentication configuration
-ldap.server=ldap://ldap_server:389
-ldap.username=
-ldap.password=
-
-# LDAP user account directory; 
-ldap.user.searchBase=
-ldap.user.searchPattern=
-ldap.user.groupSearchBase=
-
-# LDAP service account directory
-ldap.service.searchBase=
-ldap.service.searchPattern=
-ldap.service.groupSearchBase=
-
-# SAML configurations for SSO
-# SAML IDP metadata file location
-saml.metadata.file=classpath:sso_metadata.xml
-saml.metadata.entityBaseURL=https://hostname/kylin
-saml.context.scheme=https
-saml.context.serverName=hostname
-saml.context.serverPort=443
-saml.context.contextPath=/kylin
-
-### MAIL ###
-
-# If true, will send email notification;
-mail.enabled=false
-mail.host=
-mail.username=
-mail.password=
-mail.sender=
-
 ### WEB ###
 
 # Help info, format{name|displayName|link}, optional

http://git-wip-us.apache.org/repos/asf/kylin/blob/d6745eaf/build/conf/kylin_account.properties
----------------------------------------------------------------------
diff --git a/build/conf/kylin_account.properties b/build/conf/kylin_account.properties
new file mode 100644
index 0000000..39efd89
--- /dev/null
+++ b/build/conf/kylin_account.properties
@@ -0,0 +1,50 @@
+### JOB ###
+
+# Only necessary when kylin.job.run.as.remote.cmd=true
+kylin.job.remote.cli.username=
+
+# Only necessary when kylin.job.run.as.remote.cmd=true
+kylin.job.remote.cli.password=
+
+### SECURITY ###
+
+# Spring security profile, options: testing, ldap, saml
+# with "testing" profile, user can use pre-defined name/pwd like KYLIN/ADMIN to login
+kylin.security.profile=testing
+
+# Default roles and admin roles in LDAP, for ldap and saml
+acl.defaultRole=ROLE_ANALYST,ROLE_MODELER
+acl.adminRole=ROLE_ADMIN
+
+# LDAP authentication configuration
+ldap.server=ldap://ldap_server:389
+ldap.username=
+ldap.password=
+
+# LDAP user account directory;
+ldap.user.searchBase=
+ldap.user.searchPattern=
+ldap.user.groupSearchBase=
+
+# LDAP service account directory
+ldap.service.searchBase=
+ldap.service.searchPattern=
+ldap.service.groupSearchBase=
+
+# SAML configurations for SSO
+# SAML IDP metadata file location
+saml.metadata.file=classpath:sso_metadata.xml
+saml.metadata.entityBaseURL=https://hostname/kylin
+saml.context.scheme=https
+saml.context.serverName=hostname
+saml.context.serverPort=443
+saml.context.contextPath=/kylin
+
+### MAIL ###
+
+# If true, will send email notification;
+mail.enabled=false
+mail.host=
+mail.username=
+mail.password=
+mail.sender=
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/kylin/blob/d6745eaf/core-common/src/main/java/org/apache/kylin/common/KylinConfig.java
----------------------------------------------------------------------
diff --git a/core-common/src/main/java/org/apache/kylin/common/KylinConfig.java b/core-common/src/main/java/org/apache/kylin/common/KylinConfig.java
index f650cd2..20ff8e4 100644
--- a/core-common/src/main/java/org/apache/kylin/common/KylinConfig.java
+++ b/core-common/src/main/java/org/apache/kylin/common/KylinConfig.java
@@ -18,16 +18,11 @@
 
 package org.apache.kylin.common;
 
-import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.InputStreamReader;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.nio.charset.Charset;
@@ -55,6 +50,7 @@ public class KylinConfig extends KylinConfigBase {
 
     /** Kylin properties file name */
     public static final String KYLIN_CONF_PROPERTIES_FILE = "kylin.properties";
+    public static final String KYLIN_SECURITY_CONF_PROPERTIES_FILE = "kylin_account.properties";
     public static final String KYLIN_CONF = "KYLIN_CONF";
 
     // static cached instances
@@ -134,8 +130,10 @@ public class KylinConfig extends KylinConfigBase {
             try {
                 config = new KylinConfig();
                 InputStream is = new FileInputStream(uri);
-                config.reloadKylinConfig(is);
-                is.close();
+                Properties prop = new Properties();
+                prop.load(is);
+                IOUtils.closeQuietly(is);
+                config.reloadKylinConfig(prop);
             } catch (IOException e) {
                 throw new RuntimeException(e);
             }
@@ -146,8 +144,10 @@ public class KylinConfig extends KylinConfigBase {
                 RestClient client = new RestClient(uri);
                 String propertyText = client.getKylinProperties();
                 InputStream is = IOUtils.toInputStream(propertyText, Charset.defaultCharset());
-                config.reloadKylinConfig(is);
-                is.close();
+                Properties prop = new Properties();
+                prop.load(is);
+                IOUtils.closeQuietly(is);
+                config.reloadKylinConfig(prop);
                 return config;
             } catch (IOException e) {
                 throw new RuntimeException(e);
@@ -155,11 +155,12 @@ public class KylinConfig extends KylinConfigBase {
         }
     }
 
-    public static void setKylinConfigFromInputStream(InputStream is) {
+    public static void setKylinConfig(Properties prop) {
         synchronized (KylinConfig.class) {
             if (ENV_INSTANCE == null) {
                 try {
-                    KylinConfig config = createKylinConfigFromInputStream(is);
+                    KylinConfig config = new KylinConfig();
+                    config.reloadKylinConfig(prop);
                     logger.info("Resetting ENV_INSTANCE by a input stream: " + System.identityHashCode(config));
                     ENV_INSTANCE = config;
                 } catch (IllegalArgumentException e) {
@@ -169,10 +170,10 @@ public class KylinConfig extends KylinConfigBase {
         }
     }
 
-    public static KylinConfig createKylinConfigFromInputStream(InputStream is) {
-        KylinConfig config = new KylinConfig();
-        config.reloadKylinConfig(is);
-        return config;
+    public static KylinConfig createKylinConfig(Properties prop) {
+        KylinConfig kylinConfig = new KylinConfig();
+        kylinConfig.reloadKylinConfig(prop);
+        return kylinConfig;
     }
 
     static File getKylinPropertiesFile() {
@@ -190,48 +191,69 @@ public class KylinConfig extends KylinConfigBase {
 
         String path = kylinHome + File.separator + "conf";
         return getKylinPropertiesFile(path);
+    }
+
+    static File getKylinSecurityPropertiesFile() {
+        String kylinConfHome = System.getProperty(KYLIN_CONF);
+        if (!StringUtils.isEmpty(kylinConfHome)) {
+            logger.info("Use KYLIN_CONF=" + kylinConfHome);
+            return getKylinSecurityPropertiesFile(kylinConfHome);
+        }
+
+        logger.warn("KYLIN_CONF property was not set, will seek KYLIN_HOME env variable");
+
+        String kylinHome = getKylinHome();
+        if (StringUtils.isEmpty(kylinHome))
+            throw new KylinConfigCannotInitException("Didn't find KYLIN_CONF or KYLIN_HOME, please set one of them");
 
+        String path = kylinHome + File.separator + "conf";
+        return getKylinSecurityPropertiesFile(path);
     }
 
-    public static InputStream getKylinPropertiesAsInputStream() {
+    public static Properties getKylinProperties() {
         File propFile = getKylinPropertiesFile();
         if (propFile == null || !propFile.exists()) {
-            logger.error("fail to locate kylin.properties");
-            throw new RuntimeException("fail to locate kylin.properties");
+            logger.error("fail to locate " + KYLIN_CONF_PROPERTIES_FILE);
+            throw new RuntimeException("fail to locate " + KYLIN_CONF_PROPERTIES_FILE);
         }
+        Properties conf = new Properties();
+        try {
+            FileInputStream is = new FileInputStream(propFile);
+            conf.load(is);
+            IOUtils.closeQuietly(is);
+
+            File propOverrideFile = new File(propFile.getParentFile(), propFile.getName() + ".override");
+            if (propOverrideFile.exists()) {
+                FileInputStream ois = new FileInputStream(propOverrideFile);
+                Properties propOverride = new Properties();
+                propOverride.load(ois);
+                IOUtils.closeQuietly(ois);
+                conf.putAll(propOverride);
+            }
 
-        File overrideFile = new File(propFile.getParentFile(), propFile.getName() + ".override");
-        if (overrideFile.exists()) {
-            FileInputStream fis = null;
-            FileInputStream fis2 = null;
-            try {
-                fis = new FileInputStream(propFile);
-                fis2 = new FileInputStream(overrideFile);
-                Properties conf = new Properties();
-                conf.load(new BufferedReader(new InputStreamReader(fis, "UTF-8")));
-                Properties override = new Properties();
-                override.load(new BufferedReader(new InputStreamReader(fis2, "UTF-8")));
-                for (Map.Entry<Object, Object> entries : override.entrySet()) {
-                    conf.setProperty(entries.getKey().toString(), entries.getValue().toString());
-                }
-                ByteArrayOutputStream bout = new ByteArrayOutputStream();
-                conf.store(bout, "output");
-                return new ByteArrayInputStream(bout.toByteArray());
-            } catch (IOException e) {
-                throw new RuntimeException(e);
-            } finally {
-                IOUtils.closeQuietly(fis);
-                IOUtils.closeQuietly(fis2);
+            File securityPropFile = getKylinSecurityPropertiesFile();
+            if (securityPropFile.exists()) {
+                FileInputStream ois = new FileInputStream(securityPropFile);
+                Properties propSecurity = new Properties();
+                propSecurity.load(ois);
+                IOUtils.closeQuietly(ois);
+                conf.putAll(propSecurity);
             }
-        } else {
-            try {
-                return new FileInputStream(propFile);
-            } catch (FileNotFoundException e) {
-                logger.error("this should not happen");
-                throw new RuntimeException(e);
+
+            File securityPropOverrideFile = new File(securityPropFile.getParentFile(), securityPropFile.getName() + ".override");
+            if (securityPropOverrideFile.exists()) {
+                FileInputStream ois = new FileInputStream(securityPropOverrideFile);
+                Properties propSecurityOverride = new Properties();
+                propSecurityOverride.load(ois);
+                IOUtils.closeQuietly(ois);
+                conf.putAll(propSecurityOverride);
             }
+
+        } catch (IOException e) {
+            throw new RuntimeException(e);
         }
 
+        return conf;
     }
 
     /**
@@ -248,19 +270,23 @@ public class KylinConfig extends KylinConfigBase {
         return new File(path, KYLIN_CONF_PROPERTIES_FILE);
     }
 
+    private static File getKylinSecurityPropertiesFile(String path) {
+        if (path == null) {
+            return null;
+        }
+
+        return new File(path, KYLIN_SECURITY_CONF_PROPERTIES_FILE);
+    }
+
     /**
      * Find config from environment. The Search process: 1. Check the
      * $KYLIN_CONF/kylin.properties 2. Check the $KYLIN_HOME/conf/kylin.properties
      */
     private static KylinConfig loadKylinConfig() {
+        Properties prop = getKylinProperties();
 
-        InputStream is = getKylinPropertiesAsInputStream();
-        if (is == null) {
-            throw new IllegalArgumentException("Failed to load kylin config");
-        }
         KylinConfig config = new KylinConfig();
-        config.reloadKylinConfig(is);
-
+        config.reloadKylinConfig(prop);
         return config;
     }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/d6745eaf/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
----------------------------------------------------------------------
diff --git a/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java b/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
index eb4102a..65a7fb9 100644
--- a/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
+++ b/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
@@ -20,7 +20,6 @@ package org.apache.kylin.common;
 
 import java.io.File;
 import java.io.IOException;
-import java.io.InputStream;
 import java.io.Serializable;
 import java.util.Map;
 import java.util.Properties;
@@ -29,7 +28,6 @@ import java.util.Map.Entry;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.kylin.common.util.CliCommandExecutor;
 import org.slf4j.Logger;
@@ -124,16 +122,8 @@ abstract public class KylinConfigBase implements Serializable {
         properties.setProperty(key, value);
     }
 
-    final protected void reloadKylinConfig(InputStream is) {
-        Properties newProperties = new Properties();
-        try {
-            newProperties.load(is);
-        } catch (IOException e) {
-            throw new RuntimeException("Cannot load kylin config.", e);
-        } finally {
-            IOUtils.closeQuietly(is);
-        }
-        this.properties = newProperties;
+    final protected void reloadKylinConfig(Properties properties) {
+        this.properties = properties;
     }
 
     // ============================================================================

http://git-wip-us.apache.org/repos/asf/kylin/blob/d6745eaf/core-common/src/test/java/org/apache/kylin/common/KylinConfigTest.java
----------------------------------------------------------------------
diff --git a/core-common/src/test/java/org/apache/kylin/common/KylinConfigTest.java b/core-common/src/test/java/org/apache/kylin/common/KylinConfigTest.java
index 097fe11..0e11c22 100644
--- a/core-common/src/test/java/org/apache/kylin/common/KylinConfigTest.java
+++ b/core-common/src/test/java/org/apache/kylin/common/KylinConfigTest.java
@@ -48,4 +48,16 @@ public class KylinConfigTest extends LocalFileMetadataTestCase {
         assertEquals("test2", override.get("test2"));
     }
 
+    @Test
+    public void testAccountConfig() {
+        KylinConfig config = KylinConfig.getInstanceFromEnv();
+        assertEquals("need_reset", config.getMailPassword());
+    }
+
+    @Test
+    public void testAccountOverrideConfig(){
+        KylinConfig config = KylinConfig.getInstanceFromEnv();
+        assertEquals("override.mail.com", config.getMailHost());
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/kylin/blob/d6745eaf/examples/test_case_data/localmeta/kylin.properties
----------------------------------------------------------------------
diff --git a/examples/test_case_data/localmeta/kylin.properties b/examples/test_case_data/localmeta/kylin.properties
index c80a08f..47d9577 100644
--- a/examples/test_case_data/localmeta/kylin.properties
+++ b/examples/test_case_data/localmeta/kylin.properties
@@ -81,6 +81,9 @@ kylin.job.yarn.app.rest.check.interval.seconds=10
 # with "testing" profile, user can use pre-defined name/pwd like KYLIN/ADMIN to login
 kylin.security.profile=testing
 
+### MAIL ###
+mail.host=origin.mail.com
+
 ### OTHER ###
 
 # for tests

http://git-wip-us.apache.org/repos/asf/kylin/blob/d6745eaf/examples/test_case_data/localmeta/kylin_account.properties
----------------------------------------------------------------------
diff --git a/examples/test_case_data/localmeta/kylin_account.properties b/examples/test_case_data/localmeta/kylin_account.properties
new file mode 100644
index 0000000..6350d7f
--- /dev/null
+++ b/examples/test_case_data/localmeta/kylin_account.properties
@@ -0,0 +1,50 @@
+### JOB ###
+
+# Only necessary when kylin.job.run.as.remote.cmd=true
+kylin.job.remote.cli.username=
+
+# Only necessary when kylin.job.run.as.remote.cmd=true
+kylin.job.remote.cli.password=
+
+### SECURITY ###
+
+# Spring security profile, options: testing, ldap, saml
+# with "testing" profile, user can use pre-defined name/pwd like KYLIN/ADMIN to login
+kylin.security.profile=testing
+
+# Default roles and admin roles in LDAP, for ldap and saml
+acl.defaultRole=ROLE_ANALYST,ROLE_MODELER
+acl.adminRole=ROLE_ADMIN
+
+# LDAP authentication configuration
+ldap.server=ldap://ldap_server:389
+ldap.username=
+ldap.password=
+
+# LDAP user account directory;
+ldap.user.searchBase=
+ldap.user.searchPattern=
+ldap.user.groupSearchBase=
+
+# LDAP service account directory
+ldap.service.searchBase=
+ldap.service.searchPattern=
+ldap.service.groupSearchBase=
+
+# SAML configurations for SSO
+# SAML IDP metadata file location
+saml.metadata.file=classpath:sso_metadata.xml
+saml.metadata.entityBaseURL=https://hostname/kylin
+saml.context.scheme=https
+saml.context.serverName=hostname
+saml.context.serverPort=443
+saml.context.contextPath=/kylin
+
+### MAIL ###
+
+# If true, will send email notification;
+mail.enabled=false
+mail.host=override.mail.com
+mail.username=
+mail.password=need_reset
+mail.sender=
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/kylin/blob/d6745eaf/server-base/src/main/java/org/apache/kylin/rest/security/PasswordPlaceholderConfigurer.java
----------------------------------------------------------------------
diff --git a/server-base/src/main/java/org/apache/kylin/rest/security/PasswordPlaceholderConfigurer.java b/server-base/src/main/java/org/apache/kylin/rest/security/PasswordPlaceholderConfigurer.java
index 2692da9..8212b9d 100644
--- a/server-base/src/main/java/org/apache/kylin/rest/security/PasswordPlaceholderConfigurer.java
+++ b/server-base/src/main/java/org/apache/kylin/rest/security/PasswordPlaceholderConfigurer.java
@@ -18,12 +18,17 @@
 
 package org.apache.kylin.rest.security;
 
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.nio.charset.Charset;
 import java.util.Properties;
 
 import javax.crypto.Cipher;
 import javax.crypto.spec.SecretKeySpec;
 
 import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.io.IOUtils;
 import org.apache.kylin.common.KylinConfig;
 import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
 import org.springframework.core.io.InputStreamResource;
@@ -36,11 +41,20 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
  */
 public class PasswordPlaceholderConfigurer extends PropertyPlaceholderConfigurer {
 
+    /**
+     * thisIsAsecretKey
+     */
     private static byte[] key = { 0x74, 0x68, 0x69, 0x73, 0x49, 0x73, 0x41, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79 };
 
     public PasswordPlaceholderConfigurer() {
         Resource[] resources = new Resource[1];
-        resources[0] = new InputStreamResource(KylinConfig.getKylinPropertiesAsInputStream());
+        Properties prop = KylinConfig.getKylinProperties();
+        StringWriter writer = new StringWriter();
+        prop.list(new PrintWriter(writer));
+        String propString = writer.getBuffer().toString();
+        IOUtils.closeQuietly(writer);
+        InputStream is = IOUtils.toInputStream(propString, Charset.defaultCharset());
+        resources[0] = new InputStreamResource(is);
         this.setLocations(resources);
     }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/d6745eaf/server-base/src/test/java/org/apache/kylin/rest/security/PasswordPlaceHolderConfigurerTest.java
----------------------------------------------------------------------
diff --git a/server-base/src/test/java/org/apache/kylin/rest/security/PasswordPlaceHolderConfigurerTest.java b/server-base/src/test/java/org/apache/kylin/rest/security/PasswordPlaceHolderConfigurerTest.java
new file mode 100644
index 0000000..3afd2ca
--- /dev/null
+++ b/server-base/src/test/java/org/apache/kylin/rest/security/PasswordPlaceHolderConfigurerTest.java
@@ -0,0 +1,16 @@
+package org.apache.kylin.rest.security;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+
+public class PasswordPlaceHolderConfigurerTest {
+
+    @Test
+    public void testAESEncrypt(){
+        String input = "hello world";
+        String result = PasswordPlaceholderConfigurer.encrypt(input);
+        Assert.assertEquals("4stv/RRleOtvie/8SLHmXA==", result);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/kylin/blob/d6745eaf/server/src/test/java/org/apache/kylin/rest/service/CacheServiceTest.java
----------------------------------------------------------------------
diff --git a/server/src/test/java/org/apache/kylin/rest/service/CacheServiceTest.java b/server/src/test/java/org/apache/kylin/rest/service/CacheServiceTest.java
index 7620f8c..250c79f 100644
--- a/server/src/test/java/org/apache/kylin/rest/service/CacheServiceTest.java
+++ b/server/src/test/java/org/apache/kylin/rest/service/CacheServiceTest.java
@@ -73,7 +73,7 @@ public class CacheServiceTest extends LocalFileMetadataTestCase {
         staticCreateTestMetadata();
         configA = KylinConfig.getInstanceFromEnv();
         configA.setProperty("kylin.rest.servers", "localhost:7777");
-        configB = KylinConfig.createKylinConfigFromInputStream(KylinConfig.getKylinPropertiesAsInputStream());
+        configB = KylinConfig.createKylinConfig(KylinConfig.getKylinProperties());
         configB.setProperty("kylin.rest.servers", "localhost:7777");
         configB.setMetadataUrl("../examples/test_metadata");
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/d6745eaf/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/CubeVisitService.java
----------------------------------------------------------------------
diff --git a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/CubeVisitService.java b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/CubeVisitService.java
index cbccac6..407890c 100644
--- a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/CubeVisitService.java
+++ b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/CubeVisitService.java
@@ -20,13 +20,14 @@ package org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.io.StringReader;
 import java.lang.management.ManagementFactory;
 import java.net.InetAddress;
 import java.nio.BufferOverflowException;
 import java.nio.ByteBuffer;
-import java.nio.charset.Charset;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Properties;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.ArrayUtils;
@@ -184,7 +185,10 @@ public class CubeVisitService extends CubeVisitProtos.CubeVisitService implement
             region.startRegionOperation();
 
             // if user change kylin.properties on kylin server, need to manually redeploy coprocessor jar to update KylinConfig of Env.
-            KylinConfig.setKylinConfigFromInputStream(IOUtils.toInputStream(request.getKylinProperties(), Charset.defaultCharset()));
+            String serverPropString = request.getKylinProperties();
+            Properties serverProp = new Properties();
+            serverProp.load(new StringReader(serverPropString));
+            KylinConfig.setKylinConfig(serverProp);
             KylinConfig kylinConfig = KylinConfig.getInstanceFromEnv();
 
             debugGitTag = region.getTableDesc().getValue(IRealizationConstants.HTableGitTag);