This is an automated email from the ASF dual-hosted git repository.

xxyu pushed a commit to branch kylin5
in repository https://gitbox.apache.org/repos/asf/kylin.git

commit 5c814ecb22e24ff61388dac4de6e3366a5d0cb7b
Author: hongrong.cao <hongrong....@kyligence.io>
AuthorDate: Tue Nov 14 17:21:35 2023 +0800

    License Limitation related
    
    ---------
    Co-authored-by: longfei.jiang <longfei.ji...@kyligence.io>
---
 .../kylin/rest/controller/NAdminController.java    | 20 ++++++---
 .../kylin/rest/controller/NBasicController.java    | 26 ++++++++---
 .../rest/controller/NBasicControllerTest.java      | 46 +++++++++++++++++++-
 .../org/apache/kylin/common/KylinConfigBase.java   | 10 ++++-
 .../kylin/common/exception/ServerErrorCode.java    |  1 +
 .../kylin/common/extension/KylinInfoExtension.java | 50 ++++++++++++++++++++++
 .../org/apache/kylin/common/msg/CnMessage.java     | 10 +++++
 .../java/org/apache/kylin/common/msg/Message.java  |  8 ++++
 .../resources/kylin_errorcode_conf_en.properties   |  1 +
 .../resources/kylin_errorcode_conf_zh.properties   |  1 +
 .../common/extension/KylinInfoExtensionTest.java   | 41 ++++++++++++++++++
 .../apache/kylin/rest/service/JobServiceTest.java  |  2 +
 .../kylin/rest/service/ModelServiceTest.java       |  6 +++
 .../apache/kylin/rest/MultiTenantModeFilter.java   |  2 +-
 14 files changed, 207 insertions(+), 17 deletions(-)

diff --git 
a/src/common-server/src/main/java/org/apache/kylin/rest/controller/NAdminController.java
 
b/src/common-server/src/main/java/org/apache/kylin/rest/controller/NAdminController.java
index 77365f1e9e..fb6882b74c 100644
--- 
a/src/common-server/src/main/java/org/apache/kylin/rest/controller/NAdminController.java
+++ 
b/src/common-server/src/main/java/org/apache/kylin/rest/controller/NAdminController.java
@@ -32,16 +32,15 @@ import java.util.TimeZone;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.kylin.common.KylinConfig;
 import org.apache.kylin.common.exception.KylinException;
-import org.apache.kylin.rest.response.EnvelopeResponse;
+import org.apache.kylin.guava30.shaded.common.collect.Lists;
+import org.apache.kylin.guava30.shaded.common.collect.Maps;
 import org.apache.kylin.metadata.resourcegroup.ResourceGroupManager;
+import org.apache.kylin.rest.response.EnvelopeResponse;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
-import org.apache.kylin.guava30.shaded.common.collect.Lists;
-import org.apache.kylin.guava30.shaded.common.collect.Maps;
-
 import io.swagger.annotations.ApiOperation;
 
 @Controller
@@ -70,7 +69,6 @@ public class NAdminController extends NBasicController {
         propertyKeys.add("kylin.favorite.import-sql-max-size");
         propertyKeys.add("kylin.model.suggest-model-sql-limit");
         propertyKeys.add("kylin.query.query-history-download-max-size");
-        propertyKeys.add("kylin.streaming.enabled");
         propertyKeys.add("kylin.model.measure-name-check-enabled");
         
propertyKeys.add("kylin.security.remove-ldap-custom-security-limit-enabled");
         propertyKeys.add("kylin.source.ddl.logical-view.enabled");
@@ -90,7 +88,8 @@ public class NAdminController extends NBasicController {
             
propertyKeys.add("kylin.security.allow-non-admin-generate-query-diag-package");
         }
 
-        final String config = 
KylinConfig.getInstanceFromEnv().exportToString(propertyKeys) + 
addPropertyInMetadata();
+        final String config = 
KylinConfig.getInstanceFromEnv().exportToString(propertyKeys)
+                + addPropertyWithKylinInfoCheck() + addPropertyInMetadata();
 
         return new EnvelopeResponse<>(KylinException.CODE_SUCCESS, config, "");
     }
