From 18d923db398fc6432ae9e90ae7ef6bb176ff117c Mon Sep 17 00:00:00 2001 From: Wink <809097465@qq.com> Date: Sat, 21 Mar 2026 13:58:28 +0800 Subject: [PATCH 1/2] [Fix-4530] Fix resolve pagination error when changing pages on the Registry --- .github/workflows/backend.yaml | 46 ++++++++++++++++++- .../main/resources/mapper/DocumentMapper.xml | 7 +++ .../gateway/kubernetes/KubernetesGateway.java | 38 +++++++++------ .../components/DocumentProTable/index.tsx | 14 ++---- e2e_test/tools/env.py | 11 +++-- 5 files changed, 84 insertions(+), 32 deletions(-) diff --git a/.github/workflows/backend.yaml b/.github/workflows/backend.yaml index f1676c7888..8b23567afc 100644 --- a/.github/workflows/backend.yaml +++ b/.github/workflows/backend.yaml @@ -246,13 +246,55 @@ 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 + 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 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-gateway/src/main/java/org/dinky/gateway/kubernetes/KubernetesGateway.java b/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/KubernetesGateway.java index e9d8b6508c..694a400b0d 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,11 +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.Method; +import java.lang.reflect.InvocationTargetException; import java.util.Collections; import java.util.Map; import java.util.UUID; @@ -55,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; @@ -226,26 +223,37 @@ 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); + String errorDetail = extractTestErrorDetail(e); return TestResult.fail( - StrFormatter.format("{}:{}", Status.GATEWAY_KUBERNETES_TEST_FAILED.getMessage(), e.getMessage())); + StrFormatter.format("{} {}", Status.GATEWAY_KUBERNETES_TEST_FAILED.getMessage(), errorDetail)); } finally { close(); } } + 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-web/src/pages/RegCenter/Document/components/DocumentProTable/index.tsx b/dinky-web/src/pages/RegCenter/Document/components/DocumentProTable/index.tsx index 42e473610b..26780c7a71 100644 --- a/dinky-web/src/pages/RegCenter/Document/components/DocumentProTable/index.tsx +++ b/dinky-web/src/pages/RegCenter/Document/components/DocumentProTable/index.tsx @@ -120,16 +120,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, valueEnum: DOCUMENT_FUNCTION_TYPE_ENUMS, renderFormItem: (item, { type }, form) => { const currentType = form.getFieldValue('type'); @@ -141,8 +137,6 @@ const DocumentTableList: React.FC = () => { title: l('rc.doc.category'), sorter: true, dataIndex: 'category', - filterMultiple: true, - filters: true, valueEnum: DOCUMENT_CATEGORY_ENUMS }, { @@ -174,11 +168,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 ( 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 978bc7038ef6bf72ada4460d090899d94e7302bc Mon Sep 17 00:00:00 2001 From: Wink <809097465@qq.com> Date: Sat, 21 Mar 2026 14:16:28 +0800 Subject: [PATCH 2/2] Fix indentation --- .github/workflows/backend.yaml | 86 +++++++++++++++++----------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/.github/workflows/backend.yaml b/.github/workflows/backend.yaml index 8b23567afc..2750e107c4 100644 --- a/.github/workflows/backend.yaml +++ b/.github/workflows/backend.yaml @@ -252,49 +252,49 @@ jobs: kubectl create serviceaccount dinky -n dinky kubectl create clusterrolebinding flink-role-binding-dinky --clusterrole=edit --serviceaccount=dinky:dinky 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 + apiVersion: rbac.authorization.k8s.io/v1 + kind: ClusterRole + metadata: + name: dinky-node-reader + rules: + - apiGroups: [""] + resources: ["nodes"] + verbs: ["get", "list", "watch"] + --- + apiVersion: rbac.authorization.k8s.io/v1 + kind: ClusterRoleBinding + metadata: + name: dinky-node-reader-binding + roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: dinky-node-reader + subjects: + - kind: ServiceAccount + name: dinky + namespace: dinky + EOF + 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