diff --git a/conf/db/upgrade/V5.5.22__schema.sql b/conf/db/upgrade/V5.5.22__schema.sql index 94b14f06535..d111d1eb85a 100644 --- a/conf/db/upgrade/V5.5.22__schema.sql +++ b/conf/db/upgrade/V5.5.22__schema.sql @@ -29,3 +29,6 @@ DROP PROCEDURE IF EXISTS backfill_model_service_ref_create_date; -- in DEFAULT or ON UPDATE. lastOpDate already uses it, so keep createDate non-zero -- and let ModelServiceRefVO.@PrePersist populate the real creation time for new rows. ALTER TABLE `zstack`.`ModelServiceRefVO` MODIFY COLUMN `createDate` TIMESTAMP NOT NULL DEFAULT '2000-01-01 00:00:00'; + +CALL ADD_COLUMN('ModelServiceVO', 'hasNewVersion', 'tinyint(1)', 1, NULL); + diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 72fbac9b302..234e074a66b 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -10,6 +10,7 @@ public class SourceClassMap { put("org.zstack.accessKey.AccessKeyInventory", "org.zstack.sdk.AccessKeyInventory"); put("org.zstack.accessKey.AccessKeyState", "org.zstack.sdk.AccessKeyState"); put("org.zstack.accessKey.AccessKeyType", "org.zstack.sdk.AccessKeyType"); + put("org.zstack.ai.CdnTemplateEntry", "org.zstack.sdk.CdnTemplateEntry"); put("org.zstack.ai.NginxRedirectRule", "org.zstack.sdk.NginxRedirectRule"); put("org.zstack.ai.entity.ApplicationDevelopmentServiceInventory", "org.zstack.sdk.ApplicationDevelopmentServiceInventory"); put("org.zstack.ai.entity.DatasetInventory", "org.zstack.sdk.DatasetInventory"); @@ -1010,6 +1011,7 @@ public class SourceClassMap { put("org.zstack.sdk.CbtTaskResourceRefInventory", "org.zstack.header.cbt.CbtTaskResourceRefInventory"); put("org.zstack.sdk.CbtTaskStatus", "org.zstack.header.cbt.CbtTaskStatus"); put("org.zstack.sdk.CdRomTO", "org.zstack.kvm.KVMAgentCommands$CdRomTO"); + put("org.zstack.sdk.CdnTemplateEntry", "org.zstack.ai.CdnTemplateEntry"); put("org.zstack.sdk.CdpPolicyInventory", "org.zstack.header.storage.cdp.CdpPolicyInventory"); put("org.zstack.sdk.CdpPolicyState", "org.zstack.header.storage.cdp.CdpPolicyState"); put("org.zstack.sdk.CdpTaskInventory", "org.zstack.header.storage.cdp.CdpTaskInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/CdnTemplateEntry.java b/sdk/src/main/java/org/zstack/sdk/CdnTemplateEntry.java new file mode 100644 index 00000000000..e262882aeeb --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CdnTemplateEntry.java @@ -0,0 +1,71 @@ +package org.zstack.sdk; + + + +public class CdnTemplateEntry { + + 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 version; + public void setVersion(java.lang.String version) { + this.version = version; + } + public java.lang.String getVersion() { + return this.version; + } + + public java.lang.String platform; + public void setPlatform(java.lang.String platform) { + this.platform = platform; + } + public java.lang.String getPlatform() { + return this.platform; + } + + public java.lang.String size; + public void setSize(java.lang.String size) { + this.size = size; + } + public java.lang.String getSize() { + return this.size; + } + + public java.lang.String projectId; + public void setProjectId(java.lang.String projectId) { + this.projectId = projectId; + } + public java.lang.String getProjectId() { + return this.projectId; + } + + public java.lang.String projectName; + public void setProjectName(java.lang.String projectName) { + this.projectName = projectName; + } + public java.lang.String getProjectName() { + return this.projectName; + } + + public java.lang.String downloadUrl; + public void setDownloadUrl(java.lang.String downloadUrl) { + this.downloadUrl = downloadUrl; + } + public java.lang.String getDownloadUrl() { + return this.downloadUrl; + } + + public boolean installed; + public void setInstalled(boolean installed) { + this.installed = installed; + } + public boolean getInstalled() { + return this.installed; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ImportModelServiceTemplateFromCdnAction.java b/sdk/src/main/java/org/zstack/sdk/ImportModelServiceTemplateFromCdnAction.java new file mode 100644 index 00000000000..6f4d9b4ac4d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ImportModelServiceTemplateFromCdnAction.java @@ -0,0 +1,110 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class ImportModelServiceTemplateFromCdnAction 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.ImportModelServiceTemplateFromCdnResult 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 = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String modelCenterUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String templateName; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + + @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.ImportModelServiceTemplateFromCdnResult value = res.getResult(org.zstack.sdk.ImportModelServiceTemplateFromCdnResult.class); + ret.value = value == null ? new org.zstack.sdk.ImportModelServiceTemplateFromCdnResult() : 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 = "/ai/model-services/template/import/cdn"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "param"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ImportModelServiceTemplateFromCdnResult.java b/sdk/src/main/java/org/zstack/sdk/ImportModelServiceTemplateFromCdnResult.java new file mode 100644 index 00000000000..765dd4e631c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ImportModelServiceTemplateFromCdnResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelServiceInventory; + +public class ImportModelServiceTemplateFromCdnResult { + public ModelServiceInventory inventory; + public void setInventory(ModelServiceInventory inventory) { + this.inventory = inventory; + } + public ModelServiceInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ImportModelServiceTemplateFromUploadAction.java b/sdk/src/main/java/org/zstack/sdk/ImportModelServiceTemplateFromUploadAction.java new file mode 100644 index 00000000000..c341b0c2448 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ImportModelServiceTemplateFromUploadAction.java @@ -0,0 +1,113 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class ImportModelServiceTemplateFromUploadAction 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.ImportModelServiceTemplateFromUploadResult 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 = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String modelCenterUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String fileName; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String templateName; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + + @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.ImportModelServiceTemplateFromUploadResult value = res.getResult(org.zstack.sdk.ImportModelServiceTemplateFromUploadResult.class); + ret.value = value == null ? new org.zstack.sdk.ImportModelServiceTemplateFromUploadResult() : 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 = "/ai/model-services/template/import/upload"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "param"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ImportModelServiceTemplateFromUploadResult.java b/sdk/src/main/java/org/zstack/sdk/ImportModelServiceTemplateFromUploadResult.java new file mode 100644 index 00000000000..e17ea42af99 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ImportModelServiceTemplateFromUploadResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelServiceInventory; + +public class ImportModelServiceTemplateFromUploadResult { + public ModelServiceInventory inventory; + public void setInventory(ModelServiceInventory inventory) { + this.inventory = inventory; + } + public ModelServiceInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ImportModelServiceTemplateFromUrlAction.java b/sdk/src/main/java/org/zstack/sdk/ImportModelServiceTemplateFromUrlAction.java new file mode 100644 index 00000000000..1bd3b5837e5 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ImportModelServiceTemplateFromUrlAction.java @@ -0,0 +1,113 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class ImportModelServiceTemplateFromUrlAction 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.ImportModelServiceTemplateFromUrlResult 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 = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String modelCenterUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String url; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String templateName; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + + @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.ImportModelServiceTemplateFromUrlResult value = res.getResult(org.zstack.sdk.ImportModelServiceTemplateFromUrlResult.class); + ret.value = value == null ? new org.zstack.sdk.ImportModelServiceTemplateFromUrlResult() : 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 = "/ai/model-services/template/import/url"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "param"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ImportModelServiceTemplateFromUrlResult.java b/sdk/src/main/java/org/zstack/sdk/ImportModelServiceTemplateFromUrlResult.java new file mode 100644 index 00000000000..5199d7a5d7c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ImportModelServiceTemplateFromUrlResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelServiceInventory; + +public class ImportModelServiceTemplateFromUrlResult { + public ModelServiceInventory inventory; + public void setInventory(ModelServiceInventory inventory) { + this.inventory = inventory; + } + public ModelServiceInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryCdnModelServiceTemplateListAction.java b/sdk/src/main/java/org/zstack/sdk/QueryCdnModelServiceTemplateListAction.java new file mode 100644 index 00000000000..1ba74a70040 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryCdnModelServiceTemplateListAction.java @@ -0,0 +1,92 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryCdnModelServiceTemplateListAction 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.QueryCdnModelServiceTemplateListResult 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; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @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.QueryCdnModelServiceTemplateListResult value = res.getResult(org.zstack.sdk.QueryCdnModelServiceTemplateListResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryCdnModelServiceTemplateListResult() : 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 = "/ai/model-services/template/cdn-list"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryCdnModelServiceTemplateListResult.java b/sdk/src/main/java/org/zstack/sdk/QueryCdnModelServiceTemplateListResult.java new file mode 100644 index 00000000000..0d5a60d6b99 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryCdnModelServiceTemplateListResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class QueryCdnModelServiceTemplateListResult { + public java.util.List templates; + public void setTemplates(java.util.List templates) { + this.templates = templates; + } + public java.util.List getTemplates() { + return this.templates; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index b505a267862..b82854c4c62 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -27125,6 +27125,87 @@ abstract class ApiHelper { } + def importModelServiceTemplateFromCdn(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ImportModelServiceTemplateFromCdnAction.class) Closure c) { + def a = new org.zstack.sdk.ImportModelServiceTemplateFromCdnAction() + 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 importModelServiceTemplateFromUpload(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ImportModelServiceTemplateFromUploadAction.class) Closure c) { + def a = new org.zstack.sdk.ImportModelServiceTemplateFromUploadAction() + 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 importModelServiceTemplateFromUrl(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ImportModelServiceTemplateFromUrlAction.class) Closure c) { + def a = new org.zstack.sdk.ImportModelServiceTemplateFromUrlAction() + 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 inspectBareMetal2Chassis(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.InspectBareMetal2ChassisAction.class) Closure c) { def a = new org.zstack.sdk.InspectBareMetal2ChassisAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -30089,6 +30170,33 @@ abstract class ApiHelper { } + def queryCdnModelServiceTemplateList(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryCdnModelServiceTemplateListAction.class) Closure c) { + def a = new org.zstack.sdk.QueryCdnModelServiceTemplateListAction() + 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 queryCdpPolicy(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryCdpPolicyAction.class) Closure c) { def a = new org.zstack.sdk.QueryCdpPolicyAction() a.sessionId = Test.currentEnvSpec?.session?.uuid