From 998c5f520e549c6ef4dca3c3601987691f818829 Mon Sep 17 00:00:00 2001 From: "tao.gan" Date: Wed, 1 Jul 2026 23:44:37 +0800 Subject: [PATCH] [conf]: add reported alert source schema Introduce ReportedAlertSourceVO as the generic registry for pushed or built-in reported alerts. The schema uses sourceType plus sourceUuid as the idempotency key, stores display metadata as JSON, and tracks owner, state, and lastSeenDate for source management. This replaces the earlier LiveRecovery-specific source and event tables. Alert event payloads now flow through the native ZWatch event-record path instead of a product-specific event table. Remove the generic reported alert source schema and SDK bindings from the ZSV side. Expose the Live Recovery receiver through dedicated SDK and testlib helpers that push sourceUuid and payloadJson directly. This is a new Live Recovery integration path, so no source registration table or compatibility fallback remains. Resolves: ZSV-12277 Change-Id: I6a78716b6f7770686f6e6d6878796b7774707a70 --- .../api/PushLiveRecoveryAlertEventAction.java | 104 ++++++++++++++++++ .../api/PushLiveRecoveryAlertResult.java | 22 ++++ .../java/org/zstack/testlib/ApiHelper.groovy | 27 +++++ 3 files changed, 153 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/zwatch/liverecovery/api/PushLiveRecoveryAlertEventAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/zwatch/liverecovery/api/PushLiveRecoveryAlertResult.java diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/liverecovery/api/PushLiveRecoveryAlertEventAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/liverecovery/api/PushLiveRecoveryAlertEventAction.java new file mode 100644 index 00000000000..0a32a41be9f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/liverecovery/api/PushLiveRecoveryAlertEventAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk.zwatch.liverecovery.api; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class PushLiveRecoveryAlertEventAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.zwatch.liverecovery.api.PushLiveRecoveryAlertResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, maxLength = 64, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String sourceUuid; + + @Param(required = true, maxLength = 65535, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String payloadJson; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.zwatch.liverecovery.api.PushLiveRecoveryAlertResult value = res.getResult(org.zstack.sdk.zwatch.liverecovery.api.PushLiveRecoveryAlertResult.class); + ret.value = value == null ? new org.zstack.sdk.zwatch.liverecovery.api.PushLiveRecoveryAlertResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/zwatch/live-recovery/alert-events"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/liverecovery/api/PushLiveRecoveryAlertResult.java b/sdk/src/main/java/org/zstack/sdk/zwatch/liverecovery/api/PushLiveRecoveryAlertResult.java new file mode 100644 index 00000000000..32c590536aa --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/liverecovery/api/PushLiveRecoveryAlertResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk.zwatch.liverecovery.api; + + + +public class PushLiveRecoveryAlertResult { + public java.lang.String remoteEventId; + public void setRemoteEventId(java.lang.String remoteEventId) { + this.remoteEventId = remoteEventId; + } + public java.lang.String getRemoteEventId() { + return this.remoteEventId; + } + + public java.lang.String remoteAlertId; + public void setRemoteAlertId(java.lang.String remoteAlertId) { + this.remoteAlertId = remoteAlertId; + } + public java.lang.String getRemoteAlertId() { + return this.remoteAlertId; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 7160cd1d93d..e87caa02b4b 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -42640,6 +42640,33 @@ abstract class ApiHelper { } + def pushLiveRecoveryAlertEvent(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.zwatch.liverecovery.api.PushLiveRecoveryAlertEventAction.class) Closure c) { + def a = new org.zstack.sdk.zwatch.liverecovery.api.PushLiveRecoveryAlertEventAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def addThirdpartyPlatform(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.zwatch.thirdparty.api.AddThirdpartyPlatformAction.class) Closure c) { def a = new org.zstack.sdk.zwatch.thirdparty.api.AddThirdpartyPlatformAction() a.sessionId = Test.currentEnvSpec?.session?.uuid