This is an automated email from the ASF dual-hosted git repository.
lizhimins pushed a commit to branch rocketmq-studio
in repository https://gitbox.apache.org/repos/asf/rocketmq-dashboard.git
The following commit(s) were added to refs/heads/rocketmq-studio by this push:
new 4e349459 fix: report corrupt K8s certificate records (#1417)
4e349459 is described below
commit 4e349459b1957cf6936ca3a4ac3f769caacec7c9
Author: aias00 <[email protected]>
AuthorDate: Mon Aug 10 20:44:24 2026 +0800
fix: report corrupt K8s certificate records (#1417)
---
.../cluster/k8s/MybatisPlusK8sCertRepository.java | 24 ++++++++++++++--------
.../k8s/MybatisPlusK8sCertRepositoryTest.java | 17 +++++++++++++--
2 files changed, 30 insertions(+), 11 deletions(-)
diff --git
a/server/src/main/java/org/apache/rocketmq/studio/cluster/k8s/MybatisPlusK8sCertRepository.java
b/server/src/main/java/org/apache/rocketmq/studio/cluster/k8s/MybatisPlusK8sCertRepository.java
index 87ed6b28..155b576f 100644
---
a/server/src/main/java/org/apache/rocketmq/studio/cluster/k8s/MybatisPlusK8sCertRepository.java
+++
b/server/src/main/java/org/apache/rocketmq/studio/cluster/k8s/MybatisPlusK8sCertRepository.java
@@ -22,6 +22,7 @@ import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.rocketmq.studio.common.domain.enums.CertStatus;
import org.apache.rocketmq.studio.common.domain.enums.CertType;
+import org.apache.rocketmq.studio.common.exception.BusinessException;
import org.apache.rocketmq.studio.persistence.entity.RmqK8sCertificate;
import org.apache.rocketmq.studio.persistence.mapper.RmqK8sCertificateMapper;
import org.springframework.stereotype.Repository;
@@ -81,13 +82,13 @@ public class MybatisPlusK8sCertRepository implements
K8sCertRepository {
vo.setName(entity.getName());
vo.setNamespace(entity.getNamespace());
vo.setCluster(entity.getCluster());
- vo.setType(parseCertType(entity.getCertType()));
+ vo.setType(parseCertType(entity.getId(), entity.getCertType()));
vo.setIssuer(entity.getIssuer());
vo.setNotBefore(entity.getNotBefore());
vo.setNotAfter(entity.getNotAfter());
- vo.setStatus(parseCertStatus(entity.getStatus()));
+ vo.setStatus(parseCertStatus(entity.getId(), entity.getStatus()));
vo.setDaysRemaining(entity.getDaysRemaining() == null ? 0 :
entity.getDaysRemaining());
- vo.setSan(parseSan(entity.getSan()));
+ vo.setSan(parseSan(entity.getId(), entity.getSan()));
vo.setCreatedAt(entity.getCreatedAt());
vo.setUpdatedAt(entity.getUpdatedAt());
return vo;
@@ -111,29 +112,29 @@ public class MybatisPlusK8sCertRepository implements
K8sCertRepository {
return entity;
}
- private CertType parseCertType(String value) {
+ private CertType parseCertType(String certificateId, String value) {
if (!StringUtils.hasText(value)) {
return null;
}
try {
return CertType.valueOf(value);
} catch (IllegalArgumentException exception) {
- throw new IllegalStateException("Invalid persisted certificate
type: " + value, exception);
+ throw invalidPersistedValue(certificateId, "type", value);
}
}
- private CertStatus parseCertStatus(String value) {
+ private CertStatus parseCertStatus(String certificateId, String value) {
if (!StringUtils.hasText(value)) {
return null;
}
try {
return CertStatus.valueOf(value);
} catch (IllegalArgumentException exception) {
- throw new IllegalStateException("Invalid persisted certificate
status: " + value, exception);
+ throw invalidPersistedValue(certificateId, "status", value);
}
}
- private List<String> parseSan(String json) {
+ private List<String> parseSan(String certificateId, String json) {
if (!StringUtils.hasText(json)) {
return List.of();
}
@@ -141,10 +142,15 @@ public class MybatisPlusK8sCertRepository implements
K8sCertRepository {
return objectMapper.readValue(json, new
TypeReference<List<String>>() {
});
} catch (JsonProcessingException exception) {
- throw new IllegalStateException("Invalid persisted certificate SAN
JSON", exception);
+ throw invalidPersistedValue(certificateId, "SAN JSON", json);
}
}
+ private BusinessException invalidPersistedValue(String certificateId,
String field, String value) {
+ return new BusinessException(500, "Invalid persisted certificate " +
field
+ + " for certificate " + certificateId + ": " + value);
+ }
+
private String writeSan(List<String> san) {
if (san == null) {
return null;
diff --git
a/server/src/test/java/org/apache/rocketmq/studio/cluster/k8s/MybatisPlusK8sCertRepositoryTest.java
b/server/src/test/java/org/apache/rocketmq/studio/cluster/k8s/MybatisPlusK8sCertRepositoryTest.java
index 011d6f67..4f3ce18f 100644
---
a/server/src/test/java/org/apache/rocketmq/studio/cluster/k8s/MybatisPlusK8sCertRepositoryTest.java
+++
b/server/src/test/java/org/apache/rocketmq/studio/cluster/k8s/MybatisPlusK8sCertRepositoryTest.java
@@ -17,6 +17,7 @@
package org.apache.rocketmq.studio.cluster.k8s;
import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.rocketmq.studio.common.exception.BusinessException;
import org.apache.rocketmq.studio.persistence.entity.RmqK8sCertificate;
import org.apache.rocketmq.studio.persistence.mapper.RmqK8sCertificateMapper;
import org.junit.jupiter.api.Test;
@@ -35,7 +36,7 @@ class MybatisPlusK8sCertRepositoryTest {
when(mapper.selectById("cert-1")).thenReturn(entity);
assertThatThrownBy(() -> repository(mapper).findById("cert-1"))
- .isInstanceOf(IllegalStateException.class)
+ .isInstanceOf(BusinessException.class)
.hasMessageContaining("certificate type");
}
@@ -47,10 +48,22 @@ class MybatisPlusK8sCertRepositoryTest {
when(mapper.selectById("cert-1")).thenReturn(entity);
assertThatThrownBy(() -> repository(mapper).findById("cert-1"))
- .isInstanceOf(IllegalStateException.class)
+ .isInstanceOf(BusinessException.class)
.hasMessageContaining("SAN JSON");
}
+ @Test
+ void findByIdSurfacesInvalidPersistedCertificateStatus() {
+ RmqK8sCertificateMapper mapper = mock(RmqK8sCertificateMapper.class);
+ RmqK8sCertificate entity = certificate();
+ entity.setStatus("unknown");
+ when(mapper.selectById("cert-1")).thenReturn(entity);
+
+ assertThatThrownBy(() -> repository(mapper).findById("cert-1"))
+ .isInstanceOf(BusinessException.class)
+ .hasMessageContaining("certificate status");
+ }
+
private MybatisPlusK8sCertRepository repository(RmqK8sCertificateMapper
mapper) {
return new MybatisPlusK8sCertRepository(mapper, new ObjectMapper());
}