diff --git a/conf/db/zsv/V5.1.0__schema.sql b/conf/db/zsv/V5.1.0__schema.sql index f2302d4e9d4..796e4135c4f 100644 --- a/conf/db/zsv/V5.1.0__schema.sql +++ b/conf/db/zsv/V5.1.0__schema.sql @@ -36,3 +36,19 @@ SET src.`type` = IF(ldap.serverType IN ('OpenLdap', 'WindowsAD'), ldap.serverTyp WHERE src.`type` = 'ldap'; CALL INSERT_COLUMN('ThirdPartyAccountSourceVO', 'updateAccountStrategies', 'varchar(255)', 0, '', 'createAccountStrategy'); + +-- Feature: Log Server | ZSV-12254 + +CREATE TABLE IF NOT EXISTS `zstack`.`LogServerVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(255) NOT NULL, + `description` varchar(2048) NULL, + `category` varchar(255) NOT NULL, + `type` varchar(255) NOT NULL, + `level` varchar(255) NULL, + `state` varchar(255) NOT NULL DEFAULT 'Enabled', + `configuration` text NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '1999-12-31 23:59:59', + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/conf/persistence.xml b/conf/persistence.xml index 97fa6edff1c..bb95abb9228 100755 --- a/conf/persistence.xml +++ b/conf/persistence.xml @@ -224,5 +224,6 @@ org.zstack.softwarePackage.header.SoftwarePackageVO org.zstack.header.vm.metadata.VmMetadataDirtyVO org.zstack.header.vm.metadata.VmMetadataFlushStateVO + org.zstack.log.server.LogServerVO diff --git a/core/src/main/java/org/zstack/core/log/LogGlobalConfig.java b/core/src/main/java/org/zstack/core/log/LogGlobalConfig.java index a368ed1fbcc..041124abe33 100644 --- a/core/src/main/java/org/zstack/core/log/LogGlobalConfig.java +++ b/core/src/main/java/org/zstack/core/log/LogGlobalConfig.java @@ -1,6 +1,7 @@ package org.zstack.core.log; import org.zstack.core.config.GlobalConfig; +import org.zstack.core.config.GlobalConfigDef; import org.zstack.core.config.GlobalConfigDefinition; import org.zstack.core.config.GlobalConfigValidation; @@ -13,4 +14,8 @@ public class LogGlobalConfig { @GlobalConfigValidation public static GlobalConfig LOG_DELETE_ACCUMULATED_FILE_SIZE = new GlobalConfig(CATEGORY, "log.delete.accumulatedFileSize"); + + @GlobalConfigValidation(numberGreaterThan = 1) + @GlobalConfigDef(defaultValue = "30", type = Long.class, description = "sync custom log configuration interval") + public static GlobalConfig SYNC_CUSTOM_LOG_CONFIGURATION_TASK_INTERVAL = new GlobalConfig(CATEGORY, "log.syncCustomLogConfigurationTaskInterval"); } diff --git a/rest/src/main/resources/scripts/SdkDataStructureGenerator.groovy b/rest/src/main/resources/scripts/SdkDataStructureGenerator.groovy index 30736cef780..0a9927b2601 100755 --- a/rest/src/main/resources/scripts/SdkDataStructureGenerator.groovy +++ b/rest/src/main/resources/scripts/SdkDataStructureGenerator.groovy @@ -71,6 +71,7 @@ class SdkDataStructureGenerator implements SdkTemplate { dstToSrc.sort() SdkFile f = new SdkFile() + f.subPath = "org/zstack/sdk" f.fileName = "SourceClassMap.java" f.content = """package org.zstack.sdk; diff --git a/sdk/src/main/java/org/zstack/sdk/AddLogConfigurationAction.java b/sdk/src/main/java/org/zstack/sdk/AddLogConfigurationAction.java index 86a11aa953d..8538477d4e9 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddLogConfigurationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddLogConfigurationAction.java @@ -34,6 +34,9 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; + @Param(required = false, validValues = {"OFF","FATAL","ERROR","WARN","INFO","DEBUG","TRACE","ALL"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String level; + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String configuration; diff --git a/sdk/src/main/java/org/zstack/sdk/AddLogServerAction.java b/sdk/src/main/java/org/zstack/sdk/AddLogServerAction.java new file mode 100644 index 00000000000..63616a924c1 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AddLogServerAction.java @@ -0,0 +1,122 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class AddLogServerAction 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.AddLogServerResult 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 = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = true, validValues = {"ManagementNodeLog","PlatformOperationLog"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String category; + + @Param(required = true, validValues = {"Log4j2","FluentBit"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String type; + + @Param(required = false, validValues = {"OFF","FATAL","ERROR","WARN","INFO","DEBUG","TRACE","ALL"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String level; + + @Param(required = true, maxLength = 8192, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String configuration; + + @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.AddLogServerResult value = res.getResult(org.zstack.sdk.AddLogServerResult.class); + ret.value = value == null ? new org.zstack.sdk.AddLogServerResult() : 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 = "/log/servers"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/AddLogServerResult.java b/sdk/src/main/java/org/zstack/sdk/AddLogServerResult.java new file mode 100644 index 00000000000..fe40b3b9c2c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AddLogServerResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.LogServerInventory; + +public class AddLogServerResult { + public LogServerInventory inventory; + public void setInventory(LogServerInventory inventory) { + this.inventory = inventory; + } + public LogServerInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteLogServerAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteLogServerAction.java new file mode 100644 index 00000000000..57fbf96daad --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteLogServerAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteLogServerAction 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.DeleteLogServerResult 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, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @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.DeleteLogServerResult value = res.getResult(org.zstack.sdk.DeleteLogServerResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteLogServerResult() : 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 = "DELETE"; + info.path = "/log/servers"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteLogServerResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteLogServerResult.java new file mode 100644 index 00000000000..87a8349b0b0 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteLogServerResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class DeleteLogServerResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/LogCategory.java b/sdk/src/main/java/org/zstack/sdk/LogCategory.java new file mode 100644 index 00000000000..96662c4bfb3 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/LogCategory.java @@ -0,0 +1,6 @@ +package org.zstack.sdk; + +public enum LogCategory { + ManagementNodeLog, + PlatformOperationLog, +} diff --git a/sdk/src/main/java/org/zstack/sdk/LogLevel.java b/sdk/src/main/java/org/zstack/sdk/LogLevel.java new file mode 100644 index 00000000000..3c184fb2820 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/LogLevel.java @@ -0,0 +1,12 @@ +package org.zstack.sdk; + +public enum LogLevel { + OFF, + FATAL, + ERROR, + WARN, + INFO, + DEBUG, + TRACE, + ALL, +} diff --git a/sdk/src/main/java/org/zstack/sdk/LogServerInventory.java b/sdk/src/main/java/org/zstack/sdk/LogServerInventory.java new file mode 100644 index 00000000000..fab7139f4b3 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/LogServerInventory.java @@ -0,0 +1,98 @@ +package org.zstack.sdk; + +import org.zstack.sdk.LogCategory; +import org.zstack.sdk.LogType; +import org.zstack.sdk.LogLevel; +import org.zstack.sdk.LogServerState; + +public class LogServerInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + 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 description; + public void setDescription(java.lang.String description) { + this.description = description; + } + public java.lang.String getDescription() { + return this.description; + } + + public LogCategory category; + public void setCategory(LogCategory category) { + this.category = category; + } + public LogCategory getCategory() { + return this.category; + } + + public LogType type; + public void setType(LogType type) { + this.type = type; + } + public LogType getType() { + return this.type; + } + + public LogLevel level; + public void setLevel(LogLevel level) { + this.level = level; + } + public LogLevel getLevel() { + return this.level; + } + + public LogServerState state; + public void setState(LogServerState state) { + this.state = state; + } + public LogServerState getState() { + return this.state; + } + + public java.lang.String configuration; + public void setConfiguration(java.lang.String configuration) { + this.configuration = configuration; + } + public java.lang.String getConfiguration() { + return this.configuration; + } + + public java.lang.String accountUuid; + public void setAccountUuid(java.lang.String accountUuid) { + this.accountUuid = accountUuid; + } + public java.lang.String getAccountUuid() { + return this.accountUuid; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/LogServerState.java b/sdk/src/main/java/org/zstack/sdk/LogServerState.java new file mode 100644 index 00000000000..4d5d06f5f3f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/LogServerState.java @@ -0,0 +1,6 @@ +package org.zstack.sdk; + +public enum LogServerState { + Enabled, + Disabled, +} diff --git a/sdk/src/main/java/org/zstack/sdk/LogType.java b/sdk/src/main/java/org/zstack/sdk/LogType.java new file mode 100644 index 00000000000..9ab0dd45333 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/LogType.java @@ -0,0 +1,6 @@ +package org.zstack.sdk; + +public enum LogType { + Log4j2, + FluentBit, +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryLogServerAction.java b/sdk/src/main/java/org/zstack/sdk/QueryLogServerAction.java new file mode 100644 index 00000000000..7c0b3dc9563 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryLogServerAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryLogServerAction extends QueryAction { + + 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.QueryLogServerResult 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; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryLogServerResult value = res.getResult(org.zstack.sdk.QueryLogServerResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryLogServerResult() : 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 = "/log/servers"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryLogServerResult.java b/sdk/src/main/java/org/zstack/sdk/QueryLogServerResult.java new file mode 100644 index 00000000000..957fadbefd6 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryLogServerResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryLogServerResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/org/zstack/sdk/SourceClassMap.java similarity index 99% rename from sdk/src/main/java/SourceClassMap.java rename to sdk/src/main/java/org/zstack/sdk/SourceClassMap.java index fc0be01aa3a..6b2c54dc13a 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/org/zstack/sdk/SourceClassMap.java @@ -368,6 +368,11 @@ public class SourceClassMap { put("org.zstack.license.entity.LicenseUsageResult", "org.zstack.sdk.license.entity.LicenseUsageResult"); put("org.zstack.license.entity.LicenseUsageView", "org.zstack.sdk.license.entity.LicenseUsageView"); put("org.zstack.license.entity.UpdateLicenseView", "org.zstack.sdk.license.entity.UpdateLicenseView"); + put("org.zstack.log.server.LogCategory", "org.zstack.sdk.LogCategory"); + put("org.zstack.log.server.LogLevel", "org.zstack.sdk.LogLevel"); + put("org.zstack.log.server.LogServerInventory", "org.zstack.sdk.LogServerInventory"); + put("org.zstack.log.server.LogServerState", "org.zstack.sdk.LogServerState"); + put("org.zstack.log.server.LogType", "org.zstack.sdk.LogType"); put("org.zstack.loginControl.entity.AccessControlRuleInventory", "org.zstack.sdk.AccessControlRuleInventory"); put("org.zstack.loginControl.entity.ControlStrategy", "org.zstack.sdk.ControlStrategy"); put("org.zstack.managements.entity.common.ManagementNodeStatusView", "org.zstack.sdk.managements.common.ManagementNodeStatusView"); @@ -925,6 +930,11 @@ public class SourceClassMap { put("org.zstack.sdk.LoadBalancerServerGroupVmNicRefInventory", "org.zstack.network.service.lb.LoadBalancerServerGroupVmNicRefInventory"); put("org.zstack.sdk.LocalStorageResourceRefInventory", "org.zstack.storage.primary.local.LocalStorageResourceRefInventory"); put("org.zstack.sdk.LocateStatus", "org.zstack.storage.device.localRaid.LocateStatus"); + put("org.zstack.sdk.LogCategory", "org.zstack.log.server.LogCategory"); + put("org.zstack.sdk.LogLevel", "org.zstack.log.server.LogLevel"); + put("org.zstack.sdk.LogServerInventory", "org.zstack.log.server.LogServerInventory"); + put("org.zstack.sdk.LogServerState", "org.zstack.log.server.LogServerState"); + put("org.zstack.sdk.LogType", "org.zstack.log.server.LogType"); put("org.zstack.sdk.LoginAuthenticationProcedureDesc", "org.zstack.header.identity.login.LoginAuthenticationProcedureDesc"); put("org.zstack.sdk.LongJobInventory", "org.zstack.header.longjob.LongJobInventory"); put("org.zstack.sdk.LongJobState", "org.zstack.header.longjob.LongJobState"); diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateLogServerAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateLogServerAction.java new file mode 100644 index 00000000000..e2853cb1f16 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateLogServerAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateLogServerAction 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.UpdateLogServerResult 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, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @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.UpdateLogServerResult value = res.getResult(org.zstack.sdk.UpdateLogServerResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateLogServerResult() : 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 = "PUT"; + info.path = "/log/servers"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateLogServer"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateLogServerResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateLogServerResult.java new file mode 100644 index 00000000000..d32b9f98f2e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateLogServerResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.LogServerInventory; + +public class UpdateLogServerResult { + public LogServerInventory inventory; + public void setInventory(LogServerInventory inventory) { + this.inventory = inventory; + } + public LogServerInventory getInventory() { + return this.inventory; + } + +}