初始化字段修改
This commit is contained in:
parent
1d8869fad8
commit
8c38c0bfbe
@ -15,6 +15,8 @@ import io.swagger.v3.oas.annotations.Parameter;
|
|||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.core.io.FileSystemResource;
|
import org.springframework.core.io.FileSystemResource;
|
||||||
import org.springframework.core.io.Resource;
|
import org.springframework.core.io.Resource;
|
||||||
import org.springframework.http.ContentDisposition;
|
import org.springframework.http.ContentDisposition;
|
||||||
@ -30,14 +32,12 @@ import org.springframework.web.bind.annotation.RestController;
|
|||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/api/v1/resource-backups")
|
@RequestMapping("/api/v1/resource-backups")
|
||||||
|
@RequiredArgsConstructor
|
||||||
@Tag(name = "资源备份", description = "资源备份创建、状态查询和步骤日志接口")
|
@Tag(name = "资源备份", description = "资源备份创建、状态查询和步骤日志接口")
|
||||||
public class ResourceBackupController {
|
public class ResourceBackupController {
|
||||||
|
|
||||||
private final ResourceBackupService resourceBackupService;
|
private final ResourceBackupService resourceBackupService;
|
||||||
|
|
||||||
public ResourceBackupController(ResourceBackupService resourceBackupService) {
|
|
||||||
this.resourceBackupService = resourceBackupService;
|
|
||||||
}
|
|
||||||
|
|
||||||
@GetMapping("/keyset/status")
|
@GetMapping("/keyset/status")
|
||||||
@Operation(summary = "查询资源备份密钥状态", description = "返回资源备份恢复前置密钥状态和公钥指纹。")
|
@Operation(summary = "查询资源备份密钥状态", description = "返回资源备份恢复前置密钥状态和公钥指纹。")
|
||||||
|
|||||||
@ -25,12 +25,8 @@ public class CurrentInitConfigResponse {
|
|||||||
private String node01Ip;
|
private String node01Ip;
|
||||||
@Schema(description = "节点二 IP", example = "10.0.0.2")
|
@Schema(description = "节点二 IP", example = "10.0.0.2")
|
||||||
private String node02Ip;
|
private String node02Ip;
|
||||||
@Schema(description = "签名服务地址", example = "172.30.1.101")
|
@Schema(description = "CIPS 中心网关地址", example = "192.168.10.20")
|
||||||
private String signHost;
|
private String cipsGatewayHost;
|
||||||
@Schema(description = "签名服务端口", example = "50006")
|
|
||||||
private Integer signPort;
|
|
||||||
@Schema(description = "签名服务类型", example = "INFSEC")
|
|
||||||
private String signType;
|
|
||||||
|
|
||||||
public String getOrgCodeType() {
|
public String getOrgCodeType() {
|
||||||
return orgCodeType;
|
return orgCodeType;
|
||||||
@ -112,27 +108,11 @@ public class CurrentInitConfigResponse {
|
|||||||
this.node02Ip = node02Ip;
|
this.node02Ip = node02Ip;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getSignHost() {
|
public String getCipsGatewayHost() {
|
||||||
return signHost;
|
return cipsGatewayHost;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSignHost(String signHost) {
|
public void setCipsGatewayHost(String cipsGatewayHost) {
|
||||||
this.signHost = signHost;
|
this.cipsGatewayHost = cipsGatewayHost;
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -720,7 +720,7 @@ public class InitServiceImpl implements InitService {
|
|||||||
JsonNode request = root.path("request");
|
JsonNode request = root.path("request");
|
||||||
JsonNode mq = request.path("mq");
|
JsonNode mq = request.path("mq");
|
||||||
JsonNode nodes = request.path("nodes");
|
JsonNode nodes = request.path("nodes");
|
||||||
JsonNode signServer = request.path("signServer");
|
JsonNode directTlq = request.path("directTlq");
|
||||||
|
|
||||||
CurrentInitConfigResponse response = new CurrentInitConfigResponse();
|
CurrentInitConfigResponse response = new CurrentInitConfigResponse();
|
||||||
response.setOrgCodeType(firstNonBlank(normalizeUpper(text(request, "orgCodeType")), normalizeUpper(text(root, "orgCodeType"))));
|
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.setChannelUsername(firstNonBlank(text(mq, "channelUsername"), text(request, "channelUsername")));
|
||||||
response.setNode01Ip(firstNonBlank(text(nodes, "node01Ip"), text(request, "node01Ip")));
|
response.setNode01Ip(firstNonBlank(text(nodes, "node01Ip"), text(request, "node01Ip")));
|
||||||
response.setNode02Ip(firstNonBlank(text(nodes, "node02Ip"), text(request, "node02Ip")));
|
response.setNode02Ip(firstNonBlank(text(nodes, "node02Ip"), text(request, "node02Ip")));
|
||||||
// 保留初始化快照中的签名服务配置,便于设备画像和联调页面直接复用。
|
response.setCipsGatewayHost(firstNonBlank(text(mq, "cipsGatewayHost"), text(request, "cipsGatewayHost")));
|
||||||
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")));
|
|
||||||
return response;
|
return response;
|
||||||
} catch (JsonProcessingException ex) {
|
} catch (JsonProcessingException ex) {
|
||||||
throw new BizException(ErrorCode.BIZ_ERROR.getCode(), "failed to parse successful init task snapshot");
|
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());
|
requireNotBlank("licenses.cfgZipFileId", request.getLicenses().getCfgZipFileId());
|
||||||
requireFileId("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)) {
|
if ("RABBITMQ_TLQ".equals(mqType)) {
|
||||||
requireNotBlank("mq.tlqLicenseFileId", request.getMq().getTlqLicenseFileId());
|
requireNotBlank("mq.tlqLicenseFileId", request.getMq().getTlqLicenseFileId());
|
||||||
requireFileId("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.localNodeSeq", directTlq.getLocalNodeSeq());
|
||||||
requireNotBlank("directTlq.upstreamInstitutions", directTlq.getUpstreamInstitutions());
|
requireNotBlank("directTlq.upstreamInstitutions", directTlq.getUpstreamInstitutions());
|
||||||
|
requireNotBlank("mq.cipsGatewayHost", request.getMq().getCipsGatewayHost());
|
||||||
if (directTlq.getUpstreamCocCount() == null
|
if (directTlq.getUpstreamCocCount() == null
|
||||||
|| directTlq.getUpstreamCocCount() < 1
|
|| directTlq.getUpstreamCocCount() < 1
|
||||||
|| directTlq.getUpstreamCocCount() > 2) {
|
|| directTlq.getUpstreamCocCount() > 2) {
|
||||||
|
|||||||
@ -137,6 +137,7 @@ class InitServiceTest {
|
|||||||
InitPreviewRequest request = validDirectRequest();
|
InitPreviewRequest request = validDirectRequest();
|
||||||
request.getMq().setMqType("RABBITMQ_TLQ");
|
request.getMq().setMqType("RABBITMQ_TLQ");
|
||||||
request.getMq().setTlqLicenseFileId("file-tlq-001");
|
request.getMq().setTlqLicenseFileId("file-tlq-001");
|
||||||
|
setMqCipsGatewayHost(request.getMq(), "192.168.10.20");
|
||||||
request.setDirectTlq(directTlqConfig());
|
request.setDirectTlq(directTlqConfig());
|
||||||
|
|
||||||
InitPreviewResponse response = service.preview(request);
|
InitPreviewResponse response = service.preview(request);
|
||||||
@ -144,6 +145,44 @@ class InitServiceTest {
|
|||||||
Assertions.assertTrue(response.getStepCount() >= 1);
|
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
|
@Test
|
||||||
void shouldGeneratePreviewForValidEnterpriseRequest() {
|
void shouldGeneratePreviewForValidEnterpriseRequest() {
|
||||||
InitService service = newService(emptyRepository(), emptyStepRepository(), preset("ENTERPRISE", "V1.3.2", "CONFIG"), successExecutor(), "/tmp/tms-init-logs");
|
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();
|
InitPreviewRequest request = validEnterpriseRequest();
|
||||||
request.setOrgNameEn("Test Organization");
|
request.setOrgNameEn("Test Organization");
|
||||||
request.getNodes().setNode02Ip("10.0.0.2");
|
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);
|
createSuccessfulInitTask(service, request);
|
||||||
|
|
||||||
CurrentInitConfigResponse response = service.loadCurrentInitConfig();
|
CurrentInitConfigResponse response = service.loadCurrentInitConfig();
|
||||||
@ -229,9 +263,6 @@ class InitServiceTest {
|
|||||||
Assertions.assertEquals("cisd_channel_user", response.getChannelUsername());
|
Assertions.assertEquals("cisd_channel_user", response.getChannelUsername());
|
||||||
Assertions.assertEquals("10.0.0.1", response.getNode01Ip());
|
Assertions.assertEquals("10.0.0.1", response.getNode01Ip());
|
||||||
Assertions.assertEquals("10.0.0.2", response.getNode02Ip());
|
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
|
@Test
|
||||||
@ -263,6 +294,25 @@ class InitServiceTest {
|
|||||||
Assertions.assertEquals("Test Organization", response.getOrgNameEn());
|
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
|
@Test
|
||||||
void shouldPlanEnterpriseTlqWithoutRabbitmqSteps() {
|
void shouldPlanEnterpriseTlqWithoutRabbitmqSteps() {
|
||||||
InMemoryInitTaskRepository repository = new InMemoryInitTaskRepository();
|
InMemoryInitTaskRepository repository = new InMemoryInitTaskRepository();
|
||||||
@ -406,6 +456,7 @@ class InitServiceTest {
|
|||||||
InitPreviewRequest request = validDirectRequest();
|
InitPreviewRequest request = validDirectRequest();
|
||||||
request.getMq().setMqType("RABBITMQ_TLQ");
|
request.getMq().setMqType("RABBITMQ_TLQ");
|
||||||
request.getMq().setTlqLicenseFileId("file-tlq-001");
|
request.getMq().setTlqLicenseFileId("file-tlq-001");
|
||||||
|
setMqCipsGatewayHost(request.getMq(), "192.168.10.20");
|
||||||
request.setDirectTlq(directTlqConfig());
|
request.setDirectTlq(directTlqConfig());
|
||||||
|
|
||||||
InitCreateTaskResponse created = service.createTask(request);
|
InitCreateTaskResponse created = service.createTask(request);
|
||||||
@ -742,15 +793,6 @@ class InitServiceTest {
|
|||||||
|
|
||||||
InitPreviewRequest.Licenses licenses = request.getLicenses();
|
InitPreviewRequest.Licenses licenses = request.getLicenses();
|
||||||
licenses.setCfgZipFileId("file-cfg-001");
|
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;
|
return request;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -768,6 +810,22 @@ class InitServiceTest {
|
|||||||
return config;
|
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<String> stepCodes) {
|
private static void assertContainsStandardPostDeploySteps(List<String> stepCodes) {
|
||||||
Assertions.assertTrue(stepCodes.contains("DB_RENDER"));
|
Assertions.assertTrue(stepCodes.contains("DB_RENDER"));
|
||||||
Assertions.assertTrue(stepCodes.contains("DB_APPLY"));
|
Assertions.assertTrue(stepCodes.contains("DB_APPLY"));
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user