@@ -112,6 +111,10 @@ public class NAdminController extends NBasicController {
         Properties properties = new Properties();
         ResourceGroupManager manager = 
ResourceGroupManager.getInstance(KylinConfig.getInstanceFromEnv());
         properties.put("resource_group_enabled", 
manager.isResourceGroupEnabled());
+        return getPropertyString(properties);
+    }
+
+    private String getPropertyString(Properties properties) {
         final StringBuilder sb = new StringBuilder();
         for (Map.Entry<Object, Object> entry : properties.entrySet()) {
             
sb.append(entry.getKey()).append("=").append(entry.getValue()).append('\n');
@@ -119,4 +122,9 @@ public class NAdminController extends NBasicController {
         return sb.toString();
     }
 
+    private String addPropertyWithKylinInfoCheck() {
+        Properties properties = new Properties();
+        properties.put("kylin.streaming.enabled", 
KylinConfig.getInstanceFromEnv().streamingEnabled());
+        return getPropertyString(properties);
+    }
 }
diff --git 
a/src/common-server/src/main/java/org/apache/kylin/rest/controller/NBasicController.java
 
b/src/common-server/src/main/java/org/apache/kylin/rest/controller/NBasicController.java
index ac5ee3b536..e88ce19d72 100644
--- 
a/src/common-server/src/main/java/org/apache/kylin/rest/controller/NBasicController.java
+++ 
b/src/common-server/src/main/java/org/apache/kylin/rest/controller/NBasicController.java
@@ -18,8 +18,6 @@
 
 package org.apache.kylin.rest.controller;
 
-import static 
org.apache.kylin.guava30.shaded.common.net.HttpHeaders.ACCEPT_ENCODING;
-import static 
org.apache.kylin.guava30.shaded.common.net.HttpHeaders.CONTENT_DISPOSITION;
 import static org.apache.kylin.common.exception.ServerErrorCode.ACCESS_DENIED;
 import static org.apache.kylin.common.exception.ServerErrorCode.EMPTY_ID;
 import static 
org.apache.kylin.common.exception.ServerErrorCode.EMPTY_PROJECT_NAME;
@@ -27,6 +25,7 @@ import static 
org.apache.kylin.common.exception.ServerErrorCode.FAILED_CONNECT_C
 import static 
org.apache.kylin.common.exception.ServerErrorCode.FAILED_DOWNLOAD_FILE;
 import static 
org.apache.kylin.common.exception.ServerErrorCode.INCORRECT_PROJECT_MODE;
 import static 
org.apache.kylin.common.exception.ServerErrorCode.INVALID_PARAMETER;
+import static 
org.apache.kylin.common.exception.ServerErrorCode.LOW_LEVEL_LICENSE;
 import static 
org.apache.kylin.common.exception.ServerErrorCode.UNSUPPORTED_STREAMING_OPERATION;
 import static 
org.apache.kylin.common.exception.code.ErrorCodeServer.ARGS_TYPE_CHECK;
 import static 
org.apache.kylin.common.exception.code.ErrorCodeServer.DATETIME_FORMAT_EMPTY;
@@ -41,6 +40,8 @@ import static 
org.apache.kylin.common.exception.code.ErrorCodeServer.TIME_INVALI
 import static 
org.apache.kylin.common.exception.code.ErrorCodeServer.TIME_INVALID_RANGE_IN_RANGE;
 import static 
org.apache.kylin.common.exception.code.ErrorCodeServer.TIME_INVALID_RANGE_LESS_THAN_ZERO;
 import static 
org.apache.kylin.common.exception.code.ErrorCodeServer.USER_UNAUTHORIZED;
+import static 
org.apache.kylin.guava30.shaded.common.net.HttpHeaders.ACCEPT_ENCODING;
+import static 
org.apache.kylin.guava30.shaded.common.net.HttpHeaders.CONTENT_DISPOSITION;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -71,19 +72,22 @@ import org.apache.commons.codec.binary.Base64;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.kylin.common.KylinConfig;
 import org.apache.kylin.common.KylinConfigBase;
 import org.apache.kylin.common.exception.KylinException;
 import org.apache.kylin.common.exception.ServerErrorCode;
+import org.apache.kylin.common.extension.KylinInfoExtension;
 import org.apache.kylin.common.msg.Message;
 import org.apache.kylin.common.msg.MsgPicker;
 import org.apache.kylin.common.persistence.transaction.TransactionException;
 import org.apache.kylin.common.util.EncryptUtil;
 import org.apache.kylin.common.util.JsonUtil;
 import org.apache.kylin.common.util.Pair;
+import org.apache.kylin.guava30.shaded.common.base.Preconditions;
+import org.apache.kylin.guava30.shaded.common.collect.Lists;
 import org.apache.kylin.job.constant.JobStatusEnum;
 import org.apache.kylin.job.dao.ExecutablePO;
 import org.apache.kylin.job.execution.JobTypeEnum;
@@ -132,9 +136,6 @@ import org.springframework.web.client.ResponseExtractor;
 import org.springframework.web.client.RestTemplate;
 import 
org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
 
-import org.apache.kylin.guava30.shaded.common.base.Preconditions;
-import org.apache.kylin.guava30.shaded.common.collect.Lists;
-
 import lombok.SneakyThrows;
 import lombok.val;
 
@@ -381,7 +382,8 @@ public class NBasicController {
         return data;
     }
 
-    public Map<String, Object> setCustomDataResponse(String name, 
Pair<List<TableDesc>, Integer> result, int offset, int limit) {
+    public Map<String, Object> setCustomDataResponse(String name, 
Pair<List<TableDesc>, Integer> result, int offset,
+            int limit) {
         Map<String, Object> data = new HashMap<>();
         data.put(name, PagingUtil.cutPage(result.getFirst(), offset, limit));
         data.put("size", result.getSecond());
@@ -667,4 +669,14 @@ public class NBasicController {
         }
         return host;
     }
+
+    public void checkKylinInfo(boolean enableSecondStorage) {
+        if (enableSecondStorage) {
+            boolean checkKylinInfo = 
KylinInfoExtension.getFactory().checkKylinInfo();
+            if (!checkKylinInfo) {
+                Message msg = MsgPicker.getMsg();
+                throw new KylinException(LOW_LEVEL_LICENSE, 
msg.getLowLevelLicenseMessage());
+            }
+        }
+    }
 }
diff --git 
a/src/common-server/src/test/java/org/apache/kylin/rest/controller/NBasicControllerTest.java
 
b/src/common-server/src/test/java/org/apache/kylin/rest/controller/NBasicControllerTest.java
index a6f8ab3484..5b15c539d3 100644
--- 
a/src/common-server/src/test/java/org/apache/kylin/rest/controller/NBasicControllerTest.java
+++ 
b/src/common-server/src/test/java/org/apache/kylin/rest/controller/NBasicControllerTest.java
@@ -19,6 +19,7 @@
 package org.apache.kylin.rest.controller;
 
 import static 
org.apache.kylin.common.exception.CommonErrorCode.UNKNOWN_ERROR_CODE;
+import static 
org.apache.kylin.common.exception.ServerErrorCode.LOW_LEVEL_LICENSE;
 import static 
org.apache.kylin.common.exception.code.ErrorCodeServer.DATETIME_FORMAT_EMPTY;
 import static 
org.apache.kylin.common.exception.code.ErrorCodeServer.DATETIME_FORMAT_PARSE_ERROR;
 import static 
org.apache.kylin.common.exception.code.ErrorCodeServer.INTEGER_NON_NEGATIVE_CHECK;
@@ -30,6 +31,7 @@ import static 
org.apache.kylin.common.exception.code.ErrorCodeServer.TIME_INVALI
 import static 
org.apache.kylin.common.exception.code.ErrorCodeServer.USER_AUTH_INFO_NOTFOUND;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
@@ -40,6 +42,8 @@ import java.util.Map;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.kylin.common.exception.KylinException;
+import org.apache.kylin.common.extension.KylinInfoExtension;
+import org.apache.kylin.common.msg.CnMessage;
 import org.apache.kylin.common.msg.Message;
 import org.apache.kylin.common.msg.MsgPicker;
 import org.apache.kylin.common.util.NLocalFileMetadataTestCase;
@@ -57,14 +61,25 @@ import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
 import org.mockito.InjectMocks;
 import org.mockito.Mockito;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PowerMockIgnore;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
 import org.springframework.security.access.AccessDeniedException;
 import org.springframework.test.web.servlet.MockMvc;
 import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
 import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
 import org.springframework.test.web.servlet.setup.MockMvcBuilders;
 
+import lombok.val;
+
+@RunWith(PowerMockRunner.class)
+@PowerMockIgnore({ "javax.management.*", "javax.script.*", 
"org.apache.hadoop.*", "javax.security.*",
+        "javax.crypto.*" })
+@PrepareForTest({ KylinInfoExtension.class })
 public class NBasicControllerTest extends NLocalFileMetadataTestCase {
 
     private MockMvc mockMvc;
@@ -306,12 +321,12 @@ public class NBasicControllerTest extends 
NLocalFileMetadataTestCase {
         Object tableData = mockDataResponse.get("table");
         if (tableData instanceof List<?>) {
             for (Object tableDatum : (List<?>) tableData) {
-                Assert.assertEquals("table1", 
((TableDesc)tableDatum).getName().toLowerCase(Locale.ROOT));
+                Assert.assertEquals("table1", ((TableDesc) 
tableDatum).getName().toLowerCase(Locale.ROOT));
             }
         }
         Assert.assertEquals(3, mockDataResponse.get("size"));
     }
-    
+
     @Test
     public void testEncodeAndDecodeHost() {
         Assert.assertTrue(nBasicController.encodeHost("").isEmpty());
@@ -324,4 +339,31 @@ public class NBasicControllerTest extends 
NLocalFileMetadataTestCase {
         Assert.assertEquals("ip", nBasicController.decodeHost("ip"));
     }
 
+    @Test
+    public void testCheckLicenseLevel() throws Exception {
+        nBasicController.checkKylinInfo(false);
+
+        PowerMockito.mockStatic(KylinInfoExtension.class);
+        val factory = Mockito.mock(KylinInfoExtension.Factory.class);
+        Mockito.when(factory.checkKylinInfo()).thenReturn(true);
+        PowerMockito.when(KylinInfoExtension.getFactory()).thenReturn(factory);
+        nBasicController.checkKylinInfo(true);
+
+        checkErrorMessage(factory, "en", Message.getInstance());
+        checkErrorMessage(factory, "cn", CnMessage.getInstance());
+    }
+
+    private void checkErrorMessage(KylinInfoExtension.Factory factory, String 
lang, Message message) {
+        try {
+            MsgPicker.setMsg(lang);
+            Mockito.when(factory.checkKylinInfo()).thenReturn(false);
+            nBasicController.checkKylinInfo(true);
+            fail();
+        } catch (Exception e) {
+            Assert.assertTrue(e instanceof KylinException);
+            val kylinException = (KylinException) e;
+            Assert.assertEquals(LOW_LEVEL_LICENSE.toErrorCode(), 
kylinException.getErrorCode());
+            Assert.assertEquals(message.getLowLevelLicenseMessage(), 
kylinException.getMessage());
+        }
+    }
 }
diff --git 
a/src/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java 
b/src/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
index a683e66a59..8e8a82164e 100644
--- a/src/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
+++ b/src/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
@@ -59,6 +59,7 @@ import org.apache.hadoop.fs.Path;
 import org.apache.kylin.common.annotation.ThirdPartyDependencies;
 import org.apache.kylin.common.constant.NonCustomProjectLevelConfig;
 import org.apache.kylin.common.exception.KylinRuntimeException;
+import org.apache.kylin.common.extension.KylinInfoExtension;
 import org.apache.kylin.common.lock.DistributedLockFactory;
 import org.apache.kylin.common.persistence.metadata.HDFSMetadataStore;
 import org.apache.kylin.common.util.AddressUtil;
@@ -1669,7 +1670,9 @@ public abstract class KylinConfigBase implements 
Serializable {
     }
 
     public boolean streamingEnabled() {
-        return Boolean.parseBoolean(getOptional("kylin.streaming.enabled", 
FALSE));
+        boolean checkKylinInfo = 
KylinInfoExtension.getFactory().checkKylinInfo();
+        boolean enable = 
Boolean.parseBoolean(getOptional("kylin.streaming.enabled", FALSE));
+        return enable && checkKylinInfo;
     }
 
     public Map<String, String> getStreamingSparkConfigOverride() {
@@ -3980,4 +3983,9 @@ public abstract class KylinConfigBase implements 
Serializable {
     public void setJdbcShareStateUrl(String jdbcShareStateUrl) {
         setProperty(KYLIN_JDBC_SHARE_STATE_URL, jdbcShareStateUrl);
     }
+
+    public String getKylinInfoExtensionFactory() {
+        String defaultValue = 
"org.apache.kylin.common.extension.KylinInfoExtension$Factory";
+        return getOptional("kylin.extension.info.factory", defaultValue);
+    }
 }
diff --git 
a/src/core-common/src/main/java/org/apache/kylin/common/exception/ServerErrorCode.java
 
b/src/core-common/src/main/java/org/apache/kylin/common/exception/ServerErrorCode.java
index 5c90c5db1d..881a6c1f7f 100644
--- 
a/src/core-common/src/main/java/org/apache/kylin/common/exception/ServerErrorCode.java
+++ 
b/src/core-common/src/main/java/org/apache/kylin/common/exception/ServerErrorCode.java
@@ -142,6 +142,7 @@ public enum ServerErrorCode implements ErrorCodeSupplier {
     LICENSE_FILE_NOT_EXIST("KE-010015001"), //
     EMPTY_LICENSE_CONTENT("KE-010015002"), //
     INVALID_LICENSE("KE-010015003"), //
+    LOW_LEVEL_LICENSE("KE-010015004"), //
 
     // 10016XXX email
     EMPTY_EMAIL("KE-010016001"), //
diff --git 
a/src/core-common/src/main/java/org/apache/kylin/common/extension/KylinInfoExtension.java
 
b/src/core-common/src/main/java/org/apache/kylin/common/extension/KylinInfoExtension.java
new file mode 100644
index 0000000000..0a2e849ee3
--- /dev/null
+++ 
b/src/core-common/src/main/java/org/apache/kylin/common/extension/KylinInfoExtension.java
@@ -0,0 +1,50 @@
+/*
+ * 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.kylin.common.extension;
+
+import org.apache.kylin.common.KylinConfig;
+
+public class KylinInfoExtension {
+    private static final ExtensionFactoryLoader<KylinInfoExtension.Factory> 
loader = new ExtensionFactoryLoader<>();
+    private static KylinInfoExtension.Factory extensionFactory = null;
+
+    private KylinInfoExtension() {
+    }
+
+    public static Factory getFactory() {
+        if (extensionFactory == null) {
+            synchronized (KylinInfoExtension.class) {
+                extensionFactory = 
loader.loadFactory(KylinInfoExtension.Factory.class,
+                        
KylinConfig.getInstanceFromEnv().getKylinInfoExtensionFactory());
+            }
+        }
+        return extensionFactory;
+    }
+
+    public static class Factory {
+
+        public Factory() {
+            // Do nothing
+        }
+
+        public boolean checkKylinInfo() {
+            return true;
+        }
+    }
+}
diff --git 
a/src/core-common/src/main/java/org/apache/kylin/common/msg/CnMessage.java 
b/src/core-common/src/main/java/org/apache/kylin/common/msg/CnMessage.java
index 203eece840..c62f52156d 100644
--- a/src/core-common/src/main/java/org/apache/kylin/common/msg/CnMessage.java
+++ b/src/core-common/src/main/java/org/apache/kylin/common/msg/CnMessage.java
@@ -540,6 +540,16 @@ public class CnMessage extends Message {
         return "配置列表不能为空。请检查后重试。";
     }
 
+    @Override
+    public String getLowLevelLicenseMessage() {
+        return "无法使用分层存储,如需使用请先升级为 Kyligence 高级版";
+    }
+
+    @Override
+    public String getRestartNoticeMessage() {
+        return "部分功能需重启后再试";
+    }
+
     @Override
     public String saveModelFail() {
         return "模型 “%s” 保存失败。请确保模型中使用的列 “%s” 在源表 “%s” 中存在。";
diff --git 
a/src/core-common/src/main/java/org/apache/kylin/common/msg/Message.java 
b/src/core-common/src/main/java/org/apache/kylin/common/msg/Message.java
index 4a76464ce2..79e267eab1 100644
--- a/src/core-common/src/main/java/org/apache/kylin/common/msg/Message.java
+++ b/src/core-common/src/main/java/org/apache/kylin/common/msg/Message.java
@@ -632,6 +632,14 @@ public class Message {
         return UNKNOWN_ERROR;
     }
 
+    public String getLowLevelLicenseMessage() {
+        return "Tiered Storage cannot be used. Please upgrade to Kyligence 
Premium version if you want to use the function.";
+    }
+
+    public String getRestartNoticeMessage() {
+        return "Some functions need to restart and try again.";
+    }
+
     public String saveModelFail() {
         return "Can’t save model \"%s\". Please ensure that the used column 
\"%s\" exist in source table \"%s\".";
     }
diff --git 
a/src/core-common/src/main/resources/kylin_errorcode_conf_en.properties 
b/src/core-common/src/main/resources/kylin_errorcode_conf_en.properties
index 664c1b8d01..b82744456d 100644
--- a/src/core-common/src/main/resources/kylin_errorcode_conf_en.properties
+++ b/src/core-common/src/main/resources/kylin_errorcode_conf_en.properties
@@ -132,6 +132,7 @@ KE-010014004=Empty Sql Expression
 KE-010015001=License File Not Exist
 KE-010015002=Empty License Content
 KE-010015003=Invalid License
+KE-010015004=Low Level License
 KE-010016001=Empty Email
 KE-010016002=Invalid Email
 KE-010017001=File Not Exist
diff --git 
a/src/core-common/src/main/resources/kylin_errorcode_conf_zh.properties 
b/src/core-common/src/main/resources/kylin_errorcode_conf_zh.properties
index f5e12bc109..9f04bec06f 100644
--- a/src/core-common/src/main/resources/kylin_errorcode_conf_zh.properties
+++ b/src/core-common/src/main/resources/kylin_errorcode_conf_zh.properties
@@ -132,6 +132,7 @@ KE-010014004=查询语句为空
 KE-010015001=许可证文件不存在
 KE-010015002=许可证未空
 KE-010015003=非法许可证
+KE-010015004=低版本许可证
 KE-010016001=邮箱名为空
 KE-010016002=非法邮箱
 KE-010017001=文件不存在
diff --git 
a/src/core-common/src/test/java/org/apache/kylin/common/extension/KylinInfoExtensionTest.java
 
b/src/core-common/src/test/java/org/apache/kylin/common/extension/KylinInfoExtensionTest.java
new file mode 100644
index 0000000000..b737d3e7f9
--- /dev/null
+++ 
b/src/core-common/src/test/java/org/apache/kylin/common/extension/KylinInfoExtensionTest.java
@@ -0,0 +1,41 @@
+/*
+ * 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.kylin.common.extension;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.apache.kylin.junit.annotation.MetadataInfo;
+import org.junit.jupiter.api.Test;
+
+import lombok.val;
+
+@MetadataInfo
+class KylinInfoExtensionTest {
+
+    @Test
+    void test() {
+        val factory = KylinInfoExtension.getFactory();
+        
assertEquals("org.apache.kylin.common.extension.KylinInfoExtension$Factory", 
factory.getClass().getName());
+
+        assertTrue(factory.checkKylinInfo());
+
+        assertEquals(factory, KylinInfoExtension.getFactory());
+    }
+}
\ No newline at end of file
diff --git 
a/src/data-loading-service/src/test/java/org/apache/kylin/rest/service/JobServiceTest.java
 
b/src/data-loading-service/src/test/java/org/apache/kylin/rest/service/JobServiceTest.java
index 53e332f15a..3d82dc7e45 100644
--- 
a/src/data-loading-service/src/test/java/org/apache/kylin/rest/service/JobServiceTest.java
+++ 
b/src/data-loading-service/src/test/java/org/apache/kylin/rest/service/JobServiceTest.java
@@ -1578,6 +1578,7 @@ public class JobServiceTest extends 
NLocalFileMetadataTestCase {
         }, project);
 //        SecondStorageUtil.initModelMetaData(project, model);
 //        Assert.assertTrue(SecondStorageUtil.isModelEnable(project, model));
+//        
Assert.assertTrue(SecondStorageUtil.isModelEnableWithoutCheckKylinInfo(project, 
model));
 
         val job3 = new DefaultExecutable();
         job3.setProject(getProject());
@@ -1610,6 +1611,7 @@ public class JobServiceTest extends 
NLocalFileMetadataTestCase {
         }, project);
 //        SecondStorageUtil.initModelMetaData(project, model);
 //        Assert.assertTrue(SecondStorageUtil.isModelEnable(project, model));
+//        
Assert.assertTrue(SecondStorageUtil.isModelEnableWithoutCheckKylinInfo(project, 
model));
 
         val manager = 
NExecutableManager.getInstance(KylinConfig.getInstanceFromEnv(), getProject());
         val job = new DefaultExecutable();
diff --git 
a/src/modeling-service/src/test/java/org/apache/kylin/rest/service/ModelServiceTest.java
 
b/src/modeling-service/src/test/java/org/apache/kylin/rest/service/ModelServiceTest.java
index 5f618da57a..58beefba66 100644
--- 
a/src/modeling-service/src/test/java/org/apache/kylin/rest/service/ModelServiceTest.java
+++ 
b/src/modeling-service/src/test/java/org/apache/kylin/rest/service/ModelServiceTest.java
@@ -3966,6 +3966,7 @@ public class ModelServiceTest extends SourceTestCase {
         }, defaultProject);
 //        SecondStorageUtil.initModelMetaData(defaultProject, modelId);
 //        Assert.assertTrue(SecondStorageUtil.isModelEnable(defaultProject, 
modelId));
+//        
Assert.assertTrue(SecondStorageUtil.isModelEnableWithoutCheckKylinInfo(defaultProject,
 modelId));
         List<NDataSegment> overlapSegments31 = 
modelService.checkSegmentToBuildOverlapsBuilt(defaultProject,
                 dataModelDesc, new 
SegmentRange.TimePartitionedSegmentRange(1309891513770L, 1509891513770L), true,
                 null);
@@ -4308,6 +4309,7 @@ public class ModelServiceTest extends SourceTestCase {
         when(changedResponse.hasTableIndexChange()).thenReturn(true);
         modelService.changeSecondStorageIfNeeded(project, request, () -> true);
         Assert.assertTrue(SecondStorageUtil.isModelEnable(project, model));
+//        
Assert.assertTrue(SecondStorageUtil.isModelEnableWithoutCheckKylinInfo(project, 
model));
 
         val modelRequest = 
modelService.convertToRequest(modelService.getModelById(model, project));
         Assert.assertTrue(modelRequest.isWithSecondStorage());
@@ -4326,6 +4328,7 @@ public class ModelServiceTest extends SourceTestCase {
         
Assert.assertTrue(indexPlanManager.getIndexPlan(model).containBaseTableLayout());
         SecondStorageUtil.initModelMetaData(project, model);
         Assert.assertTrue(SecondStorageUtil.isModelEnable(project, model));
+//        
Assert.assertTrue(SecondStorageUtil.isModelEnableWithoutCheckKylinInfo(project, 
model));
         {
             List<NDataSegmentResponse> segments = 
modelService.getSegmentsResponse(model, project, "0",
                     "" + Long.MAX_VALUE, "", null, null, true, "start_time", 
false, null, null);
@@ -4383,6 +4386,7 @@ public class ModelServiceTest extends SourceTestCase {
         }, project);
         
Assert.assertTrue(indexPlanManager.getIndexPlan(model).containBaseTableLayout());
         Assert.assertFalse(SecondStorageUtil.isModelEnable(project, model));
+//        
Assert.assertFalse(SecondStorageUtil.isModelEnableWithoutCheckKylinInfo(project,
 model));
         {
             List<NDataSegmentResponse> segments = 
modelService.getSegmentsResponse(model, project, "0",
                     "" + Long.MAX_VALUE, "", null, null, true, "start_time", 
false,
@@ -5280,9 +5284,11 @@ public class ModelServiceTest extends SourceTestCase {
         }, project);
         SecondStorageUtil.initModelMetaData(project, model);
         Assert.assertTrue(SecondStorageUtil.isModelEnable(project, model));
+//        
Assert.assertTrue(SecondStorageUtil.isModelEnableWithoutCheckKylinInfo(project, 
model));
 
         val mockModel = RandomUtil.randomUUIDStr();
         Assert.assertFalse(SecondStorageUtil.isModelEnable(project, 
mockModel));
+//        
Assert.assertFalse(SecondStorageUtil.isModelEnableWithoutCheckKylinInfo(project,
 mockModel));
 
         val segment = Mockito.mock(NDataSegment.class);
         modelService.checkSegmentSecondStorage(mockModel, project, segment);
diff --git 
a/src/server/src/main/java/org/apache/kylin/rest/MultiTenantModeFilter.java 
b/src/server/src/main/java/org/apache/kylin/rest/MultiTenantModeFilter.java
index 7af0ececb5..dffefc5a5e 100644
--- a/src/server/src/main/java/org/apache/kylin/rest/MultiTenantModeFilter.java
+++ b/src/server/src/main/java/org/apache/kylin/rest/MultiTenantModeFilter.java
@@ -54,7 +54,7 @@ import lombok.extern.slf4j.Slf4j;
 @Component
 @Order(Ordered.HIGHEST_PRECEDENCE + 4)
 public class MultiTenantModeFilter extends BaseFilter {
-    private static final Set<String> NOT_ROUTE_APIS = 
com.google.common.collect.Sets.newHashSet();
+    private static final Set<String> NOT_ROUTE_APIS = Sets.newHashSet();
     private static final Set<String> ASYNC_QUERY_APIS = Sets.newHashSet();
     private static final Set<String> ROUTES_APIS = Sets.newHashSet();
     private static final Set<String> JOB_APIS = Sets.newHashSet();

Reply via email to