From 8c38c0bfbeb5a06046cb38ecf63fb4ffd05dfe05 Mon Sep 17 00:00:00 2001 From: waner Date: Wed, 15 Apr 2026 11:19:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ResourceBackupController.java | 6 +- .../init/dto/CurrentInitConfigResponse.java | 32 ++----- .../init/service/impl/InitServiceImpl.java | 21 +---- .../modules/init/service/InitServiceTest.java | 92 +++++++++++++++---- 4 files changed, 87 insertions(+), 64 deletions(-) diff --git a/src/main/java/com/cisd/tms/modules/backup/controller/ResourceBackupController.java b/src/main/java/com/cisd/tms/modules/backup/controller/ResourceBackupController.java index 7a944a5..64801ba 100644 --- a/src/main/java/com/cisd/tms/modules/backup/controller/ResourceBackupController.java +++ b/src/main/java/com/cisd/tms/modules/backup/controller/ResourceBackupController.java @@ -15,6 +15,8 @@ import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import java.util.List; + +import lombok.RequiredArgsConstructor; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; import org.springframework.http.ContentDisposition; @@ -30,14 +32,12 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/v1/resource-backups") +@RequiredArgsConstructor @Tag(name = "资源备份", description = "资源备份创建、状态查询和步骤日志接口") public class ResourceBackupController { private final ResourceBackupService resourceBackupService; - public ResourceBackupController(ResourceBackupService resourceBackupService) { - this.resourceBackupService = resourceBackupService; - } @GetMapping("/keyset/status") @Operation(summary = "查询资源备份密钥状态", description = "返回资源备份恢复前置密钥状态和公钥指纹。") diff --git a/src/main/java/com/cisd/tms/modules/init/dto/CurrentInitConfigResponse.java b/src/main/java/com/cisd/tms/modules/init/dto/CurrentInitConfigResponse.java index 052547e..4c2a53b 100644 --- a/src/main/java/com/cisd/tms/modules/init/dto/CurrentInitConfigResponse.java +++ b/src/main/java/com/cisd/tms/modules/init/dto/CurrentInitConfigResponse.java @@ -25,12 +25,8 @@ public class CurrentInitConfigResponse { private String node01Ip; @Schema(description = "节点二 IP", example = "10.0.0.2") private String node02Ip; - @Schema(description = "签名服务地址", example = "172.30.1.101") - private String signHost; - @Schema(description = "签名服务端口", example = "50006") - private Integer signPort; - @Schema(description = "签名服务类型", example = "INFSEC") - private String signType; + @Schema(description = "CIPS 中心网关地址", example = "192.168.10.20") + private String cipsGatewayHost; public String getOrgCodeType() { return orgCodeType; @@ -112,27 +108,11 @@ public class CurrentInitConfigResponse { this.node02Ip = node02Ip; } - public String getSignHost() { - return signHost; + public String getCipsGatewayHost() { + return cipsGatewayHost; } - public void setSignHost(String signHost) { - this.signHost = signHost; - } - - public Integer getSignPort() { - return signPort; - } - - public void setSignPort(Integer signPort) { - this.signPort = signPort; - } - - public String getSignType() { - return signType; - } - - public void setSignType(String signType) { - this.signType = signType; + public void setCipsGatewayHost(String cipsGatewayHost) { + this.cipsGatewayHost = cipsGatewayHost; } } diff --git a/src/main/java/com/cisd/tms/modules/init/service/impl/InitServiceImpl.java b/src/main/java/com/cisd/tms/modules/init/service/impl/InitServiceImpl.java index 8933611..598c2eb 100644 --- a/src/main/java/com/cisd/tms/modules/init/service/impl/InitServiceImpl.java +++ b/src/main/java/com/cisd/tms/modules/init/service/impl/InitServiceImpl.java @@ -720,7 +720,7 @@ public class InitServiceImpl implements InitService { JsonNode request = root.path("request"); JsonNode mq = request.path("mq"); JsonNode nodes = request.path("nodes"); - JsonNode signServer = request.path("signServer"); + JsonNode directTlq = request.path("directTlq"); CurrentInitConfigResponse response = new CurrentInitConfigResponse(); response.setOrgCodeType(firstNonBlank(normalizeUpper(text(request, "orgCodeType")), normalizeUpper(text(root, "orgCodeType")))); @@ -733,10 +733,7 @@ public class InitServiceImpl implements InitService { response.setChannelUsername(firstNonBlank(text(mq, "channelUsername"), text(request, "channelUsername"))); response.setNode01Ip(firstNonBlank(text(nodes, "node01Ip"), text(request, "node01Ip"))); response.setNode02Ip(firstNonBlank(text(nodes, "node02Ip"), text(request, "node02Ip"))); - // 保留初始化快照中的签名服务配置,便于设备画像和联调页面直接复用。 - response.setSignHost(firstNonBlank(text(signServer, "signHost"), text(request, "signHost"))); - response.setSignPort(integerValue(firstNonBlank(text(signServer, "signPort"), text(request, "signPort")))); - response.setSignType(firstNonBlank(text(signServer, "signType"), text(request, "signType"))); + response.setCipsGatewayHost(firstNonBlank(text(mq, "cipsGatewayHost"), text(request, "cipsGatewayHost"))); return response; } catch (JsonProcessingException ex) { throw new BizException(ErrorCode.BIZ_ERROR.getCode(), "failed to parse successful init task snapshot"); @@ -795,19 +792,6 @@ public class InitServiceImpl implements InitService { requireNotBlank("licenses.cfgZipFileId", request.getLicenses().getCfgZipFileId()); requireFileId("licenses.cfgZipFileId", request.getLicenses().getCfgZipFileId()); - InitPreviewRequest.SignServer signServer = request.getSignServer(); - if (signServer == null) { - throw new IllegalArgumentException("signServer is required for DIRECT"); - } - requireNotBlank("signServer.signHost", signServer.getSignHost()); - if (signServer.getSignPort() == null || signServer.getSignPort() <= 0 || signServer.getSignPort() > 65535) { - throw new IllegalArgumentException("signServer.signPort must be in [1,65535]"); - } - requireNotBlank("signServer.signType", signServer.getSignType()); - requireNotBlank("signServer.signCertDn", signServer.getSignCertDn()); - requireNotBlank("signServer.signCertSn", signServer.getSignCertSn()); - requireNotBlank("signServer.signPassword", signServer.getSignPassword()); - if ("RABBITMQ_TLQ".equals(mqType)) { requireNotBlank("mq.tlqLicenseFileId", request.getMq().getTlqLicenseFileId()); requireFileId("mq.tlqLicenseFileId", request.getMq().getTlqLicenseFileId()); @@ -817,6 +801,7 @@ public class InitServiceImpl implements InitService { } requireNotBlank("directTlq.localNodeSeq", directTlq.getLocalNodeSeq()); requireNotBlank("directTlq.upstreamInstitutions", directTlq.getUpstreamInstitutions()); + requireNotBlank("mq.cipsGatewayHost", request.getMq().getCipsGatewayHost()); if (directTlq.getUpstreamCocCount() == null || directTlq.getUpstreamCocCount() < 1 || directTlq.getUpstreamCocCount() > 2) { diff --git a/src/test/java/com/cisd/tms/modules/init/service/InitServiceTest.java b/src/test/java/com/cisd/tms/modules/init/service/InitServiceTest.java index 6512196..f45956f 100644 --- a/src/test/java/com/cisd/tms/modules/init/service/InitServiceTest.java +++ b/src/test/java/com/cisd/tms/modules/init/service/InitServiceTest.java @@ -137,6 +137,7 @@ class InitServiceTest { InitPreviewRequest request = validDirectRequest(); request.getMq().setMqType("RABBITMQ_TLQ"); request.getMq().setTlqLicenseFileId("file-tlq-001"); + setMqCipsGatewayHost(request.getMq(), "192.168.10.20"); request.setDirectTlq(directTlqConfig()); InitPreviewResponse response = service.preview(request); @@ -144,6 +145,44 @@ class InitServiceTest { Assertions.assertTrue(response.getStepCount() >= 1); } + @Test + void shouldAcceptDirectCfmqModeWithoutSignServer() { + InitService service = newService(emptyRepository(), emptyStepRepository(), preset("DIRECT", "V1.3.2", "CONFIG"), successExecutor(), "/tmp/tms-init-logs"); + InitPreviewRequest request = validDirectRequest(); + + InitPreviewResponse response = service.preview(request); + + Assertions.assertEquals("DIRECT", response.getResolvedProductType()); + Assertions.assertTrue(response.getStepCount() >= 1); + } + + @Test + void shouldRequireCipsGatewayHostForDirectTlqMode() { + InitService service = newService(emptyRepository(), emptyStepRepository(), preset("DIRECT", "V1.3.2", "CONFIG"), successExecutor(), "/tmp/tms-init-logs"); + InitPreviewRequest request = validDirectRequest(); + request.getMq().setMqType("RABBITMQ_TLQ"); + request.getMq().setTlqLicenseFileId("file-tlq-001"); + request.setDirectTlq(directTlqConfig()); + + IllegalArgumentException ex = Assertions.assertThrows(IllegalArgumentException.class, () -> service.preview(request)); + Assertions.assertTrue(ex.getMessage().contains("mq.cipsGatewayHost")); + } + + @Test + void shouldAcceptDirectTlqModeWithoutSignServerWhenGatewayHostProvided() { + InitService service = newService(emptyRepository(), emptyStepRepository(), preset("DIRECT", "V1.3.2", "CONFIG"), successExecutor(), "/tmp/tms-init-logs"); + InitPreviewRequest request = validDirectRequest(); + request.getMq().setMqType("RABBITMQ_TLQ"); + request.getMq().setTlqLicenseFileId("file-tlq-001"); + setMqCipsGatewayHost(request.getMq(), "192.168.10.20"); + request.setDirectTlq(directTlqConfig()); + + InitPreviewResponse response = service.preview(request); + + Assertions.assertEquals("DIRECT", response.getResolvedProductType()); + Assertions.assertTrue(response.getStepCount() >= 1); + } + @Test void shouldGeneratePreviewForValidEnterpriseRequest() { InitService service = newService(emptyRepository(), emptyStepRepository(), preset("ENTERPRISE", "V1.3.2", "CONFIG"), successExecutor(), "/tmp/tms-init-logs"); @@ -210,11 +249,6 @@ class InitServiceTest { InitPreviewRequest request = validEnterpriseRequest(); request.setOrgNameEn("Test Organization"); request.getNodes().setNode02Ip("10.0.0.2"); - InitPreviewRequest.SignServer signServer = new InitPreviewRequest.SignServer(); - signServer.setSignHost("172.30.1.101"); - signServer.setSignPort(50006); - signServer.setSignType("INFSEC"); - request.setSignServer(signServer); createSuccessfulInitTask(service, request); CurrentInitConfigResponse response = service.loadCurrentInitConfig(); @@ -229,9 +263,6 @@ class InitServiceTest { Assertions.assertEquals("cisd_channel_user", response.getChannelUsername()); Assertions.assertEquals("10.0.0.1", response.getNode01Ip()); Assertions.assertEquals("10.0.0.2", response.getNode02Ip()); - Assertions.assertEquals("172.30.1.101", response.getSignHost()); - Assertions.assertEquals(50006, response.getSignPort()); - Assertions.assertEquals("INFSEC", response.getSignType()); } @Test @@ -263,6 +294,25 @@ class InitServiceTest { Assertions.assertEquals("Test Organization", response.getOrgNameEn()); } + @Test + void shouldLoadCurrentInitConfigWithDirectTlqGatewayHost() { + InMemoryInitTaskRepository repository = new InMemoryInitTaskRepository(); + InMemoryInitTaskStepRepository stepRepository = new InMemoryInitTaskStepRepository(); + InitService service = newService(repository, stepRepository, preset("DIRECT", "V1.3.2", "CONFIG"), successExecutor(), "/tmp/tms-init-logs"); + InitPreviewRequest request = validDirectRequest(); + request.getMq().setMqType("RABBITMQ_TLQ"); + request.getMq().setTlqLicenseFileId("file-tlq-001"); + setMqCipsGatewayHost(request.getMq(), "192.168.10.20"); + request.setDirectTlq(directTlqConfig()); + createSuccessfulInitTask(service, request); + + CurrentInitConfigResponse response = service.loadCurrentInitConfig(); + + Assertions.assertEquals("DIRECT", response.getProductType()); + Assertions.assertEquals("RABBITMQ_TLQ", response.getMqType()); + Assertions.assertEquals("192.168.10.20", readCurrentInitConfigCipsGatewayHost(response)); + } + @Test void shouldPlanEnterpriseTlqWithoutRabbitmqSteps() { InMemoryInitTaskRepository repository = new InMemoryInitTaskRepository(); @@ -406,6 +456,7 @@ class InitServiceTest { InitPreviewRequest request = validDirectRequest(); request.getMq().setMqType("RABBITMQ_TLQ"); request.getMq().setTlqLicenseFileId("file-tlq-001"); + setMqCipsGatewayHost(request.getMq(), "192.168.10.20"); request.setDirectTlq(directTlqConfig()); InitCreateTaskResponse created = service.createTask(request); @@ -742,15 +793,6 @@ class InitServiceTest { InitPreviewRequest.Licenses licenses = request.getLicenses(); licenses.setCfgZipFileId("file-cfg-001"); - - InitPreviewRequest.SignServer signServer = new InitPreviewRequest.SignServer(); - signServer.setSignHost("172.30.1.101"); - signServer.setSignPort(50006); - signServer.setSignType("Infosec"); - signServer.setSignCertDn("CN=051@AAAABBBBXXX@7321@1,OU=Org,OU=CIPS,O=CFCA OCA1,C=CN"); - signServer.setSignCertSn("1154809590"); - signServer.setSignPassword("secret"); - request.setSignServer(signServer); return request; } @@ -768,6 +810,22 @@ class InitServiceTest { return config; } + private static void setMqCipsGatewayHost(InitPreviewRequest.Mq mq, String value) { + try { + mq.getClass().getMethod("setCipsGatewayHost", String.class).invoke(mq, value); + } catch (ReflectiveOperationException ex) { + throw new AssertionError("Mq should expose setCipsGatewayHost", ex); + } + } + + private static String readCurrentInitConfigCipsGatewayHost(CurrentInitConfigResponse response) { + try { + return (String) response.getClass().getMethod("getCipsGatewayHost").invoke(response); + } catch (ReflectiveOperationException ex) { + throw new AssertionError("CurrentInitConfigResponse should expose getCipsGatewayHost", ex); + } + } + private static void assertContainsStandardPostDeploySteps(List stepCodes) { Assertions.assertTrue(stepCodes.contains("DB_RENDER")); Assertions.assertTrue(stepCodes.contains("DB_APPLY"));