diff --git a/sermant-agentcore/sermant-agentcore-implement/src/main/java/io/sermant/implement/service/dynamicconfig/kie/KieDynamicConfigService.java b/sermant-agentcore/sermant-agentcore-implement/src/main/java/io/sermant/implement/service/dynamicconfig/kie/KieDynamicConfigService.java index 250384f4ea..c68abbb699 100644 --- a/sermant-agentcore/sermant-agentcore-implement/src/main/java/io/sermant/implement/service/dynamicconfig/kie/KieDynamicConfigService.java +++ b/sermant-agentcore/sermant-agentcore-implement/src/main/java/io/sermant/implement/service/dynamicconfig/kie/KieDynamicConfigService.java @@ -21,6 +21,7 @@ import io.sermant.core.service.dynamicconfig.common.DynamicConfigListener; import io.sermant.implement.service.dynamicconfig.kie.client.kie.KieConfigEntity; import io.sermant.implement.service.dynamicconfig.kie.client.kie.KieResponse; +import io.sermant.implement.service.dynamicconfig.kie.constants.KieConstants; import io.sermant.implement.service.dynamicconfig.kie.listener.SubscriberManager; import io.sermant.implement.utils.LabelGroupUtils; @@ -84,8 +85,8 @@ public boolean addConfigListener(String key, String group, DynamicConfigListener String newGroup = group; if (!LabelGroupUtils.isLabelGroup(group)) { // Add label group judgment to adapt irregular groups - newGroup = LabelGroupUtils - .createLabelGroup(Collections.singletonMap(fixSeparator(group, true), fixSeparator(key, false))); + newGroup = LabelGroupUtils.createLabelGroup(Collections.singletonMap(KieConstants.DEFAULT_GROUP, + fixSeparator(group, true))); } return subscriberManager.addConfigListener(key, newGroup, listener, ifNotify); } diff --git a/sermant-agentcore/sermant-agentcore-implement/src/main/java/io/sermant/implement/service/dynamicconfig/kie/client/kie/KieClient.java b/sermant-agentcore/sermant-agentcore-implement/src/main/java/io/sermant/implement/service/dynamicconfig/kie/client/kie/KieClient.java index ac8ca63eae..1f613214a0 100644 --- a/sermant-agentcore/sermant-agentcore-implement/src/main/java/io/sermant/implement/service/dynamicconfig/kie/client/kie/KieClient.java +++ b/sermant-agentcore/sermant-agentcore-implement/src/main/java/io/sermant/implement/service/dynamicconfig/kie/client/kie/KieClient.java @@ -22,6 +22,7 @@ import io.sermant.implement.service.dynamicconfig.kie.client.ClientUrlManager; import io.sermant.implement.service.dynamicconfig.kie.client.http.HttpClient; import io.sermant.implement.service.dynamicconfig.kie.client.http.HttpResult; +import io.sermant.implement.service.dynamicconfig.kie.constants.KieConstants; import io.sermant.implement.utils.LabelGroupUtils; import org.apache.http.HttpStatus; @@ -220,8 +221,9 @@ public String getConfig(String key, String group) { @Override public Map> getConfigList(String key, String group, boolean exactMatchFlag) { final KieResponse kieResponse; + String covertGroup = group.replace(KieConstants.SEPARATOR, KieConstants.CONNECTOR); if (exactMatchFlag) { - kieResponse = getKieResponse(key, group, exactMatchFlag); + kieResponse = getKieResponse(key, covertGroup, exactMatchFlag); } else { kieResponse = getKieResponse(key, null, exactMatchFlag); } @@ -236,7 +238,7 @@ public Map> getConfigList(String key, String group, boolean configList.add(entity.getKey()); } else { String currentConfigGroup = LabelGroupUtils.createLabelGroup(entity.getLabels()); - if (currentConfigGroup.contains(group)) { + if (currentConfigGroup.contains(covertGroup)) { List configList = result.computeIfAbsent( LabelGroupUtils.createLabelGroup(entity.getLabels()), configKey -> new ArrayList<>()); configList.add(entity.getKey()); diff --git a/sermant-agentcore/sermant-agentcore-implement/src/main/java/io/sermant/implement/service/dynamicconfig/kie/constants/KieConstants.java b/sermant-agentcore/sermant-agentcore-implement/src/main/java/io/sermant/implement/service/dynamicconfig/kie/constants/KieConstants.java index 17938652c0..16c36ef765 100644 --- a/sermant-agentcore/sermant-agentcore-implement/src/main/java/io/sermant/implement/service/dynamicconfig/kie/constants/KieConstants.java +++ b/sermant-agentcore/sermant-agentcore-implement/src/main/java/io/sermant/implement/service/dynamicconfig/kie/constants/KieConstants.java @@ -28,6 +28,26 @@ public class KieConstants { */ public static final String DEFAULT_GROUP_KEY = "_DEFAULT_GROUP_KEY"; + /** + * Unsupported delimiter in Group + */ + public static final String SEPARATOR = "/"; + + /** + * Supported connectors in Group + */ + public static final String CONNECTOR = "."; + + /** + * The default key for the label + */ + public static final String DEFAULT_LABEL_PRE = "GROUP="; + + /** + * The default key for the label + */ + public static final String DEFAULT_GROUP = "GROUP"; + private KieConstants() { } } diff --git a/sermant-agentcore/sermant-agentcore-implement/src/main/java/io/sermant/implement/service/dynamicconfig/zookeeper/ZooKeeperClient.java b/sermant-agentcore/sermant-agentcore-implement/src/main/java/io/sermant/implement/service/dynamicconfig/zookeeper/ZooKeeperClient.java index 2b44015e15..c6ff9ac2f7 100644 --- a/sermant-agentcore/sermant-agentcore-implement/src/main/java/io/sermant/implement/service/dynamicconfig/zookeeper/ZooKeeperClient.java +++ b/sermant-agentcore/sermant-agentcore-implement/src/main/java/io/sermant/implement/service/dynamicconfig/zookeeper/ZooKeeperClient.java @@ -48,7 +48,9 @@ public class ZooKeeperClient implements ConfigClient { * ZK path separator */ public static final char ZK_PATH_SEPARATOR = '/'; + private static final Logger LOGGER = LoggerFactory.getLogger(ZooKeeperClient.class.getName()); + /** * ZK client */ @@ -166,33 +168,38 @@ private Map> fuzzyGetConfigListByGroupAndKey(String key, St if (!ifNodeExist(parentNodePath)) { return configList; } - List childList = this.zkClient.getChildren(parentNodePath, false); - for (String child : childList) { + fillChildrenInfo(parentNodePath, configList, nodeName, key); + return configList; + } + + private void fillChildrenInfo(String path, Map> configMap, String nodeName, + String key) throws InterruptedException, KeeperException { + List children = this.zkClient.getChildren(path, false); + children.parallelStream().forEach(child -> { + List subChild; if (!child.contains(nodeName)) { - continue; + return; } - String childPath; - if (parentNodePath.endsWith(String.valueOf(ZK_PATH_SEPARATOR))) { - childPath = parentNodePath + child; - } else { - childPath = parentNodePath + ZK_PATH_SEPARATOR + child; + String childPath = toPath(child, path); + try { + subChild = this.zkClient.getChildren(childPath, false); + } catch (KeeperException | InterruptedException e) { + return; } - List subChild = this.zkClient.getChildren(childPath, false); if (subChild == null || subChild.isEmpty()) { - continue; + return; } if (key == null || key.isEmpty()) { - configList.put(childPath.substring(1), subChild); - continue; + configMap.put(childPath.substring(1), subChild); + return; } List matchSubChild = subChild.stream().filter(value -> value.contains(key)) .collect(Collectors.toList()); if (matchSubChild.isEmpty()) { - continue; + return; } - configList.put(childPath.substring(1), matchSubChild); - } - return configList; + configMap.put(childPath.substring(1), matchSubChild); + }); } private Map> accurateGetConfigListByGroupAndKey(String key, String group) diff --git a/sermant-agentcore/sermant-agentcore-implement/src/main/java/io/sermant/implement/utils/LabelGroupUtils.java b/sermant-agentcore/sermant-agentcore-implement/src/main/java/io/sermant/implement/utils/LabelGroupUtils.java index ddc2c60e70..ee4cade090 100644 --- a/sermant-agentcore/sermant-agentcore-implement/src/main/java/io/sermant/implement/utils/LabelGroupUtils.java +++ b/sermant-agentcore/sermant-agentcore-implement/src/main/java/io/sermant/implement/utils/LabelGroupUtils.java @@ -17,6 +17,7 @@ package io.sermant.implement.utils; import io.sermant.implement.service.dynamicconfig.common.DynamicConstants; +import io.sermant.implement.service.dynamicconfig.kie.constants.KieConstants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -94,7 +95,8 @@ public static String createLabelGroup(Map labels) { if (group.length() == 0) { return DynamicConstants.EMPTY_STRING; } - return group.deleteCharAt(group.length() - 1).toString(); + String groupString = group.deleteCharAt(group.length() - 1).toString(); + return groupString.replace(KieConstants.SEPARATOR, KieConstants.CONNECTOR); } /** @@ -131,7 +133,7 @@ public static Map resolveGroupLabels(String group) { if (group == null) { return result; } - String curGroup = group; + String curGroup = group.replace(KieConstants.SEPARATOR, KieConstants.SEPARATOR); if (!isLabelGroup(curGroup)) { // If the label is not a group (applicable to the ZK configuration center scenario), create a label for // the group @@ -175,7 +177,8 @@ public static String getLabelCondition(String group) { .append(buildSingleLabel(entry.getKey(), entry.getValue())) .append(GROUP_SEPARATOR); } - return finalGroup.deleteCharAt(finalGroup.length() - 1).toString(); + String finalGroupStr = finalGroup.deleteCharAt(finalGroup.length() - 1).toString(); + return finalGroupStr.replace(KieConstants.SEPARATOR, KieConstants.CONNECTOR); } private static String buildSingleLabel(String key, String value) { diff --git a/sermant-backend/src/main/java/io/sermant/backend/common/conf/DynamicConfig.java b/sermant-backend/src/main/java/io/sermant/backend/common/conf/DynamicConfig.java index ade045db61..1a2ba747bd 100644 --- a/sermant-backend/src/main/java/io/sermant/backend/common/conf/DynamicConfig.java +++ b/sermant-backend/src/main/java/io/sermant/backend/common/conf/DynamicConfig.java @@ -91,6 +91,6 @@ public class DynamicConfig { /** * Switch for configuration management */ - @Value("${dynamic.config.dynamicConfigEnable}") - private boolean dynamicConfigEnable; + @Value("${dynamic.config.enable}") + private boolean enable; } diff --git a/sermant-backend/src/main/java/io/sermant/backend/entity/config/ResultCodeType.java b/sermant-backend/src/main/java/io/sermant/backend/entity/config/ResultCodeType.java index a8f8846b21..af4e6a07bc 100644 --- a/sermant-backend/src/main/java/io/sermant/backend/entity/config/ResultCodeType.java +++ b/sermant-backend/src/main/java/io/sermant/backend/entity/config/ResultCodeType.java @@ -74,7 +74,12 @@ public enum ResultCodeType { /** * Interface call failed */ - FAIL("09", "Failure."); + FAIL("09", "Failure."), + + /** + * Dynamic configuration switch not turned on + */ + NOT_ENABLE("10", "Dynamic configuration switch not turned on."); private final String code; diff --git a/sermant-backend/src/main/java/io/sermant/backend/service/ConfigService.java b/sermant-backend/src/main/java/io/sermant/backend/service/ConfigService.java index 2d0a76ea74..0be626f5c9 100644 --- a/sermant-backend/src/main/java/io/sermant/backend/service/ConfigService.java +++ b/sermant-backend/src/main/java/io/sermant/backend/service/ConfigService.java @@ -31,6 +31,7 @@ import io.sermant.implement.service.dynamicconfig.ConfigClient; import io.sermant.implement.service.dynamicconfig.kie.client.ClientUrlManager; import io.sermant.implement.service.dynamicconfig.kie.client.kie.KieClient; +import io.sermant.implement.service.dynamicconfig.kie.constants.KieConstants; import io.sermant.implement.service.dynamicconfig.nacos.NacosClient; import io.sermant.implement.service.dynamicconfig.nacos.NacosUtils; import io.sermant.implement.service.dynamicconfig.zookeeper.ZooKeeperClient; @@ -108,6 +109,9 @@ public Result> getConfigList(ConfigInfo request, PluginType plu String group = entry.getKey(); if (client instanceof NacosClient) { group = NacosUtils.convertGroup(group); + } else if (client instanceof KieClient) { + group = group.replace(KieConstants.CONNECTOR, KieConstants.SEPARATOR); + group = group.replace(KieConstants.DEFAULT_LABEL_PRE, StringUtils.EMPTY); } if (!exactMatchFlag && !handler.verifyConfigurationGroup(group)) { continue; @@ -202,7 +206,7 @@ public Result deleteConfig(ConfigInfo request) { */ @PostConstruct public void init() { - if (!dynamicConfig.isDynamicConfigEnable()) { + if (!dynamicConfig.isEnable()) { return; } EXECUTOR_SERVICE.scheduleAtFixedRate(this::reConnection, dynamicConfig.getConnectTimeout(), @@ -262,7 +266,6 @@ private ConfigClient createNacosClient(String namespace) { try { client = new NacosClient(properties); CONFIG_CLIENT_MAP.put(namespace, client); - return client; } catch (NacosException e) { LOGGER.error("Nacos connection exception", e); } @@ -294,6 +297,9 @@ private Properties createProperties(String namespace) { * @return Configuration Center Client */ public Result checkConnection(ConfigInfo request) { + if (!dynamicConfig.isEnable()) { + return new Result<>(ResultCodeType.NOT_ENABLE.getCode(), ResultCodeType.NOT_ENABLE.getMessage()); + } ConfigClient client = getConfigClient(request.getNamespace()); if (client == null || !client.isConnect()) { return new Result<>(ResultCodeType.CONNECT_FAIL.getCode(), ResultCodeType.CONNECT_FAIL.getMessage()); diff --git a/sermant-backend/src/main/resources/application.properties b/sermant-backend/src/main/resources/application.properties index 07a1d27b35..fec3ac00d1 100644 --- a/sermant-backend/src/main/resources/application.properties +++ b/sermant-backend/src/main/resources/application.properties @@ -38,11 +38,11 @@ database.fixedDelay=10000 session.expire=60 # Dynamic config service configuration -dynamic.config.dynamicConfigEnable=true +dynamic.config.enable=true dynamic.config.namespace=default dynamic.config.timeout=30000 -dynamic.config.serverAddress=127.0.0.1:30110 -dynamic.config.dynamicConfigType=KIE +dynamic.config.serverAddress=127.0.0.1:8848 +dynamic.config.dynamicConfigType=NACOS dynamic.config.connectTimeout=3000 dynamic.config.enableAuth=false dynamic.config.userName= diff --git a/sermant-backend/src/main/webapp/frontend/auto-imports.d.ts b/sermant-backend/src/main/webapp/frontend/auto-imports.d.ts index ccbac87ae6..918aad8808 100644 --- a/sermant-backend/src/main/webapp/frontend/auto-imports.d.ts +++ b/sermant-backend/src/main/webapp/frontend/auto-imports.d.ts @@ -4,5 +4,5 @@ // Generated by unplugin-auto-import export {} declare global { - const ElMessage: typeof import('element-plus/es')['ElMessage'] + } diff --git a/sermant-backend/src/main/webapp/frontend/src/composables/config.ts b/sermant-backend/src/main/webapp/frontend/src/composables/config.ts index cb7556b7a4..cd04b3e502 100644 --- a/sermant-backend/src/main/webapp/frontend/src/composables/config.ts +++ b/sermant-backend/src/main/webapp/frontend/src/composables/config.ts @@ -12,6 +12,7 @@ const resultCodes = [ {code: '07', key: 'common.configurationDoesNotExist'}, {code: '08', key: 'common.missingRequestParameters'}, {code: '09', key: 'common.failedToRequest'}, + {code: '10', key: 'common.notEnable'}, ]; export const resultCodeMap = new Map(resultCodes.map(item => [item.code, i18n.global.t(item.key)])); diff --git a/sermant-backend/src/main/webapp/frontend/src/composables/translations.ts b/sermant-backend/src/main/webapp/frontend/src/composables/translations.ts index 40884a7884..6eaf7320c6 100644 --- a/sermant-backend/src/main/webapp/frontend/src/composables/translations.ts +++ b/sermant-backend/src/main/webapp/frontend/src/composables/translations.ts @@ -157,6 +157,7 @@ const messages = { configurationDoesNotExist: 'Configuration does not exist', missingRequestParameters: 'Missing request parameters', failedToRequest: 'Failed to request', + notEnable: 'Dynamic configuration switch not turned on', router: 'router', springbootRegistry: 'springboot-registry', serviceRegistry: 'service-registry', @@ -372,6 +373,7 @@ const messages = { configurationDoesNotExist: '配置不存在', missingRequestParameters: '缺少请求参数', failedToRequest: '请求失败', + notEnable: '动态配置开关未开启', router: '路由插件', springbootRegistry: 'springboot注册插件', serviceRegistry: '注册迁移插件', diff --git a/sermant-backend/src/main/webapp/frontend/src/views/ConfigInfo.vue b/sermant-backend/src/main/webapp/frontend/src/views/ConfigInfo.vue index 9fd97f3ce2..17f0ab1214 100644 --- a/sermant-backend/src/main/webapp/frontend/src/views/ConfigInfo.vue +++ b/sermant-backend/src/main/webapp/frontend/src/views/ConfigInfo.vue @@ -226,7 +226,7 @@ import {onMounted, reactive, ref, watch} from "vue"; import {LocationQuery, useRouter} from "vue-router"; import axios from "axios"; import TooltipIcon from '../components/layouts/TooltipIcon.vue' -import {ElMessage, FormInstance, FormRules} from "element-plus"; +import {ElMessage, FormInstance} from "element-plus"; import {options, resultCodeMap} from '~/composables/config' import i18n from "~/composables/translations"; @@ -315,7 +315,11 @@ const goBack = () => { const getConfig = () => { axios.get(`${window.location.origin}/sermant/config`, { - params: requestParam, + params : { + key: requestParam.key, + group: requestParam.group, + namespace: requestParam.namespace + } }).then(function (response) { if (response.data.code == "00") { requestParam.content = response.data.data.content; diff --git a/sermant-backend/src/test/java/io/sermant/backend/service/ConfigServiceTest.java b/sermant-backend/src/test/java/io/sermant/backend/service/ConfigServiceTest.java index 044839993e..2ca8f6f78c 100644 --- a/sermant-backend/src/test/java/io/sermant/backend/service/ConfigServiceTest.java +++ b/sermant-backend/src/test/java/io/sermant/backend/service/ConfigServiceTest.java @@ -77,6 +77,7 @@ public void setUp() { PowerMockito.when(configClient.getConfig(KEY, GROUP)).thenReturn(CONTENT); PowerMockito.when(configClient.publishConfig(KEY, GROUP, CONTENT)).thenReturn(true); PowerMockito.when(configClient.removeConfig(KEY, GROUP)).thenReturn(true); + PowerMockito.when(dynamicConfig.isEnable()).thenReturn(true); } @Test