From 06a575b94f08f0da72da519f433ee8430861ad45 Mon Sep 17 00:00:00 2001 From: Wink <809097465@qq.com> Date: Sun, 15 Mar 2026 17:33:26 +0800 Subject: [PATCH 1/9] [Fix-4530-1.2] Fix resolve pagination error when changing pages on the Registry --- .../main/resources/mapper/DocumentMapper.xml | 7 ++++ dinky-web/pom.xml | 40 +++++++++---------- .../components/DocumentProTable/index.tsx | 14 ++----- 3 files changed, 31 insertions(+), 30 deletions(-) diff --git a/dinky-admin/src/main/resources/mapper/DocumentMapper.xml b/dinky-admin/src/main/resources/mapper/DocumentMapper.xml index 604c8fe14e..a3a3cd95dd 100644 --- a/dinky-admin/src/main/resources/mapper/DocumentMapper.xml +++ b/dinky-admin/src/main/resources/mapper/DocumentMapper.xml @@ -46,6 +46,13 @@ and a.subtype = #{param.subtype} + + and a.enabled = + + 1 + 0 + + and a.version = #{param.version} diff --git a/dinky-web/pom.xml b/dinky-web/pom.xml index e81a054878..6635b17191 100644 --- a/dinky-web/pom.xml +++ b/dinky-web/pom.xml @@ -51,8 +51,8 @@ 10.5.0 9.15.4 - - + + @@ -61,24 +61,24 @@ install-node-and-pnpm - - install - - pnpm - - - install --registry ${npm-registry-repo} - - - - build - - pnpm - - - run build - - + + install + + pnpm + + + install --registry ${npm-registry-repo} + + + + build + + pnpm + + + run build + + diff --git a/dinky-web/src/pages/RegCenter/Document/components/DocumentProTable/index.tsx b/dinky-web/src/pages/RegCenter/Document/components/DocumentProTable/index.tsx index a5ebecbbad..ec0491d3e8 100644 --- a/dinky-web/src/pages/RegCenter/Document/components/DocumentProTable/index.tsx +++ b/dinky-web/src/pages/RegCenter/Document/components/DocumentProTable/index.tsx @@ -117,16 +117,12 @@ const DocumentTableList: React.FC = () => { title: l('rc.doc.functionType'), sorter: true, dataIndex: 'type', - filterMultiple: true, - filters: true, valueEnum: DOCUMENT_TYPE_ENUMS }, { title: l('rc.doc.subFunctionType'), sorter: true, dataIndex: 'subtype', - filters: true, - filterMultiple: true, renderFormItem: (item, { type }, form) => { const currentType = form.getFieldValue('type'); let options = currentType === DOCUMENT_TYPE_ENUMS.FUN_UDF.value ? FUNCTION_TYPES : JOB_TYPE; @@ -139,8 +135,6 @@ const DocumentTableList: React.FC = () => { title: l('rc.doc.category'), sorter: true, dataIndex: 'category', - filterMultiple: true, - filters: true, valueEnum: DOCUMENT_CATEGORY_ENUMS }, { @@ -172,11 +166,11 @@ const DocumentTableList: React.FC = () => { { title: l('global.table.isEnable'), dataIndex: 'enabled', - hideInSearch: true, - filters: STATUS_MAPPING(), - filterMultiple: false, hideInDescriptions: true, - valueEnum: STATUS_ENUM(), + valueType: 'select', + valueEnum: Object.fromEntries( + STATUS_MAPPING().map(item => [item.value, { text: item.text, status: item.value === 1 ? 'Success' : 'Error' }]) + ), render: (_, record) => { return ( Date: Sun, 15 Mar 2026 18:24:12 +0800 Subject: [PATCH 2/9] upgrade k3s --- .github/workflows/backend.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/backend.yaml b/.github/workflows/backend.yaml index dcd0f4f2bd..17d22feaba 100644 --- a/.github/workflows/backend.yaml +++ b/.github/workflows/backend.yaml @@ -244,7 +244,7 @@ jobs: - name: Init k3s uses: nolar/setup-k3d-k3s@v1 with: - version: v1.27.16+k3s1 + version: v1.35.2+k3s1 k3d-args: -s 1 --network dinky_net --api-port 172.28.0.1:6550 k3d-tag: v5.7.5 - name: Get k3s kube config From 8ab9ea06e27e5b71b030994f9eb486981487abbd Mon Sep 17 00:00:00 2001 From: Wink <809097465@qq.com> Date: Mon, 16 Mar 2026 23:42:19 +0800 Subject: [PATCH 3/9] Fix NPE --- .../java/org/dinky/gateway/kubernetes/KubernetesGateway.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/KubernetesGateway.java b/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/KubernetesGateway.java index ae9bd7236d..187dac6aea 100644 --- a/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/KubernetesGateway.java +++ b/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/KubernetesGateway.java @@ -237,8 +237,10 @@ public TestResult test() { return TestResult.success(); } catch (Exception e) { logger.error(Status.GATEWAY_KUBERNETES_TEST_FAILED.getMessage(), e); + String errorDetail = + e.getMessage() != null ? e.getMessage() : e.toString(); return TestResult.fail( - StrFormatter.format("{}:{}", Status.GATEWAY_KUBERNETES_TEST_FAILED.getMessage(), e.getMessage())); + StrFormatter.format("{} {}", Status.GATEWAY_KUBERNETES_TEST_FAILED.getMessage(), errorDetail)); } finally { close(); } From 4d9443e1ec683122e38de00faf241728f5a91ea4 Mon Sep 17 00:00:00 2001 From: Wink <809097465@qq.com> Date: Tue, 17 Mar 2026 00:47:58 +0800 Subject: [PATCH 4/9] spotless --- .../java/org/dinky/gateway/kubernetes/KubernetesGateway.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/KubernetesGateway.java b/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/KubernetesGateway.java index 187dac6aea..43cc82be14 100644 --- a/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/KubernetesGateway.java +++ b/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/KubernetesGateway.java @@ -237,8 +237,7 @@ public TestResult test() { return TestResult.success(); } catch (Exception e) { logger.error(Status.GATEWAY_KUBERNETES_TEST_FAILED.getMessage(), e); - String errorDetail = - e.getMessage() != null ? e.getMessage() : e.toString(); + String errorDetail = e.getMessage() != null ? e.getMessage() : e.toString(); return TestResult.fail( StrFormatter.format("{} {}", Status.GATEWAY_KUBERNETES_TEST_FAILED.getMessage(), errorDetail)); } finally { From 4c02d0bb5abf93510b5e3ad7528552eb941c971e Mon Sep 17 00:00:00 2001 From: Wink <809097465@qq.com> Date: Fri, 20 Mar 2026 21:35:41 +0800 Subject: [PATCH 5/9] fix e2e --- .../gateway/kubernetes/KubernetesGateway.java | 20 +++++++- .../kubernetes/KubernetesGatewayTest.java | 48 +++++++++++++++++++ e2e_test/tools/env.py | 11 +++-- 3 files changed, 73 insertions(+), 6 deletions(-) create mode 100644 dinky-gateway/src/test/java/org/dinky/gateway/kubernetes/KubernetesGatewayTest.java diff --git a/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/KubernetesGateway.java b/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/KubernetesGateway.java index 43cc82be14..c6adad48f0 100644 --- a/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/KubernetesGateway.java +++ b/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/KubernetesGateway.java @@ -45,6 +45,7 @@ import org.apache.flink.kubernetes.kubeclient.FlinkKubeClient; import org.apache.flink.python.PythonOptions; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Collections; import java.util.Map; @@ -237,7 +238,7 @@ public TestResult test() { return TestResult.success(); } catch (Exception e) { logger.error(Status.GATEWAY_KUBERNETES_TEST_FAILED.getMessage(), e); - String errorDetail = e.getMessage() != null ? e.getMessage() : e.toString(); + String errorDetail = extractTestErrorDetail(e); return TestResult.fail( StrFormatter.format("{} {}", Status.GATEWAY_KUBERNETES_TEST_FAILED.getMessage(), errorDetail)); } finally { @@ -245,6 +246,23 @@ public TestResult test() { } } + static String extractTestErrorDetail(Throwable throwable) { + Throwable rootCause = throwable; + while (rootCause instanceof InvocationTargetException + && ((InvocationTargetException) rootCause).getTargetException() != null) { + rootCause = ((InvocationTargetException) rootCause).getTargetException(); + } + while (rootCause.getCause() != null && rootCause.getCause() != rootCause) { + rootCause = rootCause.getCause(); + } + + String message = rootCause.getMessage(); + if (StringUtils.isBlank(message)) { + return rootCause.getClass().getName(); + } + return StrFormatter.format("{}: {}", rootCause.getClass().getName(), message); + } + @Override public void killCluster() { log.info("Start kill cluster: " + config.getFlinkConfig().getJobName()); diff --git a/dinky-gateway/src/test/java/org/dinky/gateway/kubernetes/KubernetesGatewayTest.java b/dinky-gateway/src/test/java/org/dinky/gateway/kubernetes/KubernetesGatewayTest.java new file mode 100644 index 0000000000..a8f3e88dcb --- /dev/null +++ b/dinky-gateway/src/test/java/org/dinky/gateway/kubernetes/KubernetesGatewayTest.java @@ -0,0 +1,48 @@ +/* + * + * 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.dinky.gateway.kubernetes; + +import static org.junit.Assert.assertEquals; + +import java.lang.reflect.InvocationTargetException; + +import org.junit.Test; + +public class KubernetesGatewayTest { + + @Test + public void testExtractTestErrorDetailUnwrapsInvocationTargetException() { + IllegalStateException rootCause = new IllegalStateException("connection refused"); + InvocationTargetException invocationTargetException = new InvocationTargetException(rootCause); + + String errorDetail = KubernetesGateway.extractTestErrorDetail(invocationTargetException); + + assertEquals("java.lang.IllegalStateException: connection refused", errorDetail); + } + + @Test + public void testExtractTestErrorDetailFallsBackToClassName() { + NullPointerException rootCause = new NullPointerException(); + + String errorDetail = KubernetesGateway.extractTestErrorDetail(rootCause); + + assertEquals("java.lang.NullPointerException", errorDetail); + } +} diff --git a/e2e_test/tools/env.py b/e2e_test/tools/env.py index 0ce58b4f6c..ebff3d564b 100644 --- a/e2e_test/tools/env.py +++ b/e2e_test/tools/env.py @@ -33,12 +33,13 @@ def addStandaloneCluster(session: Session) -> int: def addApplicationCluster(session: Session, params: dict) -> Optional[int]: name = params['name'] - test_connection_yarn_resp = session.post(url("api/clusterConfiguration/testConnect"), json=params) - assertRespOk(test_connection_yarn_resp, "Test yarn connectivity") - test_connection_yarn_resp = session.put(url("api/clusterConfiguration/saveOrUpdate"), json=params) - assertRespOk(test_connection_yarn_resp, "Add Yarn Application Cluster") + cluster_type = params["type"] + test_connection_resp = session.post(url("api/clusterConfiguration/testConnect"), json=params) + assertRespOk(test_connection_resp, f"Test {cluster_type} connectivity") + save_cluster_resp = session.put(url("api/clusterConfiguration/saveOrUpdate"), json=params) + assertRespOk(save_cluster_resp, f"Add {cluster_type} cluster") get_app_list = session.get(url(f"api/clusterConfiguration/list?keyword={name}"), json=params) - assertRespOk(get_app_list, "Get Yarn Application Cluster") + assertRespOk(get_app_list, f"Get {cluster_type} cluster") for data in get_app_list.json()["data"]: if data["name"] == name: return data['id'] From 0108ce0f6f5ee3819db478a90ad55dda8e436831 Mon Sep 17 00:00:00 2001 From: Wink <809097465@qq.com> Date: Fri, 20 Mar 2026 21:49:05 +0800 Subject: [PATCH 6/9] test e2e --- .../gateway/kubernetes/KubernetesGateway.java | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/KubernetesGateway.java b/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/KubernetesGateway.java index c6adad48f0..019cd63f86 100644 --- a/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/KubernetesGateway.java +++ b/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/KubernetesGateway.java @@ -41,12 +41,9 @@ import org.apache.flink.kubernetes.KubernetesClusterClientFactory; import org.apache.flink.kubernetes.KubernetesClusterDescriptor; import org.apache.flink.kubernetes.configuration.KubernetesConfigOptions; -import org.apache.flink.kubernetes.kubeclient.Fabric8FlinkKubeClient; -import org.apache.flink.kubernetes.kubeclient.FlinkKubeClient; import org.apache.flink.python.PythonOptions; import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.util.Collections; import java.util.Map; import java.util.UUID; @@ -225,16 +222,9 @@ public TestResult test() { // Test mode no jobName, use uuid . addConfigParas(KubernetesConfigOptions.CLUSTER_ID, UUID.randomUUID().toString()); initConfig(); - FlinkKubeClient client = k8sClientHelper.getClient(); - if (client instanceof Fabric8FlinkKubeClient) { - Object internalClient = ReflectUtil.getFieldValue(client, "internalClient"); - Method method = ReflectUtil.getMethod(internalClient.getClass(), "getVersion"); - Object versionInfo = method.invoke(internalClient); - logger.info( - "k8s cluster link successful ; k8s version: {} ; platform: {}", - ReflectUtil.getFieldValue(versionInfo, "gitVersion"), - ReflectUtil.getFieldValue(versionInfo, "platform")); - } + String namespace = configuration.get(KubernetesConfigOptions.NAMESPACE); + k8sClientHelper.getKubernetesClient().pods().inNamespace(namespace).list(); + logger.info("k8s cluster link successful ; namespace: {}", namespace); return TestResult.success(); } catch (Exception e) { logger.error(Status.GATEWAY_KUBERNETES_TEST_FAILED.getMessage(), e); From 271f46d9c27ffbe8e2e98c87e854213acf7c260d Mon Sep 17 00:00:00 2001 From: Wink <809097465@qq.com> Date: Fri, 20 Mar 2026 21:52:56 +0800 Subject: [PATCH 7/9] spotless --- .../java/org/dinky/gateway/kubernetes/KubernetesGateway.java | 1 - 1 file changed, 1 deletion(-) diff --git a/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/KubernetesGateway.java b/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/KubernetesGateway.java index 019cd63f86..803036096a 100644 --- a/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/KubernetesGateway.java +++ b/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/KubernetesGateway.java @@ -53,7 +53,6 @@ import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.text.StrFormatter; -import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; import io.fabric8.kubernetes.api.model.Pod; import lombok.Data; From 9733d6ba302c3b14cbedc788253f5808d78e2fb4 Mon Sep 17 00:00:00 2001 From: Wink <809097465@qq.com> Date: Fri, 20 Mar 2026 22:16:19 +0800 Subject: [PATCH 8/9] test e2e --- .github/workflows/backend.yaml | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/.github/workflows/backend.yaml b/.github/workflows/backend.yaml index 17d22feaba..8f38ae9c61 100644 --- a/.github/workflows/backend.yaml +++ b/.github/workflows/backend.yaml @@ -247,13 +247,32 @@ jobs: version: v1.35.2+k3s1 k3d-args: -s 1 --network dinky_net --api-port 172.28.0.1:6550 k3d-tag: v5.7.5 - - name: Get k3s kube config - run: k3d kubeconfig get --all && mkdir ./kube && k3d kubeconfig get --all > ./kube/k3s.yaml && sed -i 's/0.0.0.0/172.28.0.1/g' ./kube/k3s.yaml - name: Init k8s RBAC and namespace run: | kubectl create namespace dinky kubectl create serviceaccount dinky -n dinky kubectl create clusterrolebinding flink-role-binding-dinky --clusterrole=edit --serviceaccount=dinky:dinky + mkdir ./kube + cat < ./kube/k3s.yaml + apiVersion: v1 + kind: Config + clusters: + - name: k3d-default + cluster: + server: https://172.28.0.1:6550 + insecure-skip-tls-verify: true + users: + - name: dinky + user: + token: $(kubectl create token dinky -n dinky) + contexts: + - name: dinky + context: + cluster: k3d-default + namespace: dinky + user: dinky + current-context: dinky + EOF - name: Init k3s main images run: | docker exec k3d-k3s-default-server-0 crictl pull library/busybox:latest From 575d47e652fab984e3674960b1dccfb36563a853 Mon Sep 17 00:00:00 2001 From: Wink <809097465@qq.com> Date: Fri, 20 Mar 2026 22:56:17 +0800 Subject: [PATCH 9/9] test --- .github/workflows/backend.yaml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/.github/workflows/backend.yaml b/.github/workflows/backend.yaml index 8f38ae9c61..fc9ae65001 100644 --- a/.github/workflows/backend.yaml +++ b/.github/workflows/backend.yaml @@ -252,6 +252,29 @@ jobs: kubectl create namespace dinky kubectl create serviceaccount dinky -n dinky kubectl create clusterrolebinding flink-role-binding-dinky --clusterrole=edit --serviceaccount=dinky:dinky + cat < ./kube/k3s.yaml apiVersion: v1