From 4d4096ad9ac1ace71bbdbb7d251c67c205237c81 Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Mon, 1 Jun 2026 16:06:32 +0800 Subject: [PATCH 1/3] [license]: add license auth info api Resolves: ZCF-3922 Change-Id: If9579e1648bc614985e13855fc84ade1a49fc38a (cherry picked from commit 4bd879eb2a8fb0cd729cef0a5776bf4cd1b15ecc) --- sdk/src/main/java/SourceClassMap.java | 4 + .../GetLicenseAuthorizationInfoAction.java | 86 ++++++++++ .../GetLicenseAuthorizationInfoResult.java | 14 ++ .../zstack/sdk/LicenseAuthorizationInfo.java | 111 +++++++++++++ .../LicenseAuthorizationQuotaInventory.java | 119 ++++++++++++++ .../sdk/RegisterLicenseClientAction.java | 3 + .../java/org/zstack/testlib/ApiHelper.groovy | 147 +++++++++++------- 7 files changed, 424 insertions(+), 60 deletions(-) create mode 100644 sdk/src/main/java/org/zstack/sdk/GetLicenseAuthorizationInfoAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/GetLicenseAuthorizationInfoResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/LicenseAuthorizationInfo.java create mode 100644 sdk/src/main/java/org/zstack/sdk/LicenseAuthorizationQuotaInventory.java diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 63756cc5fa5..4fdc5791b47 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -514,6 +514,8 @@ public class SourceClassMap { put("org.zstack.license.AdditionalLicenseInfo", "org.zstack.sdk.AdditionalLicenseInfo"); put("org.zstack.license.AdditionalLicenseType", "org.zstack.sdk.AdditionalLicenseType"); put("org.zstack.license.LicenseAddOnInventory", "org.zstack.sdk.LicenseAddOnInventory"); + put("org.zstack.license.LicenseAuthorizationInfo", "org.zstack.sdk.LicenseAuthorizationInfo"); + put("org.zstack.license.LicenseAuthorizationQuotaInventory", "org.zstack.sdk.LicenseAuthorizationQuotaInventory"); put("org.zstack.license.LicenseInventory", "org.zstack.sdk.LicenseInventory"); put("org.zstack.license.UKeyInventory", "org.zstack.sdk.UKeyInventory"); put("org.zstack.license.UKeyStatus", "org.zstack.sdk.UKeyStatus"); @@ -1233,6 +1235,8 @@ public class SourceClassMap { put("org.zstack.sdk.LdapResourceRefInventory", "org.zstack.login.entity.LdapResourceRefInventory"); put("org.zstack.sdk.LdapServerInventory", "org.zstack.ldap.LdapServerInventory"); put("org.zstack.sdk.LicenseAddOnInventory", "org.zstack.license.LicenseAddOnInventory"); + put("org.zstack.sdk.LicenseAuthorizationInfo", "org.zstack.license.LicenseAuthorizationInfo"); + put("org.zstack.sdk.LicenseAuthorizationQuotaInventory", "org.zstack.license.LicenseAuthorizationQuotaInventory"); put("org.zstack.sdk.LicenseInventory", "org.zstack.license.LicenseInventory"); put("org.zstack.sdk.LoadBalancerDataInventory", "org.zstack.observabilityServer.service.loadBalancer.LoadBalancerDataInventory"); put("org.zstack.sdk.LoadBalancerInventory", "org.zstack.network.service.lb.LoadBalancerInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/GetLicenseAuthorizationInfoAction.java b/sdk/src/main/java/org/zstack/sdk/GetLicenseAuthorizationInfoAction.java new file mode 100644 index 00000000000..cb7199f2c17 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetLicenseAuthorizationInfoAction.java @@ -0,0 +1,86 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetLicenseAuthorizationInfoAction 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.GetLicenseAuthorizationInfoResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) + ); + } + + return this; + } + } + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @NonAPIParam + public boolean isSuppressCredentialCheck = true; + + @Param(required = false) + public String requestIp; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.GetLicenseAuthorizationInfoResult value = res.getResult(org.zstack.sdk.GetLicenseAuthorizationInfoResult.class); + ret.value = value == null ? new org.zstack.sdk.GetLicenseAuthorizationInfoResult() : 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 = "GET"; + info.path = "/licenses/authorization-info"; + info.needSession = false; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetLicenseAuthorizationInfoResult.java b/sdk/src/main/java/org/zstack/sdk/GetLicenseAuthorizationInfoResult.java new file mode 100644 index 00000000000..dd109e3c5ec --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetLicenseAuthorizationInfoResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.LicenseAuthorizationInfo; + +public class GetLicenseAuthorizationInfoResult { + public LicenseAuthorizationInfo info; + public void setInfo(LicenseAuthorizationInfo info) { + this.info = info; + } + public LicenseAuthorizationInfo getInfo() { + return this.info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/LicenseAuthorizationInfo.java b/sdk/src/main/java/org/zstack/sdk/LicenseAuthorizationInfo.java new file mode 100644 index 00000000000..f01f92de62e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/LicenseAuthorizationInfo.java @@ -0,0 +1,111 @@ +package org.zstack.sdk; + +import org.zstack.sdk.LicenseInventory; + +public class LicenseAuthorizationInfo { + + public java.lang.String authType; + public void setAuthType(java.lang.String authType) { + this.authType = authType; + } + public java.lang.String getAuthType() { + return this.authType; + } + + public boolean connected; + public void setConnected(boolean connected) { + this.connected = connected; + } + public boolean getConnected() { + return this.connected; + } + + public java.lang.String serverUrl; + public void setServerUrl(java.lang.String serverUrl) { + this.serverUrl = serverUrl; + } + public java.lang.String getServerUrl() { + return this.serverUrl; + } + + public java.lang.String serverVersion; + public void setServerVersion(java.lang.String serverVersion) { + this.serverVersion = serverVersion; + } + public java.lang.String getServerVersion() { + return this.serverVersion; + } + + public java.lang.String siteUuid; + public void setSiteUuid(java.lang.String siteUuid) { + this.siteUuid = siteUuid; + } + public java.lang.String getSiteUuid() { + return this.siteUuid; + } + + public java.lang.String siteName; + public void setSiteName(java.lang.String siteName) { + this.siteName = siteName; + } + public java.lang.String getSiteName() { + return this.siteName; + } + + public java.lang.String productLine; + public void setProductLine(java.lang.String productLine) { + this.productLine = productLine; + } + public java.lang.String getProductLine() { + return this.productLine; + } + + public java.lang.String snapshotState; + public void setSnapshotState(java.lang.String snapshotState) { + this.snapshotState = snapshotState; + } + public java.lang.String getSnapshotState() { + return this.snapshotState; + } + + public java.lang.String source; + public void setSource(java.lang.String source) { + this.source = source; + } + public java.lang.String getSource() { + return this.source; + } + + public java.lang.String lastSyncDate; + public void setLastSyncDate(java.lang.String lastSyncDate) { + this.lastSyncDate = lastSyncDate; + } + public java.lang.String getLastSyncDate() { + return this.lastSyncDate; + } + + public LicenseInventory platformLicense; + public void setPlatformLicense(LicenseInventory platformLicense) { + this.platformLicense = platformLicense; + } + public LicenseInventory getPlatformLicense() { + return this.platformLicense; + } + + public java.util.List addOns; + public void setAddOns(java.util.List addOns) { + this.addOns = addOns; + } + public java.util.List getAddOns() { + return this.addOns; + } + + public java.util.List quotas; + public void setQuotas(java.util.List quotas) { + this.quotas = quotas; + } + public java.util.List getQuotas() { + return this.quotas; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/LicenseAuthorizationQuotaInventory.java b/sdk/src/main/java/org/zstack/sdk/LicenseAuthorizationQuotaInventory.java new file mode 100644 index 00000000000..89f4718a3d1 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/LicenseAuthorizationQuotaInventory.java @@ -0,0 +1,119 @@ +package org.zstack.sdk; + + + +public class LicenseAuthorizationQuotaInventory { + + public java.lang.String authEntity; + public void setAuthEntity(java.lang.String authEntity) { + this.authEntity = authEntity; + } + public java.lang.String getAuthEntity() { + return this.authEntity; + } + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.String product; + public void setProduct(java.lang.String product) { + this.product = product; + } + public java.lang.String getProduct() { + return this.product; + } + + public java.lang.String module; + public void setModule(java.lang.String module) { + this.module = module; + } + public java.lang.String getModule() { + return this.module; + } + + public java.lang.String licenseType; + public void setLicenseType(java.lang.String licenseType) { + this.licenseType = licenseType; + } + public java.lang.String getLicenseType() { + return this.licenseType; + } + + public java.lang.String quotaType; + public void setQuotaType(java.lang.String quotaType) { + this.quotaType = quotaType; + } + public java.lang.String getQuotaType() { + return this.quotaType; + } + + public long quota; + public void setQuota(long quota) { + this.quota = quota; + } + public long getQuota() { + return this.quota; + } + + public long used; + public void setUsed(long used) { + this.used = used; + } + public long getUsed() { + return this.used; + } + + public long available; + public void setAvailable(long available) { + this.available = available; + } + public long getAvailable() { + return this.available; + } + + public java.lang.String issuedDate; + public void setIssuedDate(java.lang.String issuedDate) { + this.issuedDate = issuedDate; + } + public java.lang.String getIssuedDate() { + return this.issuedDate; + } + + public java.lang.String expiredDate; + public void setExpiredDate(java.lang.String expiredDate) { + this.expiredDate = expiredDate; + } + public java.lang.String getExpiredDate() { + return this.expiredDate; + } + + public boolean expired; + public void setExpired(boolean expired) { + this.expired = expired; + } + public boolean getExpired() { + return this.expired; + } + + public boolean platform; + public void setPlatform(boolean platform) { + this.platform = platform; + } + public boolean getPlatform() { + return this.platform; + } + + public java.lang.String status; + public void setStatus(java.lang.String status) { + this.status = status; + } + public java.lang.String getStatus() { + return this.status; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/RegisterLicenseClientAction.java b/sdk/src/main/java/org/zstack/sdk/RegisterLicenseClientAction.java index aa6c6904668..a937ffab4ed 100644 --- a/sdk/src/main/java/org/zstack/sdk/RegisterLicenseClientAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RegisterLicenseClientAction.java @@ -37,6 +37,9 @@ public Result throwExceptionIfError() { @Param(required = false, validRegexValues = "^[a-f0-9]{32}$", nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String siteUuid; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String siteAccessKey; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String baseAuthEntity; diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index a09908b89ca..a58475e1650 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -21,20 +21,20 @@ abstract class ApiHelper { 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()) @@ -3689,6 +3689,33 @@ abstract class ApiHelper { } + def attachDGpuToVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AttachDGpuToVmAction.class) Closure c) { + def a = new org.zstack.sdk.AttachDGpuToVmAction() + 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 attachDataVolumeToHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AttachDataVolumeToHostAction.class) Closure c) { def a = new org.zstack.sdk.AttachDataVolumeToHostAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -18620,33 +18647,6 @@ abstract class ApiHelper { } - def attachDGpuToVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AttachDGpuToVmAction.class) Closure c) { - def a = new org.zstack.sdk.AttachDGpuToVmAction() - 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 detachBaremetalPxeServerFromCluster(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachBaremetalPxeServerFromClusterAction.class) Closure c) { def a = new org.zstack.sdk.DetachBaremetalPxeServerFromClusterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -23696,26 +23696,53 @@ abstract class ApiHelper { } + def getLicenseAuthorizationInfo(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetLicenseAuthorizationInfoAction.class) Closure c) { + def a = new org.zstack.sdk.GetLicenseAuthorizationInfoAction() + + 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 getLicenseCapabilities(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetLicenseCapabilitiesAction.class) Closure c) { def a = new org.zstack.sdk.GetLicenseCapabilitiesAction() 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()) @@ -40683,33 +40710,6 @@ abstract class ApiHelper { } - def updateVmDGpu(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVmDGpuAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateVmDGpuAction() - 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 setVmEmulatorPinning(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmEmulatorPinningAction.class) Closure c) { def a = new org.zstack.sdk.SetVmEmulatorPinningAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -48108,6 +48108,33 @@ abstract class ApiHelper { } + def updateVmDGpu(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVmDGpuAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateVmDGpuAction() + 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 updateVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVmInstanceAction.class) Closure c) { def a = new org.zstack.sdk.UpdateVmInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From 7dabfb88fa0b53d954ea46595cd9277b57d70d80 Mon Sep 17 00:00:00 2001 From: lianghy Date: Tue, 2 Jun 2026 21:43:25 +0800 Subject: [PATCH 2/3] [license]: complete auth info output Add localVersion and license user to license authorization info output. Resolves: ZCF-3922 Change-Id: I1c8a88f7a08d5b13c0e92c86abc9876d1d41f088 (cherry picked from commit 13b69c91e006740f74f1f09c50eff9eef3975eab) --- .../java/org/zstack/sdk/LicenseAuthorizationInfo.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/LicenseAuthorizationInfo.java b/sdk/src/main/java/org/zstack/sdk/LicenseAuthorizationInfo.java index f01f92de62e..def485897e7 100644 --- a/sdk/src/main/java/org/zstack/sdk/LicenseAuthorizationInfo.java +++ b/sdk/src/main/java/org/zstack/sdk/LicenseAuthorizationInfo.java @@ -36,6 +36,14 @@ public java.lang.String getServerVersion() { return this.serverVersion; } + public java.lang.String localVersion; + public void setLocalVersion(java.lang.String localVersion) { + this.localVersion = localVersion; + } + public java.lang.String getLocalVersion() { + return this.localVersion; + } + public java.lang.String siteUuid; public void setSiteUuid(java.lang.String siteUuid) { this.siteUuid = siteUuid; From 9c510f17c3b34ed53180249874bd3e67bf371e41 Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Wed, 3 Jun 2026 18:04:36 +0800 Subject: [PATCH 3/3] [license]: support LS HTTPS SDK Regenerate SDK action fields for external License Server HTTPS TLS CA and server name configuration. Resolves: ZCF-3922 Change-Id: I7a4cfcf8b5fe57037ce9f5592370f9e1db42dabd (cherry picked from commit 13b4267c71289b50874cb77d05c1c721d56c058a) --- .../java/org/zstack/sdk/RegisterLicenseClientAction.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/RegisterLicenseClientAction.java b/sdk/src/main/java/org/zstack/sdk/RegisterLicenseClientAction.java index a937ffab4ed..9177d409bbb 100644 --- a/sdk/src/main/java/org/zstack/sdk/RegisterLicenseClientAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RegisterLicenseClientAction.java @@ -43,6 +43,12 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String baseAuthEntity; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String tlsCaPem; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String tlsServerName; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String bundle;